diff --git a/.circleci/config.yml b/.circleci/config.yml
index 42ba901..901a6a1 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -78,7 +78,7 @@ jobs:
# run babel compile
- run: git config user.email "jputney@noverant.com" && git config user.name "Jonathan Putney"
- - run: ./node_modules/.bin/grunt
+ - run: ./node_modules/.bin/webpack --bail --config webpack.js
- run: git add --all dist/
# run jsdoc
@@ -101,4 +101,4 @@ jobs:
- store_artifacts: # upload test coverage as artifact
path: ./coverage/lcov.info
- prefix: tests
\ No newline at end of file
+ prefix: tests
diff --git a/README.md b/README.md
index 7bbf22d..fc530ae 100644
--- a/README.md
+++ b/README.md
@@ -270,8 +270,8 @@ I welcome any and all feedback and contributions to this project! I'm sure it wo
#### Setup and Development
You will need `node` installed on your local machine, and you'll have to run `npm install` in the repo directory before starting development.
-To run a build, you need to just run the `grunt` command in the root of the project.
+To run a build, you need to just run the `yarn run compile` command in the root of the project.
-Similarly, to run the tests, you just run the `grunt test` or `npm test` command.
+Similarly, to run the tests, you just run the `yarn test` command.
Before submitting pull requests, please also run `eslint ./src --fix` against your code first, otherwise your pull request build could fail.
diff --git a/dist/aicc.js b/dist/aicc.js
index 329e6f2..6489bdf 100644
--- a/dist/aicc.js
+++ b/dist/aicc.js
@@ -1,5 +1,14 @@
-(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i
* Build: `lodash modularize exports="npm" -o ./`
@@ -11,51 +20,50 @@
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = 'Expected a function';
-
/** Used as references for various `Number` constants. */
+
var NAN = 0 / 0;
-
/** `Object#toString` result references. */
+
var symbolTag = '[object Symbol]';
-
/** Used to match leading and trailing whitespace. */
+
var reTrim = /^\s+|\s+$/g;
-
/** Used to detect bad signed hexadecimal string values. */
+
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
-
/** Used to detect binary string values. */
+
var reIsBinary = /^0b[01]+$/i;
-
/** Used to detect octal string values. */
+
var reIsOctal = /^0o[0-7]+$/i;
-
/** Built-in method references without a dependency on `root`. */
+
var freeParseInt = parseInt;
-
/** Detect free variable `global` from Node.js. */
-var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
+var freeGlobal = (typeof __webpack_require__.g === "undefined" ? "undefined" : _typeof(__webpack_require__.g)) == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;
/** Detect free variable `self`. */
-var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
+var freeSelf = (typeof self === "undefined" ? "undefined" : _typeof(self)) == 'object' && self && self.Object === Object && self;
/** Used as a reference to the global object. */
+
var root = freeGlobal || freeSelf || Function('return this')();
-
/** Used for built-in method references. */
-var objectProto = Object.prototype;
+var objectProto = Object.prototype;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
* of values.
*/
-var objectToString = objectProto.toString;
+var objectToString = objectProto.toString;
/* Built-in method references for those with the same name as other `lodash` methods. */
+
var nativeMax = Math.max,
nativeMin = Math.min;
-
/**
* Gets the timestamp of the number of milliseconds that have elapsed since
* the Unix epoch (1 January 1970 00:00:00 UTC).
@@ -72,10 +80,10 @@ var nativeMax = Math.max,
* }, _.now());
* // => Logs the number of milliseconds it took for the deferred invocation.
*/
-var now = function() {
+
+var now = function now() {
return root.Date.now();
};
-
/**
* Creates a debounced function that delays invoking `func` until after `wait`
* milliseconds have elapsed since the last time the debounced function was
@@ -130,6 +138,8 @@ var now = function() {
* // Cancel the trailing debounced invocation.
* jQuery(window).on('popstate', debounced.cancel);
*/
+
+
function debounce(func, wait, options) {
var lastArgs,
lastThis,
@@ -145,7 +155,9 @@ function debounce(func, wait, options) {
if (typeof func != 'function') {
throw new TypeError(FUNC_ERROR_TEXT);
}
+
wait = toNumber(wait) || 0;
+
if (isObject(options)) {
leading = !!options.leading;
maxing = 'maxWait' in options;
@@ -156,7 +168,6 @@ function debounce(func, wait, options) {
function invokeFunc(time) {
var args = lastArgs,
thisArg = lastThis;
-
lastArgs = lastThis = undefined;
lastInvokeTime = time;
result = func.apply(thisArg, args);
@@ -165,10 +176,10 @@ function debounce(func, wait, options) {
function leadingEdge(time) {
// Reset any `maxWait` timer.
- lastInvokeTime = time;
- // Start the timer for the trailing edge.
- timerId = setTimeout(timerExpired, wait);
- // Invoke the leading edge.
+ lastInvokeTime = time; // Start the timer for the trailing edge.
+
+ timerId = setTimeout(timerExpired, wait); // Invoke the leading edge.
+
return leading ? invokeFunc(time) : result;
}
@@ -176,38 +187,37 @@ function debounce(func, wait, options) {
var timeSinceLastCall = time - lastCallTime,
timeSinceLastInvoke = time - lastInvokeTime,
result = wait - timeSinceLastCall;
-
return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
}
function shouldInvoke(time) {
var timeSinceLastCall = time - lastCallTime,
- timeSinceLastInvoke = time - lastInvokeTime;
-
- // Either this is the first call, activity has stopped and we're at the
+ timeSinceLastInvoke = time - lastInvokeTime; // Either this is the first call, activity has stopped and we're at the
// trailing edge, the system time has gone backwards and we're treating
// it as the trailing edge, or we've hit the `maxWait` limit.
- return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
- (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
+
+ return lastCallTime === undefined || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
}
function timerExpired() {
var time = now();
+
if (shouldInvoke(time)) {
return trailingEdge(time);
- }
- // Restart the timer.
+ } // Restart the timer.
+
+
timerId = setTimeout(timerExpired, remainingWait(time));
}
function trailingEdge(time) {
- timerId = undefined;
-
- // Only invoke if we have `lastArgs` which means `func` has been
+ timerId = undefined; // Only invoke if we have `lastArgs` which means `func` has been
// debounced at least once.
+
if (trailing && lastArgs) {
return invokeFunc(time);
}
+
lastArgs = lastThis = undefined;
return result;
}
@@ -216,6 +226,7 @@ function debounce(func, wait, options) {
if (timerId !== undefined) {
clearTimeout(timerId);
}
+
lastInvokeTime = 0;
lastArgs = lastCallTime = lastThis = timerId = undefined;
}
@@ -227,7 +238,6 @@ function debounce(func, wait, options) {
function debounced() {
var time = now(),
isInvoking = shouldInvoke(time);
-
lastArgs = arguments;
lastThis = this;
lastCallTime = time;
@@ -236,22 +246,25 @@ function debounce(func, wait, options) {
if (timerId === undefined) {
return leadingEdge(lastCallTime);
}
+
if (maxing) {
// Handle invocations in a tight loop.
timerId = setTimeout(timerExpired, wait);
return invokeFunc(lastCallTime);
}
}
+
if (timerId === undefined) {
timerId = setTimeout(timerExpired, wait);
}
+
return result;
}
+
debounced.cancel = cancel;
debounced.flush = flush;
return debounced;
}
-
/**
* Checks if `value` is the
* [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
@@ -277,11 +290,13 @@ function debounce(func, wait, options) {
* _.isObject(null);
* // => false
*/
+
+
function isObject(value) {
- var type = typeof value;
+ var type = _typeof(value);
+
return !!value && (type == 'object' || type == 'function');
}
-
/**
* Checks if `value` is object-like. A value is object-like if it's not `null`
* and has a `typeof` result of "object".
@@ -306,10 +321,11 @@ function isObject(value) {
* _.isObjectLike(null);
* // => false
*/
-function isObjectLike(value) {
- return !!value && typeof value == 'object';
-}
+
+function isObjectLike(value) {
+ return !!value && _typeof(value) == 'object';
+}
/**
* Checks if `value` is classified as a `Symbol` primitive or object.
*
@@ -327,11 +343,11 @@ function isObjectLike(value) {
* _.isSymbol('abc');
* // => false
*/
-function isSymbol(value) {
- return typeof value == 'symbol' ||
- (isObjectLike(value) && objectToString.call(value) == symbolTag);
-}
+
+function isSymbol(value) {
+ return _typeof(value) == 'symbol' || isObjectLike(value) && objectToString.call(value) == symbolTag;
+}
/**
* Converts `value` to a number.
*
@@ -355,49 +371,51 @@ function isSymbol(value) {
* _.toNumber('3.2');
* // => 3.2
*/
+
+
function toNumber(value) {
if (typeof value == 'number') {
return value;
}
+
if (isSymbol(value)) {
return NAN;
}
+
if (isObject(value)) {
var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
- value = isObject(other) ? (other + '') : other;
+ value = isObject(other) ? other + '' : other;
}
+
if (typeof value != 'string') {
return value === 0 ? value : +value;
}
+
value = value.replace(reTrim, '');
var isBinary = reIsBinary.test(value);
- return (isBinary || reIsOctal.test(value))
- ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
- : (reIsBadHex.test(value) ? NAN : +value);
+ return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
}
module.exports = debounce;
-}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+/***/ }),
+
+/***/ "./src/AICC.js":
+/*!*********************!*\
+ !*** ./src/AICC.js ***!
+ \*********************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{}],2:[function(require,module,exports){
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ AICC; }
+/* harmony export */ });
+/* harmony import */ var _Scorm12API__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Scorm12API */ "./src/Scorm12API.js");
+/* harmony import */ var _cmi_aicc_cmi__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cmi/aicc_cmi */ "./src/cmi/aicc_cmi.js");
+/* harmony import */ var _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./cmi/scorm12_cmi */ "./src/cmi/scorm12_cmi.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _Scorm12API2 = _interopRequireDefault(require("./Scorm12API"));
-
-var _aicc_cmi = require("./cmi/aicc_cmi");
-
-var _scorm12_cmi = require("./cmi/scorm12_cmi");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -428,9 +446,13 @@ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Re
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
+
+
+
/**
* The AICC API class
*/
+
var AICC = /*#__PURE__*/function (_Scorm12API) {
_inherits(AICC, _Scorm12API);
@@ -450,8 +472,8 @@ var AICC = /*#__PURE__*/function (_Scorm12API) {
}), settings);
_this = _super.call(this, finalSettings);
- _this.cmi = new _aicc_cmi.CMI();
- _this.nav = new _scorm12_cmi.NAV();
+ _this.cmi = new _cmi_aicc_cmi__WEBPACK_IMPORTED_MODULE_1__.CMI();
+ _this.nav = new _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_2__.NAV();
return _this;
}
/**
@@ -471,11 +493,11 @@ var AICC = /*#__PURE__*/function (_Scorm12API) {
if (!newChild) {
if (this.stringMatches(CMIElement, 'cmi\\.evaluation\\.comments\\.\\d+')) {
- newChild = new _aicc_cmi.CMIEvaluationCommentsObject();
+ newChild = new _cmi_aicc_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIEvaluationCommentsObject();
} else if (this.stringMatches(CMIElement, 'cmi\\.student_data\\.tries\\.\\d+')) {
- newChild = new _aicc_cmi.CMITriesObject();
+ newChild = new _cmi_aicc_cmi__WEBPACK_IMPORTED_MODULE_1__.CMITriesObject();
} else if (this.stringMatches(CMIElement, 'cmi\\.student_data\\.attempt_records\\.\\d+')) {
- newChild = new _aicc_cmi.CMIAttemptRecordsObject();
+ newChild = new _cmi_aicc_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIAttemptRecordsObject();
}
}
@@ -497,32 +519,30 @@ var AICC = /*#__PURE__*/function (_Scorm12API) {
}]);
return AICC;
-}(_Scorm12API2["default"]);
+}(_Scorm12API__WEBPACK_IMPORTED_MODULE_0__["default"]);
-exports["default"] = AICC;
-},{"./Scorm12API":4,"./cmi/aicc_cmi":5,"./cmi/scorm12_cmi":7}],3:[function(require,module,exports){
+
+/***/ }),
+
+/***/ "./src/BaseAPI.js":
+/*!************************!*\
+ !*** ./src/BaseAPI.js ***!
+ \************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _common = require("./cmi/common");
-
-var _exceptions = require("./exceptions");
-
-var _error_codes2 = _interopRequireDefault(require("./constants/error_codes"));
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-var _utilities = require("./utilities");
-
-var _lodash = _interopRequireDefault(require("lodash.debounce"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ BaseAPI; }
+/* harmony export */ });
+/* harmony import */ var _cmi_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cmi/common */ "./src/cmi/common.js");
+/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./exceptions */ "./src/exceptions.js");
+/* harmony import */ var _constants_error_codes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants/error_codes */ "./src/constants/error_codes.js");
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants/api_constants */ "./src/constants/api_constants.js");
+/* harmony import */ var _utilities__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utilities */ "./src/utilities.js");
+/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash.debounce */ "./node_modules/lodash.debounce/index.js");
+/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash_debounce__WEBPACK_IMPORTED_MODULE_5__);
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -563,8 +583,14 @@ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!priva
function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-var global_constants = _api_constants["default"].global;
-var scorm12_error_codes = _error_codes2["default"].scorm12;
+
+
+
+
+
+
+var global_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__["default"].global;
+var scorm12_error_codes = _constants_error_codes__WEBPACK_IMPORTED_MODULE_2__["default"].scorm12;
/**
* Base API class for AICC, SCORM 1.2, and SCORM 2004. Should be considered
* abstract, and never initialized on it's own.
@@ -635,6 +661,9 @@ var BaseAPI = /*#__PURE__*/function () {
return result;
},
+ requestHandler: function requestHandler(commitObject) {
+ return commitObject;
+ },
onLogMessage: function onLogMessage(messageLevel, logMessage) {
switch (messageLevel) {
case global_constants.LOG_LEVEL_ERROR:
@@ -793,7 +822,7 @@ var BaseAPI = /*#__PURE__*/function () {
try {
returnValue = this.getCMIValue(CMIElement);
} catch (e) {
- if (e instanceof _exceptions.ValidationError) {
+ if (e instanceof _exceptions__WEBPACK_IMPORTED_MODULE_1__.ValidationError) {
this.lastErrorCode = e.errorCode;
returnValue = global_constants.SCORM_FALSE;
} else {
@@ -840,7 +869,7 @@ var BaseAPI = /*#__PURE__*/function () {
try {
returnValue = this.setCMIValue(CMIElement, value);
} catch (e) {
- if (e instanceof _exceptions.ValidationError) {
+ if (e instanceof _exceptions__WEBPACK_IMPORTED_MODULE_1__.ValidationError) {
this.lastErrorCode = e.errorCode;
returnValue = global_constants.SCORM_FALSE;
} else {
@@ -1158,7 +1187,7 @@ var BaseAPI = /*#__PURE__*/function () {
break;
}
- if (refObject instanceof _common.CMIArray) {
+ if (refObject instanceof _cmi_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray) {
var index = parseInt(structure[i + 1], 10); // SCO is trying to set an item on an array
if (!isNaN(index)) {
@@ -1270,7 +1299,7 @@ var BaseAPI = /*#__PURE__*/function () {
break;
}
- if (refObject instanceof _common.CMIArray) {
+ if (refObject instanceof _cmi_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray) {
var index = parseInt(structure[i + 1], 10); // SCO is trying to set an item on an array
if (!isNaN(index)) {
@@ -1612,7 +1641,7 @@ var BaseAPI = /*#__PURE__*/function () {
obj = {};
obj[element[0]] = element[1];
- _this3.loadFromJSON((0, _utilities.unflatten)(obj), CMIElement);
+ _this3.loadFromJSON((0,_utilities__WEBPACK_IMPORTED_MODULE_4__.unflatten)(obj), CMIElement);
});
}
/**
@@ -1736,6 +1765,8 @@ var BaseAPI = /*#__PURE__*/function () {
}
try {
+ params = settings.requestHandler(params);
+
if (params instanceof Array) {
httpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
httpReq.send(params.join('&'));
@@ -1805,8 +1836,8 @@ var BaseAPI = /*#__PURE__*/function () {
return result;
};
- if (typeof _lodash["default"] !== 'undefined') {
- var debounced = (0, _lodash["default"])(process, 500);
+ if (typeof (lodash_debounce__WEBPACK_IMPORTED_MODULE_5___default()) !== 'undefined') {
+ var debounced = lodash_debounce__WEBPACK_IMPORTED_MODULE_5___default()(process, 500);
debounced(url, params, this.settings, this.error_codes); // if we're terminating, go ahead and commit immediately
if (immediate) {
@@ -1859,7 +1890,7 @@ var BaseAPI = /*#__PURE__*/function () {
*/
-exports["default"] = BaseAPI;
+
var _API = /*#__PURE__*/new WeakMap();
@@ -1935,32 +1966,26 @@ var ScheduledCommit = /*#__PURE__*/function () {
return ScheduledCommit;
}();
-},{"./cmi/common":6,"./constants/api_constants":8,"./constants/error_codes":9,"./exceptions":11,"./utilities":13,"lodash.debounce":1}],4:[function(require,module,exports){
+/***/ }),
+
+/***/ "./src/Scorm12API.js":
+/*!***************************!*\
+ !*** ./src/Scorm12API.js ***!
+ \***************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ Scorm12API; }
+/* harmony export */ });
+/* harmony import */ var _BaseAPI__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BaseAPI */ "./src/BaseAPI.js");
+/* harmony import */ var _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cmi/scorm12_cmi */ "./src/cmi/scorm12_cmi.js");
+/* harmony import */ var _utilities__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utilities */ "./src/utilities.js");
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants/api_constants */ "./src/constants/api_constants.js");
+/* harmony import */ var _constants_error_codes__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./constants/error_codes */ "./src/constants/error_codes.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _BaseAPI2 = _interopRequireDefault(require("./BaseAPI"));
-
-var _scorm12_cmi = require("./cmi/scorm12_cmi");
-
-var Utilities = _interopRequireWildcard(require("./utilities"));
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("./constants/error_codes"));
-
-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; }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -1987,9 +2012,14 @@ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Re
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-var scorm12_constants = _api_constants["default"].scorm12;
-var global_constants = _api_constants["default"].global;
-var scorm12_error_codes = _error_codes["default"].scorm12;
+
+
+
+
+
+var scorm12_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__["default"].scorm12;
+var global_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__["default"].global;
+var scorm12_error_codes = _constants_error_codes__WEBPACK_IMPORTED_MODULE_4__["default"].scorm12;
/**
* API class for SCORM 1.2
*/
@@ -2013,8 +2043,8 @@ var Scorm12API = /*#__PURE__*/function (_BaseAPI) {
}), settings);
_this = _super.call(this, scorm12_error_codes, finalSettings);
- _this.cmi = new _scorm12_cmi.CMI();
- _this.nav = new _scorm12_cmi.NAV(); // Rename functions to match 1.2 Spec and expose to modules
+ _this.cmi = new _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_1__.CMI();
+ _this.nav = new _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_1__.NAV(); // Rename functions to match 1.2 Spec and expose to modules
_this.LMSInitialize = _this.lmsInitialize;
_this.LMSFinish = _this.lmsFinish;
@@ -2175,13 +2205,13 @@ var Scorm12API = /*#__PURE__*/function (_BaseAPI) {
var newChild;
if (this.stringMatches(CMIElement, 'cmi\\.objectives\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIObjectivesObject();
+ newChild = new _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIObjectivesObject();
} else if (foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+\\.correct_responses\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIInteractionsCorrectResponsesObject();
+ newChild = new _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIInteractionsCorrectResponsesObject();
} else if (foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+\\.objectives\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIInteractionsObjectivesObject();
+ newChild = new _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIInteractionsObjectivesObject();
} else if (!foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIInteractionsObject();
+ newChild = new _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIInteractionsObject();
}
return newChild;
@@ -2251,11 +2281,11 @@ var Scorm12API = /*#__PURE__*/function (_BaseAPI) {
}
var result = [];
- var flattened = Utilities.flatten(cmiExport);
+ var flattened = _utilities__WEBPACK_IMPORTED_MODULE_2__.flatten(cmiExport);
switch (this.settings.dataCommitFormat) {
case 'flattened':
- return Utilities.flatten(cmiExport);
+ return _utilities__WEBPACK_IMPORTED_MODULE_2__.flatten(cmiExport);
case 'params':
for (var item in flattened) {
@@ -2323,38 +2353,39 @@ var Scorm12API = /*#__PURE__*/function (_BaseAPI) {
}]);
return Scorm12API;
-}(_BaseAPI2["default"]);
+}(_BaseAPI__WEBPACK_IMPORTED_MODULE_0__["default"]);
-exports["default"] = Scorm12API;
-},{"./BaseAPI":3,"./cmi/scorm12_cmi":7,"./constants/api_constants":8,"./constants/error_codes":9,"./utilities":13}],5:[function(require,module,exports){
+
+/***/ }),
+
+/***/ "./src/cmi/aicc_cmi.js":
+/*!*****************************!*\
+ !*** ./src/cmi/aicc_cmi.js ***!
+ \*****************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "CMI": function() { return /* binding */ CMI; },
+/* harmony export */ "CMIStudentDemographics": function() { return /* binding */ CMIStudentDemographics; },
+/* harmony export */ "CMIPaths": function() { return /* binding */ CMIPaths; },
+/* harmony export */ "CMIPathsObject": function() { return /* binding */ CMIPathsObject; },
+/* harmony export */ "CMITries": function() { return /* binding */ CMITries; },
+/* harmony export */ "CMITriesObject": function() { return /* binding */ CMITriesObject; },
+/* harmony export */ "CMIAttemptRecords": function() { return /* binding */ CMIAttemptRecords; },
+/* harmony export */ "CMIAttemptRecordsObject": function() { return /* binding */ CMIAttemptRecordsObject; },
+/* harmony export */ "CMIEvaluationCommentsObject": function() { return /* binding */ CMIEvaluationCommentsObject; }
+/* harmony export */ });
+/* harmony import */ var _scorm12_cmi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./scorm12_cmi */ "./src/cmi/scorm12_cmi.js");
+/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./common */ "./src/cmi/common.js");
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants/api_constants */ "./src/constants/api_constants.js");
+/* harmony import */ var _constants_regex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../constants/regex */ "./src/constants/regex.js");
+/* harmony import */ var _constants_error_codes__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants/error_codes */ "./src/constants/error_codes.js");
+/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../exceptions */ "./src/exceptions.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.CMITriesObject = exports.CMITries = exports.CMIStudentDemographics = exports.CMIPathsObject = exports.CMIPaths = exports.CMIEvaluationCommentsObject = exports.CMIAttemptRecordsObject = exports.CMIAttemptRecords = exports.CMI = void 0;
-
-var Scorm12CMI = _interopRequireWildcard(require("./scorm12_cmi"));
-
-var _common = require("./common");
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _exceptions = require("../exceptions");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-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; }
-
function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
@@ -2393,15 +2424,21 @@ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Re
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-var aicc_constants = _api_constants["default"].aicc;
-var aicc_regex = _regex["default"].aicc;
-var aicc_error_codes = _error_codes["default"].scorm12;
+
+
+
+
+
+
+var aicc_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_2__["default"].aicc;
+var aicc_regex = _constants_regex__WEBPACK_IMPORTED_MODULE_3__["default"].aicc;
+var aicc_error_codes = _constants_error_codes__WEBPACK_IMPORTED_MODULE_4__["default"].scorm12;
/**
* Helper method for throwing Read Only error
*/
function throwReadOnlyError() {
- throw new _exceptions.AICCValidationError(aicc_error_codes.READ_ONLY_ELEMENT);
+ throw new _exceptions__WEBPACK_IMPORTED_MODULE_5__.AICCValidationError(aicc_error_codes.READ_ONLY_ELEMENT);
}
/**
* Helper method, no reason to have to pass the same error codes every time
@@ -2413,7 +2450,7 @@ function throwReadOnlyError() {
function checkAICCValidFormat(value, regexPattern, allowEmptyString) {
- return (0, _common.checkValidFormat)(value, regexPattern, aicc_error_codes.TYPE_MISMATCH, _exceptions.AICCValidationError, allowEmptyString);
+ return (0,_common__WEBPACK_IMPORTED_MODULE_1__.checkValidFormat)(value, regexPattern, aicc_error_codes.TYPE_MISMATCH, _exceptions__WEBPACK_IMPORTED_MODULE_5__.AICCValidationError, allowEmptyString);
}
/**
* CMI Class for AICC
@@ -2504,14 +2541,11 @@ var CMI = /*#__PURE__*/function (_Scorm12CMI$CMI) {
}]);
return CMI;
-}(Scorm12CMI.CMI);
+}(_scorm12_cmi__WEBPACK_IMPORTED_MODULE_0__.CMI);
/**
* AICC Evaluation object
*/
-
-exports.CMI = CMI;
-
var CMIEvaluation = /*#__PURE__*/function (_BaseCMI) {
_inherits(CMIEvaluation, _BaseCMI);
@@ -2561,7 +2595,7 @@ var CMIEvaluation = /*#__PURE__*/function (_BaseCMI) {
}]);
return CMIEvaluation;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_1__.BaseCMI);
/**
* Class representing AICC's cmi.evaluation.comments object
*/
@@ -2581,12 +2615,12 @@ var CMIEvaluationComments = /*#__PURE__*/function (_CMIArray) {
return _super3.call(this, {
children: aicc_constants.comments_children,
errorCode: aicc_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.AICCValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.AICCValidationError
});
}
return _createClass(CMIEvaluationComments);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_1__.CMIArray);
/**
* StudentPreferences class for AICC
*/
@@ -2642,9 +2676,9 @@ var AICCStudentPreferences = /*#__PURE__*/function (_Scorm12CMI$CMIStuden) {
value: ''
});
- _this3.windows = new _common.CMIArray({
+ _this3.windows = new _common__WEBPACK_IMPORTED_MODULE_1__.CMIArray({
errorCode: aicc_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.AICCValidationError,
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.AICCValidationError,
children: ''
});
return _this3;
@@ -2798,7 +2832,7 @@ var AICCStudentPreferences = /*#__PURE__*/function (_Scorm12CMI$CMIStuden) {
}]);
return AICCStudentPreferences;
-}(Scorm12CMI.CMIStudentPreference);
+}(_scorm12_cmi__WEBPACK_IMPORTED_MODULE_0__.CMIStudentPreference);
/**
* StudentData class for AICC
*/
@@ -2890,7 +2924,7 @@ var AICCCMIStudentData = /*#__PURE__*/function (_Scorm12CMI$CMIStuden2) {
}]);
return AICCCMIStudentData;
-}(Scorm12CMI.CMIStudentData);
+}(_scorm12_cmi__WEBPACK_IMPORTED_MODULE_0__.CMIStudentData);
/**
* Class representing the AICC cmi.student_demographics object
*/
@@ -3296,7 +3330,7 @@ var CMIStudentDemographics = /*#__PURE__*/function (_BaseCMI2) {
this.jsonString = true;
var result = {
'city': this.city,
- 'class': this["class"],
+ 'class': this.class,
'company': this.company,
'country': this.country,
'experience': this.experience,
@@ -3315,14 +3349,11 @@ var CMIStudentDemographics = /*#__PURE__*/function (_BaseCMI2) {
}]);
return CMIStudentDemographics;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_1__.BaseCMI);
/**
* Class representing the AICC cmi.paths object
*/
-
-exports.CMIStudentDemographics = CMIStudentDemographics;
-
var CMIPaths = /*#__PURE__*/function (_CMIArray2) {
_inherits(CMIPaths, _CMIArray2);
@@ -3340,14 +3371,11 @@ var CMIPaths = /*#__PURE__*/function (_CMIArray2) {
}
return _createClass(CMIPaths);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_1__.CMIArray);
/**
* Class for AICC Paths
*/
-
-exports.CMIPaths = CMIPaths;
-
var _location_id = /*#__PURE__*/new WeakMap();
var _date = /*#__PURE__*/new WeakMap();
@@ -3560,14 +3588,11 @@ var CMIPathsObject = /*#__PURE__*/function (_BaseCMI3) {
}]);
return CMIPathsObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_1__.BaseCMI);
/**
* Class representing the AICC cmi.student_data.tries object
*/
-
-exports.CMIPathsObject = CMIPathsObject;
-
var CMITries = /*#__PURE__*/function (_CMIArray3) {
_inherits(CMITries, _CMIArray3);
@@ -3585,14 +3610,11 @@ var CMITries = /*#__PURE__*/function (_CMIArray3) {
}
return _createClass(CMITries);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_1__.CMIArray);
/**
* Class for AICC Tries
*/
-
-exports.CMITries = CMITries;
-
var _status2 = /*#__PURE__*/new WeakMap();
var _time2 = /*#__PURE__*/new WeakMap();
@@ -3622,13 +3644,13 @@ var CMITriesObject = /*#__PURE__*/function (_BaseCMI4) {
value: ''
});
- _this7.score = new _common.CMIScore({
+ _this7.score = new _common__WEBPACK_IMPORTED_MODULE_1__.CMIScore({
score_children: aicc_constants.score_children,
score_range: aicc_regex.score_range,
invalidErrorCode: aicc_error_codes.INVALID_SET_VALUE,
invalidTypeCode: aicc_error_codes.TYPE_MISMATCH,
invalidRangeCode: aicc_error_codes.VALUE_OUT_OF_RANGE,
- errorClass: _exceptions.AICCValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.AICCValidationError
});
return _this7;
}
@@ -3712,14 +3734,11 @@ var CMITriesObject = /*#__PURE__*/function (_BaseCMI4) {
}]);
return CMITriesObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_1__.BaseCMI);
/**
* Class for cmi.student_data.attempt_records array
*/
-
-exports.CMITriesObject = CMITriesObject;
-
var CMIAttemptRecords = /*#__PURE__*/function (_CMIArray4) {
_inherits(CMIAttemptRecords, _CMIArray4);
@@ -3737,14 +3756,11 @@ var CMIAttemptRecords = /*#__PURE__*/function (_CMIArray4) {
}
return _createClass(CMIAttemptRecords);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_1__.CMIArray);
/**
* Class for AICC Attempt Records
*/
-
-exports.CMIAttemptRecords = CMIAttemptRecords;
-
var _lesson_status = /*#__PURE__*/new WeakMap();
var CMIAttemptRecordsObject = /*#__PURE__*/function (_BaseCMI5) {
@@ -3767,13 +3783,13 @@ var CMIAttemptRecordsObject = /*#__PURE__*/function (_BaseCMI5) {
value: ''
});
- _this8.score = new _common.CMIScore({
+ _this8.score = new _common__WEBPACK_IMPORTED_MODULE_1__.CMIScore({
score_children: aicc_constants.score_children,
score_range: aicc_regex.score_range,
invalidErrorCode: aicc_error_codes.INVALID_SET_VALUE,
invalidTypeCode: aicc_error_codes.TYPE_MISMATCH,
invalidRangeCode: aicc_error_codes.VALUE_OUT_OF_RANGE,
- errorClass: _exceptions.AICCValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.AICCValidationError
});
return _this8;
}
@@ -3836,14 +3852,11 @@ var CMIAttemptRecordsObject = /*#__PURE__*/function (_BaseCMI5) {
}]);
return CMIAttemptRecordsObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_1__.BaseCMI);
/**
* Class for AICC Evaluation Comments
*/
-
-exports.CMIAttemptRecordsObject = CMIAttemptRecordsObject;
-
var _content = /*#__PURE__*/new WeakMap();
var _location = /*#__PURE__*/new WeakMap();
@@ -3969,30 +3982,30 @@ var CMIEvaluationCommentsObject = /*#__PURE__*/function (_BaseCMI6) {
}]);
return CMIEvaluationCommentsObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_1__.BaseCMI);
-exports.CMIEvaluationCommentsObject = CMIEvaluationCommentsObject;
+/***/ }),
+
+/***/ "./src/cmi/common.js":
+/*!***************************!*\
+ !*** ./src/cmi/common.js ***!
+ \***************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{"../constants/api_constants":8,"../constants/error_codes":9,"../constants/regex":10,"../exceptions":11,"./common":6,"./scorm12_cmi":7}],6:[function(require,module,exports){
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "checkValidFormat": function() { return /* binding */ checkValidFormat; },
+/* harmony export */ "checkValidRange": function() { return /* binding */ checkValidRange; },
+/* harmony export */ "BaseCMI": function() { return /* binding */ BaseCMI; },
+/* harmony export */ "CMIScore": function() { return /* binding */ CMIScore; },
+/* harmony export */ "CMIArray": function() { return /* binding */ CMIArray; }
+/* harmony export */ });
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants/api_constants */ "./src/constants/api_constants.js");
+/* harmony import */ var _constants_error_codes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants/error_codes */ "./src/constants/error_codes.js");
+/* harmony import */ var _constants_regex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants/regex */ "./src/constants/regex.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.CMIScore = exports.CMIArray = exports.BaseCMI = void 0;
-exports.checkValidFormat = checkValidFormat;
-exports.checkValidRange = checkValidRange;
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
@@ -4029,9 +4042,12 @@ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!priva
function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-var scorm12_constants = _api_constants["default"].scorm12;
-var scorm12_regex = _regex["default"].scorm12;
-var scorm12_error_codes = _error_codes["default"].scorm12;
+
+
+
+var scorm12_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__["default"].scorm12;
+var scorm12_regex = _constants_regex__WEBPACK_IMPORTED_MODULE_2__["default"].scorm12;
+var scorm12_error_codes = _constants_error_codes__WEBPACK_IMPORTED_MODULE_1__["default"].scorm12;
/**
* Check if the value matches the proper format. If not, throw proper error code.
*
@@ -4067,7 +4083,6 @@ function checkValidFormat(value, regexPattern, errorCode, errorClass, allowEmpty
* @return {boolean}
*/
-
function checkValidRange(value, rangePattern, errorCode, errorClass) {
var ranges = rangePattern.split('#');
value = value * 1.0;
@@ -4086,7 +4101,6 @@ function checkValidRange(value, rangePattern, errorCode, errorClass) {
* Base class for API cmi objects
*/
-
var _initialized = /*#__PURE__*/new WeakMap();
var _start_time = /*#__PURE__*/new WeakMap();
@@ -4162,9 +4176,6 @@ var BaseCMI = /*#__PURE__*/function () {
* Base class for cmi *.score objects
*/
-
-exports.BaseCMI = BaseCMI;
-
var _children2 = /*#__PURE__*/new WeakMap();
var _score_range = /*#__PURE__*/new WeakMap();
@@ -4391,9 +4402,6 @@ var CMIScore = /*#__PURE__*/function (_BaseCMI) {
* Base class for cmi *.n objects
*/
-
-exports.CMIScore = CMIScore;
-
var _errorCode = /*#__PURE__*/new WeakMap();
var _errorClass = /*#__PURE__*/new WeakMap();
@@ -4506,42 +4514,38 @@ var CMIArray = /*#__PURE__*/function (_BaseCMI2) {
return CMIArray;
}(BaseCMI);
-exports.CMIArray = CMIArray;
+/***/ }),
+
+/***/ "./src/cmi/scorm12_cmi.js":
+/*!********************************!*\
+ !*** ./src/cmi/scorm12_cmi.js ***!
+ \********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{"../constants/api_constants":8,"../constants/error_codes":9,"../constants/regex":10}],7:[function(require,module,exports){
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "throwReadOnlyError": function() { return /* binding */ throwReadOnlyError; },
+/* harmony export */ "throwWriteOnlyError": function() { return /* binding */ throwWriteOnlyError; },
+/* harmony export */ "check12ValidFormat": function() { return /* binding */ check12ValidFormat; },
+/* harmony export */ "check12ValidRange": function() { return /* binding */ check12ValidRange; },
+/* harmony export */ "CMI": function() { return /* binding */ CMI; },
+/* harmony export */ "CMIStudentData": function() { return /* binding */ CMIStudentData; },
+/* harmony export */ "CMIStudentPreference": function() { return /* binding */ CMIStudentPreference; },
+/* harmony export */ "CMIInteractionsObject": function() { return /* binding */ CMIInteractionsObject; },
+/* harmony export */ "CMIObjectivesObject": function() { return /* binding */ CMIObjectivesObject; },
+/* harmony export */ "CMIInteractionsObjectivesObject": function() { return /* binding */ CMIInteractionsObjectivesObject; },
+/* harmony export */ "CMIInteractionsCorrectResponsesObject": function() { return /* binding */ CMIInteractionsCorrectResponsesObject; },
+/* harmony export */ "NAV": function() { return /* binding */ NAV; }
+/* harmony export */ });
+/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./common */ "./src/cmi/common.js");
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants/api_constants */ "./src/constants/api_constants.js");
+/* harmony import */ var _constants_error_codes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants/error_codes */ "./src/constants/error_codes.js");
+/* harmony import */ var _constants_regex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../constants/regex */ "./src/constants/regex.js");
+/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../exceptions */ "./src/exceptions.js");
+/* harmony import */ var _utilities__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utilities */ "./src/utilities.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.NAV = exports.CMIStudentPreference = exports.CMIStudentData = exports.CMIObjectivesObject = exports.CMIInteractionsObjectivesObject = exports.CMIInteractionsObject = exports.CMIInteractionsCorrectResponsesObject = exports.CMI = void 0;
-exports.check12ValidFormat = check12ValidFormat;
-exports.check12ValidRange = check12ValidRange;
-exports.throwReadOnlyError = throwReadOnlyError;
-exports.throwWriteOnlyError = throwWriteOnlyError;
-
-var _common = require("./common");
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-var _exceptions = require("../exceptions");
-
-var Utilities = _interopRequireWildcard(require("../utilities"));
-
-var Util = Utilities;
-
-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; }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
@@ -4582,31 +4586,36 @@ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!priva
function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-var scorm12_constants = _api_constants["default"].scorm12;
-var scorm12_regex = _regex["default"].scorm12;
-var scorm12_error_codes = _error_codes["default"].scorm12;
+
+
+
+
+
+
+
+var scorm12_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_1__["default"].scorm12;
+var scorm12_regex = _constants_regex__WEBPACK_IMPORTED_MODULE_3__["default"].scorm12;
+var scorm12_error_codes = _constants_error_codes__WEBPACK_IMPORTED_MODULE_2__["default"].scorm12;
/**
* Helper method for throwing Read Only error
*/
function throwReadOnlyError() {
- throw new _exceptions.Scorm12ValidationError(scorm12_error_codes.READ_ONLY_ELEMENT);
+ throw new _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError(scorm12_error_codes.READ_ONLY_ELEMENT);
}
/**
* Helper method for throwing Write Only error
*/
-
function throwWriteOnlyError() {
- throw new _exceptions.Scorm12ValidationError(scorm12_error_codes.WRITE_ONLY_ELEMENT);
+ throw new _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError(scorm12_error_codes.WRITE_ONLY_ELEMENT);
}
/**
* Helper method for throwing Invalid Set error
*/
-
function throwInvalidValueError() {
- throw new _exceptions.Scorm12ValidationError(scorm12_error_codes.INVALID_SET_VALUE);
+ throw new _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError(scorm12_error_codes.INVALID_SET_VALUE);
}
/**
* Helper method, no reason to have to pass the same error codes every time
@@ -4618,7 +4627,7 @@ function throwInvalidValueError() {
function check12ValidFormat(value, regexPattern, allowEmptyString) {
- return (0, _common.checkValidFormat)(value, regexPattern, scorm12_error_codes.TYPE_MISMATCH, _exceptions.Scorm12ValidationError, allowEmptyString);
+ return (0,_common__WEBPACK_IMPORTED_MODULE_0__.checkValidFormat)(value, regexPattern, scorm12_error_codes.TYPE_MISMATCH, _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError, allowEmptyString);
}
/**
* Helper method, no reason to have to pass the same error codes every time
@@ -4628,15 +4637,13 @@ function check12ValidFormat(value, regexPattern, allowEmptyString) {
* @return {boolean}
*/
-
function check12ValidRange(value, rangePattern, allowEmptyString) {
- return (0, _common.checkValidRange)(value, rangePattern, scorm12_error_codes.VALUE_OUT_OF_RANGE, _exceptions.Scorm12ValidationError, allowEmptyString);
+ return (0,_common__WEBPACK_IMPORTED_MODULE_0__.checkValidRange)(value, rangePattern, scorm12_error_codes.VALUE_OUT_OF_RANGE, _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError, allowEmptyString);
}
/**
* Class representing the cmi object for SCORM 1.2
*/
-
var _children2 = /*#__PURE__*/new WeakMap();
var _version2 = /*#__PURE__*/new WeakMap();
@@ -4885,15 +4892,12 @@ var CMI = /*#__PURE__*/function (_BaseCMI) {
}]);
return CMI;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing the cmi.core object
* @extends BaseCMI
*/
-
-exports.CMI = CMI;
-
var _children3 = /*#__PURE__*/new WeakMap();
var _student_id = /*#__PURE__*/new WeakMap();
@@ -4993,13 +4997,13 @@ var CMICore = /*#__PURE__*/function (_BaseCMI2) {
value: ''
});
- _this2.score = new _common.CMIScore({
+ _this2.score = new _common__WEBPACK_IMPORTED_MODULE_0__.CMIScore({
score_children: scorm12_constants.score_children,
score_range: scorm12_regex.score_range,
invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,
invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,
invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,
- errorClass: _exceptions.Scorm12ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError
});
return _this2;
}
@@ -5266,10 +5270,10 @@ var CMICore = /*#__PURE__*/function (_BaseCMI2) {
if (typeof startTime !== 'undefined' && startTime !== null) {
var seconds = new Date().getTime() - startTime;
- sessionTime = Util.getSecondsAsHHMMSS(seconds / 1000);
+ sessionTime = _utilities__WEBPACK_IMPORTED_MODULE_5__.getSecondsAsHHMMSS(seconds / 1000);
}
- return Utilities.addHHMMSSTimeStrings(_classPrivateFieldGet(this, _total_time), sessionTime, new RegExp(scorm12_regex.CMITimespan));
+ return _utilities__WEBPACK_IMPORTED_MODULE_5__.addHHMMSSTimeStrings(_classPrivateFieldGet(this, _total_time), sessionTime, new RegExp(scorm12_regex.CMITimespan));
}
/**
* toJSON for cmi.core
@@ -5312,7 +5316,7 @@ var CMICore = /*#__PURE__*/function (_BaseCMI2) {
}]);
return CMICore;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 1.2's cmi.objectives object
* @extends CMIArray
@@ -5333,12 +5337,12 @@ var CMIObjectives = /*#__PURE__*/function (_CMIArray) {
return _super3.call(this, {
children: scorm12_constants.objectives_children,
errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError
});
}
return _createClass(CMIObjectives);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray);
/**
* Class representing SCORM 1.2's cmi.student_data object
* @extends BaseCMI
@@ -5495,15 +5499,12 @@ var CMIStudentData = /*#__PURE__*/function (_BaseCMI3) {
}]);
return CMIStudentData;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 1.2's cmi.student_preference object
* @extends BaseCMI
*/
-
-exports.CMIStudentData = CMIStudentData;
-
var _children5 = /*#__PURE__*/new WeakMap();
var _audio = /*#__PURE__*/new WeakMap();
@@ -5689,15 +5690,12 @@ var CMIStudentPreference = /*#__PURE__*/function (_BaseCMI4) {
}]);
return CMIStudentPreference;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 1.2's cmi.interactions object
* @extends BaseCMI
*/
-
-exports.CMIStudentPreference = CMIStudentPreference;
-
var CMIInteractions = /*#__PURE__*/function (_CMIArray2) {
_inherits(CMIInteractions, _CMIArray2);
@@ -5712,12 +5710,12 @@ var CMIInteractions = /*#__PURE__*/function (_CMIArray2) {
return _super6.call(this, {
children: scorm12_constants.interactions_children,
errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError
});
}
return _createClass(CMIInteractions);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray);
/**
* Class representing SCORM 1.2's cmi.interactions.n object
* @extends BaseCMI
@@ -5788,14 +5786,14 @@ var CMIInteractionsObject = /*#__PURE__*/function (_BaseCMI5) {
value: ''
});
- _this5.objectives = new _common.CMIArray({
+ _this5.objectives = new _common__WEBPACK_IMPORTED_MODULE_0__.CMIArray({
errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError,
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError,
children: scorm12_constants.objectives_children
});
- _this5.correct_responses = new _common.CMIArray({
+ _this5.correct_responses = new _common__WEBPACK_IMPORTED_MODULE_0__.CMIArray({
errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError,
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError,
children: scorm12_constants.correct_responses_children
});
return _this5;
@@ -5994,15 +5992,12 @@ var CMIInteractionsObject = /*#__PURE__*/function (_BaseCMI5) {
}]);
return CMIInteractionsObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 1.2's cmi.objectives.n object
* @extends BaseCMI
*/
-
-exports.CMIInteractionsObject = CMIInteractionsObject;
-
var _id2 = /*#__PURE__*/new WeakMap();
var _status = /*#__PURE__*/new WeakMap();
@@ -6032,13 +6027,13 @@ var CMIObjectivesObject = /*#__PURE__*/function (_BaseCMI6) {
value: ''
});
- _this6.score = new _common.CMIScore({
+ _this6.score = new _common__WEBPACK_IMPORTED_MODULE_0__.CMIScore({
score_children: scorm12_constants.score_children,
score_range: scorm12_regex.score_range,
invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,
invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,
invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,
- errorClass: _exceptions.Scorm12ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError
});
return _this6;
}
@@ -6109,15 +6104,12 @@ var CMIObjectivesObject = /*#__PURE__*/function (_BaseCMI6) {
}]);
return CMIObjectivesObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 1.2's cmi.interactions.n.objectives.n object
* @extends BaseCMI
*/
-
-exports.CMIObjectivesObject = CMIObjectivesObject;
-
var _id3 = /*#__PURE__*/new WeakMap();
var CMIInteractionsObjectivesObject = /*#__PURE__*/function (_BaseCMI7) {
@@ -6185,15 +6177,12 @@ var CMIInteractionsObjectivesObject = /*#__PURE__*/function (_BaseCMI7) {
}]);
return CMIInteractionsObjectivesObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 1.2's cmi.interactions.correct_responses.n object
* @extends BaseCMI
*/
-
-exports.CMIInteractionsObjectivesObject = CMIInteractionsObjectivesObject;
-
var _pattern = /*#__PURE__*/new WeakMap();
var CMIInteractionsCorrectResponsesObject = /*#__PURE__*/function (_BaseCMI8) {
@@ -6261,14 +6250,11 @@ var CMIInteractionsCorrectResponsesObject = /*#__PURE__*/function (_BaseCMI8) {
}]);
return CMIInteractionsCorrectResponsesObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class for AICC Navigation object
*/
-
-exports.CMIInteractionsCorrectResponsesObject = CMIInteractionsCorrectResponsesObject;
-
var _event = /*#__PURE__*/new WeakMap();
var NAV = /*#__PURE__*/function (_BaseCMI9) {
@@ -6336,18 +6322,18 @@ var NAV = /*#__PURE__*/function (_BaseCMI9) {
}]);
return NAV;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
-exports.NAV = NAV;
+/***/ }),
+
+/***/ "./src/constants/api_constants.js":
+/*!****************************************!*\
+ !*** ./src/constants/api_constants.js ***!
+ \****************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{"../constants/api_constants":8,"../constants/error_codes":9,"../constants/regex":10,"../exceptions":11,"../utilities":13,"./common":6}],8:[function(require,module,exports){
"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
+__webpack_require__.r(__webpack_exports__);
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -6562,17 +6548,18 @@ var APIConstants = {
aicc: aicc,
scorm2004: scorm2004
};
-var _default = APIConstants;
-exports["default"] = _default;
+/* harmony default export */ __webpack_exports__["default"] = (APIConstants);
+
+/***/ }),
+
+/***/ "./src/constants/error_codes.js":
+/*!**************************************!*\
+ !*** ./src/constants/error_codes.js ***!
+ \**************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{}],9:[function(require,module,exports){
"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
+__webpack_require__.r(__webpack_exports__);
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -6659,17 +6646,18 @@ var ErrorCodes = {
scorm12: scorm12,
scorm2004: scorm2004
};
-var _default = ErrorCodes;
-exports["default"] = _default;
+/* harmony default export */ __webpack_exports__["default"] = (ErrorCodes);
+
+/***/ }),
+
+/***/ "./src/constants/regex.js":
+/*!********************************!*\
+ !*** ./src/constants/regex.js ***!
+ \********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{}],10:[function(require,module,exports){
"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
+__webpack_require__.r(__webpack_exports__);
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -6763,23 +6751,27 @@ var Regex = {
scorm12: scorm12,
scorm2004: scorm2004
};
-var _default = Regex;
-exports["default"] = _default;
+/* harmony default export */ __webpack_exports__["default"] = (Regex);
+
+/***/ }),
+
+/***/ "./src/exceptions.js":
+/*!***************************!*\
+ !*** ./src/exceptions.js ***!
+ \***************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{}],11:[function(require,module,exports){
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "ValidationError": function() { return /* binding */ ValidationError; },
+/* harmony export */ "Scorm12ValidationError": function() { return /* binding */ Scorm12ValidationError; },
+/* harmony export */ "AICCValidationError": function() { return /* binding */ AICCValidationError; },
+/* harmony export */ "Scorm2004ValidationError": function() { return /* binding */ Scorm2004ValidationError; }
+/* harmony export */ });
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants/api_constants */ "./src/constants/api_constants.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.ValidationError = exports.Scorm2004ValidationError = exports.Scorm12ValidationError = exports.AICCValidationError = void 0;
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
@@ -6820,9 +6812,10 @@ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!priva
function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-var scorm12_errors = _api_constants["default"].scorm12.error_descriptions;
-var aicc_errors = _api_constants["default"].aicc.error_descriptions;
-var scorm2004_errors = _api_constants["default"].scorm2004.error_descriptions;
+
+var scorm12_errors = _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__["default"].scorm12.error_descriptions;
+var aicc_errors = _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__["default"].aicc.error_descriptions;
+var scorm2004_errors = _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__["default"].scorm2004.error_descriptions;
/**
* Base Validation Exception
*/
@@ -6913,9 +6906,6 @@ var ValidationError = /*#__PURE__*/function (_Error) {
* SCORM 1.2 Validation Error
*/
-
-exports.ValidationError = ValidationError;
-
var Scorm12ValidationError = /*#__PURE__*/function (_ValidationError) {
_inherits(Scorm12ValidationError, _ValidationError);
@@ -6945,9 +6935,6 @@ var Scorm12ValidationError = /*#__PURE__*/function (_ValidationError) {
* AICC Validation Error
*/
-
-exports.Scorm12ValidationError = Scorm12ValidationError;
-
var AICCValidationError = /*#__PURE__*/function (_ValidationError2) {
_inherits(AICCValidationError, _ValidationError2);
@@ -6977,9 +6964,6 @@ var AICCValidationError = /*#__PURE__*/function (_ValidationError2) {
* SCORM 2004 Validation Error
*/
-
-exports.AICCValidationError = AICCValidationError;
-
var Scorm2004ValidationError = /*#__PURE__*/function (_ValidationError3) {
_inherits(Scorm2004ValidationError, _ValidationError3);
@@ -7006,34 +6990,31 @@ var Scorm2004ValidationError = /*#__PURE__*/function (_ValidationError3) {
return _createClass(Scorm2004ValidationError);
}(ValidationError);
-exports.Scorm2004ValidationError = Scorm2004ValidationError;
+/***/ }),
+
+/***/ "./src/utilities.js":
+/*!**************************!*\
+ !*** ./src/utilities.js ***!
+ \**************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{"./constants/api_constants":8}],12:[function(require,module,exports){
"use strict";
-
-var _AICC = _interopRequireDefault(require("../AICC"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-window.AICC = _AICC["default"];
-
-},{"../AICC":2}],13:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.SECONDS_PER_SECOND = exports.SECONDS_PER_MINUTE = exports.SECONDS_PER_HOUR = exports.SECONDS_PER_DAY = void 0;
-exports.addHHMMSSTimeStrings = addHHMMSSTimeStrings;
-exports.addTwoDurations = addTwoDurations;
-exports.countDecimals = countDecimals;
-exports.flatten = flatten;
-exports.getDurationAsSeconds = getDurationAsSeconds;
-exports.getSecondsAsHHMMSS = getSecondsAsHHMMSS;
-exports.getSecondsAsISODuration = getSecondsAsISODuration;
-exports.getTimeAsSeconds = getTimeAsSeconds;
-exports.unflatten = unflatten;
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "SECONDS_PER_SECOND": function() { return /* binding */ SECONDS_PER_SECOND; },
+/* harmony export */ "SECONDS_PER_MINUTE": function() { return /* binding */ SECONDS_PER_MINUTE; },
+/* harmony export */ "SECONDS_PER_HOUR": function() { return /* binding */ SECONDS_PER_HOUR; },
+/* harmony export */ "SECONDS_PER_DAY": function() { return /* binding */ SECONDS_PER_DAY; },
+/* harmony export */ "getSecondsAsHHMMSS": function() { return /* binding */ getSecondsAsHHMMSS; },
+/* harmony export */ "getSecondsAsISODuration": function() { return /* binding */ getSecondsAsISODuration; },
+/* harmony export */ "getTimeAsSeconds": function() { return /* binding */ getTimeAsSeconds; },
+/* harmony export */ "getDurationAsSeconds": function() { return /* binding */ getDurationAsSeconds; },
+/* harmony export */ "addTwoDurations": function() { return /* binding */ addTwoDurations; },
+/* harmony export */ "addHHMMSSTimeStrings": function() { return /* binding */ addHHMMSSTimeStrings; },
+/* harmony export */ "flatten": function() { return /* binding */ flatten; },
+/* harmony export */ "unflatten": function() { return /* binding */ unflatten; },
+/* harmony export */ "countDecimals": function() { return /* binding */ countDecimals; }
+/* harmony export */ });
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -7047,13 +7028,9 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
var SECONDS_PER_SECOND = 1.0;
-exports.SECONDS_PER_SECOND = SECONDS_PER_SECOND;
var SECONDS_PER_MINUTE = 60;
-exports.SECONDS_PER_MINUTE = SECONDS_PER_MINUTE;
var SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE;
-exports.SECONDS_PER_HOUR = SECONDS_PER_HOUR;
var SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;
-exports.SECONDS_PER_DAY = SECONDS_PER_DAY;
var designations = [['D', SECONDS_PER_DAY], ['H', SECONDS_PER_HOUR], ['M', SECONDS_PER_MINUTE], ['S', SECONDS_PER_SECOND]];
/**
* Converts a Number to a String of HH:MM:SS
@@ -7095,7 +7072,6 @@ function getSecondsAsHHMMSS(totalSeconds) {
* @return {String}
*/
-
function getSecondsAsISODuration(seconds) {
// SCORM spec does not deal with negative durations, give zero back
if (!seconds || seconds <= 0) {
@@ -7140,7 +7116,6 @@ function getSecondsAsISODuration(seconds) {
* @return {number}
*/
-
function getTimeAsSeconds(timeString, timeRegex) {
if (!timeString || typeof timeString !== 'string' || !timeString.match(timeRegex)) {
return 0;
@@ -7160,7 +7135,6 @@ function getTimeAsSeconds(timeString, timeRegex) {
* @return {number}
*/
-
function getDurationAsSeconds(duration, durationRegex) {
if (!duration || !duration.match(durationRegex)) {
return 0;
@@ -7192,7 +7166,6 @@ function getDurationAsSeconds(duration, durationRegex) {
* @return {string}
*/
-
function addTwoDurations(first, second, durationRegex) {
return getSecondsAsISODuration(getDurationAsSeconds(first, durationRegex) + getDurationAsSeconds(second, durationRegex));
}
@@ -7205,7 +7178,6 @@ function addTwoDurations(first, second, durationRegex) {
* @return {string}
*/
-
function addHHMMSSTimeStrings(first, second, timeRegex) {
return getSecondsAsHHMMSS(getTimeAsSeconds(first, timeRegex) + getTimeAsSeconds(second, timeRegex));
}
@@ -7215,7 +7187,6 @@ function addHHMMSSTimeStrings(first, second, timeRegex) {
* @return {object}
*/
-
function flatten(data) {
var result = {};
/**
@@ -7255,7 +7226,6 @@ function flatten(data) {
* @return {object}
*/
-
function unflatten(data) {
'use strict';
@@ -7287,12 +7257,106 @@ function unflatten(data) {
* @return {number}
*/
-
function countDecimals(num) {
if (Math.floor(num) === num || String(num).indexOf('.') < 0) return 0;
var parts = num.toString().split('.')[1];
return parts.length || 0;
}
-},{}]},{},[12])
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLmRlYm91bmNlL2luZGV4LmpzIiwic3JjL0FJQ0MuanMiLCJzcmMvQmFzZUFQSS5qcyIsInNyYy9TY29ybTEyQVBJLmpzIiwic3JjL2NtaS9haWNjX2NtaS5qcyIsInNyYy9jbWkvY29tbW9uLmpzIiwic3JjL2NtaS9zY29ybTEyX2NtaS5qcyIsInNyYy9jb25zdGFudHMvYXBpX2NvbnN0YW50cy5qcyIsInNyYy9jb25zdGFudHMvZXJyb3JfY29kZXMuanMiLCJzcmMvY29uc3RhbnRzL3JlZ2V4LmpzIiwic3JjL2V4Y2VwdGlvbnMuanMiLCJzcmMvZXhwb3J0cy9haWNjLmpzIiwic3JjL3V0aWxpdGllcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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RUFBRTtBQUZWLEtBakJXO0FBcUJsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsNkJBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBckJXO0FBeUJsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsbUNBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBekJXO0FBNkJsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsK0JBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBN0JXO0FBaUNsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUscUNBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBakNXO0FBcUNsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsaUNBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBckNXO0FBeUNsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsa0NBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBekNXO0FBNkNsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsOEJBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBN0NXO0FBaURsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsOEJBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBakRXO0FBcURsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsMEJBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBckRXO0FBeURsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsd0JBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBekRXO0FBNkRsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUscUJBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBN0RXO0FBaUVsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUscUJBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBakVXO0FBcUVsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsd0JBRFQ7QUFFTCxNQUFBLGFBQWEsRUFB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UixRQUFBLEdBQUcsR0FBRyxHQUFHLENBQUMsSUFBRCxDQUFILEtBQWMsR0FBRyxDQUFDLElBQUQsQ0FBSCxHQUFhLENBQUMsQ0FBQyxDQUFELENBQUQsR0FBTyxFQUFQLEdBQVksRUFBdkMsQ0FBTjtBQUNBLFFBQUEsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFELENBQUQsSUFBUSxDQUFDLENBQUMsQ0FBRCxDQUFoQjtBQUNBLFFBQUEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFOLENBQVcsQ0FBWCxDQUFKO0FBQ0Q7O0FBQ0QsTUFBQSxHQUFHLENBQUMsSUFBRCxDQUFILEdBQVksSUFBSSxDQUFDLENBQUQsQ0FBaEI7QUFDRDtBQUNGOztBQUNELFNBQU8sTUFBTSxDQUFDLEVBQUQsQ0FBTixJQUFjLE1BQXJCO0FBQ0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTLGFBQVQsQ0FBdUIsR0FBdkIsRUFBb0M7QUFDekMsTUFBSSxJQUFJLENBQUMsS0FBTCxDQUFXLEdBQVgsTUFBb0IsR0FBcEIsSUFBMkIsTUFBTSxDQUFDLEdBQUQsQ0FBTixDQUFZLE9BQVosQ0FBb0IsR0FBcEIsSUFBMkIsQ0FBMUQsRUFBNkQsT0FBTyxDQUFQO0FBQzdELE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxRQUFKLEdBQWUsS0FBZixDQUFxQixHQUFyQixFQUEwQixDQUExQixDQUFkO0FBQ0EsU0FBTyxLQUFLLENBQUMsTUFBTixJQUFnQixDQUF2QjtBQUNEIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHRoZSBgVHlwZUVycm9yYCBtZXNzYWdlIGZvciBcIkZ1bmN0aW9uc1wiIG1ldGhvZHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBOQU4gPSAwIC8gMDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBEYXRlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTtcbiAqIH0sIF8ubm93KCkpO1xuICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAqL1xudmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcm9vdC5EYXRlLm5vdygpO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAqIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHdhc1xuICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG4gKiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYCBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGVcbiAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcbiAqIGNhbGxzIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgXG4gKiBpbnZvY2F0aW9uLlxuICpcbiAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gKlxuICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gKlxuICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZScsIF8uZGVib3VuY2UoY2FsY3VsYXRlTGF5b3V0LCAxNTApKTtcbiAqXG4gKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cbiAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmRlYm91bmNlKHNlbmRNYWlsLCAzMDAsIHtcbiAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICogICAndHJhaWxpbmcnOiBmYWxzZVxuICogfSkpO1xuICpcbiAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG4gKiB2YXIgZGVib3VuY2VkID0gXy5kZWJvdW5jZShiYXRjaExvZywgMjUwLCB7ICdtYXhXYWl0JzogMTAwMCB9KTtcbiAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxhc3RBcmdzLFxuICAgICAgbGFzdFRoaXMsXG4gICAgICBtYXhXYWl0LFxuICAgICAgcmVzdWx0LFxuICAgICAgdGltZXJJZCxcbiAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcbiAgICAgIGxlYWRpbmcgPSBmYWxzZSxcbiAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHdhaXQgPSB0b051bWJlcih3YWl0KSB8fCAwO1xuICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG4gICAgbWF4aW5nID0gJ21heFdhaXQnIGluIG9wdGlvbnM7XG4gICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgdGhpc0FyZyA9IGxhc3RUaGlzO1xuXG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gbGVhZGluZ0VkZ2UodGltZSkge1xuICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIC8vIFN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIHRyYWlsaW5nIGVkZ2UuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICByZXR1cm4gbGVhZGluZyA/IGludm9rZUZ1bmModGltZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICByZXN1bHQgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICByZXR1cm4gbWF4aW5nID8gbmF0aXZlTWluKHJlc3VsdCwgbWF4V2FpdCAtIHRpbWVTaW5jZUxhc3RJbnZva2UpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lO1xuXG4gICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIGFjdGl2aXR5IGhhcyBzdG9wcGVkIGFuZCB3ZSdyZSBhdCB0aGVcbiAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgIC8vIGl0IGFzIHRoZSB0cmFpbGluZyBlZGdlLCBvciB3ZSd2ZSBoaXQgdGhlIGBtYXhXYWl0YCBsaW1pdC5cbiAgICByZXR1cm4gKGxhc3RDYWxsVGltZSA9PT0gdW5kZWZpbmVkIHx8ICh0aW1lU2luY2VMYXN0Q2FsbCA+PSB3YWl0KSB8fFxuICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7XG4gICAgfVxuICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7XG4gICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICB9XG4gICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKSxcbiAgICAgICAgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTtcblxuICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lO1xuXG4gICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgICBpZiAobWF4aW5nKSB7XG4gICAgICAgIC8vIEhhbmRsZSBpbnZvY2F0aW9ucyBpbiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgIHJldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7XG4gIHJldHVybiBkZWJvdW5jZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocmVUcmltLCAnJyk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlYm91bmNlO1xuIiwiLy8gQGZsb3dcbmltcG9ydCBTY29ybTEyQVBJIGZyb20gJy4vU2Nvcm0xMkFQSSc7XG5pbXBvcnQge1xuICBDTUksXG4gIENNSUF0dGVtcHRSZWNvcmRzT2JqZWN0LFxuICBDTUlFdmFsdWF0aW9uQ29tbWVudHNPYmplY3QsXG4gIENNSVRyaWVzT2JqZWN0LFxufSBmcm9tICcuL2NtaS9haWNjX2NtaSc7XG5pbXBvcnQge05BVn0gZnJvbSAnLi9jbWkvc2Nvcm0xMl9jbWknO1xuXG4vKipcbiAqIFRoZSBBSUNDIEFQSSBjbGFzc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBSUNDIGV4dGVuZHMgU2Nvcm0xMkFQSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciB0byBjcmVhdGUgQUlDQyBBUEkgb2JqZWN0XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5nc1xuICAgKi9cbiAgY29uc3RydWN0b3Ioc2V0dGluZ3M6IHt9KSB7XG4gICAgY29uc3QgZmluYWxTZXR0aW5ncyA9IHtcbiAgICAgIC4uLntcbiAgICAgICAgbWFzdGVyeV9vdmVycmlkZTogZmFsc2UsXG4gICAgICB9LCAuLi5zZXR0aW5ncyxcbiAgICB9O1xuXG4gICAgc3VwZXIoZmluYWxTZXR0aW5ncyk7XG5cbiAgICB0aGlzLmNtaSA9IG5ldyBDTUkoKTtcbiAgICB0aGlzLm5hdiA9IG5ldyBOQVYoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIGJ1aWxkcyBhIG5ldyBjaGlsZCBlbGVtZW50IHRvIGFkZCB0byB0aGUgYXJyYXkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvdW5kRmlyc3RJbmRleFxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICBnZXRDaGlsZEVsZW1lbnQoQ01JRWxlbWVudCwgdmFsdWUsIGZvdW5kRmlyc3RJbmRleCkge1xuICAgIGxldCBuZXdDaGlsZCA9IHN1cGVyLmdldENoaWxkRWxlbWVudChDTUlFbGVtZW50LCB2YWx1ZSwgZm91bmRGaXJzdEluZGV4KTtcblxuICAgIGlmICghbmV3Q2hpbGQpIHtcbiAgICAgIGlmICh0aGlzLnN0cmluZ01hdGNoZXMoQ01JRWxlbWVudCwgJ2NtaVxcXFwuZXZhbHVhdGlvblxcXFwuY29tbWVudHNcXFxcLlxcXFxkKycpKSB7XG4gICAgICAgIG5ld0NoaWxkID0gbmV3IENNSUV2YWx1YXRpb25Db21tZW50c09iamVjdCgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnN0cmluZ01hdGNoZXMoQ01JRWxlbWVudCxcbiAgICAgICAgICAnY21pXFxcXC5zdHVkZW50X2RhdGFcXFxcLnRyaWVzXFxcXC5cXFxcZCsnKSkge1xuICAgICAgICBuZXdDaGlsZCA9IG5ldyBDTUlUcmllc09iamVjdCgpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnN0cmluZ01hdGNoZXMoQ01JRWxlbWVudCxcbiAgICAgICAgICAnY21pXFxcXC5zdHVkZW50X2RhdGFcXFxcLmF0dGVtcHRfcmVjb3Jkc1xcXFwuXFxcXGQrJykpIHtcbiAgICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JQXR0ZW1wdFJlY29yZHNPYmplY3QoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3Q2hpbGQ7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgd2hvbGUgQVBJIHdpdGggYW5vdGhlclxuICAgKlxuICAgKiBAcGFyYW0ge0FJQ0N9IG5ld0FQSVxuICAgKi9cbiAgcmVwbGFjZVdpdGhBbm90aGVyU2Nvcm1BUEkobmV3QVBJKSB7XG4gICAgLy8gRGF0YSBNb2RlbFxuICAgIHRoaXMuY21pID0gbmV3QVBJLmNtaTtcbiAgICB0aGlzLm5hdiA9IG5ld0FQSS5uYXY7XG4gIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQge0NNSUFycmF5fSBmcm9tICcuL2NtaS9jb21tb24nO1xuaW1wb3J0IHtWYWxpZGF0aW9uRXJyb3J9IGZyb20gJy4vZXhjZXB0aW9ucyc7XG5pbXBvcnQgRXJyb3JDb2RlcyBmcm9tICcuL2NvbnN0YW50cy9lcnJvcl9jb2Rlcyc7XG5pbXBvcnQgQVBJQ29uc3RhbnRzIGZyb20gJy4vY29uc3RhbnRzL2FwaV9jb25zdGFudHMnO1xuaW1wb3J0IHt1bmZsYXR0ZW59IGZyb20gJy4vdXRpbGl0aWVzJztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICdsb2Rhc2guZGVib3VuY2UnO1xuXG5jb25zdCBnbG9iYWxfY29uc3RhbnRzID0gQVBJQ29uc3RhbnRzLmdsb2JhbDtcbmNvbnN0IHNjb3JtMTJfZXJyb3JfY29kZXMgPSBFcnJvckNvZGVzLnNjb3JtMTI7XG5cbi8qKlxuICogQmFzZSBBUEkgY2xhc3MgZm9yIEFJQ0MsIFNDT1JNIDEuMiwgYW5kIFNDT1JNIDIwMDQuIFNob3VsZCBiZSBjb25zaWRlcmVkXG4gKiBhYnN0cmFjdCwgYW5kIG5ldmVyIGluaXRpYWxpemVkIG9uIGl0J3Mgb3duLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlQVBJIHtcbiAgI3RpbWVvdXQ7XG4gICNlcnJvcl9jb2RlcztcbiAgI3NldHRpbmdzID0ge1xuICAgIGF1dG9jb21taXQ6IGZhbHNlLFxuICAgIGF1dG9jb21taXRTZWNvbmRzOiAxMCxcbiAgICBhc3luY0NvbW1pdDogZmFsc2UsXG4gICAgc2VuZEJlYWNvbkNvbW1pdDogZmFsc2UsXG4gICAgbG1zQ29tbWl0VXJsOiBmYWxzZSxcbiAgICBkYXRhQ29tbWl0Rm9ybWF0OiAnanNvbicsIC8vIHZhbGlkIGZvcm1hdHMgYXJlICdqc29uJyBvciAnZmxhdHRlbmVkJywgJ3BhcmFtcydcbiAgICBjb21taXRSZXF1ZXN0RGF0YVR5cGU6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLFxuICAgIGF1dG9Qcm9ncmVzczogZmFsc2UsXG4gICAgbG9nTGV2ZWw6IGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0VSUk9SLFxuICAgIHNlbGZSZXBvcnRTZXNzaW9uVGltZTogZmFsc2UsXG4gICAgYWx3YXlzU2VuZFRvdGFsVGltZTogZmFsc2UsXG4gICAgc3RyaWN0X2Vycm9yczogdHJ1ZSxcbiAgICB4aHJIZWFkZXJzOiB7fSxcbiAgICB4aHJXaXRoQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgIHJlc3BvbnNlSGFuZGxlcjogZnVuY3Rpb24oeGhyKSB7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgaWYgKHR5cGVvZiB4aHIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgIXt9Lmhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCAncmVzdWx0JykpIHtcbiAgICAgICAgICByZXN1bHQgPSB7fTtcbiAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXN1bHQucmVzdWx0ID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFO1xuICAgICAgICAgICAgcmVzdWx0LmVycm9yQ29kZSA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5yZXN1bHQgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuICAgICAgICAgICAgcmVzdWx0LmVycm9yQ29kZSA9IDEwMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICBvbkxvZ01lc3NhZ2U6IGZ1bmN0aW9uKG1lc3NhZ2VMZXZlbCwgbG9nTWVzc2FnZSkge1xuICAgICAgc3dpdGNoIChtZXNzYWdlTGV2ZWwpIHtcbiAgICAgICAgY2FzZSBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9FUlJPUjpcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX1dBUk5JTkc6XG4gICAgICAgICAgY29uc29sZS53YXJuKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0lORk86XG4gICAgICAgICAgY29uc29sZS5pbmZvKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0RFQlVHOlxuICAgICAgICAgIGlmIChjb25zb2xlLmRlYnVnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhsb2dNZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbiAgY21pO1xuICBzdGFydGluZ0RhdGE6IHt9O1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgQmFzZSBBUEkgY2xhc3MuIFNldHMgc29tZSBzaGFyZWQgQVBJIGZpZWxkcywgYXMgd2VsbCBhc1xuICAgKiBzZXRzIHVwIG9wdGlvbnMgZm9yIHRoZSBBUEkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBlcnJvcl9jb2Rlc1xuICAgKiBAcGFyYW0ge29iamVjdH0gc2V0dGluZ3NcbiAgICovXG4gIGNvbnN0cnVjdG9yKGVycm9yX2NvZGVzLCBzZXR0aW5ncykge1xuICAgIGlmIChuZXcudGFyZ2V0ID09PSBCYXNlQVBJKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29uc3RydWN0IEJhc2VBUEkgaW5zdGFuY2VzIGRpcmVjdGx5Jyk7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudFN0YXRlID0gZ2xvYmFsX2NvbnN0YW50cy5TVEFURV9OT1RfSU5JVElBTElaRUQ7XG4gICAgdGhpcy5sYXN0RXJyb3JDb2RlID0gMDtcbiAgICB0aGlzLmxpc3RlbmVyQXJyYXkgPSBbXTtcblxuICAgIHRoaXMuI3RpbWVvdXQgPSBudWxsO1xuICAgIHRoaXMuI2Vycm9yX2NvZGVzID0gZXJyb3JfY29kZXM7XG5cbiAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgdGhpcy5hcGlMb2dMZXZlbCA9IHRoaXMuc2V0dGluZ3MubG9nTGV2ZWw7XG4gICAgdGhpcy5zZWxmUmVwb3J0U2Vzc2lvblRpbWUgPSB0aGlzLnNldHRpbmdzLnNlbGZSZXBvcnRTZXNzaW9uVGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBBUElcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrTmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5pdGlhbGl6ZU1lc3NhZ2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlcm1pbmF0aW9uTWVzc2FnZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBpbml0aWFsaXplKFxuICAgICAgY2FsbGJhY2tOYW1lOiBTdHJpbmcsXG4gICAgICBpbml0aWFsaXplTWVzc2FnZT86IFN0cmluZyxcbiAgICAgIHRlcm1pbmF0aW9uTWVzc2FnZT86IFN0cmluZykge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0U7XG5cbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKCkpIHtcbiAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHRoaXMuI2Vycm9yX2NvZGVzLklOSVRJQUxJWkVELCBpbml0aWFsaXplTWVzc2FnZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzVGVybWluYXRlZCgpKSB7XG4gICAgICB0aGlzLnRocm93U0NPUk1FcnJvcih0aGlzLiNlcnJvcl9jb2Rlcy5URVJNSU5BVEVELCB0ZXJtaW5hdGlvbk1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5zZWxmUmVwb3J0U2Vzc2lvblRpbWUpIHtcbiAgICAgICAgdGhpcy5jbWkuc2V0U3RhcnRUaW1lKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3VycmVudFN0YXRlID0gZ2xvYmFsX2NvbnN0YW50cy5TVEFURV9JTklUSUFMSVpFRDtcbiAgICAgIHRoaXMubGFzdEVycm9yQ29kZSA9IDA7XG4gICAgICByZXR1cm5WYWx1ZSA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fVFJVRTtcbiAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycyhjYWxsYmFja05hbWUpO1xuICAgIH1cblxuICAgIHRoaXMuYXBpTG9nKGNhbGxiYWNrTmFtZSwgbnVsbCwgJ3JldHVybmVkOiAnICsgcmV0dXJuVmFsdWUsXG4gICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0lORk8pO1xuICAgIHRoaXMuY2xlYXJTQ09STUVycm9yKHJldHVyblZhbHVlKTtcblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNlcnJvcl9jb2Rlc1xuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICBnZXQgZXJyb3JfY29kZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2Vycm9yX2NvZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3NldHRpbmdzXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIGdldCBzZXR0aW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy4jc2V0dGluZ3M7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc2V0dGluZ3NcbiAgICogQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzXG4gICAqL1xuICBzZXQgc2V0dGluZ3Moc2V0dGluZ3M6IE9iamVjdCkge1xuICAgIHRoaXMuI3NldHRpbmdzID0gey4uLnRoaXMuI3NldHRpbmdzLCAuLi5zZXR0aW5nc307XG4gIH1cblxuICAvKipcbiAgICogVGVybWluYXRlcyB0aGUgY3VycmVudCBydW4gb2YgdGhlIEFQSVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2tOYW1lXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tUZXJtaW5hdGVkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRlcm1pbmF0ZShcbiAgICAgIGNhbGxiYWNrTmFtZTogU3RyaW5nLFxuICAgICAgY2hlY2tUZXJtaW5hdGVkOiBib29sZWFuKSB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcblxuICAgIGlmICh0aGlzLmNoZWNrU3RhdGUoY2hlY2tUZXJtaW5hdGVkLFxuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5URVJNSU5BVElPTl9CRUZPUkVfSU5JVCxcbiAgICAgICAgdGhpcy4jZXJyb3JfY29kZXMuTVVMVElQTEVfVEVSTUlOQVRJT04pKSB7XG4gICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IGdsb2JhbF9jb25zdGFudHMuU1RBVEVfVEVSTUlOQVRFRDtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zdG9yZURhdGEodHJ1ZSk7XG4gICAgICBpZiAoIXRoaXMuc2V0dGluZ3Muc2VuZEJlYWNvbkNvbW1pdCAmJiAhdGhpcy5zZXR0aW5ncy5hc3luY0NvbW1pdCAmJlxuICAgICAgICAgIHR5cGVvZiByZXN1bHQuZXJyb3JDb2RlICE9PSAndW5kZWZpbmVkJyAmJiByZXN1bHQuZXJyb3JDb2RlID4gMCkge1xuICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihyZXN1bHQuZXJyb3JDb2RlKTtcbiAgICAgIH1cbiAgICAgIHJldHVyblZhbHVlID0gKHR5cGVvZiByZXN1bHQgIT09ICd1bmRlZmluZWQnICYmIHJlc3VsdC5yZXN1bHQpID9cbiAgICAgICAgICByZXN1bHQucmVzdWx0IDogZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcblxuICAgICAgaWYgKGNoZWNrVGVybWluYXRlZCkgdGhpcy5sYXN0RXJyb3JDb2RlID0gMDtcblxuICAgICAgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX1RSVUU7XG4gICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoY2FsbGJhY2tOYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLmFwaUxvZyhjYWxsYmFja05hbWUsIG51bGwsICdyZXR1cm5lZDogJyArIHJldHVyblZhbHVlLFxuICAgICAgICBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9JTkZPKTtcbiAgICB0aGlzLmNsZWFyU0NPUk1FcnJvcihyZXR1cm5WYWx1ZSk7XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgQ01JRWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrTmFtZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNoZWNrVGVybWluYXRlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXRWYWx1ZShcbiAgICAgIGNhbGxiYWNrTmFtZTogU3RyaW5nLFxuICAgICAgY2hlY2tUZXJtaW5hdGVkOiBib29sZWFuLFxuICAgICAgQ01JRWxlbWVudDogU3RyaW5nKSB7XG4gICAgbGV0IHJldHVyblZhbHVlO1xuXG4gICAgaWYgKHRoaXMuY2hlY2tTdGF0ZShjaGVja1Rlcm1pbmF0ZWQsXG4gICAgICAgIHRoaXMuI2Vycm9yX2NvZGVzLlJFVFJJRVZFX0JFRk9SRV9JTklULFxuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5SRVRSSUVWRV9BRlRFUl9URVJNKSkge1xuICAgICAgaWYgKGNoZWNrVGVybWluYXRlZCkgdGhpcy5sYXN0RXJyb3JDb2RlID0gMDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVyblZhbHVlID0gdGhpcy5nZXRDTUlWYWx1ZShDTUlFbGVtZW50KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgICB0aGlzLmxhc3RFcnJvckNvZGUgPSBlLmVycm9yQ29kZTtcbiAgICAgICAgICByZXR1cm5WYWx1ZSA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGUubWVzc2FnZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlLm1lc3NhZ2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcih0aGlzLiNlcnJvcl9jb2Rlcy5HRU5FUkFMKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKGNhbGxiYWNrTmFtZSwgQ01JRWxlbWVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCBDTUlFbGVtZW50LCAnOiByZXR1cm5lZDogJyArIHJldHVyblZhbHVlLFxuICAgICAgICBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9JTkZPKTtcbiAgICB0aGlzLmNsZWFyU0NPUk1FcnJvcihyZXR1cm5WYWx1ZSk7XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIENNSUVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsYmFja05hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1pdENhbGxiYWNrXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tUZXJtaW5hdGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgc2V0VmFsdWUoXG4gICAgICBjYWxsYmFja05hbWU6IFN0cmluZyxcbiAgICAgIGNvbW1pdENhbGxiYWNrOiBTdHJpbmcsXG4gICAgICBjaGVja1Rlcm1pbmF0ZWQ6IGJvb2xlYW4sXG4gICAgICBDTUlFbGVtZW50LFxuICAgICAgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgICBsZXQgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuXG4gICAgaWYgKHRoaXMuY2hlY2tTdGF0ZShjaGVja1Rlcm1pbmF0ZWQsIHRoaXMuI2Vycm9yX2NvZGVzLlNUT1JFX0JFRk9SRV9JTklULFxuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5TVE9SRV9BRlRFUl9URVJNKSkge1xuICAgICAgaWYgKGNoZWNrVGVybWluYXRlZCkgdGhpcy5sYXN0RXJyb3JDb2RlID0gMDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVyblZhbHVlID0gdGhpcy5zZXRDTUlWYWx1ZShDTUlFbGVtZW50LCB2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICAgICAgdGhpcy5sYXN0RXJyb3JDb2RlID0gZS5lcnJvckNvZGU7XG4gICAgICAgICAgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChlLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IodGhpcy4jZXJyb3JfY29kZXMuR0VORVJBTCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycyhjYWxsYmFja05hbWUsIENNSUVsZW1lbnQsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAocmV0dXJuVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGRpZG4ndCBoYXZlIGFueSBlcnJvcnMgd2hpbGUgc2V0dGluZyB0aGUgZGF0YSwgZ28gYWhlYWQgYW5kXG4gICAgLy8gc2NoZWR1bGUgYSBjb21taXQsIGlmIGF1dG9jb21taXQgaXMgdHVybmVkIG9uXG4gICAgaWYgKFN0cmluZyh0aGlzLmxhc3RFcnJvckNvZGUpID09PSAnMCcpIHtcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzLmF1dG9jb21taXQgJiYgIXRoaXMuI3RpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZUNvbW1pdCh0aGlzLnNldHRpbmdzLmF1dG9jb21taXRTZWNvbmRzICogMTAwMCwgY29tbWl0Q2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYXBpTG9nKGNhbGxiYWNrTmFtZSwgQ01JRWxlbWVudCxcbiAgICAgICAgJzogJyArIHZhbHVlICsgJzogcmVzdWx0OiAnICsgcmV0dXJuVmFsdWUsXG4gICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0lORk8pO1xuICAgIHRoaXMuY2xlYXJTQ09STUVycm9yKHJldHVyblZhbHVlKTtcblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcmRlcnMgTE1TIHRvIHN0b3JlIGFsbCBjb250ZW50IHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrTmFtZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNoZWNrVGVybWluYXRlZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBjb21taXQoXG4gICAgICBjYWxsYmFja05hbWU6IFN0cmluZyxcbiAgICAgIGNoZWNrVGVybWluYXRlZDogYm9vbGVhbikge1xuICAgIHRoaXMuY2xlYXJTY2hlZHVsZWRDb21taXQoKTtcblxuICAgIGxldCByZXR1cm5WYWx1ZSA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0U7XG5cbiAgICBpZiAodGhpcy5jaGVja1N0YXRlKGNoZWNrVGVybWluYXRlZCwgdGhpcy4jZXJyb3JfY29kZXMuQ09NTUlUX0JFRk9SRV9JTklULFxuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5DT01NSVRfQUZURVJfVEVSTSkpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc3RvcmVEYXRhKGZhbHNlKTtcbiAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5zZW5kQmVhY29uQ29tbWl0ICYmICF0aGlzLnNldHRpbmdzLmFzeW5jQ29tbWl0ICYmXG4gICAgICAgICAgcmVzdWx0LmVycm9yQ29kZSAmJiByZXN1bHQuZXJyb3JDb2RlID4gMCkge1xuICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihyZXN1bHQuZXJyb3JDb2RlKTtcbiAgICAgIH1cbiAgICAgIHJldHVyblZhbHVlID0gKHR5cGVvZiByZXN1bHQgIT09ICd1bmRlZmluZWQnICYmIHJlc3VsdC5yZXN1bHQpID9cbiAgICAgICAgICByZXN1bHQucmVzdWx0IDogZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcblxuICAgICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCAnSHR0cFJlcXVlc3QnLCAnIFJlc3VsdDogJyArIHJldHVyblZhbHVlLFxuICAgICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0RFQlVHKTtcblxuICAgICAgaWYgKGNoZWNrVGVybWluYXRlZCkgdGhpcy5sYXN0RXJyb3JDb2RlID0gMDtcblxuICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKGNhbGxiYWNrTmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCBudWxsLCAncmV0dXJuZWQ6ICcgKyByZXR1cm5WYWx1ZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG4gICAgdGhpcy5jbGVhclNDT1JNRXJyb3IocmV0dXJuVmFsdWUpO1xuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbGFzdCBlcnJvciBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsYmFja05hbWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0TGFzdEVycm9yKGNhbGxiYWNrTmFtZTogU3RyaW5nKSB7XG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSBTdHJpbmcodGhpcy5sYXN0RXJyb3JDb2RlKTtcblxuICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycyhjYWxsYmFja05hbWUpO1xuXG4gICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCBudWxsLCAncmV0dXJuZWQ6ICcgKyByZXR1cm5WYWx1ZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXJyb3JOdW1iZXIgZXJyb3IgZGVzY3JpcHRpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrTmFtZVxuICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gQ01JRXJyb3JDb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldEVycm9yU3RyaW5nKGNhbGxiYWNrTmFtZTogU3RyaW5nLCBDTUlFcnJvckNvZGUpIHtcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSAnJztcblxuICAgIGlmIChDTUlFcnJvckNvZGUgIT09IG51bGwgJiYgQ01JRXJyb3JDb2RlICE9PSAnJykge1xuICAgICAgcmV0dXJuVmFsdWUgPSB0aGlzLmdldExtc0Vycm9yTWVzc2FnZURldGFpbHMoQ01JRXJyb3JDb2RlKTtcbiAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycyhjYWxsYmFja05hbWUpO1xuICAgIH1cblxuICAgIHRoaXMuYXBpTG9nKGNhbGxiYWNrTmFtZSwgbnVsbCwgJ3JldHVybmVkOiAnICsgcmV0dXJuVmFsdWUsXG4gICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0lORk8pO1xuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb21wcmVoZW5zaXZlIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvck51bWJlciBlcnJvci5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrTmFtZVxuICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gQ01JRXJyb3JDb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldERpYWdub3N0aWMoY2FsbGJhY2tOYW1lOiBTdHJpbmcsIENNSUVycm9yQ29kZSkge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuXG4gICAgaWYgKENNSUVycm9yQ29kZSAhPT0gbnVsbCAmJiBDTUlFcnJvckNvZGUgIT09ICcnKSB7XG4gICAgICByZXR1cm5WYWx1ZSA9IHRoaXMuZ2V0TG1zRXJyb3JNZXNzYWdlRGV0YWlscyhDTUlFcnJvckNvZGUsIHRydWUpO1xuICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKGNhbGxiYWNrTmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCBudWxsLCAncmV0dXJuZWQ6ICcgKyByZXR1cm5WYWx1ZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHRoZSBMTVMgc3RhdGUgYW5kIGVuc3VyZXMgaXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tUZXJtaW5hdGVkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBiZWZvcmVJbml0RXJyb3JcbiAgICogQHBhcmFtIHtudW1iZXJ9IGFmdGVyVGVybUVycm9yXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBjaGVja1N0YXRlKFxuICAgICAgY2hlY2tUZXJtaW5hdGVkOiBib29sZWFuLFxuICAgICAgYmVmb3JlSW5pdEVycm9yOiBudW1iZXIsXG4gICAgICBhZnRlclRlcm1FcnJvcj86IG51bWJlcikge1xuICAgIGlmICh0aGlzLmlzTm90SW5pdGlhbGl6ZWQoKSkge1xuICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IoYmVmb3JlSW5pdEVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGNoZWNrVGVybWluYXRlZCAmJiB0aGlzLmlzVGVybWluYXRlZCgpKSB7XG4gICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihhZnRlclRlcm1FcnJvcik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogTG9nZ2luZyBmb3IgYWxsIFNDT1JNIGFjdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uTmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9nTWVzc2FnZVxuICAgKiBAcGFyYW0ge251bWJlcn1tZXNzYWdlTGV2ZWxcbiAgICovXG4gIGFwaUxvZyhcbiAgICAgIGZ1bmN0aW9uTmFtZTogU3RyaW5nLFxuICAgICAgQ01JRWxlbWVudDogU3RyaW5nLFxuICAgICAgbG9nTWVzc2FnZTogU3RyaW5nLFxuICAgICAgbWVzc2FnZUxldmVsOiBudW1iZXIpIHtcbiAgICBsb2dNZXNzYWdlID0gdGhpcy5mb3JtYXRNZXNzYWdlKGZ1bmN0aW9uTmFtZSwgQ01JRWxlbWVudCwgbG9nTWVzc2FnZSk7XG5cbiAgICBpZiAobWVzc2FnZUxldmVsID49IHRoaXMuYXBpTG9nTGV2ZWwpIHtcbiAgICAgIHRoaXMuc2V0dGluZ3Mub25Mb2dNZXNzYWdlKG1lc3NhZ2VMZXZlbCwgbG9nTWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgdGhlIFNDT1JNIG1lc3NhZ2VzIGZvciBlYXN5IHJlYWRpbmdcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uTmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBmb3JtYXRNZXNzYWdlKGZ1bmN0aW9uTmFtZTogU3RyaW5nLCBDTUlFbGVtZW50OiBTdHJpbmcsIG1lc3NhZ2U6IFN0cmluZykge1xuICAgIGNvbnN0IGJhc2VMZW5ndGggPSAyMDtcbiAgICBsZXQgbWVzc2FnZVN0cmluZyA9ICcnO1xuXG4gICAgbWVzc2FnZVN0cmluZyArPSBmdW5jdGlvbk5hbWU7XG5cbiAgICBsZXQgZmlsbENoYXJzID0gYmFzZUxlbmd0aCAtIG1lc3NhZ2VTdHJpbmcubGVuZ3RoO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxsQ2hhcnM7IGkrKykge1xuICAgICAgbWVzc2FnZVN0cmluZyArPSAnICc7XG4gICAgfVxuXG4gICAgbWVzc2FnZVN0cmluZyArPSAnOiAnO1xuXG4gICAgaWYgKENNSUVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IENNSUVsZW1lbnRCYXNlTGVuZ3RoID0gNzA7XG5cbiAgICAgIG1lc3NhZ2VTdHJpbmcgKz0gQ01JRWxlbWVudDtcblxuICAgICAgZmlsbENoYXJzID0gQ01JRWxlbWVudEJhc2VMZW5ndGggLSBtZXNzYWdlU3RyaW5nLmxlbmd0aDtcblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBmaWxsQ2hhcnM7IGorKykge1xuICAgICAgICBtZXNzYWdlU3RyaW5nICs9ICcgJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZSkge1xuICAgICAgbWVzc2FnZVN0cmluZyArPSBtZXNzYWdlO1xuICAgIH1cblxuICAgIHJldHVybiBtZXNzYWdlU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB0byBzZWUgaWYge3N0cn0gY29udGFpbnMge3Rlc3Rlcn1cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciBTdHJpbmcgdG8gY2hlY2sgYWdhaW5zdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdGVyIFN0cmluZyB0byBjaGVjayBmb3JcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIHN0cmluZ01hdGNoZXMoc3RyOiBTdHJpbmcsIHRlc3RlcjogU3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ciAmJiB0ZXN0ZXIgJiYgc3RyLm1hdGNoKHRlc3Rlcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBzcGVjaWZpYyBvYmplY3QgaGFzIHRoZSBnaXZlbiBwcm9wZXJ0eVxuICAgKiBAcGFyYW0geyp9IHJlZk9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2hlY2tPYmplY3RIYXNQcm9wZXJ0eShyZWZPYmplY3QsIGF0dHJpYnV0ZTogU3RyaW5nKSB7XG4gICAgcmV0dXJuIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlZk9iamVjdCwgYXR0cmlidXRlKSB8fFxuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHJlZk9iamVjdCksIGF0dHJpYnV0ZSkgfHxcbiAgICAgICAgKGF0dHJpYnV0ZSBpbiByZWZPYmplY3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG1lc3NhZ2UgdGhhdCBjb3JyZXNwb25kcyB0byBlcnJvck51bWJlclxuICAgKiBBUElzIHRoYXQgaW5oZXJpdCBCYXNlQVBJIHNob3VsZCBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpfSBfZXJyb3JOdW1iZXJcbiAgICogQHBhcmFtIHtib29sZWFufSBfZGV0YWlsXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBnZXRMbXNFcnJvck1lc3NhZ2VEZXRhaWxzKF9lcnJvck51bWJlciwgX2RldGFpbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSBnZXRMbXNFcnJvck1lc3NhZ2VEZXRhaWxzIG1ldGhvZCBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmljIGVsZW1lbnQuXG4gICAqIEFQSXMgdGhhdCBpbmhlcml0IEJhc2VBUEkgc2hvdWxkIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IF9DTUlFbGVtZW50XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBnZXRDTUlWYWx1ZShfQ01JRWxlbWVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGdldENNSVZhbHVlIG1ldGhvZCBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmljIGVsZW1lbnQuXG4gICAqIEFQSXMgdGhhdCBpbmhlcml0IEJhc2VBUEkgc2hvdWxkIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IF9DTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7YW55fSBfdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIHNldENNSVZhbHVlKF9DTUlFbGVtZW50LCBfdmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBzZXRDTUlWYWx1ZSBtZXRob2QgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmVkIEFQSSBtZXRob2QgdG8gc2V0IGEgdmFsaWQgZm9yIGEgZ2l2ZW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAgICogQHBhcmFtIHtib29sZWFufSBzY29ybTIwMDRcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBfY29tbW9uU2V0Q01JVmFsdWUoXG4gICAgICBtZXRob2ROYW1lOiBTdHJpbmcsIHNjb3JtMjAwNDogYm9vbGVhbiwgQ01JRWxlbWVudCwgdmFsdWUpIHtcbiAgICBpZiAoIUNNSUVsZW1lbnQgfHwgQ01JRWxlbWVudCA9PT0gJycpIHtcbiAgICAgIHJldHVybiBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cnVjdHVyZSA9IENNSUVsZW1lbnQuc3BsaXQoJy4nKTtcbiAgICBsZXQgcmVmT2JqZWN0ID0gdGhpcztcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuICAgIGxldCBmb3VuZEZpcnN0SW5kZXggPSBmYWxzZTtcblxuICAgIGNvbnN0IGludmFsaWRFcnJvck1lc3NhZ2UgPSBgVGhlIGRhdGEgbW9kZWwgZWxlbWVudCBwYXNzZWQgdG8gJHttZXRob2ROYW1lfSAoJHtDTUlFbGVtZW50fSkgaXMgbm90IGEgdmFsaWQgU0NPUk0gZGF0YSBtb2RlbCBlbGVtZW50LmA7XG4gICAgY29uc3QgaW52YWxpZEVycm9yQ29kZSA9IHNjb3JtMjAwNCA/XG4gICAgICAgIHRoaXMuI2Vycm9yX2NvZGVzLlVOREVGSU5FRF9EQVRBX01PREVMIDpcbiAgICAgICAgdGhpcy4jZXJyb3JfY29kZXMuR0VORVJBTDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RydWN0dXJlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSBzdHJ1Y3R1cmVbaV07XG5cbiAgICAgIGlmIChpID09PSBzdHJ1Y3R1cmUubGVuZ3RoIC0gMSkge1xuICAgICAgICBpZiAoc2Nvcm0yMDA0ICYmIChhdHRyaWJ1dGUuc3Vic3RyKDAsIDgpID09PSAne3RhcmdldD0nKSAmJlxuICAgICAgICAgICAgKHR5cGVvZiByZWZPYmplY3QuX2lzVGFyZ2V0VmFsaWQgPT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcih0aGlzLiNlcnJvcl9jb2Rlcy5SRUFEX09OTFlfRUxFTUVOVCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2NoZWNrT2JqZWN0SGFzUHJvcGVydHkocmVmT2JqZWN0LCBhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IoaW52YWxpZEVycm9yQ29kZSwgaW52YWxpZEVycm9yTWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCgpICYmXG4gICAgICAgICAgICAgIHRoaXMuc3RyaW5nTWF0Y2hlcyhDTUlFbGVtZW50LCAnXFxcXC5jb3JyZWN0X3Jlc3BvbnNlc1xcXFwuXFxcXGQrJykpIHtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGVDb3JyZWN0UmVzcG9uc2UoQ01JRWxlbWVudCwgdmFsdWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghc2Nvcm0yMDA0IHx8IHRoaXMubGFzdEVycm9yQ29kZSA9PT0gMCkge1xuICAgICAgICAgICAgcmVmT2JqZWN0W2F0dHJpYnV0ZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVyblZhbHVlID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVmT2JqZWN0ID0gcmVmT2JqZWN0W2F0dHJpYnV0ZV07XG4gICAgICAgIGlmICghcmVmT2JqZWN0KSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IoaW52YWxpZEVycm9yQ29kZSwgaW52YWxpZEVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVmT2JqZWN0IGluc3RhbmNlb2YgQ01JQXJyYXkpIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KHN0cnVjdHVyZVtpICsgMV0sIDEwKTtcblxuICAgICAgICAgIC8vIFNDTyBpcyB0cnlpbmcgdG8gc2V0IGFuIGl0ZW0gb24gYW4gYXJyYXlcbiAgICAgICAgICBpZiAoIWlzTmFOKGluZGV4KSkge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHJlZk9iamVjdC5jaGlsZEFycmF5W2luZGV4XTtcblxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgcmVmT2JqZWN0ID0gaXRlbTtcbiAgICAgICAgICAgICAgZm91bmRGaXJzdEluZGV4ID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld0NoaWxkID0gdGhpcy5nZXRDaGlsZEVsZW1lbnQoQ01JRWxlbWVudCwgdmFsdWUsXG4gICAgICAgICAgICAgICAgICBmb3VuZEZpcnN0SW5kZXgpO1xuICAgICAgICAgICAgICBmb3VuZEZpcnN0SW5kZXggPSB0cnVlO1xuXG4gICAgICAgICAgICAgIGlmICghbmV3Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihpbnZhbGlkRXJyb3JDb2RlLCBpbnZhbGlkRXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocmVmT2JqZWN0LmluaXRpYWxpemVkKSBuZXdDaGlsZC5pbml0aWFsaXplKCk7XG5cbiAgICAgICAgICAgICAgICByZWZPYmplY3QuY2hpbGRBcnJheS5wdXNoKG5ld0NoaWxkKTtcbiAgICAgICAgICAgICAgICByZWZPYmplY3QgPSBuZXdDaGlsZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBIYXZlIHRvIHVwZGF0ZSBpIHZhbHVlIHRvIHNraXAgdGhlIGFycmF5IHBvc2l0aW9uXG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJldHVyblZhbHVlID09PSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFKSB7XG4gICAgICB0aGlzLmFwaUxvZyhtZXRob2ROYW1lLCBudWxsLFxuICAgICAgICAgIGBUaGVyZSB3YXMgYW4gZXJyb3Igc2V0dGluZyB0aGUgdmFsdWUgZm9yOiAke0NNSUVsZW1lbnR9LCB2YWx1ZSBvZjogJHt2YWx1ZX1gLFxuICAgICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX1dBUk5JTkcpO1xuICAgIH1cblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYnN0cmFjdCBtZXRob2QgZm9yIHZhbGlkYXRpbmcgdGhhdCBhIHJlc3BvbnNlIGlzIGNvcnJlY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfQ01JRWxlbWVudFxuICAgKiBAcGFyYW0geyp9IF92YWx1ZVxuICAgKi9cbiAgdmFsaWRhdGVDb3JyZWN0UmVzcG9uc2UoX0NNSUVsZW1lbnQsIF92YWx1ZSkge1xuICAgIC8vIGp1c3QgYSBzdHViIG1ldGhvZFxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3IgYnVpbGRzIGEgbmV3IGNoaWxkIGVsZW1lbnQgdG8gYWRkIHRvIHRoZSBhcnJheS5cbiAgICogQVBJcyB0aGF0IGluaGVyaXQgQmFzZUFQSSBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfQ01JRWxlbWVudCAtIHVudXNlZFxuICAgKiBAcGFyYW0geyp9IF92YWx1ZSAtIHVudXNlZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IF9mb3VuZEZpcnN0SW5kZXggLSB1bnVzZWRcbiAgICogQHJldHVybiB7Kn1cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBnZXRDaGlsZEVsZW1lbnQoX0NNSUVsZW1lbnQsIF92YWx1ZSwgX2ZvdW5kRmlyc3RJbmRleCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGdldENoaWxkRWxlbWVudCBtZXRob2QgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHZhbHVlIGZyb20gdGhlIENNSSBPYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAgICogQHBhcmFtIHtib29sZWFufSBzY29ybTIwMDRcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIF9jb21tb25HZXRDTUlWYWx1ZShtZXRob2ROYW1lOiBTdHJpbmcsIHNjb3JtMjAwNDogYm9vbGVhbiwgQ01JRWxlbWVudCkge1xuICAgIGlmICghQ01JRWxlbWVudCB8fCBDTUlFbGVtZW50ID09PSAnJykge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cnVjdHVyZSA9IENNSUVsZW1lbnQuc3BsaXQoJy4nKTtcbiAgICBsZXQgcmVmT2JqZWN0ID0gdGhpcztcbiAgICBsZXQgYXR0cmlidXRlID0gbnVsbDtcblxuICAgIGNvbnN0IHVuaW5pdGlhbGl6ZWRFcnJvck1lc3NhZ2UgPSBgVGhlIGRhdGEgbW9kZWwgZWxlbWVudCBwYXNzZWQgdG8gJHttZXRob2ROYW1lfSAoJHtDTUlFbGVtZW50fSkgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLmA7XG4gICAgY29uc3QgaW52YWxpZEVycm9yTWVzc2FnZSA9IGBUaGUgZGF0YSBtb2RlbCBlbGVtZW50IHBhc3NlZCB0byAke21ldGhvZE5hbWV9ICgke0NNSUVsZW1lbnR9KSBpcyBub3QgYSB2YWxpZCBTQ09STSBkYXRhIG1vZGVsIGVsZW1lbnQuYDtcbiAgICBjb25zdCBpbnZhbGlkRXJyb3JDb2RlID0gc2Nvcm0yMDA0ID9cbiAgICAgICAgdGhpcy4jZXJyb3JfY29kZXMuVU5ERUZJTkVEX0RBVEFfTU9ERUwgOlxuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5HRU5FUkFMO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJ1Y3R1cmUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGF0dHJpYnV0ZSA9IHN0cnVjdHVyZVtpXTtcblxuICAgICAgaWYgKCFzY29ybTIwMDQpIHtcbiAgICAgICAgaWYgKGkgPT09IHN0cnVjdHVyZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLl9jaGVja09iamVjdEhhc1Byb3BlcnR5KHJlZk9iamVjdCwgYXR0cmlidXRlKSkge1xuICAgICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IoaW52YWxpZEVycm9yQ29kZSwgaW52YWxpZEVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKFN0cmluZyhhdHRyaWJ1dGUpLnN1YnN0cigwLCA4KSA9PT0gJ3t0YXJnZXQ9JykgJiZcbiAgICAgICAgICAgICh0eXBlb2YgcmVmT2JqZWN0Ll9pc1RhcmdldFZhbGlkID09ICdmdW5jdGlvbicpKSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gU3RyaW5nKGF0dHJpYnV0ZSkuXG4gICAgICAgICAgICAgIHN1YnN0cig4LCBTdHJpbmcoYXR0cmlidXRlKS5sZW5ndGggLSA5KTtcbiAgICAgICAgICByZXR1cm4gcmVmT2JqZWN0Ll9pc1RhcmdldFZhbGlkKHRhcmdldCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2NoZWNrT2JqZWN0SGFzUHJvcGVydHkocmVmT2JqZWN0LCBhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IoaW52YWxpZEVycm9yQ29kZSwgaW52YWxpZEVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlZk9iamVjdCA9IHJlZk9iamVjdFthdHRyaWJ1dGVdO1xuICAgICAgaWYgKHJlZk9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKGludmFsaWRFcnJvckNvZGUsIGludmFsaWRFcnJvck1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlZk9iamVjdCBpbnN0YW5jZW9mIENNSUFycmF5KSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoc3RydWN0dXJlW2kgKyAxXSwgMTApO1xuXG4gICAgICAgIC8vIFNDTyBpcyB0cnlpbmcgdG8gc2V0IGFuIGl0ZW0gb24gYW4gYXJyYXlcbiAgICAgICAgaWYgKCFpc05hTihpbmRleCkpIHtcbiAgICAgICAgICBjb25zdCBpdGVtID0gcmVmT2JqZWN0LmNoaWxkQXJyYXlbaW5kZXhdO1xuXG4gICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIHJlZk9iamVjdCA9IGl0ZW07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHRoaXMuI2Vycm9yX2NvZGVzLlZBTFVFX05PVF9JTklUSUFMSVpFRCxcbiAgICAgICAgICAgICAgICB1bmluaXRpYWxpemVkRXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEhhdmUgdG8gdXBkYXRlIGkgdmFsdWUgdG8gc2tpcCB0aGUgYXJyYXkgcG9zaXRpb25cbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVmT2JqZWN0ID09PSBudWxsIHx8IHJlZk9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIXNjb3JtMjAwNCkge1xuICAgICAgICBpZiAoYXR0cmlidXRlID09PSAnX2NoaWxkcmVuJykge1xuICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMTJfZXJyb3JfY29kZXMuQ0hJTERSRU5fRVJST1IpO1xuICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZSA9PT0gJ19jb3VudCcpIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTEyX2Vycm9yX2NvZGVzLkNPVU5UX0VSUk9SKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVmT2JqZWN0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEFQSSdzIGN1cnJlbnQgc3RhdGUgaXMgU1RBVEVfSU5JVElBTElaRURcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGlzSW5pdGlhbGl6ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlID09PSBnbG9iYWxfY29uc3RhbnRzLlNUQVRFX0lOSVRJQUxJWkVEO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQVBJJ3MgY3VycmVudCBzdGF0ZSBpcyBTVEFURV9OT1RfSU5JVElBTElaRURcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGlzTm90SW5pdGlhbGl6ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlID09PSBnbG9iYWxfY29uc3RhbnRzLlNUQVRFX05PVF9JTklUSUFMSVpFRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEFQSSdzIGN1cnJlbnQgc3RhdGUgaXMgU1RBVEVfVEVSTUlOQVRFRFxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaXNUZXJtaW5hdGVkKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZSA9PT0gZ2xvYmFsX2NvbnN0YW50cy5TVEFURV9URVJNSU5BVEVEO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBhdHRhY2hpbmcgdG8gYSBzcGVjaWZpYyBTQ09STSBldmVudFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGlzdGVuZXJOYW1lXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbihsaXN0ZW5lck5hbWU6IFN0cmluZywgY2FsbGJhY2s6IGZ1bmN0aW9uKSB7XG4gICAgaWYgKCFjYWxsYmFjaykgcmV0dXJuO1xuXG4gICAgY29uc3QgbGlzdGVuZXJGdW5jdGlvbnMgPSBsaXN0ZW5lck5hbWUuc3BsaXQoJyAnKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVyRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBsaXN0ZW5lclNwbGl0ID0gbGlzdGVuZXJGdW5jdGlvbnNbaV0uc3BsaXQoJy4nKTtcbiAgICAgIGlmIChsaXN0ZW5lclNwbGl0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBsaXN0ZW5lclNwbGl0WzBdO1xuXG4gICAgICBsZXQgQ01JRWxlbWVudCA9IG51bGw7XG4gICAgICBpZiAobGlzdGVuZXJTcGxpdC5sZW5ndGggPiAxKSB7XG4gICAgICAgIENNSUVsZW1lbnQgPSBsaXN0ZW5lck5hbWUucmVwbGFjZShmdW5jdGlvbk5hbWUgKyAnLicsICcnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5saXN0ZW5lckFycmF5LnB1c2goe1xuICAgICAgICBmdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgQ01JRWxlbWVudDogQ01JRWxlbWVudCxcbiAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuYXBpTG9nKCdvbicsIGZ1bmN0aW9uTmFtZSwgYEFkZGVkIGV2ZW50IGxpc3RlbmVyOiAke3RoaXMubGlzdGVuZXJBcnJheS5sZW5ndGh9YCwgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBkZXRhY2hpbmcgYSBzcGVjaWZpYyBTQ09STSBldmVudCBsaXN0ZW5lclxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGlzdGVuZXJOYW1lXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvZmYobGlzdGVuZXJOYW1lOiBTdHJpbmcsIGNhbGxiYWNrOiBmdW5jdGlvbikge1xuICAgIGlmICghY2FsbGJhY2spIHJldHVybjtcblxuICAgIGNvbnN0IGxpc3RlbmVyRnVuY3Rpb25zID0gbGlzdGVuZXJOYW1lLnNwbGl0KCcgJyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0ZW5lckZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbGlzdGVuZXJTcGxpdCA9IGxpc3RlbmVyRnVuY3Rpb25zW2ldLnNwbGl0KCcuJyk7XG4gICAgICBpZiAobGlzdGVuZXJTcGxpdC5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gbGlzdGVuZXJTcGxpdFswXTtcblxuICAgICAgbGV0IENNSUVsZW1lbnQgPSBudWxsO1xuICAgICAgaWYgKGxpc3RlbmVyU3BsaXQubGVuZ3RoID4gMSkge1xuICAgICAgICBDTUlFbGVtZW50ID0gbGlzdGVuZXJOYW1lLnJlcGxhY2UoZnVuY3Rpb25OYW1lICsgJy4nLCAnJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlbW92ZUluZGV4ID0gdGhpcy5saXN0ZW5lckFycmF5LmZpbmRJbmRleCgob2JqKSA9PlxuICAgICAgICBvYmouZnVuY3Rpb25OYW1lID09PSBmdW5jdGlvbk5hbWUgJiZcbiAgICAgICAgb2JqLkNNSUVsZW1lbnQgPT09IENNSUVsZW1lbnQgJiZcbiAgICAgICAgb2JqLmNhbGxiYWNrID09PSBjYWxsYmFja1xuICAgICAgKTtcbiAgICAgIGlmIChyZW1vdmVJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lckFycmF5LnNwbGljZShyZW1vdmVJbmRleCwgMSk7XG4gICAgICAgIHRoaXMuYXBpTG9nKCdvZmYnLCBmdW5jdGlvbk5hbWUsIGBSZW1vdmVkIGV2ZW50IGxpc3RlbmVyOiAke3RoaXMubGlzdGVuZXJBcnJheS5sZW5ndGh9YCwgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBjbGVhcmluZyBhbGwgbGlzdGVuZXJzIGZyb20gYSBzcGVjaWZpYyBTQ09STSBldmVudFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGlzdGVuZXJOYW1lXG4gICAqL1xuICBjbGVhcihsaXN0ZW5lck5hbWU6IFN0cmluZykge1xuICAgIGNvbnN0IGxpc3RlbmVyRnVuY3Rpb25zID0gbGlzdGVuZXJOYW1lLnNwbGl0KCcgJyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0ZW5lckZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbGlzdGVuZXJTcGxpdCA9IGxpc3RlbmVyRnVuY3Rpb25zW2ldLnNwbGl0KCcuJyk7XG4gICAgICBpZiAobGlzdGVuZXJTcGxpdC5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gbGlzdGVuZXJTcGxpdFswXTtcblxuICAgICAgbGV0IENNSUVsZW1lbnQgPSBudWxsO1xuICAgICAgaWYgKGxpc3RlbmVyU3BsaXQubGVuZ3RoID4gMSkge1xuICAgICAgICBDTUlFbGVtZW50ID0gbGlzdGVuZXJOYW1lLnJlcGxhY2UoZnVuY3Rpb25OYW1lICsgJy4nLCAnJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGlzdGVuZXJBcnJheSA9IHRoaXMubGlzdGVuZXJBcnJheS5maWx0ZXIoKG9iaikgPT5cbiAgICAgICAgb2JqLmZ1bmN0aW9uTmFtZSAhPT0gZnVuY3Rpb25OYW1lICYmXG4gICAgICAgIG9iai5DTUlFbGVtZW50ICE9PSBDTUlFbGVtZW50LFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIGFueSAnb24nIGxpc3RlbmVycyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jdGlvbk5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKi9cbiAgcHJvY2Vzc0xpc3RlbmVycyhmdW5jdGlvbk5hbWU6IFN0cmluZywgQ01JRWxlbWVudDogU3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5hcGlMb2coZnVuY3Rpb25OYW1lLCBDTUlFbGVtZW50LCB2YWx1ZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxpc3RlbmVyQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gdGhpcy5saXN0ZW5lckFycmF5W2ldO1xuICAgICAgY29uc3QgZnVuY3Rpb25zTWF0Y2ggPSBsaXN0ZW5lci5mdW5jdGlvbk5hbWUgPT09IGZ1bmN0aW9uTmFtZTtcbiAgICAgIGNvbnN0IGxpc3RlbmVySGFzQ01JRWxlbWVudCA9ICEhbGlzdGVuZXIuQ01JRWxlbWVudDtcbiAgICAgIGxldCBDTUlFbGVtZW50c01hdGNoID0gZmFsc2U7XG4gICAgICBpZiAoQ01JRWxlbWVudCAmJiBsaXN0ZW5lci5DTUlFbGVtZW50ICYmXG4gICAgICAgICAgbGlzdGVuZXIuQ01JRWxlbWVudC5zdWJzdHJpbmcobGlzdGVuZXIuQ01JRWxlbWVudC5sZW5ndGggLSAxKSA9PT1cbiAgICAgICAgICAnKicpIHtcbiAgICAgICAgQ01JRWxlbWVudHNNYXRjaCA9IENNSUVsZW1lbnQuaW5kZXhPZihsaXN0ZW5lci5DTUlFbGVtZW50LnN1YnN0cmluZygwLFxuICAgICAgICAgICAgbGlzdGVuZXIuQ01JRWxlbWVudC5sZW5ndGggLSAxKSkgPT09IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBDTUlFbGVtZW50c01hdGNoID0gbGlzdGVuZXIuQ01JRWxlbWVudCA9PT0gQ01JRWxlbWVudDtcbiAgICAgIH1cblxuICAgICAgaWYgKGZ1bmN0aW9uc01hdGNoICYmICghbGlzdGVuZXJIYXNDTUlFbGVtZW50IHx8IENNSUVsZW1lbnRzTWF0Y2gpKSB7XG4gICAgICAgIGxpc3RlbmVyLmNhbGxiYWNrKENNSUVsZW1lbnQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGEgU0NPUk0gZXJyb3JcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGVycm9yTnVtYmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAqL1xuICB0aHJvd1NDT1JNRXJyb3IoZXJyb3JOdW1iZXI6IG51bWJlciwgbWVzc2FnZTogU3RyaW5nKSB7XG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICBtZXNzYWdlID0gdGhpcy5nZXRMbXNFcnJvck1lc3NhZ2VEZXRhaWxzKGVycm9yTnVtYmVyKTtcbiAgICB9XG5cbiAgICB0aGlzLmFwaUxvZygndGhyb3dTQ09STUVycm9yJywgbnVsbCwgZXJyb3JOdW1iZXIgKyAnOiAnICsgbWVzc2FnZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfRVJST1IpO1xuXG4gICAgdGhpcy5sYXN0RXJyb3JDb2RlID0gU3RyaW5nKGVycm9yTnVtYmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGxhc3QgU0NPUk0gZXJyb3IgY29kZSBvbiBzdWNjZXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VjY2Vzc1xuICAgKi9cbiAgY2xlYXJTQ09STUVycm9yKHN1Y2Nlc3M6IFN0cmluZykge1xuICAgIGlmIChzdWNjZXNzICE9PSB1bmRlZmluZWQgJiYgc3VjY2VzcyAhPT0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRSkge1xuICAgICAgdGhpcy5sYXN0RXJyb3JDb2RlID0gMDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdHMgdG8gc3RvcmUgdGhlIGRhdGEgdG8gdGhlIExNUywgbG9ncyBkYXRhIGlmIG5vIExNUyBjb25maWd1cmVkXG4gICAqIEFQSXMgdGhhdCBpbmhlcml0IEJhc2VBUEkgc2hvdWxkIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBfY2FsY3VsYXRlVG90YWxUaW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBzdG9yZURhdGEoX2NhbGN1bGF0ZVRvdGFsVGltZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSBzdG9yZURhdGEgbWV0aG9kIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgdGhlIENNSSBmcm9tIGEgZmxhdHRlbmVkIEpTT04gb2JqZWN0XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBqc29uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqL1xuICBsb2FkRnJvbUZsYXR0ZW5lZEpTT04oanNvbiwgQ01JRWxlbWVudCkge1xuICAgIGlmICghdGhpcy5pc05vdEluaXRpYWxpemVkKCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgJ2xvYWRGcm9tRmxhdHRlbmVkSlNPTiBjYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjYWxsIHRvIGxtc0luaXRpYWxpemUuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGVzdCBtYXRjaCBwYXR0ZXJuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY1xuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBhX3BhdHRlcm5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGVzdFBhdHRlcm4oYSwgYywgYV9wYXR0ZXJuKSB7XG4gICAgICBjb25zdCBhX21hdGNoID0gYS5tYXRjaChhX3BhdHRlcm4pO1xuXG4gICAgICBsZXQgY19tYXRjaDtcbiAgICAgIGlmIChhX21hdGNoICE9PSBudWxsICYmIChjX21hdGNoID0gYy5tYXRjaChhX3BhdHRlcm4pKSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBhX251bSA9IE51bWJlcihhX21hdGNoWzJdKTtcbiAgICAgICAgY29uc3QgY19udW0gPSBOdW1iZXIoY19tYXRjaFsyXSk7XG4gICAgICAgIGlmIChhX251bSA9PT0gY19udW0pIHtcbiAgICAgICAgICBpZiAoYV9tYXRjaFszXSA9PT0gJ2lkJykge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYV9tYXRjaFszXSA9PT0gJ3R5cGUnKSB7XG4gICAgICAgICAgICBpZiAoY19tYXRjaFszXSA9PT0gJ2lkJykge1xuICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhX251bSAtIGNfbnVtO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRfcGF0dGVybiA9IC9eKGNtaVxcLmludGVyYWN0aW9uc1xcLikoXFxkKylcXC4oLiopJC87XG4gICAgY29uc3Qgb2JqX3BhdHRlcm4gPSAvXihjbWlcXC5vYmplY3RpdmVzXFwuKShcXGQrKVxcLiguKikkLztcblxuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5rZXlzKGpzb24pLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBbU3RyaW5nKGtleSksIGpzb25ba2V5XV07XG4gICAgfSk7XG5cbiAgICAvLyBDTUkgaW50ZXJhY3Rpb25zIG5lZWQgdG8gaGF2ZSBpZCBhbmQgdHlwZSBsb2FkZWQgYmVmb3JlIGFueSBvdGhlciBmaWVsZHNcbiAgICByZXN1bHQuc29ydChmdW5jdGlvbihbYSwgYl0sIFtjLCBkXSkge1xuICAgICAgbGV0IHRlc3Q7XG4gICAgICBpZiAoKHRlc3QgPSB0ZXN0UGF0dGVybihhLCBjLCBpbnRfcGF0dGVybikpICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0ZXN0O1xuICAgICAgfVxuICAgICAgaWYgKCh0ZXN0ID0gdGVzdFBhdHRlcm4oYSwgYywgb2JqX3BhdHRlcm4pKSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGVzdDtcbiAgICAgIH1cblxuICAgICAgaWYgKGEgPCBjKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIGlmIChhID4gYykge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuXG4gICAgbGV0IG9iajtcbiAgICByZXN1bHQuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgb2JqID0ge307XG4gICAgICBvYmpbZWxlbWVudFswXV0gPSBlbGVtZW50WzFdO1xuICAgICAgdGhpcy5sb2FkRnJvbUpTT04odW5mbGF0dGVuKG9iaiksIENNSUVsZW1lbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIENNSSBkYXRhIGZyb20gYSBKU09OIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGpzb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICovXG4gIGxvYWRGcm9tSlNPTihqc29uLCBDTUlFbGVtZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzTm90SW5pdGlhbGl6ZWQoKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAnbG9hZEZyb21KU09OIGNhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgdGhlIGNhbGwgdG8gbG1zSW5pdGlhbGl6ZS4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBDTUlFbGVtZW50ID0gQ01JRWxlbWVudCAhPT0gdW5kZWZpbmVkID8gQ01JRWxlbWVudCA6ICdjbWknO1xuXG4gICAgdGhpcy5zdGFydGluZ0RhdGEgPSBqc29uO1xuXG4gICAgLy8gY291bGQgdGhpcyBiZSByZWZhY3RvcmVkIGRvd24gdG8gZmxhdHRlbihqc29uKSB0aGVuIHNldENNSVZhbHVlIG9uIGVhY2g/XG4gICAgZm9yIChjb25zdCBrZXkgaW4ganNvbikge1xuICAgICAgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwoanNvbiwga2V5KSAmJiBqc29uW2tleV0pIHtcbiAgICAgICAgY29uc3QgY3VycmVudENNSUVsZW1lbnQgPSAoQ01JRWxlbWVudCA/IENNSUVsZW1lbnQgKyAnLicgOiAnJykgKyBrZXk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0ganNvbltrZXldO1xuXG4gICAgICAgIGlmICh2YWx1ZVsnY2hpbGRBcnJheSddKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZVsnY2hpbGRBcnJheSddLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRGcm9tSlNPTih2YWx1ZVsnY2hpbGRBcnJheSddW2ldLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRDTUlFbGVtZW50ICsgJy4nICsgaSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcbiAgICAgICAgICB0aGlzLmxvYWRGcm9tSlNPTih2YWx1ZSwgY3VycmVudENNSUVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0Q01JVmFsdWUoY3VycmVudENNSUVsZW1lbnQsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIENNSSBvYmplY3QgdG8gSlNPTiBmb3Igc2VuZGluZyB0byBhbiBMTVMuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHJlbmRlckNNSVRvSlNPTlN0cmluZygpIHtcbiAgICBjb25zdCBjbWkgPSB0aGlzLmNtaTtcbiAgICAvLyBEbyB3ZSB3YW50L25lZWQgdG8gcmV0dXJuIGZpZWxkcyB0aGF0IGhhdmUgbm8gc2V0IHZhbHVlP1xuICAgIC8vIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IGNtaSB9LCAoaywgdikgPT4gdiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHYsIDIpO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7Y21pfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEpTIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgY21pXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIHJlbmRlckNNSVRvSlNPTk9iamVjdCgpIHtcbiAgICAvLyBEbyB3ZSB3YW50L25lZWQgdG8gcmV0dXJuIGZpZWxkcyB0aGF0IGhhdmUgbm8gc2V0IHZhbHVlP1xuICAgIC8vIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IGNtaSB9LCAoaywgdikgPT4gdiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHYsIDIpO1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMucmVuZGVyQ01JVG9KU09OU3RyaW5nKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgY21pIG9iamVjdCB0byB0aGUgcHJvcGVyIGZvcm1hdCBmb3IgTE1TIGNvbW1pdFxuICAgKiBBUElzIHRoYXQgaW5oZXJpdCBCYXNlQVBJIHNob3VsZCBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gX3Rlcm1pbmF0ZUNvbW1pdFxuICAgKiBAcmV0dXJuIHsqfVxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIHJlbmRlckNvbW1pdENNSShfdGVybWluYXRlQ29tbWl0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIHN0b3JlRGF0YSBtZXRob2QgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCB0aGUgcmVxdWVzdCB0byB0aGUgTE1TXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtvYmplY3R8QXJyYXl9IHBhcmFtc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGltbWVkaWF0ZVxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICBwcm9jZXNzSHR0cFJlcXVlc3QodXJsOiBTdHJpbmcsIHBhcmFtcywgaW1tZWRpYXRlID0gZmFsc2UpIHtcbiAgICBjb25zdCBhcGkgPSB0aGlzO1xuICAgIGNvbnN0IHByb2Nlc3MgPSBmdW5jdGlvbih1cmwsIHBhcmFtcywgc2V0dGluZ3MsIGVycm9yX2NvZGVzKSB7XG4gICAgICBjb25zdCBnZW5lcmljRXJyb3IgPSB7XG4gICAgICAgICdyZXN1bHQnOiBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFLFxuICAgICAgICAnZXJyb3JDb2RlJzogZXJyb3JfY29kZXMuR0VORVJBTCxcbiAgICAgIH07XG5cbiAgICAgIGxldCByZXN1bHQ7XG4gICAgICBpZiAoIXNldHRpbmdzLnNlbmRCZWFjb25Db21taXQpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICBodHRwUmVxLm9wZW4oJ1BPU1QnLCB1cmwsIHNldHRpbmdzLmFzeW5jQ29tbWl0KTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoc2V0dGluZ3MueGhySGVhZGVycykubGVuZ3RoKSB7XG4gICAgICAgICAgT2JqZWN0LmtleXMoc2V0dGluZ3MueGhySGVhZGVycykuZm9yRWFjaCgoaGVhZGVyKSA9PiB7XG4gICAgICAgICAgICBodHRwUmVxLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBzZXR0aW5ncy54aHJIZWFkZXJzW2hlYWRlcl0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaHR0cFJlcS53aXRoQ3JlZGVudGlhbHMgPSBzZXR0aW5ncy54aHJXaXRoQ3JlZGVudGlhbHM7XG5cbiAgICAgICAgaWYgKHNldHRpbmdzLmFzeW5jQ29tbWl0KSB7XG4gICAgICAgICAgaHR0cFJlcS5vbmxvYWQgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNldHRpbmdzLnJlc3BvbnNlSGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICByZXN1bHQgPSBzZXR0aW5ncy5yZXNwb25zZUhhbmRsZXIoaHR0cFJlcSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKGh0dHBSZXEucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHBhcmFtcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICBodHRwUmVxLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgaHR0cFJlcS5zZW5kKHBhcmFtcy5qb2luKCcmJykpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBodHRwUmVxLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsXG4gICAgICAgICAgICAgICAgc2V0dGluZ3MuY29tbWl0UmVxdWVzdERhdGFUeXBlKTtcbiAgICAgICAgICAgIGh0dHBSZXEuc2VuZChKU09OLnN0cmluZ2lmeShwYXJhbXMpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIXNldHRpbmdzLmFzeW5jQ29tbWl0KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNldHRpbmdzLnJlc3BvbnNlSGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICByZXN1bHQgPSBzZXR0aW5ncy5yZXNwb25zZUhhbmRsZXIoaHR0cFJlcSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKGh0dHBSZXEucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0ge307XG4gICAgICAgICAgICByZXN1bHQucmVzdWx0ID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFO1xuICAgICAgICAgICAgcmVzdWx0LmVycm9yQ29kZSA9IDA7XG4gICAgICAgICAgICBhcGkucHJvY2Vzc0xpc3RlbmVycygnQ29tbWl0U3VjY2VzcycpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIGFwaS5wcm9jZXNzTGlzdGVuZXJzKCdDb21taXRFcnJvcicpO1xuICAgICAgICAgIHJldHVybiBnZW5lcmljRXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAgIHR5cGU6IHNldHRpbmdzLmNvbW1pdFJlcXVlc3REYXRhVHlwZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGxldCBibG9iO1xuICAgICAgICAgIGlmIChwYXJhbXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgYmxvYiA9IG5ldyBCbG9iKFtwYXJhbXMuam9pbignJicpXSwgaGVhZGVycyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkocGFyYW1zKV0sIGhlYWRlcnMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuICAgICAgICAgIGlmIChuYXZpZ2F0b3Iuc2VuZEJlYWNvbih1cmwsIGJsb2IpKSB7XG4gICAgICAgICAgICByZXN1bHQucmVzdWx0ID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFO1xuICAgICAgICAgICAgcmVzdWx0LmVycm9yQ29kZSA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5yZXN1bHQgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuICAgICAgICAgICAgcmVzdWx0LmVycm9yQ29kZSA9IDEwMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIGFwaS5wcm9jZXNzTGlzdGVuZXJzKCdDb21taXRFcnJvcicpO1xuICAgICAgICAgIHJldHVybiBnZW5lcmljRXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGFwaS5wcm9jZXNzTGlzdGVuZXJzKCdDb21taXRFcnJvcicpO1xuICAgICAgICByZXR1cm4gZ2VuZXJpY0Vycm9yO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LnJlc3VsdCA9PT0gdHJ1ZSB8fFxuICAgICAgICAgIHJlc3VsdC5yZXN1bHQgPT09IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fVFJVRSkge1xuICAgICAgICBhcGkucHJvY2Vzc0xpc3RlbmVycygnQ29tbWl0U3VjY2VzcycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBpLnByb2Nlc3NMaXN0ZW5lcnMoJ0NvbW1pdEVycm9yJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIGlmICh0eXBlb2YgZGVib3VuY2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCBkZWJvdW5jZWQgPSBkZWJvdW5jZShwcm9jZXNzLCA1MDApO1xuICAgICAgZGVib3VuY2VkKHVybCwgcGFyYW1zLCB0aGlzLnNldHRpbmdzLCB0aGlzLmVycm9yX2NvZGVzKTtcblxuICAgICAgLy8gaWYgd2UncmUgdGVybWluYXRpbmcsIGdvIGFoZWFkIGFuZCBjb21taXQgaW1tZWRpYXRlbHlcbiAgICAgIGlmIChpbW1lZGlhdGUpIHtcbiAgICAgICAgZGVib3VuY2VkLmZsdXNoKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3VsdDogZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFLFxuICAgICAgICBlcnJvckNvZGU6IDAsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJvY2Vzcyh1cmwsIHBhcmFtcywgdGhpcy5zZXR0aW5ncywgdGhpcy5lcnJvcl9jb2Rlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhIFNDT1JNIGVycm9yXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB3aGVuIC0gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgY29tbWl0dGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2sgLSB0aGUgbmFtZSBvZiB0aGUgY29tbWl0IGV2ZW50IGNhbGxiYWNrXG4gICAqL1xuICBzY2hlZHVsZUNvbW1pdCh3aGVuOiBudW1iZXIsIGNhbGxiYWNrOiBzdHJpbmcpIHtcbiAgICB0aGlzLiN0aW1lb3V0ID0gbmV3IFNjaGVkdWxlZENvbW1pdCh0aGlzLCB3aGVuLCBjYWxsYmFjayk7XG4gICAgdGhpcy5hcGlMb2coJ3NjaGVkdWxlQ29tbWl0JywgJycsICdzY2hlZHVsZWQnLFxuICAgICAgICBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9ERUJVRyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIGFuZCBjYW5jZWxzIGFueSBjdXJyZW50bHkgc2NoZWR1bGVkIGNvbW1pdHNcbiAgICovXG4gIGNsZWFyU2NoZWR1bGVkQ29tbWl0KCkge1xuICAgIGlmICh0aGlzLiN0aW1lb3V0KSB7XG4gICAgICB0aGlzLiN0aW1lb3V0LmNhbmNlbCgpO1xuICAgICAgdGhpcy4jdGltZW91dCA9IG51bGw7XG4gICAgICB0aGlzLmFwaUxvZygnY2xlYXJTY2hlZHVsZWRDb21taXQnLCAnJywgJ2NsZWFyZWQnLFxuICAgICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0RFQlVHKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQcml2YXRlIGNsYXNzIHRoYXQgd3JhcHMgYSB0aW1lb3V0IGNhbGwgdG8gdGhlIGNvbW1pdCgpIGZ1bmN0aW9uXG4gKi9cbmNsYXNzIFNjaGVkdWxlZENvbW1pdCB7XG4gICNBUEk7XG4gICNjYW5jZWxsZWQgPSBmYWxzZTtcbiAgI3RpbWVvdXQ7XG4gICNjYWxsYmFjaztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIFNjaGVkdWxlZENvbW1pdFxuICAgKiBAcGFyYW0ge0Jhc2VBUEl9IEFQSVxuICAgKiBAcGFyYW0ge251bWJlcn0gd2hlblxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2tcbiAgICovXG4gIGNvbnN0cnVjdG9yKEFQSTogYW55LCB3aGVuOiBudW1iZXIsIGNhbGxiYWNrOiBzdHJpbmcpIHtcbiAgICB0aGlzLiNBUEkgPSBBUEk7XG4gICAgdGhpcy4jdGltZW91dCA9IHNldFRpbWVvdXQodGhpcy53cmFwcGVyLmJpbmQodGhpcyksIHdoZW4pO1xuICAgIHRoaXMuI2NhbGxiYWNrID0gY2FsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGFueSBjdXJyZW50bHkgc2NoZWR1bGVkIGNvbW1pdFxuICAgKi9cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuI2NhbmNlbGxlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuI3RpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiN0aW1lb3V0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JhcCB0aGUgQVBJIGNvbW1pdCBjYWxsIHRvIGNoZWNrIGlmIHRoZSBjYWxsIGhhcyBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkXG4gICAqL1xuICB3cmFwcGVyKCkge1xuICAgIGlmICghdGhpcy4jY2FuY2VsbGVkKSB7XG4gICAgICB0aGlzLiNBUEkuY29tbWl0KHRoaXMuI2NhbGxiYWNrKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgQmFzZUFQSSBmcm9tICcuL0Jhc2VBUEknO1xuaW1wb3J0IHtcbiAgQ01JLFxuICBDTUlJbnRlcmFjdGlvbnNDb3JyZWN0UmVzcG9uc2VzT2JqZWN0LFxuICBDTUlJbnRlcmFjdGlvbnNPYmplY3QsXG4gIENNSUludGVyYWN0aW9uc09iamVjdGl2ZXNPYmplY3QsXG4gIENNSU9iamVjdGl2ZXNPYmplY3QsIE5BVixcbn0gZnJvbSAnLi9jbWkvc2Nvcm0xMl9jbWknO1xuaW1wb3J0ICogYXMgVXRpbGl0aWVzIGZyb20gJy4vdXRpbGl0aWVzJztcbmltcG9ydCBBUElDb25zdGFudHMgZnJvbSAnLi9jb25zdGFudHMvYXBpX2NvbnN0YW50cyc7XG5pbXBvcnQgRXJyb3JDb2RlcyBmcm9tICcuL2NvbnN0YW50cy9lcnJvcl9jb2Rlcyc7XG5cbmNvbnN0IHNjb3JtMTJfY29uc3RhbnRzID0gQVBJQ29uc3RhbnRzLnNjb3JtMTI7XG5jb25zdCBnbG9iYWxfY29uc3RhbnRzID0gQVBJQ29uc3RhbnRzLmdsb2JhbDtcbmNvbnN0IHNjb3JtMTJfZXJyb3JfY29kZXMgPSBFcnJvckNvZGVzLnNjb3JtMTI7XG5cbi8qKlxuICogQVBJIGNsYXNzIGZvciBTQ09STSAxLjJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2Nvcm0xMkFQSSBleHRlbmRzIEJhc2VBUEkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIFNDT1JNIDEuMiBBUElcbiAgICogQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzZXR0aW5nczoge30pIHtcbiAgICBjb25zdCBmaW5hbFNldHRpbmdzID0ge1xuICAgICAgLi4ue1xuICAgICAgICBtYXN0ZXJ5X292ZXJyaWRlOiBmYWxzZSxcbiAgICAgIH0sIC4uLnNldHRpbmdzLFxuICAgIH07XG5cbiAgICBzdXBlcihzY29ybTEyX2Vycm9yX2NvZGVzLCBmaW5hbFNldHRpbmdzKTtcblxuICAgIHRoaXMuY21pID0gbmV3IENNSSgpO1xuICAgIHRoaXMubmF2ID0gbmV3IE5BVigpO1xuXG4gICAgLy8gUmVuYW1lIGZ1bmN0aW9ucyB0byBtYXRjaCAxLjIgU3BlYyBhbmQgZXhwb3NlIHRvIG1vZHVsZXNcbiAgICB0aGlzLkxNU0luaXRpYWxpemUgPSB0aGlzLmxtc0luaXRpYWxpemU7XG4gICAgdGhpcy5MTVNGaW5pc2ggPSB0aGlzLmxtc0ZpbmlzaDtcbiAgICB0aGlzLkxNU0dldFZhbHVlID0gdGhpcy5sbXNHZXRWYWx1ZTtcbiAgICB0aGlzLkxNU1NldFZhbHVlID0gdGhpcy5sbXNTZXRWYWx1ZTtcbiAgICB0aGlzLkxNU0NvbW1pdCA9IHRoaXMubG1zQ29tbWl0O1xuICAgIHRoaXMuTE1TR2V0TGFzdEVycm9yID0gdGhpcy5sbXNHZXRMYXN0RXJyb3I7XG4gICAgdGhpcy5MTVNHZXRFcnJvclN0cmluZyA9IHRoaXMubG1zR2V0RXJyb3JTdHJpbmc7XG4gICAgdGhpcy5MTVNHZXREaWFnbm9zdGljID0gdGhpcy5sbXNHZXREaWFnbm9zdGljO1xuICB9XG5cbiAgLyoqXG4gICAqIGxtc0luaXRpYWxpemUgZnVuY3Rpb24gZnJvbSBTQ09STSAxLjIgU3BlY1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IGJvb2xcbiAgICovXG4gIGxtc0luaXRpYWxpemUoKSB7XG4gICAgdGhpcy5jbWkuaW5pdGlhbGl6ZSgpO1xuICAgIHJldHVybiB0aGlzLmluaXRpYWxpemUoJ0xNU0luaXRpYWxpemUnLCAnTE1TIHdhcyBhbHJlYWR5IGluaXRpYWxpemVkIScsXG4gICAgICAgICdMTVMgaXMgYWxyZWFkeSBmaW5pc2hlZCEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMTVNGaW5pc2ggZnVuY3Rpb24gZnJvbSBTQ09STSAxLjIgU3BlY1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IGJvb2xcbiAgICovXG4gIGxtc0ZpbmlzaCgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnRlcm1pbmF0ZSgnTE1TRmluaXNoJywgdHJ1ZSk7XG5cbiAgICBpZiAocmVzdWx0ID09PSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX1RSVUUpIHtcbiAgICAgIGlmICh0aGlzLm5hdi5ldmVudCAhPT0gJycpIHtcbiAgICAgICAgaWYgKHRoaXMubmF2LmV2ZW50ID09PSAnY29udGludWUnKSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZU5leHQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoJ1NlcXVlbmNlUHJldmlvdXMnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNldHRpbmdzLmF1dG9Qcm9ncmVzcykge1xuICAgICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoJ1NlcXVlbmNlTmV4dCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogTE1TR2V0VmFsdWUgZnVuY3Rpb24gZnJvbSBTQ09STSAxLjIgU3BlY1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBsbXNHZXRWYWx1ZShDTUlFbGVtZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoJ0xNU0dldFZhbHVlJywgZmFsc2UsIENNSUVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIExNU1NldFZhbHVlIGZ1bmN0aW9uIGZyb20gU0NPUk0gMS4yIFNwZWNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBsbXNTZXRWYWx1ZShDTUlFbGVtZW50LCB2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLnNldFZhbHVlKCdMTVNTZXRWYWx1ZScsICdMTVNDb21taXQnLCBmYWxzZSwgQ01JRWxlbWVudCwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExNU0NvbW1pdCBmdW5jdGlvbiBmcm9tIFNDT1JNIDEuMiBTcGVjXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gYm9vbFxuICAgKi9cbiAgbG1zQ29tbWl0KCkge1xuICAgIHJldHVybiB0aGlzLmNvbW1pdCgnTE1TQ29tbWl0JywgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIExNU0dldExhc3RFcnJvciBmdW5jdGlvbiBmcm9tIFNDT1JNIDEuMiBTcGVjXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGxtc0dldExhc3RFcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMYXN0RXJyb3IoJ0xNU0dldExhc3RFcnJvcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIExNU0dldEVycm9yU3RyaW5nIGZ1bmN0aW9uIGZyb20gU0NPUk0gMS4yIFNwZWNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVycm9yQ29kZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBsbXNHZXRFcnJvclN0cmluZyhDTUlFcnJvckNvZGUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRFcnJvclN0cmluZygnTE1TR2V0RXJyb3JTdHJpbmcnLCBDTUlFcnJvckNvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExNU0dldERpYWdub3N0aWMgZnVuY3Rpb24gZnJvbSBTQ09STSAxLjIgU3BlY1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRXJyb3JDb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGxtc0dldERpYWdub3N0aWMoQ01JRXJyb3JDb2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGlhZ25vc3RpYygnTE1TR2V0RGlhZ25vc3RpYycsIENNSUVycm9yQ29kZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIHZhbHVlIG9uIHRoZSBDTUkgT2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgc2V0Q01JVmFsdWUoQ01JRWxlbWVudCwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fY29tbW9uU2V0Q01JVmFsdWUoJ0xNU1NldFZhbHVlJywgZmFsc2UsIENNSUVsZW1lbnQsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgdmFsdWUgZnJvbSB0aGUgQ01JIE9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0Q01JVmFsdWUoQ01JRWxlbWVudCkge1xuICAgIHJldHVybiB0aGlzLl9jb21tb25HZXRDTUlWYWx1ZSgnZ2V0Q01JVmFsdWUnLCBmYWxzZSwgQ01JRWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBvciBidWlsZHMgYSBuZXcgY2hpbGQgZWxlbWVudCB0byBhZGQgdG8gdGhlIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm91bmRGaXJzdEluZGV4XG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIGdldENoaWxkRWxlbWVudChDTUlFbGVtZW50LCB2YWx1ZSwgZm91bmRGaXJzdEluZGV4KSB7XG4gICAgbGV0IG5ld0NoaWxkO1xuXG4gICAgaWYgKHRoaXMuc3RyaW5nTWF0Y2hlcyhDTUlFbGVtZW50LCAnY21pXFxcXC5vYmplY3RpdmVzXFxcXC5cXFxcZCsnKSkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JT2JqZWN0aXZlc09iamVjdCgpO1xuICAgIH0gZWxzZSBpZiAoZm91bmRGaXJzdEluZGV4ICYmIHRoaXMuc3RyaW5nTWF0Y2hlcyhDTUlFbGVtZW50LFxuICAgICAgICAnY21pXFxcXC5pbnRlcmFjdGlvbnNcXFxcLlxcXFxkK1xcXFwuY29ycmVjdF9yZXNwb25zZXNcXFxcLlxcXFxkKycpKSB7XG4gICAgICBuZXdDaGlsZCA9IG5ldyBDTUlJbnRlcmFjdGlvbnNDb3JyZWN0UmVzcG9uc2VzT2JqZWN0KCk7XG4gICAgfSBlbHNlIGlmIChmb3VuZEZpcnN0SW5kZXggJiYgdGhpcy5zdHJpbmdNYXRjaGVzKENNSUVsZW1lbnQsXG4gICAgICAgICdjbWlcXFxcLmludGVyYWN0aW9uc1xcXFwuXFxcXGQrXFxcXC5vYmplY3RpdmVzXFxcXC5cXFxcZCsnKSkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JSW50ZXJhY3Rpb25zT2JqZWN0aXZlc09iamVjdCgpO1xuICAgIH0gZWxzZSBpZiAoIWZvdW5kRmlyc3RJbmRleCAmJlxuICAgICAgICB0aGlzLnN0cmluZ01hdGNoZXMoQ01JRWxlbWVudCwgJ2NtaVxcXFwuaW50ZXJhY3Rpb25zXFxcXC5cXFxcZCsnKSkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JSW50ZXJhY3Rpb25zT2JqZWN0KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0NoaWxkO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBDb3JyZWN0IFJlc3BvbnNlIHZhbHVlc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICB2YWxpZGF0ZUNvcnJlY3RSZXNwb25zZShDTUlFbGVtZW50LCB2YWx1ZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG1lc3NhZ2UgdGhhdCBjb3JyZXNwb25kcyB0byBlcnJvck51bWJlci5cbiAgICpcbiAgICogQHBhcmFtIHsqfSBlcnJvck51bWJlclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRldGFpbFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXRMbXNFcnJvck1lc3NhZ2VEZXRhaWxzKGVycm9yTnVtYmVyLCBkZXRhaWwpIHtcbiAgICBsZXQgYmFzaWNNZXNzYWdlID0gJ05vIEVycm9yJztcbiAgICBsZXQgZGV0YWlsTWVzc2FnZSA9ICdObyBFcnJvcic7XG5cbiAgICAvLyBTZXQgZXJyb3IgbnVtYmVyIHRvIHN0cmluZyBzaW5jZSBpbmNvbnNpc3RlbnQgZnJvbSBtb2R1bGVzIGlmIHN0cmluZyBvciBudW1iZXJcbiAgICBlcnJvck51bWJlciA9IFN0cmluZyhlcnJvck51bWJlcik7XG4gICAgaWYgKHNjb3JtMTJfY29uc3RhbnRzLmVycm9yX2Rlc2NyaXB0aW9uc1tlcnJvck51bWJlcl0pIHtcbiAgICAgIGJhc2ljTWVzc2FnZSA9IHNjb3JtMTJfY29uc3RhbnRzLmVycm9yX2Rlc2NyaXB0aW9uc1tlcnJvck51bWJlcl0uYmFzaWNNZXNzYWdlO1xuICAgICAgZGV0YWlsTWVzc2FnZSA9IHNjb3JtMTJfY29uc3RhbnRzLmVycm9yX2Rlc2NyaXB0aW9uc1tlcnJvck51bWJlcl0uZGV0YWlsTWVzc2FnZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGV0YWlsID8gZGV0YWlsTWVzc2FnZSA6IGJhc2ljTWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSB3aG9sZSBBUEkgd2l0aCBhbm90aGVyXG4gICAqXG4gICAqIEBwYXJhbSB7U2Nvcm0xMkFQSX0gbmV3QVBJXG4gICAqL1xuICByZXBsYWNlV2l0aEFub3RoZXJTY29ybUFQSShuZXdBUEkpIHtcbiAgICAvLyBEYXRhIE1vZGVsXG4gICAgdGhpcy5jbWkgPSBuZXdBUEkuY21pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgY21pIG9iamVjdCB0byB0aGUgcHJvcGVyIGZvcm1hdCBmb3IgTE1TIGNvbW1pdFxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHRlcm1pbmF0ZUNvbW1pdFxuICAgKiBAcmV0dXJuIHtvYmplY3R8QXJyYXl9XG4gICAqL1xuICByZW5kZXJDb21taXRDTUkodGVybWluYXRlQ29tbWl0OiBib29sZWFuKSB7XG4gICAgY29uc3QgY21pRXhwb3J0ID0gdGhpcy5yZW5kZXJDTUlUb0pTT05PYmplY3QoKTtcblxuICAgIGlmICh0ZXJtaW5hdGVDb21taXQpIHtcbiAgICAgIGNtaUV4cG9ydC5jbWkuY29yZS50b3RhbF90aW1lID0gdGhpcy5jbWkuZ2V0Q3VycmVudFRvdGFsVGltZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IGZsYXR0ZW5lZCA9IFV0aWxpdGllcy5mbGF0dGVuKGNtaUV4cG9ydCk7XG4gICAgc3dpdGNoICh0aGlzLnNldHRpbmdzLmRhdGFDb21taXRGb3JtYXQpIHtcbiAgICAgIGNhc2UgJ2ZsYXR0ZW5lZCc6XG4gICAgICAgIHJldHVybiBVdGlsaXRpZXMuZmxhdHRlbihjbWlFeHBvcnQpO1xuICAgICAgY2FzZSAncGFyYW1zJzpcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIGluIGZsYXR0ZW5lZCkge1xuICAgICAgICAgIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZsYXR0ZW5lZCwgaXRlbSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGAke2l0ZW19PSR7ZmxhdHRlbmVkW2l0ZW1dfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgY2FzZSAnanNvbic6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gY21pRXhwb3J0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byBzdG9yZSB0aGUgZGF0YSB0byB0aGUgTE1TXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdGVybWluYXRlQ29tbWl0XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHN0b3JlRGF0YSh0ZXJtaW5hdGVDb21taXQ6IGJvb2xlYW4pIHtcbiAgICBpZiAodGVybWluYXRlQ29tbWl0KSB7XG4gICAgICBjb25zdCBvcmlnaW5hbFN0YXR1cyA9IHRoaXMuY21pLmNvcmUubGVzc29uX3N0YXR1cztcbiAgICAgIGlmIChvcmlnaW5hbFN0YXR1cyA9PT0gJ25vdCBhdHRlbXB0ZWQnKSB7XG4gICAgICAgIHRoaXMuY21pLmNvcmUubGVzc29uX3N0YXR1cyA9ICdjb21wbGV0ZWQnO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jbWkuY29yZS5sZXNzb25fbW9kZSA9PT0gJ25vcm1hbCcpIHtcbiAgICAgICAgaWYgKHRoaXMuY21pLmNvcmUuY3JlZGl0ID09PSAnY3JlZGl0Jykge1xuICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLm1hc3Rlcnlfb3ZlcnJpZGUgJiZcbiAgICAgICAgICAgICAgdGhpcy5jbWkuc3R1ZGVudF9kYXRhLm1hc3Rlcnlfc2NvcmUgIT09ICcnICYmXG4gICAgICAgICAgICAgIHRoaXMuY21pLmNvcmUuc2NvcmUucmF3ICE9PSAnJykge1xuICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQodGhpcy5jbWkuY29yZS5zY29yZS5yYXcpID49IHBhcnNlRmxvYXQodGhpcy5jbWkuc3R1ZGVudF9kYXRhLm1hc3Rlcnlfc2NvcmUpKSB7XG4gICAgICAgICAgICAgIHRoaXMuY21pLmNvcmUubGVzc29uX3N0YXR1cyA9ICdwYXNzZWQnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5jbWkuY29yZS5sZXNzb25fc3RhdHVzID0gJ2ZhaWxlZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY21pLmNvcmUubGVzc29uX21vZGUgPT09ICdicm93c2UnKSB7XG4gICAgICAgIGlmICgodGhpcy5zdGFydGluZ0RhdGE/LmNtaT8uY29yZT8ubGVzc29uX3N0YXR1cyB8fCAnJykgPT09ICcnICYmIG9yaWdpbmFsU3RhdHVzID09PSAnbm90IGF0dGVtcHRlZCcpIHtcbiAgICAgICAgICB0aGlzLmNtaS5jb3JlLmxlc3Nvbl9zdGF0dXMgPSAnYnJvd3NlZCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21taXRPYmplY3QgPSB0aGlzLnJlbmRlckNvbW1pdENNSSh0ZXJtaW5hdGVDb21taXQgfHxcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5hbHdheXNTZW5kVG90YWxUaW1lKTtcblxuICAgIGlmICh0aGlzLmFwaUxvZ0xldmVsID09PSBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9ERUJVRykge1xuICAgICAgY29uc29sZS5kZWJ1ZygnQ29tbWl0ICh0ZXJtaW5hdGVkOiAnICsgKHRlcm1pbmF0ZUNvbW1pdCA/ICd5ZXMnIDogJ25vJykgKyAnKTogJyk7XG4gICAgICBjb25zb2xlLmRlYnVnKGNvbW1pdE9iamVjdCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNldHRpbmdzLmxtc0NvbW1pdFVybCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0h0dHBSZXF1ZXN0KHRoaXMuc2V0dGluZ3MubG1zQ29tbWl0VXJsLCBjb21taXRPYmplY3QsIHRlcm1pbmF0ZUNvbW1pdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX1RSVUU7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBTY29ybTEyQ01JIGZyb20gJy4vc2Nvcm0xMl9jbWknO1xuaW1wb3J0IHtCYXNlQ01JLCBjaGVja1ZhbGlkRm9ybWF0LCBDTUlBcnJheSwgQ01JU2NvcmV9IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCBBUElDb25zdGFudHMgZnJvbSAnLi4vY29uc3RhbnRzL2FwaV9jb25zdGFudHMnO1xuaW1wb3J0IFJlZ2V4IGZyb20gJy4uL2NvbnN0YW50cy9yZWdleCc7XG5pbXBvcnQgRXJyb3JDb2RlcyBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JfY29kZXMnO1xuaW1wb3J0IHtBSUNDVmFsaWRhdGlvbkVycm9yfSBmcm9tICcuLi9leGNlcHRpb25zJztcblxuY29uc3QgYWljY19jb25zdGFudHMgPSBBUElDb25zdGFudHMuYWljYztcbmNvbnN0IGFpY2NfcmVnZXggPSBSZWdleC5haWNjO1xuY29uc3QgYWljY19lcnJvcl9jb2RlcyA9IEVycm9yQ29kZXMuc2Nvcm0xMjtcblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kIGZvciB0aHJvd2luZyBSZWFkIE9ubHkgZXJyb3JcbiAqL1xuZnVuY3Rpb24gdGhyb3dSZWFkT25seUVycm9yKCkge1xuICB0aHJvdyBuZXcgQUlDQ1ZhbGlkYXRpb25FcnJvcihhaWNjX2Vycm9yX2NvZGVzLlJFQURfT05MWV9FTEVNRU5UKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kLCBubyByZWFzb24gdG8gaGF2ZSB0byBwYXNzIHRoZSBzYW1lIGVycm9yIGNvZGVzIGV2ZXJ5IHRpbWVcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWdleFBhdHRlcm5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dFbXB0eVN0cmluZ1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gY2hlY2tBSUNDVmFsaWRGb3JtYXQoXG4gICAgdmFsdWU6IFN0cmluZyxcbiAgICByZWdleFBhdHRlcm46IFN0cmluZyxcbiAgICBhbGxvd0VtcHR5U3RyaW5nPzogYm9vbGVhbikge1xuICByZXR1cm4gY2hlY2tWYWxpZEZvcm1hdChcbiAgICAgIHZhbHVlLFxuICAgICAgcmVnZXhQYXR0ZXJuLFxuICAgICAgYWljY19lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENILFxuICAgICAgQUlDQ1ZhbGlkYXRpb25FcnJvcixcbiAgICAgIGFsbG93RW1wdHlTdHJpbmdcbiAgKTtcbn1cblxuLyoqXG4gKiBDTUkgQ2xhc3MgZm9yIEFJQ0NcbiAqL1xuZXhwb3J0IGNsYXNzIENNSSBleHRlbmRzIFNjb3JtMTJDTUkuQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBBSUNDIENNSSBvYmplY3RcbiAgICogQHBhcmFtIHtib29sZWFufSBpbml0aWFsaXplZFxuICAgKi9cbiAgY29uc3RydWN0b3IoaW5pdGlhbGl6ZWQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcihhaWNjX2NvbnN0YW50cy5jbWlfY2hpbGRyZW4pO1xuXG4gICAgaWYgKGluaXRpYWxpemVkKSB0aGlzLmluaXRpYWxpemUoKTtcblxuICAgIHRoaXMuc3R1ZGVudF9wcmVmZXJlbmNlID0gbmV3IEFJQ0NTdHVkZW50UHJlZmVyZW5jZXMoKTtcbiAgICB0aGlzLnN0dWRlbnRfZGF0YSA9IG5ldyBBSUNDQ01JU3R1ZGVudERhdGEoKTtcbiAgICB0aGlzLnN0dWRlbnRfZGVtb2dyYXBoaWNzID0gbmV3IENNSVN0dWRlbnREZW1vZ3JhcGhpY3MoKTtcbiAgICB0aGlzLmV2YWx1YXRpb24gPSBuZXcgQ01JRXZhbHVhdGlvbigpO1xuICAgIHRoaXMucGF0aHMgPSBuZXcgQ01JUGF0aHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5zdHVkZW50X3ByZWZlcmVuY2U/LmluaXRpYWxpemUoKTtcbiAgICB0aGlzLnN0dWRlbnRfZGF0YT8uaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuc3R1ZGVudF9kZW1vZ3JhcGhpY3M/LmluaXRpYWxpemUoKTtcbiAgICB0aGlzLmV2YWx1YXRpb24/LmluaXRpYWxpemUoKTtcbiAgICB0aGlzLnBhdGhzPy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWlcbiAgICpcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBzdXNwZW5kX2RhdGE6IHN0cmluZyxcbiAgICogICAgICBsYXVuY2hfZGF0YTogc3RyaW5nLFxuICAgKiAgICAgIGNvbW1lbnRzOiBzdHJpbmcsXG4gICAqICAgICAgY29tbWVudHNfZnJvbV9sbXM6IHN0cmluZyxcbiAgICogICAgICBjb3JlOiBDTUlDb3JlLFxuICAgKiAgICAgIG9iamVjdGl2ZXM6IENNSU9iamVjdGl2ZXMsXG4gICAqICAgICAgc3R1ZGVudF9kYXRhOiBDTUlTdHVkZW50RGF0YSxcbiAgICogICAgICBzdHVkZW50X3ByZWZlcmVuY2U6IENNSVN0dWRlbnRQcmVmZXJlbmNlLFxuICAgKiAgICAgIGludGVyYWN0aW9uczogQ01JSW50ZXJhY3Rpb25zLFxuICAgKiAgICAgIHBhdGhzOiBDTUlQYXRoc1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnc3VzcGVuZF9kYXRhJzogdGhpcy5zdXNwZW5kX2RhdGEsXG4gICAgICAnbGF1bmNoX2RhdGEnOiB0aGlzLmxhdW5jaF9kYXRhLFxuICAgICAgJ2NvbW1lbnRzJzogdGhpcy5jb21tZW50cyxcbiAgICAgICdjb21tZW50c19mcm9tX2xtcyc6IHRoaXMuY29tbWVudHNfZnJvbV9sbXMsXG4gICAgICAnY29yZSc6IHRoaXMuY29yZSxcbiAgICAgICdvYmplY3RpdmVzJzogdGhpcy5vYmplY3RpdmVzLFxuICAgICAgJ3N0dWRlbnRfZGF0YSc6IHRoaXMuc3R1ZGVudF9kYXRhLFxuICAgICAgJ3N0dWRlbnRfcHJlZmVyZW5jZSc6IHRoaXMuc3R1ZGVudF9wcmVmZXJlbmNlLFxuICAgICAgJ3N0dWRlbnRfZGVtb2dyYXBoaWNzJzogdGhpcy5zdHVkZW50X2RlbW9ncmFwaGljcyxcbiAgICAgICdpbnRlcmFjdGlvbnMnOiB0aGlzLmludGVyYWN0aW9ucyxcbiAgICAgICdldmFsdWF0aW9uJzogdGhpcy5ldmFsdWF0aW9uLFxuICAgICAgJ3BhdGhzJzogdGhpcy5wYXRocyxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIEFJQ0MgRXZhbHVhdGlvbiBvYmplY3RcbiAqL1xuY2xhc3MgQ01JRXZhbHVhdGlvbiBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIEFJQ0MgRXZhbHVhdGlvbiBvYmplY3RcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmNvbW1lbnRzID0gbmV3IENNSUV2YWx1YXRpb25Db21tZW50cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIENNSSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBpbml0aWFsaXplKCkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLmNvbW1lbnRzPy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuZXZhbHVhdGlvbiBvYmplY3RcbiAgICogQHJldHVybiB7e2NvbW1lbnRzOiBDTUlFdmFsdWF0aW9uQ29tbWVudHN9fVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ2NvbW1lbnRzJzogdGhpcy5jb21tZW50cyxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBBSUNDJ3MgY21pLmV2YWx1YXRpb24uY29tbWVudHMgb2JqZWN0XG4gKi9cbmNsYXNzIENNSUV2YWx1YXRpb25Db21tZW50cyBleHRlbmRzIENNSUFycmF5IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBBSUNDIEV2YWx1YXRpb24gQ29tbWVudHMgb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih7XG4gICAgICBjaGlsZHJlbjogYWljY19jb25zdGFudHMuY29tbWVudHNfY2hpbGRyZW4sXG4gICAgICBlcnJvckNvZGU6IGFpY2NfZXJyb3JfY29kZXMuSU5WQUxJRF9TRVRfVkFMVUUsXG4gICAgICBlcnJvckNsYXNzOiBBSUNDVmFsaWRhdGlvbkVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogU3R1ZGVudFByZWZlcmVuY2VzIGNsYXNzIGZvciBBSUNDXG4gKi9cbmNsYXNzIEFJQ0NTdHVkZW50UHJlZmVyZW5jZXMgZXh0ZW5kcyBTY29ybTEyQ01JLkNNSVN0dWRlbnRQcmVmZXJlbmNlIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBBSUNDIFN0dWRlbnQgUHJlZmVyZW5jZXMgb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihhaWNjX2NvbnN0YW50cy5zdHVkZW50X3ByZWZlcmVuY2VfY2hpbGRyZW4pO1xuXG4gICAgdGhpcy53aW5kb3dzID0gbmV3IENNSUFycmF5KHtcbiAgICAgIGVycm9yQ29kZTogYWljY19lcnJvcl9jb2Rlcy5JTlZBTElEX1NFVF9WQUxVRSxcbiAgICAgIGVycm9yQ2xhc3M6IEFJQ0NWYWxpZGF0aW9uRXJyb3IsXG4gICAgICBjaGlsZHJlbjogJycsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZCBhZnRlciB0aGUgQ01JIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIGluaXRpYWxpemUoKSB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMud2luZG93cz8uaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgI2xlc3Nvbl90eXBlID0gJyc7XG4gICN0ZXh0X2NvbG9yID0gJyc7XG4gICN0ZXh0X2xvY2F0aW9uID0gJyc7XG4gICN0ZXh0X3NpemUgPSAnJztcbiAgI3ZpZGVvID0gJyc7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xlc3Nvbl90eXBlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsZXNzb25fdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiNsZXNzb25fdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsZXNzb25fdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGVzc29uX3R5cGVcbiAgICovXG4gIHNldCBsZXNzb25fdHlwZShsZXNzb25fdHlwZTogc3RyaW5nKSB7XG4gICAgaWYgKGNoZWNrQUlDQ1ZhbGlkRm9ybWF0KGxlc3Nvbl90eXBlLCBhaWNjX3JlZ2V4LkNNSVN0cmluZzI1NikpIHtcbiAgICAgIHRoaXMuI2xlc3Nvbl90eXBlID0gbGVzc29uX3R5cGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3RleHRfY29sb3JcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHRleHRfY29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy4jdGV4dF9jb2xvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICN0ZXh0X2NvbG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0X2NvbG9yXG4gICAqL1xuICBzZXQgdGV4dF9jb2xvcih0ZXh0X2NvbG9yOiBzdHJpbmcpIHtcbiAgICBpZiAoY2hlY2tBSUNDVmFsaWRGb3JtYXQodGV4dF9jb2xvciwgYWljY19yZWdleC5DTUlTdHJpbmcyNTYpKSB7XG4gICAgICB0aGlzLiN0ZXh0X2NvbG9yID0gdGV4dF9jb2xvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjdGV4dF9sb2NhdGlvblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdGV4dF9sb2NhdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiN0ZXh0X2xvY2F0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RleHRfbG9jYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRfbG9jYXRpb25cbiAgICovXG4gIHNldCB0ZXh0X2xvY2F0aW9uKHRleHRfbG9jYXRpb246IHN0cmluZykge1xuICAgIGlmIChjaGVja0FJQ0NWYWxpZEZvcm1hdCh0ZXh0X2xvY2F0aW9uLCBhaWNjX3JlZ2V4LkNNSVN0cmluZzI1NikpIHtcbiAgICAgIHRoaXMuI3RleHRfbG9jYXRpb24gPSB0ZXh0X2xvY2F0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0ZXh0X3NpemVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHRleHRfc2l6ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiN0ZXh0X3NpemU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdGV4dF9zaXplXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0X3NpemVcbiAgICovXG4gIHNldCB0ZXh0X3NpemUodGV4dF9zaXplOiBzdHJpbmcpIHtcbiAgICBpZiAoY2hlY2tBSUNDVmFsaWRGb3JtYXQodGV4dF9zaXplLCBhaWNjX3JlZ2V4LkNNSVN0cmluZzI1NikpIHtcbiAgICAgIHRoaXMuI3RleHRfc2l6ZSA9IHRleHRfc2l6ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjdmlkZW9cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHZpZGVvKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuI3ZpZGVvO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3ZpZGVvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2aWRlb1xuICAgKi9cbiAgc2V0IHZpZGVvKHZpZGVvOiBzdHJpbmcpIHtcbiAgICBpZiAoY2hlY2tBSUNDVmFsaWRGb3JtYXQodmlkZW8sIGFpY2NfcmVnZXguQ01JU3RyaW5nMjU2KSkge1xuICAgICAgdGhpcy4jdmlkZW8gPSB2aWRlbztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuc3R1ZGVudF9wcmVmZXJlbmNlXG4gICAqXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgYXVkaW86IHN0cmluZyxcbiAgICogICAgICBsYW5ndWFnZTogc3RyaW5nLFxuICAgKiAgICAgIHNwZWVkOiBzdHJpbmcsXG4gICAqICAgICAgdGV4dDogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdhdWRpbyc6IHRoaXMuYXVkaW8sXG4gICAgICAnbGFuZ3VhZ2UnOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgJ2xlc3Nvbl90eXBlJzogdGhpcy5sZXNzb25fdHlwZSxcbiAgICAgICdzcGVlZCc6IHRoaXMuc3BlZWQsXG4gICAgICAndGV4dCc6IHRoaXMudGV4dCxcbiAgICAgICd0ZXh0X2NvbG9yJzogdGhpcy50ZXh0X2NvbG9yLFxuICAgICAgJ3RleHRfbG9jYXRpb24nOiB0aGlzLnRleHRfbG9jYXRpb24sXG4gICAgICAndGV4dF9zaXplJzogdGhpcy50ZXh0X3NpemUsXG4gICAgICAndmlkZW8nOiB0aGlzLnZpZGVvLFxuICAgICAgJ3dpbmRvd3MnOiB0aGlzLndpbmRvd3MsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTdHVkZW50RGF0YSBjbGFzcyBmb3IgQUlDQ1xuICovXG5jbGFzcyBBSUNDQ01JU3R1ZGVudERhdGEgZXh0ZW5kcyBTY29ybTEyQ01JLkNNSVN0dWRlbnREYXRhIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBBSUNDIFN0dWRlbnREYXRhIG9iamVjdFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoYWljY19jb25zdGFudHMuc3R1ZGVudF9kYXRhX2NoaWxkcmVuKTtcblxuICAgIHRoaXMudHJpZXMgPSBuZXcgQ01JVHJpZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy50cmllcz8uaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgI3RyaWVzX2R1cmluZ19sZXNzb24gPSAnJztcblxuICAvKipcbiAgICogR2V0dGVyIGZvciB0cmllc19kdXJpbmdfbGVzc29uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB0cmllc19kdXJpbmdfbGVzc29uKCkge1xuICAgIHJldHVybiB0aGlzLiN0cmllc19kdXJpbmdfbGVzc29uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RyaWVzX2R1cmluZ19sZXNzb24uIFNldHMgYW4gZXJyb3IgaWYgdHJ5aW5nIHRvIHNldCBhZnRlclxuICAgKiAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmllc19kdXJpbmdfbGVzc29uXG4gICAqL1xuICBzZXQgdHJpZXNfZHVyaW5nX2xlc3Nvbih0cmllc19kdXJpbmdfbGVzc29uKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiN0cmllc19kdXJpbmdfbGVzc29uID0gdHJpZXNfZHVyaW5nX2xlc3NvbiA6XG4gICAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLnN0dWRlbnRfZGF0YSBvYmplY3RcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBtYXN0ZXJ5X3Njb3JlOiBzdHJpbmcsXG4gICAqICAgICAgbWF4X3RpbWVfYWxsb3dlZDogc3RyaW5nLFxuICAgKiAgICAgIHRpbWVfbGltaXRfYWN0aW9uOiBzdHJpbmcsXG4gICAqICAgICAgdHJpZXM6IENNSVRyaWVzXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdtYXN0ZXJ5X3Njb3JlJzogdGhpcy5tYXN0ZXJ5X3Njb3JlLFxuICAgICAgJ21heF90aW1lX2FsbG93ZWQnOiB0aGlzLm1heF90aW1lX2FsbG93ZWQsXG4gICAgICAndGltZV9saW1pdF9hY3Rpb24nOiB0aGlzLnRpbWVfbGltaXRfYWN0aW9uLFxuICAgICAgJ3RyaWVzJzogdGhpcy50cmllcyxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyB0aGUgQUlDQyBjbWkuc3R1ZGVudF9kZW1vZ3JhcGhpY3Mgb2JqZWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlTdHVkZW50RGVtb2dyYXBoaWNzIGV4dGVuZHMgQmFzZUNNSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgQUlDQyBTdHVkZW50RGVtb2dyYXBoaWNzIG9iamVjdFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gICNfY2hpbGRyZW4gPSBhaWNjX2NvbnN0YW50cy5zdHVkZW50X2RlbW9ncmFwaGljc19jaGlsZHJlbjtcbiAgI2NpdHkgPSAnJztcbiAgI2NsYXNzID0gJyc7XG4gICNjb21wYW55ID0gJyc7XG4gICNjb3VudHJ5ID0gJyc7XG4gICNleHBlcmllbmNlID0gJyc7XG4gICNmYW1pbGlhcl9uYW1lID0gJyc7XG4gICNpbnN0cnVjdG9yX25hbWUgPSAnJztcbiAgI3RpdGxlID0gJyc7XG4gICNuYXRpdmVfbGFuZ3VhZ2UgPSAnJztcbiAgI3N0YXRlID0gJyc7XG4gICNzdHJlZXRfYWRkcmVzcyA9ICcnO1xuICAjdGVsZXBob25lID0gJyc7XG4gICN5ZWFyc19leHBlcmllbmNlID0gJyc7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgX2NoaWxkcmVuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBfY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI19jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yIGNpdHlcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGNpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NpdHk7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjY2l0eS4gU2V0cyBhbiBlcnJvciBpZiB0cnlpbmcgdG8gc2V0IGFmdGVyXG4gICAqICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNpdHlcbiAgICovXG4gIHNldCBjaXR5KGNpdHkpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICAgIHRoaXMuI2NpdHkgPSBjaXR5IDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciBjbGFzc1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgY2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NsYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2NsYXNzLiBTZXRzIGFuIGVycm9yIGlmIHRyeWluZyB0byBzZXQgYWZ0ZXJcbiAgICogIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenpcbiAgICovXG4gIHNldCBjbGFzcyhjbGF6eikge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgICAgdGhpcy4jY2xhc3MgPSBjbGF6eiA6XG4gICAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgY29tcGFueVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgY29tcGFueSgpIHtcbiAgICByZXR1cm4gdGhpcy4jY29tcGFueTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNjb21wYW55LiBTZXRzIGFuIGVycm9yIGlmIHRyeWluZyB0byBzZXQgYWZ0ZXJcbiAgICogIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29tcGFueVxuICAgKi9cbiAgc2V0IGNvbXBhbnkoY29tcGFueSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgICAgdGhpcy4jY29tcGFueSA9IGNvbXBhbnkgOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yIGNvdW50cnlcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGNvdW50cnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NvdW50cnk7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjY291bnRyeS4gU2V0cyBhbiBlcnJvciBpZiB0cnlpbmcgdG8gc2V0IGFmdGVyXG4gICAqICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvdW50cnlcbiAgICovXG4gIHNldCBjb3VudHJ5KGNvdW50cnkpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICAgIHRoaXMuI2NvdW50cnkgPSBjb3VudHJ5IDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciBleHBlcmllbmNlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBleHBlcmllbmNlKCkge1xuICAgIHJldHVybiB0aGlzLiNleHBlcmllbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2V4cGVyaWVuY2UuIFNldHMgYW4gZXJyb3IgaWYgdHJ5aW5nIHRvIHNldCBhZnRlclxuICAgKiAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlcmllbmNlXG4gICAqL1xuICBzZXQgZXhwZXJpZW5jZShleHBlcmllbmNlKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiNleHBlcmllbmNlID0gZXhwZXJpZW5jZSA6XG4gICAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgZmFtaWxpYXJfbmFtZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZmFtaWxpYXJfbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jZmFtaWxpYXJfbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNmYW1pbGlhcl9uYW1lLiBTZXRzIGFuIGVycm9yIGlmIHRyeWluZyB0byBzZXQgYWZ0ZXJcbiAgICogIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmFtaWxpYXJfbmFtZVxuICAgKi9cbiAgc2V0IGZhbWlsaWFyX25hbWUoZmFtaWxpYXJfbmFtZSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgICAgdGhpcy4jZmFtaWxpYXJfbmFtZSA9IGZhbWlsaWFyX25hbWUgOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yIGluc3RydWN0b3JfbmFtZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaW5zdHJ1Y3Rvcl9uYW1lKCkge1xuICAgIHJldHVybiB0aGlzLiNpbnN0cnVjdG9yX25hbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjaW5zdHJ1Y3Rvcl9uYW1lLiBTZXRzIGFuIGVycm9yIGlmIHRyeWluZyB0byBzZXQgYWZ0ZXJcbiAgICogIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5zdHJ1Y3Rvcl9uYW1lXG4gICAqL1xuICBzZXQgaW5zdHJ1Y3Rvcl9uYW1lKGluc3RydWN0b3JfbmFtZSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgICAgdGhpcy4jaW5zdHJ1Y3Rvcl9uYW1lID0gaW5zdHJ1Y3Rvcl9uYW1lIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciB0aXRsZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdGl0bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RpdGxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RpdGxlLiBTZXRzIGFuIGVycm9yIGlmIHRyeWluZyB0byBzZXQgYWZ0ZXJcbiAgICogIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAgICovXG4gIHNldCB0aXRsZSh0aXRsZSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgICAgdGhpcy4jdGl0bGUgPSB0aXRsZSA6XG4gICAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgbmF0aXZlX2xhbmd1YWdlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBuYXRpdmVfbGFuZ3VhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI25hdGl2ZV9sYW5ndWFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNuYXRpdmVfbGFuZ3VhZ2UuIFNldHMgYW4gZXJyb3IgaWYgdHJ5aW5nIHRvIHNldCBhZnRlclxuICAgKiAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYXRpdmVfbGFuZ3VhZ2VcbiAgICovXG4gIHNldCBuYXRpdmVfbGFuZ3VhZ2UobmF0aXZlX2xhbmd1YWdlKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiNuYXRpdmVfbGFuZ3VhZ2UgPSBuYXRpdmVfbGFuZ3VhZ2UgOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yIHN0YXRlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc3RhdGUuIFNldHMgYW4gZXJyb3IgaWYgdHJ5aW5nIHRvIHNldCBhZnRlclxuICAgKiAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0ZVxuICAgKi9cbiAgc2V0IHN0YXRlKHN0YXRlKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiNzdGF0ZSA9IHN0YXRlIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciBzdHJlZXRfYWRkcmVzc1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgc3RyZWV0X2FkZHJlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N0cmVldF9hZGRyZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3N0cmVldF9hZGRyZXNzLiBTZXRzIGFuIGVycm9yIGlmIHRyeWluZyB0byBzZXQgYWZ0ZXJcbiAgICogIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyZWV0X2FkZHJlc3NcbiAgICovXG4gIHNldCBzdHJlZXRfYWRkcmVzcyhzdHJlZXRfYWRkcmVzcykge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgICAgdGhpcy4jc3RyZWV0X2FkZHJlc3MgPSBzdHJlZXRfYWRkcmVzcyA6XG4gICAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgdGVsZXBob25lXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB0ZWxlcGhvbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RlbGVwaG9uZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICN0ZWxlcGhvbmUuIFNldHMgYW4gZXJyb3IgaWYgdHJ5aW5nIHRvIHNldCBhZnRlclxuICAgKiAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZWxlcGhvbmVcbiAgICovXG4gIHNldCB0ZWxlcGhvbmUodGVsZXBob25lKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiN0ZWxlcGhvbmUgPSB0ZWxlcGhvbmUgOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yIHllYXJzX2V4cGVyaWVuY2VcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHllYXJzX2V4cGVyaWVuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3llYXJzX2V4cGVyaWVuY2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjeWVhcnNfZXhwZXJpZW5jZS4gU2V0cyBhbiBlcnJvciBpZiB0cnlpbmcgdG8gc2V0IGFmdGVyXG4gICAqICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHllYXJzX2V4cGVyaWVuY2VcbiAgICovXG4gIHNldCB5ZWFyc19leHBlcmllbmNlKHllYXJzX2V4cGVyaWVuY2UpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICAgIHRoaXMuI3llYXJzX2V4cGVyaWVuY2UgPSB5ZWFyc19leHBlcmllbmNlIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuc3R1ZGVudF9kZW1vZ3JhcGhpY3Mgb2JqZWN0XG4gICAqIEByZXR1cm4ge1xuICAgKiAgICAgIHtcbiAgICogICAgICAgIGNpdHk6IHN0cmluZyxcbiAgICogICAgICAgIGNsYXNzOiBzdHJpbmcsXG4gICAqICAgICAgICBjb21wYW55OiBzdHJpbmcsXG4gICAqICAgICAgICBjb3VudHJ5OiBzdHJpbmcsXG4gICAqICAgICAgICBleHBlcmllbmNlOiBzdHJpbmcsXG4gICAqICAgICAgICBmYW1pbGlhcl9uYW1lOiBzdHJpbmcsXG4gICAqICAgICAgICBpbnN0cnVjdG9yX25hbWU6IHN0cmluZyxcbiAgICogICAgICAgIHRpdGxlOiBzdHJpbmcsXG4gICAqICAgICAgICBuYXRpdmVfbGFuZ3VhZ2U6IHN0cmluZyxcbiAgICogICAgICAgIHN0YXRlOiBzdHJpbmcsXG4gICAqICAgICAgICBzdHJlZXRfYWRkcmVzczogc3RyaW5nLFxuICAgKiAgICAgICAgdGVsZXBob25lOiBzdHJpbmcsXG4gICAqICAgICAgICB5ZWFyc19leHBlcmllbmNlOiBzdHJpbmdcbiAgICogICAgICB9XG4gICAqICAgIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdjaXR5JzogdGhpcy5jaXR5LFxuICAgICAgJ2NsYXNzJzogdGhpcy5jbGFzcyxcbiAgICAgICdjb21wYW55JzogdGhpcy5jb21wYW55LFxuICAgICAgJ2NvdW50cnknOiB0aGlzLmNvdW50cnksXG4gICAgICAnZXhwZXJpZW5jZSc6IHRoaXMuZXhwZXJpZW5jZSxcbiAgICAgICdmYW1pbGlhcl9uYW1lJzogdGhpcy5mYW1pbGlhcl9uYW1lLFxuICAgICAgJ2luc3RydWN0b3JfbmFtZSc6IHRoaXMuaW5zdHJ1Y3Rvcl9uYW1lLFxuICAgICAgJ3RpdGxlJzogdGhpcy50aXRsZSxcbiAgICAgICduYXRpdmVfbGFuZ3VhZ2UnOiB0aGlzLm5hdGl2ZV9sYW5ndWFnZSxcbiAgICAgICdzdGF0ZSc6IHRoaXMuc3RhdGUsXG4gICAgICAnc3RyZWV0X2FkZHJlc3MnOiB0aGlzLnN0cmVldF9hZGRyZXNzLFxuICAgICAgJ3RlbGVwaG9uZSc6IHRoaXMudGVsZXBob25lLFxuICAgICAgJ3llYXJzX2V4cGVyaWVuY2UnOiB0aGlzLnllYXJzX2V4cGVyaWVuY2UsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgdGhlIEFJQ0MgY21pLnBhdGhzIG9iamVjdFxuICovXG5leHBvcnQgY2xhc3MgQ01JUGF0aHMgZXh0ZW5kcyBDTUlBcnJheSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgaW5saW5lIFBhdGhzIEFycmF5IGNsYXNzXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih7Y2hpbGRyZW46IGFpY2NfY29uc3RhbnRzLnBhdGhzX2NoaWxkcmVufSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyBmb3IgQUlDQyBQYXRoc1xuICovXG5leHBvcnQgY2xhc3MgQ01JUGF0aHNPYmplY3QgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBBSUNDIFBhdGhzIG9iamVjdHNcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAjbG9jYXRpb25faWQgPSAnJztcbiAgI2RhdGUgPSAnJztcbiAgI3RpbWUgPSAnJztcbiAgI3N0YXR1cyA9ICcnO1xuICAjd2h5X2xlZnQgPSAnJztcbiAgI3RpbWVfaW5fZWxlbWVudCA9ICcnO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsb2NhdGlvbl9pZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbG9jYXRpb25faWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xvY2F0aW9uX2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xvY2F0aW9uX2lkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbl9pZFxuICAgKi9cbiAgc2V0IGxvY2F0aW9uX2lkKGxvY2F0aW9uX2lkKSB7XG4gICAgaWYgKGNoZWNrQUlDQ1ZhbGlkRm9ybWF0KGxvY2F0aW9uX2lkLCBhaWNjX3JlZ2V4LkNNSVN0cmluZzI1NikpIHtcbiAgICAgIHRoaXMuI2xvY2F0aW9uX2lkID0gbG9jYXRpb25faWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2RhdGVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGRhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2RhdGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjZGF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0ZVxuICAgKi9cbiAgc2V0IGRhdGUoZGF0ZSkge1xuICAgIGlmIChjaGVja0FJQ0NWYWxpZEZvcm1hdChkYXRlLCBhaWNjX3JlZ2V4LkNNSVN0cmluZzI1NikpIHtcbiAgICAgIHRoaXMuI2RhdGUgPSBkYXRlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0aW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB0aW1lKCkge1xuICAgIHJldHVybiB0aGlzLiN0aW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWVcbiAgICovXG4gIHNldCB0aW1lKHRpbWUpIHtcbiAgICBpZiAoY2hlY2tBSUNDVmFsaWRGb3JtYXQodGltZSwgYWljY19yZWdleC5DTUlUaW1lKSkge1xuICAgICAgdGhpcy4jdGltZSA9IHRpbWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3N0YXR1c1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgc3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLiNzdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc3RhdHVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0dXNcbiAgICovXG4gIHNldCBzdGF0dXMoc3RhdHVzKSB7XG4gICAgaWYgKGNoZWNrQUlDQ1ZhbGlkRm9ybWF0KHN0YXR1cywgYWljY19yZWdleC5DTUlTdGF0dXMyKSkge1xuICAgICAgdGhpcy4jc3RhdHVzID0gc3RhdHVzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN3aHlfbGVmdFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgd2h5X2xlZnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3doeV9sZWZ0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3doeV9sZWZ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSB3aHlfbGVmdFxuICAgKi9cbiAgc2V0IHdoeV9sZWZ0KHdoeV9sZWZ0KSB7XG4gICAgaWYgKGNoZWNrQUlDQ1ZhbGlkRm9ybWF0KHdoeV9sZWZ0LCBhaWNjX3JlZ2V4LkNNSVN0cmluZzI1NikpIHtcbiAgICAgIHRoaXMuI3doeV9sZWZ0ID0gd2h5X2xlZnQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3RpbWVfaW5fZWxlbWVudFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdGltZV9pbl9lbGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLiN0aW1lX2luX2VsZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdGltZV9pbl9lbGVtZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lX2luX2VsZW1lbnRcbiAgICovXG4gIHNldCB0aW1lX2luX2VsZW1lbnQodGltZV9pbl9lbGVtZW50KSB7XG4gICAgaWYgKGNoZWNrQUlDQ1ZhbGlkRm9ybWF0KHRpbWVfaW5fZWxlbWVudCwgYWljY19yZWdleC5DTUlUaW1lKSkge1xuICAgICAgdGhpcy4jdGltZV9pbl9lbGVtZW50ID0gdGltZV9pbl9lbGVtZW50O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5wYXRocy5uIG9iamVjdFxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGxvY2F0aW9uX2lkOiBzdHJpbmcsXG4gICAqICAgICAgZGF0ZTogc3RyaW5nLFxuICAgKiAgICAgIHRpbWU6IHN0cmluZyxcbiAgICogICAgICBzdGF0dXM6IHN0cmluZyxcbiAgICogICAgICB3aHlfbGVmdDogc3RyaW5nLFxuICAgKiAgICAgIHRpbWVfaW5fZWxlbWVudDogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdsb2NhdGlvbl9pZCc6IHRoaXMubG9jYXRpb25faWQsXG4gICAgICAnZGF0ZSc6IHRoaXMuZGF0ZSxcbiAgICAgICd0aW1lJzogdGhpcy50aW1lLFxuICAgICAgJ3N0YXR1cyc6IHRoaXMuc3RhdHVzLFxuICAgICAgJ3doeV9sZWZ0JzogdGhpcy53aHlfbGVmdCxcbiAgICAgICd0aW1lX2luX2VsZW1lbnQnOiB0aGlzLnRpbWVfaW5fZWxlbWVudCxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyB0aGUgQUlDQyBjbWkuc3R1ZGVudF9kYXRhLnRyaWVzIG9iamVjdFxuICovXG5leHBvcnQgY2xhc3MgQ01JVHJpZXMgZXh0ZW5kcyBDTUlBcnJheSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgaW5saW5lIFRyaWVzIEFycmF5IGNsYXNzXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih7Y2hpbGRyZW46IGFpY2NfY29uc3RhbnRzLnRyaWVzX2NoaWxkcmVufSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyBmb3IgQUlDQyBUcmllc1xuICovXG5leHBvcnQgY2xhc3MgQ01JVHJpZXNPYmplY3QgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBBSUNDIFRyaWVzIG9iamVjdFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuc2NvcmUgPSBuZXcgQ01JU2NvcmUoXG4gICAgICAgIHtcbiAgICAgICAgICBzY29yZV9jaGlsZHJlbjogYWljY19jb25zdGFudHMuc2NvcmVfY2hpbGRyZW4sXG4gICAgICAgICAgc2NvcmVfcmFuZ2U6IGFpY2NfcmVnZXguc2NvcmVfcmFuZ2UsXG4gICAgICAgICAgaW52YWxpZEVycm9yQ29kZTogYWljY19lcnJvcl9jb2Rlcy5JTlZBTElEX1NFVF9WQUxVRSxcbiAgICAgICAgICBpbnZhbGlkVHlwZUNvZGU6IGFpY2NfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCxcbiAgICAgICAgICBpbnZhbGlkUmFuZ2VDb2RlOiBhaWNjX2Vycm9yX2NvZGVzLlZBTFVFX09VVF9PRl9SQU5HRSxcbiAgICAgICAgICBlcnJvckNsYXNzOiBBSUNDVmFsaWRhdGlvbkVycm9yLFxuICAgICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5zY29yZT8uaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgI3N0YXR1cyA9ICcnO1xuICAjdGltZSA9ICcnO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzdGF0dXNcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy4jc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3N0YXR1c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RhdHVzXG4gICAqL1xuICBzZXQgc3RhdHVzKHN0YXR1cykge1xuICAgIGlmIChjaGVja0FJQ0NWYWxpZEZvcm1hdChzdGF0dXMsIGFpY2NfcmVnZXguQ01JU3RhdHVzMikpIHtcbiAgICAgIHRoaXMuI3N0YXR1cyA9IHN0YXR1cztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjdGltZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jdGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICN0aW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lXG4gICAqL1xuICBzZXQgdGltZSh0aW1lKSB7XG4gICAgaWYgKGNoZWNrQUlDQ1ZhbGlkRm9ybWF0KHRpbWUsIGFpY2NfcmVnZXguQ01JVGltZSkpIHtcbiAgICAgIHRoaXMuI3RpbWUgPSB0aW1lO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5zdHVkZW50X2RhdGEudHJpZXMubiBvYmplY3RcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBzdGF0dXM6IHN0cmluZyxcbiAgICogICAgICB0aW1lOiBzdHJpbmcsXG4gICAqICAgICAgc2NvcmU6IENNSVNjb3JlXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdzdGF0dXMnOiB0aGlzLnN0YXR1cyxcbiAgICAgICd0aW1lJzogdGhpcy50aW1lLFxuICAgICAgJ3Njb3JlJzogdGhpcy5zY29yZSxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIGZvciBjbWkuc3R1ZGVudF9kYXRhLmF0dGVtcHRfcmVjb3JkcyBhcnJheVxuICovXG5leHBvcnQgY2xhc3MgQ01JQXR0ZW1wdFJlY29yZHMgZXh0ZW5kcyBDTUlBcnJheSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgaW5saW5lIFRyaWVzIEFycmF5IGNsYXNzXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih7Y2hpbGRyZW46IGFpY2NfY29uc3RhbnRzLmF0dGVtcHRfcmVjb3Jkc19jaGlsZHJlbn0pO1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgZm9yIEFJQ0MgQXR0ZW1wdCBSZWNvcmRzXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlBdHRlbXB0UmVjb3Jkc09iamVjdCBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIEFJQ0MgQXR0ZW1wdCBSZWNvcmRzIG9iamVjdFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuc2NvcmUgPSBuZXcgQ01JU2NvcmUoXG4gICAgICAgIHtcbiAgICAgICAgICBzY29yZV9jaGlsZHJlbjogYWljY19jb25zdGFudHMuc2NvcmVfY2hpbGRyZW4sXG4gICAgICAgICAgc2NvcmVfcmFuZ2U6IGFpY2NfcmVnZXguc2NvcmVfcmFuZ2UsXG4gICAgICAgICAgaW52YWxpZEVycm9yQ29kZTogYWljY19lcnJvcl9jb2Rlcy5JTlZBTElEX1NFVF9WQUxVRSxcbiAgICAgICAgICBpbnZhbGlkVHlwZUNvZGU6IGFpY2NfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCxcbiAgICAgICAgICBpbnZhbGlkUmFuZ2VDb2RlOiBhaWNjX2Vycm9yX2NvZGVzLlZBTFVFX09VVF9PRl9SQU5HRSxcbiAgICAgICAgICBlcnJvckNsYXNzOiBBSUNDVmFsaWRhdGlvbkVycm9yLFxuICAgICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5zY29yZT8uaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgI2xlc3Nvbl9zdGF0dXMgPSAnJztcblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbGVzc29uX3N0YXR1c1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbGVzc29uX3N0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy4jbGVzc29uX3N0YXR1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsZXNzb25fc3RhdHVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsZXNzb25fc3RhdHVzXG4gICAqL1xuICBzZXQgbGVzc29uX3N0YXR1cyhsZXNzb25fc3RhdHVzKSB7XG4gICAgaWYgKGNoZWNrQUlDQ1ZhbGlkRm9ybWF0KGxlc3Nvbl9zdGF0dXMsIGFpY2NfcmVnZXguQ01JU3RhdHVzMikpIHtcbiAgICAgIHRoaXMuI2xlc3Nvbl9zdGF0dXMgPSBsZXNzb25fc3RhdHVzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5zdHVkZW50X2RhdGEuYXR0ZW1wdF9yZWNvcmRzLm4gb2JqZWN0XG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgc3RhdHVzOiBzdHJpbmcsXG4gICAqICAgICAgdGltZTogc3RyaW5nLFxuICAgKiAgICAgIHNjb3JlOiBDTUlTY29yZVxuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnbGVzc29uX3N0YXR1cyc6IHRoaXMubGVzc29uX3N0YXR1cyxcbiAgICAgICdzY29yZSc6IHRoaXMuc2NvcmUsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyBmb3IgQUlDQyBFdmFsdWF0aW9uIENvbW1lbnRzXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlFdmFsdWF0aW9uQ29tbWVudHNPYmplY3QgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBFdmFsdWF0aW9uIENvbW1lbnRzXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgI2NvbnRlbnQgPSAnJztcbiAgI2xvY2F0aW9uID0gJyc7XG4gICN0aW1lID0gJyc7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2NvbnRlbnRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGNvbnRlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbnRlbnQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjY29udGVudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgKi9cbiAgc2V0IGNvbnRlbnQoY29udGVudCkge1xuICAgIGlmIChjaGVja0FJQ0NWYWxpZEZvcm1hdChjb250ZW50LCBhaWNjX3JlZ2V4LkNNSVN0cmluZzI1NikpIHtcbiAgICAgIHRoaXMuI2NvbnRlbnQgPSBjb250ZW50O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsb2NhdGlvblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbG9jYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xvY2F0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xvY2F0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvblxuICAgKi9cbiAgc2V0IGxvY2F0aW9uKGxvY2F0aW9uKSB7XG4gICAgaWYgKGNoZWNrQUlDQ1ZhbGlkRm9ybWF0KGxvY2F0aW9uLCBhaWNjX3JlZ2V4LkNNSVN0cmluZzI1NikpIHtcbiAgICAgIHRoaXMuI2xvY2F0aW9uID0gbG9jYXRpb247XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3RpbWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RpbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGluZyBmb3IgI3RpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWVcbiAgICovXG4gIHNldCB0aW1lKHRpbWUpIHtcbiAgICBpZiAoY2hlY2tBSUNDVmFsaWRGb3JtYXQodGltZSwgYWljY19yZWdleC5DTUlUaW1lKSkge1xuICAgICAgdGhpcy4jdGltZSA9IHRpbWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLmV2YXVsYXRpb24uY29tbWVudHMubiBvYmplY3RcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBjb250ZW50OiBzdHJpbmcsXG4gICAqICAgICAgbG9jYXRpb246IHN0cmluZyxcbiAgICogICAgICB0aW1lOiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ2NvbnRlbnQnOiB0aGlzLmNvbnRlbnQsXG4gICAgICAnbG9jYXRpb24nOiB0aGlzLmxvY2F0aW9uLFxuICAgICAgJ3RpbWUnOiB0aGlzLnRpbWUsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgQVBJQ29uc3RhbnRzIGZyb20gJy4uL2NvbnN0YW50cy9hcGlfY29uc3RhbnRzJztcbmltcG9ydCBFcnJvckNvZGVzIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9jb2Rlcyc7XG5pbXBvcnQgUmVnZXggZnJvbSAnLi4vY29uc3RhbnRzL3JlZ2V4JztcblxuY29uc3Qgc2Nvcm0xMl9jb25zdGFudHMgPSBBUElDb25zdGFudHMuc2Nvcm0xMjtcbmNvbnN0IHNjb3JtMTJfcmVnZXggPSBSZWdleC5zY29ybTEyO1xuY29uc3Qgc2Nvcm0xMl9lcnJvcl9jb2RlcyA9IEVycm9yQ29kZXMuc2Nvcm0xMjtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgdmFsdWUgbWF0Y2hlcyB0aGUgcHJvcGVyIGZvcm1hdC4gSWYgbm90LCB0aHJvdyBwcm9wZXIgZXJyb3IgY29kZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWdleFBhdHRlcm5cbiAqIEBwYXJhbSB7bnVtYmVyfSBlcnJvckNvZGVcbiAqIEBwYXJhbSB7Y2xhc3N9IGVycm9yQ2xhc3NcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dFbXB0eVN0cmluZ1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrVmFsaWRGb3JtYXQoXG4gICAgdmFsdWU6IFN0cmluZyxcbiAgICByZWdleFBhdHRlcm46IFN0cmluZyxcbiAgICBlcnJvckNvZGU6IG51bWJlcixcbiAgICBlcnJvckNsYXNzOiBmdW5jdGlvbixcbiAgICBhbGxvd0VtcHR5U3RyaW5nPzogYm9vbGVhbikge1xuICBjb25zdCBmb3JtYXRSZWdleCA9IG5ldyBSZWdFeHAocmVnZXhQYXR0ZXJuKTtcbiAgY29uc3QgbWF0Y2hlcyA9IHZhbHVlLm1hdGNoKGZvcm1hdFJlZ2V4KTtcbiAgaWYgKGFsbG93RW1wdHlTdHJpbmcgJiYgdmFsdWUgPT09ICcnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgIW1hdGNoZXMgfHwgbWF0Y2hlc1swXSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IoZXJyb3JDb2RlKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgdmFsdWUgbWF0Y2hlcyB0aGUgcHJvcGVyIHJhbmdlLiBJZiBub3QsIHRocm93IHByb3BlciBlcnJvciBjb2RlLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSByYW5nZVBhdHRlcm5cbiAqIEBwYXJhbSB7bnVtYmVyfSBlcnJvckNvZGVcbiAqIEBwYXJhbSB7Y2xhc3N9IGVycm9yQ2xhc3NcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1ZhbGlkUmFuZ2UoXG4gICAgdmFsdWU6IGFueSxcbiAgICByYW5nZVBhdHRlcm46IFN0cmluZyxcbiAgICBlcnJvckNvZGU6IG51bWJlcixcbiAgICBlcnJvckNsYXNzOiBmdW5jdGlvbikge1xuICBjb25zdCByYW5nZXMgPSByYW5nZVBhdHRlcm4uc3BsaXQoJyMnKTtcbiAgdmFsdWUgPSB2YWx1ZSAqIDEuMDtcbiAgaWYgKHZhbHVlID49IHJhbmdlc1swXSkge1xuICAgIGlmICgocmFuZ2VzWzFdID09PSAnKicpIHx8ICh2YWx1ZSA8PSByYW5nZXNbMV0pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IGVycm9yQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yKGVycm9yQ29kZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBlcnJvckNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvcihlcnJvckNvZGUpO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgQVBJIGNtaSBvYmplY3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlQ01JIHtcbiAganNvblN0cmluZyA9IGZhbHNlO1xuICAjaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgI3N0YXJ0X3RpbWU7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBCYXNlQ01JLCBqdXN0IG1hcmtzIHRoZSBjbGFzcyBhcyBhYnN0cmFjdFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKG5ldy50YXJnZXQgPT09IEJhc2VDTUkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb25zdHJ1Y3QgQmFzZUNNSSBpbnN0YW5jZXMgZGlyZWN0bHknKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjaW5pdGlhbGl6ZWRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGdldCBpbml0aWFsaXplZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jaW5pdGlhbGl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc3RhcnRfdGltZVxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAqL1xuICBnZXQgc3RhcnRfdGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jc3RhcnRfdGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICB0aGlzLiNpbml0aWFsaXplZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsYXllciBzaG91bGQgb3ZlcnJpZGUgdGhlICdzZXNzaW9uX3RpbWUnIHByb3ZpZGVkIGJ5XG4gICAqIHRoZSBtb2R1bGVcbiAgICovXG4gIHNldFN0YXJ0VGltZSgpIHtcbiAgICB0aGlzLiNzdGFydF90aW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBjbWkgKi5zY29yZSBvYmplY3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlTY29yZSBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yICouc2NvcmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjb3JlX2NoaWxkcmVuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY29yZV9yYW5nZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF4XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbnZhbGlkRXJyb3JDb2RlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbnZhbGlkVHlwZUNvZGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGludmFsaWRSYW5nZUNvZGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlY2ltYWxSZWdleFxuICAgKiBAcGFyYW0ge2NsYXNzfSBlcnJvckNsYXNzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICAgIHtcbiAgICAgICAgc2NvcmVfY2hpbGRyZW4sXG4gICAgICAgIHNjb3JlX3JhbmdlLFxuICAgICAgICBtYXgsXG4gICAgICAgIGludmFsaWRFcnJvckNvZGUsXG4gICAgICAgIGludmFsaWRUeXBlQ29kZSxcbiAgICAgICAgaW52YWxpZFJhbmdlQ29kZSxcbiAgICAgICAgZGVjaW1hbFJlZ2V4LFxuICAgICAgICBlcnJvckNsYXNzLFxuICAgICAgfSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLiNfY2hpbGRyZW4gPSBzY29yZV9jaGlsZHJlbiB8fFxuICAgICAgICBzY29ybTEyX2NvbnN0YW50cy5zY29yZV9jaGlsZHJlbjtcbiAgICB0aGlzLiNfc2NvcmVfcmFuZ2UgPSAhc2NvcmVfcmFuZ2UgPyBmYWxzZSA6IHNjb3JtMTJfcmVnZXguc2NvcmVfcmFuZ2U7XG4gICAgdGhpcy4jbWF4ID0gKG1heCB8fCBtYXggPT09ICcnKSA/IG1heCA6ICcxMDAnO1xuICAgIHRoaXMuI19pbnZhbGlkX2Vycm9yX2NvZGUgPSBpbnZhbGlkRXJyb3JDb2RlIHx8XG4gICAgICAgIHNjb3JtMTJfZXJyb3JfY29kZXMuSU5WQUxJRF9TRVRfVkFMVUU7XG4gICAgdGhpcy4jX2ludmFsaWRfdHlwZV9jb2RlID0gaW52YWxpZFR5cGVDb2RlIHx8XG4gICAgICAgIHNjb3JtMTJfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSDtcbiAgICB0aGlzLiNfaW52YWxpZF9yYW5nZV9jb2RlID0gaW52YWxpZFJhbmdlQ29kZSB8fFxuICAgICAgICBzY29ybTEyX2Vycm9yX2NvZGVzLlZBTFVFX09VVF9PRl9SQU5HRTtcbiAgICB0aGlzLiNfZGVjaW1hbF9yZWdleCA9IGRlY2ltYWxSZWdleCB8fFxuICAgICAgICBzY29ybTEyX3JlZ2V4LkNNSURlY2ltYWw7XG4gICAgdGhpcy4jX2Vycm9yX2NsYXNzID0gZXJyb3JDbGFzcztcbiAgfVxuXG4gICNfY2hpbGRyZW47XG4gICNfc2NvcmVfcmFuZ2U7XG4gICNfaW52YWxpZF9lcnJvcl9jb2RlO1xuICAjX2ludmFsaWRfdHlwZV9jb2RlO1xuICAjX2ludmFsaWRfcmFuZ2VfY29kZTtcbiAgI19kZWNpbWFsX3JlZ2V4O1xuICAjX2Vycm9yX2NsYXNzO1xuICAjcmF3ID0gJyc7XG4gICNtaW4gPSAnJztcbiAgI21heDtcblxuICAvKipcbiAgICogR2V0dGVyIGZvciBfY2hpbGRyZW5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0IF9jaGlsZHJlbigpIHtcbiAgICByZXR1cm4gdGhpcy4jX2NoaWxkcmVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgX2NoaWxkcmVuLiBKdXN0IHRocm93cyBhbiBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IF9jaGlsZHJlblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2V0IF9jaGlsZHJlbihfY2hpbGRyZW4pIHtcbiAgICB0aHJvdyBuZXcgdGhpcy4jX2Vycm9yX2NsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcih0aGlzLiNfaW52YWxpZF9lcnJvcl9jb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNyYXdcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHJhdygpIHtcbiAgICByZXR1cm4gdGhpcy4jcmF3O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3Jhd1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcmF3XG4gICAqL1xuICBzZXQgcmF3KHJhdykge1xuICAgIGlmIChjaGVja1ZhbGlkRm9ybWF0KHJhdywgdGhpcy4jX2RlY2ltYWxfcmVnZXgsIHRoaXMuI19pbnZhbGlkX3R5cGVfY29kZSwgdGhpcy4jX2Vycm9yX2NsYXNzKSAmJlxuICAgICAgICAoIXRoaXMuI19zY29yZV9yYW5nZSB8fFxuICAgICAgICAgICAgY2hlY2tWYWxpZFJhbmdlKHJhdywgdGhpcy4jX3Njb3JlX3JhbmdlLCB0aGlzLiNfaW52YWxpZF9yYW5nZV9jb2RlLCB0aGlzLiNfZXJyb3JfY2xhc3MpKSkge1xuICAgICAgdGhpcy4jcmF3ID0gcmF3O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNtaW5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG1pbigpIHtcbiAgICByZXR1cm4gdGhpcy4jbWluO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI21pblxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWluXG4gICAqL1xuICBzZXQgbWluKG1pbikge1xuICAgIGlmIChjaGVja1ZhbGlkRm9ybWF0KG1pbiwgdGhpcy4jX2RlY2ltYWxfcmVnZXgsIHRoaXMuI19pbnZhbGlkX3R5cGVfY29kZSwgdGhpcy4jX2Vycm9yX2NsYXNzKSAmJlxuICAgICAgICAoIXRoaXMuI19zY29yZV9yYW5nZSB8fFxuICAgICAgICAgICAgY2hlY2tWYWxpZFJhbmdlKG1pbiwgdGhpcy4jX3Njb3JlX3JhbmdlLCB0aGlzLiNfaW52YWxpZF9yYW5nZV9jb2RlLCB0aGlzLiNfZXJyb3JfY2xhc3MpKSkge1xuICAgICAgdGhpcy4jbWluID0gbWluO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNtYXhcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG1heCgpIHtcbiAgICByZXR1cm4gdGhpcy4jbWF4O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI21heFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF4XG4gICAqL1xuICBzZXQgbWF4KG1heCkge1xuICAgIGlmIChjaGVja1ZhbGlkRm9ybWF0KG1heCwgdGhpcy4jX2RlY2ltYWxfcmVnZXgsIHRoaXMuI19pbnZhbGlkX3R5cGVfY29kZSwgdGhpcy4jX2Vycm9yX2NsYXNzKSAmJlxuICAgICAgICAoIXRoaXMuI19zY29yZV9yYW5nZSB8fFxuICAgICAgICAgICAgY2hlY2tWYWxpZFJhbmdlKG1heCwgdGhpcy4jX3Njb3JlX3JhbmdlLCB0aGlzLiNfaW52YWxpZF9yYW5nZV9jb2RlLCB0aGlzLiNfZXJyb3JfY2xhc3MpKSkge1xuICAgICAgdGhpcy4jbWF4ID0gbWF4O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yICouc2NvcmVcbiAgICogQHJldHVybiB7e21pbjogc3RyaW5nLCBtYXg6IHN0cmluZywgcmF3OiBzdHJpbmd9fVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ3Jhdyc6IHRoaXMucmF3LFxuICAgICAgJ21pbic6IHRoaXMubWluLFxuICAgICAgJ21heCc6IHRoaXMubWF4LFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgY21pICoubiBvYmplY3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlBcnJheSBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgY21pICoubiBhcnJheXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoaWxkcmVuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBlcnJvckNvZGVcbiAgICogQHBhcmFtIHtjbGFzc30gZXJyb3JDbGFzc1xuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NoaWxkcmVuLCBlcnJvckNvZGUsIGVycm9yQ2xhc3N9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLiNfY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICB0aGlzLiNlcnJvckNvZGUgPSBlcnJvckNvZGU7XG4gICAgdGhpcy4jZXJyb3JDbGFzcyA9IGVycm9yQ2xhc3M7XG4gICAgdGhpcy5jaGlsZEFycmF5ID0gW107XG4gIH1cblxuICAjZXJyb3JDb2RlO1xuICAjZXJyb3JDbGFzcztcbiAgI19jaGlsZHJlbjtcblxuICAvKipcbiAgICogR2V0dGVyIGZvciBfY2hpbGRyZW5cbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldCBfY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI19jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yIF9jaGlsZHJlbi4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfY2hpbGRyZW5cbiAgICovXG4gIHNldCBfY2hpbGRyZW4oX2NoaWxkcmVuKSB7XG4gICAgdGhyb3cgbmV3IHRoaXMuI2Vycm9yQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yKHRoaXMuI2Vycm9yQ29kZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciBfY291bnRcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IF9jb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZEFycmF5Lmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yIF9jb3VudC4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBfY291bnRcbiAgICovXG4gIHNldCBfY291bnQoX2NvdW50KSB7XG4gICAgdGhyb3cgbmV3IHRoaXMuI2Vycm9yQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yKHRoaXMuI2Vycm9yQ29kZSk7XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciAqLm4gYXJyYXlzXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHRbaSArICcnXSA9IHRoaXMuY2hpbGRBcnJheVtpXTtcbiAgICB9XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtcbiAgQmFzZUNNSSxcbiAgY2hlY2tWYWxpZEZvcm1hdCxcbiAgY2hlY2tWYWxpZFJhbmdlLFxuICBDTUlBcnJheSxcbiAgQ01JU2NvcmUsXG59IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCBBUElDb25zdGFudHMgZnJvbSAnLi4vY29uc3RhbnRzL2FwaV9jb25zdGFudHMnO1xuaW1wb3J0IEVycm9yQ29kZXMgZnJvbSAnLi4vY29uc3RhbnRzL2Vycm9yX2NvZGVzJztcbmltcG9ydCBSZWdleCBmcm9tICcuLi9jb25zdGFudHMvcmVnZXgnO1xuaW1wb3J0IHtTY29ybTEyVmFsaWRhdGlvbkVycm9yfSBmcm9tICcuLi9leGNlcHRpb25zJztcbmltcG9ydCAqIGFzIFV0aWxpdGllcyBmcm9tICcuLi91dGlsaXRpZXMnO1xuaW1wb3J0ICogYXMgVXRpbCBmcm9tICcuLi91dGlsaXRpZXMnO1xuXG5jb25zdCBzY29ybTEyX2NvbnN0YW50cyA9IEFQSUNvbnN0YW50cy5zY29ybTEyO1xuY29uc3Qgc2Nvcm0xMl9yZWdleCA9IFJlZ2V4LnNjb3JtMTI7XG5jb25zdCBzY29ybTEyX2Vycm9yX2NvZGVzID0gRXJyb3JDb2Rlcy5zY29ybTEyO1xuXG4vKipcbiAqIEhlbHBlciBtZXRob2QgZm9yIHRocm93aW5nIFJlYWQgT25seSBlcnJvclxuICovXG5leHBvcnQgZnVuY3Rpb24gdGhyb3dSZWFkT25seUVycm9yKCkge1xuICB0aHJvdyBuZXcgU2Nvcm0xMlZhbGlkYXRpb25FcnJvcihzY29ybTEyX2Vycm9yX2NvZGVzLlJFQURfT05MWV9FTEVNRU5UKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kIGZvciB0aHJvd2luZyBXcml0ZSBPbmx5IGVycm9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd1dyaXRlT25seUVycm9yKCkge1xuICB0aHJvdyBuZXcgU2Nvcm0xMlZhbGlkYXRpb25FcnJvcihzY29ybTEyX2Vycm9yX2NvZGVzLldSSVRFX09OTFlfRUxFTUVOVCk7XG59XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCBmb3IgdGhyb3dpbmcgSW52YWxpZCBTZXQgZXJyb3JcbiAqL1xuZnVuY3Rpb24gdGhyb3dJbnZhbGlkVmFsdWVFcnJvcigpIHtcbiAgdGhyb3cgbmV3IFNjb3JtMTJWYWxpZGF0aW9uRXJyb3Ioc2Nvcm0xMl9lcnJvcl9jb2Rlcy5JTlZBTElEX1NFVF9WQUxVRSk7XG59XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCwgbm8gcmVhc29uIHRvIGhhdmUgdG8gcGFzcyB0aGUgc2FtZSBlcnJvciBjb2RlcyBldmVyeSB0aW1lXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVnZXhQYXR0ZXJuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93RW1wdHlTdHJpbmdcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVjazEyVmFsaWRGb3JtYXQoXG4gICAgdmFsdWU6IFN0cmluZyxcbiAgICByZWdleFBhdHRlcm46IFN0cmluZyxcbiAgICBhbGxvd0VtcHR5U3RyaW5nPzogYm9vbGVhbikge1xuICByZXR1cm4gY2hlY2tWYWxpZEZvcm1hdChcbiAgICAgIHZhbHVlLFxuICAgICAgcmVnZXhQYXR0ZXJuLFxuICAgICAgc2Nvcm0xMl9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENILFxuICAgICAgU2Nvcm0xMlZhbGlkYXRpb25FcnJvcixcbiAgICAgIGFsbG93RW1wdHlTdHJpbmdcbiAgKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kLCBubyByZWFzb24gdG8gaGF2ZSB0byBwYXNzIHRoZSBzYW1lIGVycm9yIGNvZGVzIGV2ZXJ5IHRpbWVcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSByYW5nZVBhdHRlcm5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dFbXB0eVN0cmluZ1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrMTJWYWxpZFJhbmdlKFxuICAgIHZhbHVlOiBhbnksXG4gICAgcmFuZ2VQYXR0ZXJuOiBTdHJpbmcsXG4gICAgYWxsb3dFbXB0eVN0cmluZz86IGJvb2xlYW4pIHtcbiAgcmV0dXJuIGNoZWNrVmFsaWRSYW5nZShcbiAgICAgIHZhbHVlLFxuICAgICAgcmFuZ2VQYXR0ZXJuLFxuICAgICAgc2Nvcm0xMl9lcnJvcl9jb2Rlcy5WQUxVRV9PVVRfT0ZfUkFOR0UsXG4gICAgICBTY29ybTEyVmFsaWRhdGlvbkVycm9yLFxuICAgICAgYWxsb3dFbXB0eVN0cmluZ1xuICApO1xufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyB0aGUgY21pIG9iamVjdCBmb3IgU0NPUk0gMS4yXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUkgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgI19jaGlsZHJlbiA9ICcnO1xuICAjX3ZlcnNpb24gPSAnMy40JztcbiAgI2xhdW5jaF9kYXRhID0gJyc7XG4gICNjb21tZW50cyA9ICcnO1xuICAjY29tbWVudHNfZnJvbV9sbXMgPSAnJztcblxuICBzdHVkZW50X2RhdGEgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIFNDT1JNIDEuMiBjbWkgb2JqZWN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbWlfY2hpbGRyZW5cbiAgICogQHBhcmFtIHsoQ01JU3R1ZGVudERhdGF8QUlDQ0NNSVN0dWRlbnREYXRhKX0gc3R1ZGVudF9kYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5pdGlhbGl6ZWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNtaV9jaGlsZHJlbiwgc3R1ZGVudF9kYXRhLCBpbml0aWFsaXplZDogYm9vbGVhbikge1xuICAgIHN1cGVyKCk7XG5cbiAgICBpZiAoaW5pdGlhbGl6ZWQpIHRoaXMuaW5pdGlhbGl6ZSgpO1xuXG4gICAgdGhpcy4jX2NoaWxkcmVuID0gY21pX2NoaWxkcmVuID9cbiAgICAgICAgY21pX2NoaWxkcmVuIDpcbiAgICAgICAgc2Nvcm0xMl9jb25zdGFudHMuY21pX2NoaWxkcmVuO1xuICAgIHRoaXMuY29yZSA9IG5ldyBDTUlDb3JlKCk7XG4gICAgdGhpcy5vYmplY3RpdmVzID0gbmV3IENNSU9iamVjdGl2ZXMoKTtcbiAgICB0aGlzLnN0dWRlbnRfZGF0YSA9IHN0dWRlbnRfZGF0YSA/IHN0dWRlbnRfZGF0YSA6IG5ldyBDTUlTdHVkZW50RGF0YSgpO1xuICAgIHRoaXMuc3R1ZGVudF9wcmVmZXJlbmNlID0gbmV3IENNSVN0dWRlbnRQcmVmZXJlbmNlKCk7XG4gICAgdGhpcy5pbnRlcmFjdGlvbnMgPSBuZXcgQ01JSW50ZXJhY3Rpb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZCBhZnRlciB0aGUgQ01JIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIGluaXRpYWxpemUoKSB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuY29yZT8uaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMub2JqZWN0aXZlcz8uaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuc3R1ZGVudF9kYXRhPy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5zdHVkZW50X3ByZWZlcmVuY2U/LmluaXRpYWxpemUoKTtcbiAgICB0aGlzLmludGVyYWN0aW9ucz8uaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pXG4gICAqXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgc3VzcGVuZF9kYXRhOiBzdHJpbmcsXG4gICAqICAgICAgbGF1bmNoX2RhdGE6IHN0cmluZyxcbiAgICogICAgICBjb21tZW50czogc3RyaW5nLFxuICAgKiAgICAgIGNvbW1lbnRzX2Zyb21fbG1zOiBzdHJpbmcsXG4gICAqICAgICAgY29yZTogQ01JQ29yZSxcbiAgICogICAgICBvYmplY3RpdmVzOiBDTUlPYmplY3RpdmVzLFxuICAgKiAgICAgIHN0dWRlbnRfZGF0YTogQ01JU3R1ZGVudERhdGEsXG4gICAqICAgICAgc3R1ZGVudF9wcmVmZXJlbmNlOiBDTUlTdHVkZW50UHJlZmVyZW5jZSxcbiAgICogICAgICBpbnRlcmFjdGlvbnM6IENNSUludGVyYWN0aW9uc1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnc3VzcGVuZF9kYXRhJzogdGhpcy5zdXNwZW5kX2RhdGEsXG4gICAgICAnbGF1bmNoX2RhdGEnOiB0aGlzLmxhdW5jaF9kYXRhLFxuICAgICAgJ2NvbW1lbnRzJzogdGhpcy5jb21tZW50cyxcbiAgICAgICdjb21tZW50c19mcm9tX2xtcyc6IHRoaXMuY29tbWVudHNfZnJvbV9sbXMsXG4gICAgICAnY29yZSc6IHRoaXMuY29yZSxcbiAgICAgICdvYmplY3RpdmVzJzogdGhpcy5vYmplY3RpdmVzLFxuICAgICAgJ3N0dWRlbnRfZGF0YSc6IHRoaXMuc3R1ZGVudF9kYXRhLFxuICAgICAgJ3N0dWRlbnRfcHJlZmVyZW5jZSc6IHRoaXMuc3R1ZGVudF9wcmVmZXJlbmNlLFxuICAgICAgJ2ludGVyYWN0aW9ucyc6IHRoaXMuaW50ZXJhY3Rpb25zLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI192ZXJzaW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBfdmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy4jX3ZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjX3ZlcnNpb24uIEp1c3QgdGhyb3dzIGFuIGVycm9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gX3ZlcnNpb25cbiAgICovXG4gIHNldCBfdmVyc2lvbihfdmVyc2lvbikge1xuICAgIHRocm93SW52YWxpZFZhbHVlRXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNfY2hpbGRyZW5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IF9jaGlsZHJlbigpIHtcbiAgICByZXR1cm4gdGhpcy4jX2NoaWxkcmVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI192ZXJzaW9uLiBKdXN0IHRocm93cyBhbiBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IF9jaGlsZHJlblxuICAgKi9cbiAgc2V0IF9jaGlsZHJlbihfY2hpbGRyZW4pIHtcbiAgICB0aHJvd0ludmFsaWRWYWx1ZUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc3VzcGVuZF9kYXRhXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzdXNwZW5kX2RhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29yZT8uc3VzcGVuZF9kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3N1c3BlbmRfZGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VzcGVuZF9kYXRhXG4gICAqL1xuICBzZXQgc3VzcGVuZF9kYXRhKHN1c3BlbmRfZGF0YSkge1xuICAgIGlmICh0aGlzLmNvcmUpIHtcbiAgICAgIHRoaXMuY29yZS5zdXNwZW5kX2RhdGEgPSBzdXNwZW5kX2RhdGE7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xhdW5jaF9kYXRhXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsYXVuY2hfZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy4jbGF1bmNoX2RhdGE7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbGF1bmNoX2RhdGEuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGF1bmNoX2RhdGFcbiAgICovXG4gIHNldCBsYXVuY2hfZGF0YShsYXVuY2hfZGF0YSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID8gdGhpcy4jbGF1bmNoX2RhdGEgPSBsYXVuY2hfZGF0YSA6IHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2NvbW1lbnRzXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBjb21tZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy4jY29tbWVudHM7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjY29tbWVudHNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1lbnRzXG4gICAqL1xuICBzZXQgY29tbWVudHMoY29tbWVudHMpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KGNvbW1lbnRzLCBzY29ybTEyX3JlZ2V4LkNNSVN0cmluZzQwOTYsIHRydWUpKSB7XG4gICAgICB0aGlzLiNjb21tZW50cyA9IGNvbW1lbnRzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNjb21tZW50c19mcm9tX2xtc1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgY29tbWVudHNfZnJvbV9sbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbW1lbnRzX2Zyb21fbG1zO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2NvbW1lbnRzX2Zyb21fbG1zLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1lbnRzX2Zyb21fbG1zXG4gICAqL1xuICBzZXQgY29tbWVudHNfZnJvbV9sbXMoY29tbWVudHNfZnJvbV9sbXMpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICAgIHRoaXMuI2NvbW1lbnRzX2Zyb21fbG1zID0gY29tbWVudHNfZnJvbV9sbXMgOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBjdXJyZW50IHNlc3Npb24gdGltZSB0byB0aGUgZXhpc3RpbmcgdG90YWwgdGltZS5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0Q3VycmVudFRvdGFsVGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb3JlLmdldEN1cnJlbnRUb3RhbFRpbWUodGhpcy5zdGFydF90aW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyB0aGUgY21pLmNvcmUgb2JqZWN0XG4gKiBAZXh0ZW5kcyBCYXNlQ01JXG4gKi9cbmNsYXNzIENNSUNvcmUgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkuY29yZVxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuc2NvcmUgPSBuZXcgQ01JU2NvcmUoXG4gICAgICAgIHtcbiAgICAgICAgICBzY29yZV9jaGlsZHJlbjogc2Nvcm0xMl9jb25zdGFudHMuc2NvcmVfY2hpbGRyZW4sXG4gICAgICAgICAgc2NvcmVfcmFuZ2U6IHNjb3JtMTJfcmVnZXguc2NvcmVfcmFuZ2UsXG4gICAgICAgICAgaW52YWxpZEVycm9yQ29kZTogc2Nvcm0xMl9lcnJvcl9jb2Rlcy5JTlZBTElEX1NFVF9WQUxVRSxcbiAgICAgICAgICBpbnZhbGlkVHlwZUNvZGU6IHNjb3JtMTJfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCxcbiAgICAgICAgICBpbnZhbGlkUmFuZ2VDb2RlOiBzY29ybTEyX2Vycm9yX2NvZGVzLlZBTFVFX09VVF9PRl9SQU5HRSxcbiAgICAgICAgICBlcnJvckNsYXNzOiBTY29ybTEyVmFsaWRhdGlvbkVycm9yLFxuICAgICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5zY29yZT8uaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgI19jaGlsZHJlbiA9IHNjb3JtMTJfY29uc3RhbnRzLmNvcmVfY2hpbGRyZW47XG4gICNzdHVkZW50X2lkID0gJyc7XG4gICNzdHVkZW50X25hbWUgPSAnJztcbiAgI2xlc3Nvbl9sb2NhdGlvbiA9ICcnO1xuICAjY3JlZGl0ID0gJyc7XG4gICNsZXNzb25fc3RhdHVzID0gJ25vdCBhdHRlbXB0ZWQnO1xuICAjZW50cnkgPSAnJztcbiAgI3RvdGFsX3RpbWUgPSAnJztcbiAgI2xlc3Nvbl9tb2RlID0gJ25vcm1hbCc7XG4gICNleGl0ID0gJyc7XG4gICNzZXNzaW9uX3RpbWUgPSAnMDA6MDA6MDAnO1xuICAjc3VzcGVuZF9kYXRhID0gJyc7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI19jaGlsZHJlblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXQgX2NoaWxkcmVuKCkge1xuICAgIHJldHVybiB0aGlzLiNfY2hpbGRyZW47XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjX2NoaWxkcmVuLiBKdXN0IHRocm93cyBhbiBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IF9jaGlsZHJlblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2V0IF9jaGlsZHJlbihfY2hpbGRyZW4pIHtcbiAgICB0aHJvd0ludmFsaWRWYWx1ZUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc3R1ZGVudF9pZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgc3R1ZGVudF9pZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jc3R1ZGVudF9pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzdHVkZW50X2lkLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0dWRlbnRfaWRcbiAgICovXG4gIHNldCBzdHVkZW50X2lkKHN0dWRlbnRfaWQpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/IHRoaXMuI3N0dWRlbnRfaWQgPSBzdHVkZW50X2lkIDogdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc3R1ZGVudF9uYW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzdHVkZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N0dWRlbnRfbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzdHVkZW50X25hbWUuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3R1ZGVudF9uYW1lXG4gICAqL1xuICBzZXQgc3R1ZGVudF9uYW1lKHN0dWRlbnRfbmFtZSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgICAgdGhpcy4jc3R1ZGVudF9uYW1lID0gc3R1ZGVudF9uYW1lIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbGVzc29uX2xvY2F0aW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsZXNzb25fbG9jYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xlc3Nvbl9sb2NhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsZXNzb25fbG9jYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxlc3Nvbl9sb2NhdGlvblxuICAgKi9cbiAgc2V0IGxlc3Nvbl9sb2NhdGlvbihsZXNzb25fbG9jYXRpb24pIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KGxlc3Nvbl9sb2NhdGlvbiwgc2Nvcm0xMl9yZWdleC5DTUlTdHJpbmcyNTYsIHRydWUpKSB7XG4gICAgICB0aGlzLiNsZXNzb25fbG9jYXRpb24gPSBsZXNzb25fbG9jYXRpb247XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2NyZWRpdFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgY3JlZGl0KCkge1xuICAgIHJldHVybiB0aGlzLiNjcmVkaXQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjY3JlZGl0LiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNyZWRpdFxuICAgKi9cbiAgc2V0IGNyZWRpdChjcmVkaXQpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/IHRoaXMuI2NyZWRpdCA9IGNyZWRpdCA6IHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xlc3Nvbl9zdGF0dXNcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxlc3Nvbl9zdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xlc3Nvbl9zdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbGVzc29uX3N0YXR1c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gbGVzc29uX3N0YXR1c1xuICAgKi9cbiAgc2V0IGxlc3Nvbl9zdGF0dXMobGVzc29uX3N0YXR1cykge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KGxlc3Nvbl9zdGF0dXMsIHNjb3JtMTJfcmVnZXguQ01JU3RhdHVzKSkge1xuICAgICAgICB0aGlzLiNsZXNzb25fc3RhdHVzID0gbGVzc29uX3N0YXR1cztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChsZXNzb25fc3RhdHVzLCBzY29ybTEyX3JlZ2V4LkNNSVN0YXR1czIpKSB7XG4gICAgICAgIHRoaXMuI2xlc3Nvbl9zdGF0dXMgPSBsZXNzb25fc3RhdHVzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNlbnRyeVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZW50cnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2VudHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2VudHJ5LiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVudHJ5XG4gICAqL1xuICBzZXQgZW50cnkoZW50cnkpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/IHRoaXMuI2VudHJ5ID0gZW50cnkgOiB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0b3RhbF90aW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB0b3RhbF90aW1lKCkge1xuICAgIHJldHVybiB0aGlzLiN0b3RhbF90aW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RvdGFsX3RpbWUuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG90YWxfdGltZVxuICAgKi9cbiAgc2V0IHRvdGFsX3RpbWUodG90YWxfdGltZSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID8gdGhpcy4jdG90YWxfdGltZSA9IHRvdGFsX3RpbWUgOiB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsZXNzb25fbW9kZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbGVzc29uX21vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xlc3Nvbl9tb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xlc3Nvbl9tb2RlLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxlc3Nvbl9tb2RlXG4gICAqL1xuICBzZXQgbGVzc29uX21vZGUobGVzc29uX21vZGUpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/IHRoaXMuI2xlc3Nvbl9tb2RlID0gbGVzc29uX21vZGUgOiB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNleGl0LiBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIEpTT04gZXhwb3J0LlxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0IGV4aXQoKSB7XG4gICAgcmV0dXJuICghdGhpcy5qc29uU3RyaW5nKSA/IHRocm93V3JpdGVPbmx5RXJyb3IoKSA6IHRoaXMuI2V4aXQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjZXhpdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhpdFxuICAgKi9cbiAgc2V0IGV4aXQoZXhpdCkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoZXhpdCwgc2Nvcm0xMl9yZWdleC5DTUlFeGl0LCB0cnVlKSkge1xuICAgICAgdGhpcy4jZXhpdCA9IGV4aXQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3Nlc3Npb25fdGltZS4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyBKU09OIGV4cG9ydC5cbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldCBzZXNzaW9uX3RpbWUoKSB7XG4gICAgcmV0dXJuICghdGhpcy5qc29uU3RyaW5nKSA/IHRocm93V3JpdGVPbmx5RXJyb3IoKSA6IHRoaXMuI3Nlc3Npb25fdGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzZXNzaW9uX3RpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25fdGltZVxuICAgKi9cbiAgc2V0IHNlc3Npb25fdGltZShzZXNzaW9uX3RpbWUpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHNlc3Npb25fdGltZSwgc2Nvcm0xMl9yZWdleC5DTUlUaW1lc3BhbikpIHtcbiAgICAgIHRoaXMuI3Nlc3Npb25fdGltZSA9IHNlc3Npb25fdGltZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc3VzcGVuZF9kYXRhXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzdXNwZW5kX2RhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N1c3BlbmRfZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzdXNwZW5kX2RhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1c3BlbmRfZGF0YVxuICAgKi9cbiAgc2V0IHN1c3BlbmRfZGF0YShzdXNwZW5kX2RhdGEpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHN1c3BlbmRfZGF0YSwgc2Nvcm0xMl9yZWdleC5DTUlTdHJpbmc0MDk2LCB0cnVlKSkge1xuICAgICAgdGhpcy4jc3VzcGVuZF9kYXRhID0gc3VzcGVuZF9kYXRhO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBjdXJyZW50IHNlc3Npb24gdGltZSB0byB0aGUgZXhpc3RpbmcgdG90YWwgdGltZS5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHN0YXJ0X3RpbWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0Q3VycmVudFRvdGFsVGltZShzdGFydF90aW1lOiBOdW1iZXIpIHtcbiAgICBsZXQgc2Vzc2lvblRpbWUgPSB0aGlzLiNzZXNzaW9uX3RpbWU7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gc3RhcnRfdGltZTtcblxuICAgIGlmICh0eXBlb2Ygc3RhcnRUaW1lICE9PSAndW5kZWZpbmVkJyAmJiBzdGFydFRpbWUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHNlY29uZHMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0VGltZTtcbiAgICAgIHNlc3Npb25UaW1lID0gVXRpbC5nZXRTZWNvbmRzQXNISE1NU1Moc2Vjb25kcyAvIDEwMDApO1xuICAgIH1cblxuICAgIHJldHVybiBVdGlsaXRpZXMuYWRkSEhNTVNTVGltZVN0cmluZ3MoXG4gICAgICAgIHRoaXMuI3RvdGFsX3RpbWUsXG4gICAgICAgIHNlc3Npb25UaW1lLFxuICAgICAgICBuZXcgUmVnRXhwKHNjb3JtMTJfcmVnZXguQ01JVGltZXNwYW4pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuY29yZVxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIHN0dWRlbnRfbmFtZTogc3RyaW5nLFxuICAgKiAgICAgIGVudHJ5OiBzdHJpbmcsXG4gICAqICAgICAgZXhpdDogc3RyaW5nLFxuICAgKiAgICAgIHNjb3JlOiBDTUlTY29yZSxcbiAgICogICAgICBzdHVkZW50X2lkOiBzdHJpbmcsXG4gICAqICAgICAgbGVzc29uX21vZGU6IHN0cmluZyxcbiAgICogICAgICBsZXNzb25fbG9jYXRpb246IHN0cmluZyxcbiAgICogICAgICBsZXNzb25fc3RhdHVzOiBzdHJpbmcsXG4gICAqICAgICAgY3JlZGl0OiBzdHJpbmcsXG4gICAqICAgICAgc2Vzc2lvbl90aW1lOiAqXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdzdHVkZW50X2lkJzogdGhpcy5zdHVkZW50X2lkLFxuICAgICAgJ3N0dWRlbnRfbmFtZSc6IHRoaXMuc3R1ZGVudF9uYW1lLFxuICAgICAgJ2xlc3Nvbl9sb2NhdGlvbic6IHRoaXMubGVzc29uX2xvY2F0aW9uLFxuICAgICAgJ2NyZWRpdCc6IHRoaXMuY3JlZGl0LFxuICAgICAgJ2xlc3Nvbl9zdGF0dXMnOiB0aGlzLmxlc3Nvbl9zdGF0dXMsXG4gICAgICAnZW50cnknOiB0aGlzLmVudHJ5LFxuICAgICAgJ2xlc3Nvbl9tb2RlJzogdGhpcy5sZXNzb25fbW9kZSxcbiAgICAgICdleGl0JzogdGhpcy5leGl0LFxuICAgICAgJ3Nlc3Npb25fdGltZSc6IHRoaXMuc2Vzc2lvbl90aW1lLFxuICAgICAgJ3Njb3JlJzogdGhpcy5zY29yZSxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAxLjIncyBjbWkub2JqZWN0aXZlcyBvYmplY3RcbiAqIEBleHRlbmRzIENNSUFycmF5XG4gKi9cbmNsYXNzIENNSU9iamVjdGl2ZXMgZXh0ZW5kcyBDTUlBcnJheSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLm9iamVjdGl2ZXNcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHtcbiAgICAgIGNoaWxkcmVuOiBzY29ybTEyX2NvbnN0YW50cy5vYmplY3RpdmVzX2NoaWxkcmVuLFxuICAgICAgZXJyb3JDb2RlOiBzY29ybTEyX2Vycm9yX2NvZGVzLklOVkFMSURfU0VUX1ZBTFVFLFxuICAgICAgZXJyb3JDbGFzczogU2Nvcm0xMlZhbGlkYXRpb25FcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAxLjIncyBjbWkuc3R1ZGVudF9kYXRhIG9iamVjdFxuICogQGV4dGVuZHMgQmFzZUNNSVxuICovXG5leHBvcnQgY2xhc3MgQ01JU3R1ZGVudERhdGEgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgI19jaGlsZHJlbjtcbiAgI21hc3Rlcnlfc2NvcmUgPSAnJztcbiAgI21heF90aW1lX2FsbG93ZWQgPSAnJztcbiAgI3RpbWVfbGltaXRfYWN0aW9uID0gJyc7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkuc3R1ZGVudF9kYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHVkZW50X2RhdGFfY2hpbGRyZW5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHN0dWRlbnRfZGF0YV9jaGlsZHJlbikge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLiNfY2hpbGRyZW4gPSBzdHVkZW50X2RhdGFfY2hpbGRyZW4gP1xuICAgICAgICBzdHVkZW50X2RhdGFfY2hpbGRyZW4gOlxuICAgICAgICBzY29ybTEyX2NvbnN0YW50cy5zdHVkZW50X2RhdGFfY2hpbGRyZW47XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjX2NoaWxkcmVuXG4gICAqIEByZXR1cm4geyp9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXQgX2NoaWxkcmVuKCkge1xuICAgIHJldHVybiB0aGlzLiNfY2hpbGRyZW47XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjX2NoaWxkcmVuLiBKdXN0IHRocm93cyBhbiBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IF9jaGlsZHJlblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2V0IF9jaGlsZHJlbihfY2hpbGRyZW4pIHtcbiAgICB0aHJvd0ludmFsaWRWYWx1ZUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbWFzdGVyX3Njb3JlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBtYXN0ZXJ5X3Njb3JlKCkge1xuICAgIHJldHVybiB0aGlzLiNtYXN0ZXJ5X3Njb3JlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI21hc3Rlcl9zY29yZS4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXN0ZXJ5X3Njb3JlXG4gICAqL1xuICBzZXQgbWFzdGVyeV9zY29yZShtYXN0ZXJ5X3Njb3JlKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiNtYXN0ZXJ5X3Njb3JlID0gbWFzdGVyeV9zY29yZSA6XG4gICAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI21heF90aW1lX2FsbG93ZWRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG1heF90aW1lX2FsbG93ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI21heF90aW1lX2FsbG93ZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbWF4X3RpbWVfYWxsb3dlZC4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXhfdGltZV9hbGxvd2VkXG4gICAqL1xuICBzZXQgbWF4X3RpbWVfYWxsb3dlZChtYXhfdGltZV9hbGxvd2VkKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiNtYXhfdGltZV9hbGxvd2VkID0gbWF4X3RpbWVfYWxsb3dlZCA6XG4gICAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3RpbWVfbGltaXRfYWN0aW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB0aW1lX2xpbWl0X2FjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy4jdGltZV9saW1pdF9hY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdGltZV9saW1pdF9hY3Rpb24uIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGltZV9saW1pdF9hY3Rpb25cbiAgICovXG4gIHNldCB0aW1lX2xpbWl0X2FjdGlvbih0aW1lX2xpbWl0X2FjdGlvbikge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgICAgdGhpcy4jdGltZV9saW1pdF9hY3Rpb24gPSB0aW1lX2xpbWl0X2FjdGlvbiA6XG4gICAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLnN0dWRlbnRfZGF0YVxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIG1heF90aW1lX2FsbG93ZWQ6IHN0cmluZyxcbiAgICogICAgICB0aW1lX2xpbWl0X2FjdGlvbjogc3RyaW5nLFxuICAgKiAgICAgIG1hc3Rlcnlfc2NvcmU6IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnbWFzdGVyeV9zY29yZSc6IHRoaXMubWFzdGVyeV9zY29yZSxcbiAgICAgICdtYXhfdGltZV9hbGxvd2VkJzogdGhpcy5tYXhfdGltZV9hbGxvd2VkLFxuICAgICAgJ3RpbWVfbGltaXRfYWN0aW9uJzogdGhpcy50aW1lX2xpbWl0X2FjdGlvbixcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAxLjIncyBjbWkuc3R1ZGVudF9wcmVmZXJlbmNlIG9iamVjdFxuICogQGV4dGVuZHMgQmFzZUNNSVxuICovXG5leHBvcnQgY2xhc3MgQ01JU3R1ZGVudFByZWZlcmVuY2UgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgI19jaGlsZHJlbjtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5zdHVkZW50X3ByZWZlcmVuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0dWRlbnRfcHJlZmVyZW5jZV9jaGlsZHJlblxuICAgKi9cbiAgY29uc3RydWN0b3Ioc3R1ZGVudF9wcmVmZXJlbmNlX2NoaWxkcmVuKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuI19jaGlsZHJlbiA9IHN0dWRlbnRfcHJlZmVyZW5jZV9jaGlsZHJlbiA/XG4gICAgICAgIHN0dWRlbnRfcHJlZmVyZW5jZV9jaGlsZHJlbiA6XG4gICAgICAgIHNjb3JtMTJfY29uc3RhbnRzLnN0dWRlbnRfcHJlZmVyZW5jZV9jaGlsZHJlbjtcbiAgfVxuXG4gICNhdWRpbyA9ICcnO1xuICAjbGFuZ3VhZ2UgPSAnJztcbiAgI3NwZWVkID0gJyc7XG4gICN0ZXh0ID0gJyc7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI19jaGlsZHJlblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXQgX2NoaWxkcmVuKCkge1xuICAgIHJldHVybiB0aGlzLiNfY2hpbGRyZW47XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjX2NoaWxkcmVuLiBKdXN0IHRocm93cyBhbiBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IF9jaGlsZHJlblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2V0IF9jaGlsZHJlbihfY2hpbGRyZW4pIHtcbiAgICB0aHJvd0ludmFsaWRWYWx1ZUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjYXVkaW9cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGF1ZGlvKCkge1xuICAgIHJldHVybiB0aGlzLiNhdWRpbztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNhdWRpb1xuICAgKiBAcGFyYW0ge3N0cmluZ30gYXVkaW9cbiAgICovXG4gIHNldCBhdWRpbyhhdWRpbykge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoYXVkaW8sIHNjb3JtMTJfcmVnZXguQ01JU0ludGVnZXIpICYmXG4gICAgICAgIGNoZWNrMTJWYWxpZFJhbmdlKGF1ZGlvLCBzY29ybTEyX3JlZ2V4LmF1ZGlvX3JhbmdlKSkge1xuICAgICAgdGhpcy4jYXVkaW8gPSBhdWRpbztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbGFuZ3VhZ2VcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxhbmd1YWdlKCkge1xuICAgIHJldHVybiB0aGlzLiNsYW5ndWFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsYW5ndWFnZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2VcbiAgICovXG4gIHNldCBsYW5ndWFnZShsYW5ndWFnZSkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQobGFuZ3VhZ2UsIHNjb3JtMTJfcmVnZXguQ01JU3RyaW5nMjU2KSkge1xuICAgICAgdGhpcy4jbGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc3BlZWRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHNwZWVkKCkge1xuICAgIHJldHVybiB0aGlzLiNzcGVlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzcGVlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3BlZWRcbiAgICovXG4gIHNldCBzcGVlZChzcGVlZCkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoc3BlZWQsIHNjb3JtMTJfcmVnZXguQ01JU0ludGVnZXIpICYmXG4gICAgICAgIGNoZWNrMTJWYWxpZFJhbmdlKHNwZWVkLCBzY29ybTEyX3JlZ2V4LnNwZWVkX3JhbmdlKSkge1xuICAgICAgdGhpcy4jc3BlZWQgPSBzcGVlZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjdGV4dFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy4jdGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICN0ZXh0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gICAqL1xuICBzZXQgdGV4dCh0ZXh0KSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdCh0ZXh0LCBzY29ybTEyX3JlZ2V4LkNNSVNJbnRlZ2VyKSAmJlxuICAgICAgICBjaGVjazEyVmFsaWRSYW5nZSh0ZXh0LCBzY29ybTEyX3JlZ2V4LnRleHRfcmFuZ2UpKSB7XG4gICAgICB0aGlzLiN0ZXh0ID0gdGV4dDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuc3R1ZGVudF9wcmVmZXJlbmNlXG4gICAqXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgYXVkaW86IHN0cmluZyxcbiAgICogICAgICBsYW5ndWFnZTogc3RyaW5nLFxuICAgKiAgICAgIHNwZWVkOiBzdHJpbmcsXG4gICAqICAgICAgdGV4dDogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdhdWRpbyc6IHRoaXMuYXVkaW8sXG4gICAgICAnbGFuZ3VhZ2UnOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgJ3NwZWVkJzogdGhpcy5zcGVlZCxcbiAgICAgICd0ZXh0JzogdGhpcy50ZXh0LFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDEuMidzIGNtaS5pbnRlcmFjdGlvbnMgb2JqZWN0XG4gKiBAZXh0ZW5kcyBCYXNlQ01JXG4gKi9cbmNsYXNzIENNSUludGVyYWN0aW9ucyBleHRlbmRzIENNSUFycmF5IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkuaW50ZXJhY3Rpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih7XG4gICAgICBjaGlsZHJlbjogc2Nvcm0xMl9jb25zdGFudHMuaW50ZXJhY3Rpb25zX2NoaWxkcmVuLFxuICAgICAgZXJyb3JDb2RlOiBzY29ybTEyX2Vycm9yX2NvZGVzLklOVkFMSURfU0VUX1ZBTFVFLFxuICAgICAgZXJyb3JDbGFzczogU2Nvcm0xMlZhbGlkYXRpb25FcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAxLjIncyBjbWkuaW50ZXJhY3Rpb25zLm4gb2JqZWN0XG4gKiBAZXh0ZW5kcyBCYXNlQ01JXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlJbnRlcmFjdGlvbnNPYmplY3QgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkuaW50ZXJhY3Rpb25zLm4gb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5vYmplY3RpdmVzID0gbmV3IENNSUFycmF5KHtcbiAgICAgIGVycm9yQ29kZTogc2Nvcm0xMl9lcnJvcl9jb2Rlcy5JTlZBTElEX1NFVF9WQUxVRSxcbiAgICAgIGVycm9yQ2xhc3M6IFNjb3JtMTJWYWxpZGF0aW9uRXJyb3IsXG4gICAgICBjaGlsZHJlbjogc2Nvcm0xMl9jb25zdGFudHMub2JqZWN0aXZlc19jaGlsZHJlbixcbiAgICB9KTtcbiAgICB0aGlzLmNvcnJlY3RfcmVzcG9uc2VzID0gbmV3IENNSUFycmF5KHtcbiAgICAgIGVycm9yQ29kZTogc2Nvcm0xMl9lcnJvcl9jb2Rlcy5JTlZBTElEX1NFVF9WQUxVRSxcbiAgICAgIGVycm9yQ2xhc3M6IFNjb3JtMTJWYWxpZGF0aW9uRXJyb3IsXG4gICAgICBjaGlsZHJlbjogc2Nvcm0xMl9jb25zdGFudHMuY29ycmVjdF9yZXNwb25zZXNfY2hpbGRyZW4sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZCBhZnRlciB0aGUgQ01JIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIGluaXRpYWxpemUoKSB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMub2JqZWN0aXZlcz8uaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuY29ycmVjdF9yZXNwb25zZXM/LmluaXRpYWxpemUoKTtcbiAgfVxuXG4gICNpZCA9ICcnO1xuICAjdGltZSA9ICcnO1xuICAjdHlwZSA9ICcnO1xuICAjd2VpZ2h0aW5nID0gJyc7XG4gICNzdHVkZW50X3Jlc3BvbnNlID0gJyc7XG4gICNyZXN1bHQgPSAnJztcbiAgI2xhdGVuY3kgPSAnJztcblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjaWQuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgSlNPTiBleHBvcnQuXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBnZXQgaWQoKSB7XG4gICAgcmV0dXJuICghdGhpcy5qc29uU3RyaW5nKSA/IHRocm93V3JpdGVPbmx5RXJyb3IoKSA6IHRoaXMuI2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2lkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuICAgKi9cbiAgc2V0IGlkKGlkKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChpZCwgc2Nvcm0xMl9yZWdleC5DTUlJZGVudGlmaWVyKSkge1xuICAgICAgdGhpcy4jaWQgPSBpZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjdGltZS4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyBKU09OIGV4cG9ydC5cbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldCB0aW1lKCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgPyB0aHJvd1dyaXRlT25seUVycm9yKCkgOiB0aGlzLiN0aW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWVcbiAgICovXG4gIHNldCB0aW1lKHRpbWUpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHRpbWUsIHNjb3JtMTJfcmVnZXguQ01JVGltZSkpIHtcbiAgICAgIHRoaXMuI3RpbWUgPSB0aW1lO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0eXBlLiBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIEpTT04gZXhwb3J0LlxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuICghdGhpcy5qc29uU3RyaW5nKSA/IHRocm93V3JpdGVPbmx5RXJyb3IoKSA6IHRoaXMuI3R5cGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKi9cbiAgc2V0IHR5cGUodHlwZSkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQodHlwZSwgc2Nvcm0xMl9yZWdleC5DTUlUeXBlKSkge1xuICAgICAgdGhpcy4jdHlwZSA9IHR5cGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3dlaWdodGluZy4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyBKU09OIGV4cG9ydC5cbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldCB3ZWlnaHRpbmcoKSB7XG4gICAgcmV0dXJuICghdGhpcy5qc29uU3RyaW5nKSA/XG4gICAgICAgIHRocm93V3JpdGVPbmx5RXJyb3IoKSA6XG4gICAgICAgIHRoaXMuI3dlaWdodGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICN3ZWlnaHRpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IHdlaWdodGluZ1xuICAgKi9cbiAgc2V0IHdlaWdodGluZyh3ZWlnaHRpbmcpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHdlaWdodGluZywgc2Nvcm0xMl9yZWdleC5DTUlEZWNpbWFsKSAmJlxuICAgICAgICBjaGVjazEyVmFsaWRSYW5nZSh3ZWlnaHRpbmcsIHNjb3JtMTJfcmVnZXgud2VpZ2h0aW5nX3JhbmdlKSkge1xuICAgICAgdGhpcy4jd2VpZ2h0aW5nID0gd2VpZ2h0aW5nO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzdHVkZW50X3Jlc3BvbnNlLiBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIEpTT04gZXhwb3J0LlxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0IHN0dWRlbnRfcmVzcG9uc2UoKSB7XG4gICAgcmV0dXJuICghdGhpcy5qc29uU3RyaW5nKSA/IHRocm93V3JpdGVPbmx5RXJyb3IoKSA6IHRoaXMuI3N0dWRlbnRfcmVzcG9uc2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc3R1ZGVudF9yZXNwb25zZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3R1ZGVudF9yZXNwb25zZVxuICAgKi9cbiAgc2V0IHN0dWRlbnRfcmVzcG9uc2Uoc3R1ZGVudF9yZXNwb25zZSkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoc3R1ZGVudF9yZXNwb25zZSwgc2Nvcm0xMl9yZWdleC5DTUlGZWVkYmFjaywgdHJ1ZSkpIHtcbiAgICAgIHRoaXMuI3N0dWRlbnRfcmVzcG9uc2UgPSBzdHVkZW50X3Jlc3BvbnNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNyZXN1bHQuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgSlNPTiBleHBvcnQuXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBnZXQgcmVzdWx0KCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgPyB0aHJvd1dyaXRlT25seUVycm9yKCkgOiB0aGlzLiNyZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjcmVzdWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXN1bHRcbiAgICovXG4gIHNldCByZXN1bHQocmVzdWx0KSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChyZXN1bHQsIHNjb3JtMTJfcmVnZXguQ01JUmVzdWx0KSkge1xuICAgICAgdGhpcy4jcmVzdWx0ID0gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsYXRlbmN5LiBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIEpTT04gZXhwb3J0LlxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0IGxhdGVuY3koKSB7XG4gICAgcmV0dXJuICghdGhpcy5qc29uU3RyaW5nKSA/IHRocm93V3JpdGVPbmx5RXJyb3IoKSA6IHRoaXMuI2xhdGVuY3k7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbGF0ZW5jeVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGF0ZW5jeVxuICAgKi9cbiAgc2V0IGxhdGVuY3kobGF0ZW5jeSkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQobGF0ZW5jeSwgc2Nvcm0xMl9yZWdleC5DTUlUaW1lc3BhbikpIHtcbiAgICAgIHRoaXMuI2xhdGVuY3kgPSBsYXRlbmN5O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5pbnRlcmFjdGlvbnMublxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGlkOiBzdHJpbmcsXG4gICAqICAgICAgdGltZTogc3RyaW5nLFxuICAgKiAgICAgIHR5cGU6IHN0cmluZyxcbiAgICogICAgICB3ZWlnaHRpbmc6IHN0cmluZyxcbiAgICogICAgICBzdHVkZW50X3Jlc3BvbnNlOiBzdHJpbmcsXG4gICAqICAgICAgcmVzdWx0OiBzdHJpbmcsXG4gICAqICAgICAgbGF0ZW5jeTogc3RyaW5nLFxuICAgKiAgICAgIG9iamVjdGl2ZXM6IENNSUFycmF5LFxuICAgKiAgICAgIGNvcnJlY3RfcmVzcG9uc2VzOiBDTUlBcnJheVxuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnaWQnOiB0aGlzLmlkLFxuICAgICAgJ3RpbWUnOiB0aGlzLnRpbWUsXG4gICAgICAndHlwZSc6IHRoaXMudHlwZSxcbiAgICAgICd3ZWlnaHRpbmcnOiB0aGlzLndlaWdodGluZyxcbiAgICAgICdzdHVkZW50X3Jlc3BvbnNlJzogdGhpcy5zdHVkZW50X3Jlc3BvbnNlLFxuICAgICAgJ3Jlc3VsdCc6IHRoaXMucmVzdWx0LFxuICAgICAgJ2xhdGVuY3knOiB0aGlzLmxhdGVuY3ksXG4gICAgICAnb2JqZWN0aXZlcyc6IHRoaXMub2JqZWN0aXZlcyxcbiAgICAgICdjb3JyZWN0X3Jlc3BvbnNlcyc6IHRoaXMuY29ycmVjdF9yZXNwb25zZXMsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMS4yJ3MgY21pLm9iamVjdGl2ZXMubiBvYmplY3RcbiAqIEBleHRlbmRzIEJhc2VDTUlcbiAqL1xuZXhwb3J0IGNsYXNzIENNSU9iamVjdGl2ZXNPYmplY3QgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkub2JqZWN0aXZlcy5uXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5zY29yZSA9IG5ldyBDTUlTY29yZShcbiAgICAgICAge1xuICAgICAgICAgIHNjb3JlX2NoaWxkcmVuOiBzY29ybTEyX2NvbnN0YW50cy5zY29yZV9jaGlsZHJlbixcbiAgICAgICAgICBzY29yZV9yYW5nZTogc2Nvcm0xMl9yZWdleC5zY29yZV9yYW5nZSxcbiAgICAgICAgICBpbnZhbGlkRXJyb3JDb2RlOiBzY29ybTEyX2Vycm9yX2NvZGVzLklOVkFMSURfU0VUX1ZBTFVFLFxuICAgICAgICAgIGludmFsaWRUeXBlQ29kZTogc2Nvcm0xMl9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENILFxuICAgICAgICAgIGludmFsaWRSYW5nZUNvZGU6IHNjb3JtMTJfZXJyb3JfY29kZXMuVkFMVUVfT1VUX09GX1JBTkdFLFxuICAgICAgICAgIGVycm9yQ2xhc3M6IFNjb3JtMTJWYWxpZGF0aW9uRXJyb3IsXG4gICAgICAgIH0pO1xuICB9XG5cbiAgI2lkID0gJyc7XG4gICNzdGF0dXMgPSAnJztcblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjaWRcbiAgICogQHJldHVybiB7XCJcIn1cbiAgICovXG4gIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jaWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gICAqL1xuICBzZXQgaWQoaWQpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KGlkLCBzY29ybTEyX3JlZ2V4LkNNSUlkZW50aWZpZXIpKSB7XG4gICAgICB0aGlzLiNpZCA9IGlkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzdGF0dXNcbiAgICogQHJldHVybiB7XCJcIn1cbiAgICovXG4gIGdldCBzdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N0YXR1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzdGF0dXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0YXR1c1xuICAgKi9cbiAgc2V0IHN0YXR1cyhzdGF0dXMpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHN0YXR1cywgc2Nvcm0xMl9yZWdleC5DTUlTdGF0dXMyKSkge1xuICAgICAgdGhpcy4jc3RhdHVzID0gc3RhdHVzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5vYmplY3RpdmVzLm5cbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBpZDogc3RyaW5nLFxuICAgKiAgICAgIHN0YXR1czogc3RyaW5nLFxuICAgKiAgICAgIHNjb3JlOiBDTUlTY29yZVxuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnaWQnOiB0aGlzLmlkLFxuICAgICAgJ3N0YXR1cyc6IHRoaXMuc3RhdHVzLFxuICAgICAgJ3Njb3JlJzogdGhpcy5zY29yZSxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAxLjIncyBjbWkuaW50ZXJhY3Rpb25zLm4ub2JqZWN0aXZlcy5uIG9iamVjdFxuICogQGV4dGVuZHMgQmFzZUNNSVxuICovXG5leHBvcnQgY2xhc3MgQ01JSW50ZXJhY3Rpb25zT2JqZWN0aXZlc09iamVjdCBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5pbnRlcmFjdGlvbnMubi5vYmplY3RpdmVzLm5cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAjaWQgPSAnJztcblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjaWRcbiAgICogQHJldHVybiB7XCJcIn1cbiAgICovXG4gIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jaWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gICAqL1xuICBzZXQgaWQoaWQpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KGlkLCBzY29ybTEyX3JlZ2V4LkNNSUlkZW50aWZpZXIpKSB7XG4gICAgICB0aGlzLiNpZCA9IGlkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5pbnRlcmFjdGlvbnMubi5vYmplY3RpdmVzLm5cbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBpZDogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdpZCc6IHRoaXMuaWQsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMS4yJ3MgY21pLmludGVyYWN0aW9ucy5jb3JyZWN0X3Jlc3BvbnNlcy5uIG9iamVjdFxuICogQGV4dGVuZHMgQmFzZUNNSVxuICovXG5leHBvcnQgY2xhc3MgQ01JSW50ZXJhY3Rpb25zQ29ycmVjdFJlc3BvbnNlc09iamVjdCBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5pbnRlcmFjdGlvbnMuY29ycmVjdF9yZXNwb25zZXMublxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gICNwYXR0ZXJuID0gJyc7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3BhdHRlcm5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHBhdHRlcm4oKSB7XG4gICAgcmV0dXJuICghdGhpcy5qc29uU3RyaW5nKSA/IHRocm93V3JpdGVPbmx5RXJyb3IoKSA6IHRoaXMuI3BhdHRlcm47XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjcGF0dGVyblxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVyblxuICAgKi9cbiAgc2V0IHBhdHRlcm4ocGF0dGVybikge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQocGF0dGVybiwgc2Nvcm0xMl9yZWdleC5DTUlGZWVkYmFjaywgdHJ1ZSkpIHtcbiAgICAgIHRoaXMuI3BhdHRlcm4gPSBwYXR0ZXJuO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5pbnRlcmFjdGlvbnMuY29ycmVjdF9yZXNwb25zZXMublxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIHBhdHRlcm46IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAncGF0dGVybic6IHRoaXMucGF0dGVybixcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIGZvciBBSUNDIE5hdmlnYXRpb24gb2JqZWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBOQVYgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBOQVYgb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgI2V2ZW50ID0gJyc7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2V2ZW50XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBldmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy4jZXZlbnQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjZXZlbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqL1xuICBzZXQgZXZlbnQoZXZlbnQpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KGV2ZW50LCBzY29ybTEyX3JlZ2V4Lk5BVkV2ZW50KSkge1xuICAgICAgdGhpcy4jZXZlbnQgPSBldmVudDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBuYXYgb2JqZWN0XG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgZXZlbnQ6IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnZXZlbnQnOiB0aGlzLmV2ZW50LFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvLyBAZmxvd1xuXG5jb25zdCBnbG9iYWwgPSB7XG4gIFNDT1JNX1RSVUU6ICd0cnVlJyxcbiAgU0NPUk1fRkFMU0U6ICdmYWxzZScsXG4gIFNUQVRFX05PVF9JTklUSUFMSVpFRDogMCxcbiAgU1RBVEVfSU5JVElBTElaRUQ6IDEsXG4gIFNUQVRFX1RFUk1JTkFURUQ6IDIsXG4gIExPR19MRVZFTF9ERUJVRzogMSxcbiAgTE9HX0xFVkVMX0lORk86IDIsXG4gIExPR19MRVZFTF9XQVJOSU5HOiAzLFxuICBMT0dfTEVWRUxfRVJST1I6IDQsXG4gIExPR19MRVZFTF9OT05FOiA1LFxufTtcblxuY29uc3Qgc2Nvcm0xMiA9IHtcbiAgLy8gQ2hpbGRyZW4gbGlzdHNcbiAgY21pX2NoaWxkcmVuOiAnY29yZSxzdXNwZW5kX2RhdGEsbGF1bmNoX2RhdGEsY29tbWVudHMsb2JqZWN0aXZlcyxzdHVkZW50X2RhdGEsc3R1ZGVudF9wcmVmZXJlbmNlLGludGVyYWN0aW9ucycsXG4gIGNvcmVfY2hpbGRyZW46ICdzdHVkZW50X2lkLHN0dWRlbnRfbmFtZSxsZXNzb25fbG9jYXRpb24sY3JlZGl0LGxlc3Nvbl9zdGF0dXMsZW50cnksc2NvcmUsdG90YWxfdGltZSxsZXNzb25fbW9kZSxleGl0LHNlc3Npb25fdGltZScsXG4gIHNjb3JlX2NoaWxkcmVuOiAncmF3LG1pbixtYXgnLFxuICBjb21tZW50c19jaGlsZHJlbjogJ2NvbnRlbnQsbG9jYXRpb24sdGltZScsXG4gIG9iamVjdGl2ZXNfY2hpbGRyZW46ICdpZCxzY29yZSxzdGF0dXMnLFxuICBjb3JyZWN0X3Jlc3BvbnNlc19jaGlsZHJlbjogJ3BhdHRlcm4nLFxuICBzdHVkZW50X2RhdGFfY2hpbGRyZW46ICdtYXN0ZXJ5X3Njb3JlLG1heF90aW1lX2FsbG93ZWQsdGltZV9saW1pdF9hY3Rpb24nLFxuICBzdHVkZW50X3ByZWZlcmVuY2VfY2hpbGRyZW46ICdhdWRpbyxsYW5ndWFnZSxzcGVlZCx0ZXh0JyxcbiAgaW50ZXJhY3Rpb25zX2NoaWxkcmVuOiAnaWQsb2JqZWN0aXZlcyx0aW1lLHR5cGUsY29ycmVjdF9yZXNwb25zZXMsd2VpZ2h0aW5nLHN0dWRlbnRfcmVzcG9uc2UscmVzdWx0LGxhdGVuY3knLFxuXG4gIGVycm9yX2Rlc2NyaXB0aW9uczoge1xuICAgICcxMDEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdHZW5lcmFsIEV4Y2VwdGlvbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnTm8gc3BlY2lmaWMgZXJyb3IgY29kZSBleGlzdHMgdG8gZGVzY3JpYmUgdGhlIGVycm9yLiBVc2UgTE1TR2V0RGlhZ25vc3RpYyBmb3IgbW9yZSBpbmZvcm1hdGlvbicsXG4gICAgfSxcbiAgICAnMjAxJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnSW52YWxpZCBhcmd1bWVudCBlcnJvcicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnSW5kaWNhdGVzIHRoYXQgYW4gYXJndW1lbnQgcmVwcmVzZW50cyBhbiBpbnZhbGlkIGRhdGEgbW9kZWwgZWxlbWVudCBvciBpcyBvdGhlcndpc2UgaW5jb3JyZWN0LicsXG4gICAgfSxcbiAgICAnMjAyJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRWxlbWVudCBjYW5ub3QgaGF2ZSBjaGlsZHJlbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnSW5kaWNhdGVzIHRoYXQgTE1TR2V0VmFsdWUgd2FzIGNhbGxlZCB3aXRoIGEgZGF0YSBtb2RlbCBlbGVtZW50IG5hbWUgdGhhdCBlbmRzIGluIFwiX2NoaWxkcmVuXCIgZm9yIGEgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgXCJfY2hpbGRyZW5cIiBzdWZmaXguJyxcbiAgICB9LFxuICAgICcyMDMnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdFbGVtZW50IG5vdCBhbiBhcnJheSAtIGNhbm5vdCBoYXZlIGNvdW50JyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdJbmRpY2F0ZXMgdGhhdCBMTVNHZXRWYWx1ZSB3YXMgY2FsbGVkIHdpdGggYSBkYXRhIG1vZGVsIGVsZW1lbnQgbmFtZSB0aGF0IGVuZHMgaW4gXCJfY291bnRcIiBmb3IgYSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBcIl9jb3VudFwiIHN1ZmZpeC4nLFxuICAgIH0sXG4gICAgJzMwMSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ05vdCBpbml0aWFsaXplZCcsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnSW5kaWNhdGVzIHRoYXQgYW4gQVBJIGNhbGwgd2FzIG1hZGUgYmVmb3JlIHRoZSBjYWxsIHRvIGxtc0luaXRpYWxpemUuJyxcbiAgICB9LFxuICAgICc0MDEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdOb3QgaW1wbGVtZW50ZWQgZXJyb3InLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ1RoZSBkYXRhIG1vZGVsIGVsZW1lbnQgaW5kaWNhdGVkIGluIGEgY2FsbCB0byBMTVNHZXRWYWx1ZSBvciBMTVNTZXRWYWx1ZSBpcyB2YWxpZCwgYnV0IHdhcyBub3QgaW1wbGVtZW50ZWQgYnkgdGhpcyBMTVMuIFNDT1JNIDEuMiBkZWZpbmVzIGEgc2V0IG9mIGRhdGEgbW9kZWwgZWxlbWVudHMgYXMgYmVpbmcgb3B0aW9uYWwgZm9yIGFuIExNUyB0byBpbXBsZW1lbnQuJyxcbiAgICB9LFxuICAgICc0MDInOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdJbnZhbGlkIHNldCB2YWx1ZSwgZWxlbWVudCBpcyBhIGtleXdvcmQnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0luZGljYXRlcyB0aGF0IExNU1NldFZhbHVlIHdhcyBjYWxsZWQgb24gYSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEga2V5d29yZCAoZWxlbWVudHMgdGhhdCBlbmQgaW4gXCJfY2hpbGRyZW5cIiBhbmQgXCJfY291bnRcIikuJyxcbiAgICB9LFxuICAgICc0MDMnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdFbGVtZW50IGlzIHJlYWQgb25seScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnTE1TU2V0VmFsdWUgd2FzIGNhbGxlZCB3aXRoIGEgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgY2FuIG9ubHkgYmUgcmVhZC4nLFxuICAgIH0sXG4gICAgJzQwNCc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0VsZW1lbnQgaXMgd3JpdGUgb25seScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnTE1TR2V0VmFsdWUgd2FzIGNhbGxlZCBvbiBhIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IGNhbiBvbmx5IGJlIHdyaXR0ZW4gdG8uJyxcbiAgICB9LFxuICAgICc0MDUnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdJbmNvcnJlY3QgRGF0YSBUeXBlJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdMTVNTZXRWYWx1ZSB3YXMgY2FsbGVkIHdpdGggYSB2YWx1ZSB0aGF0IGlzIG5vdCBjb25zaXN0ZW50IHdpdGggdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBzdXBwbGllZCBkYXRhIG1vZGVsIGVsZW1lbnQuJyxcbiAgICB9LFxuICAgICc0MDcnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdFbGVtZW50IFZhbHVlIE91dCBPZiBSYW5nZScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnVGhlIG51bWVyaWMgdmFsdWUgc3VwcGxpZWQgdG8gYSBMTVNTZXRWYWx1ZSBjYWxsIGlzIG91dHNpZGUgb2YgdGhlIG51bWVyaWMgcmFuZ2UgYWxsb3dlZCBmb3IgdGhlIHN1cHBsaWVkIGRhdGEgbW9kZWwgZWxlbWVudC4nLFxuICAgIH0sXG4gICAgJzQwOCc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0RhdGEgTW9kZWwgRGVwZW5kZW5jeSBOb3QgRXN0YWJsaXNoZWQnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ1NvbWUgZGF0YSBtb2RlbCBlbGVtZW50cyBjYW5ub3QgYmUgc2V0IHVudGlsIGFub3RoZXIgZGF0YSBtb2RlbCBlbGVtZW50IHdhcyBzZXQuIFRoaXMgZXJyb3IgY29uZGl0aW9uIGluZGljYXRlcyB0aGF0IHRoZSBwcmVyZXF1aXNpdGUgZWxlbWVudCB3YXMgbm90IHNldCBiZWZvcmUgdGhlIGRlcGVuZGVudCBlbGVtZW50LicsXG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IGFpY2MgPSB7XG4gIC4uLnNjb3JtMTIsIC4uLntcbiAgICBjbWlfY2hpbGRyZW46ICdjb3JlLHN1c3BlbmRfZGF0YSxsYXVuY2hfZGF0YSxjb21tZW50cyxvYmplY3RpdmVzLHN0dWRlbnRfZGF0YSxzdHVkZW50X3ByZWZlcmVuY2UsaW50ZXJhY3Rpb25zLGV2YWx1YXRpb24nLFxuICAgIHN0dWRlbnRfcHJlZmVyZW5jZV9jaGlsZHJlbjogJ2F1ZGlvLGxhbmd1YWdlLGxlc3Nvbl90eXBlLHNwZWVkLHRleHQsdGV4dF9jb2xvcix0ZXh0X2xvY2F0aW9uLHRleHRfc2l6ZSx2aWRlbyx3aW5kb3dzJyxcbiAgICBzdHVkZW50X2RhdGFfY2hpbGRyZW46ICdhdHRlbXB0X251bWJlcix0cmllcyxtYXN0ZXJ5X3Njb3JlLG1heF90aW1lX2FsbG93ZWQsdGltZV9saW1pdF9hY3Rpb24nLFxuICAgIHN0dWRlbnRfZGVtb2dyYXBoaWNzX2NoaWxkcmVuOiAnY2l0eSxjbGFzcyxjb21wYW55LGNvdW50cnksZXhwZXJpZW5jZSxmYW1pbGlhcl9uYW1lLGluc3RydWN0b3JfbmFtZSx0aXRsZSxuYXRpdmVfbGFuZ3VhZ2Usc3RhdGUsc3RyZWV0X2FkZHJlc3MsdGVsZXBob25lLHllYXJzX2V4cGVyaWVuY2UnLFxuICAgIHRyaWVzX2NoaWxkcmVuOiAndGltZSxzdGF0dXMsc2NvcmUnLFxuICAgIGF0dGVtcHRfcmVjb3Jkc19jaGlsZHJlbjogJ3Njb3JlLGxlc3Nvbl9zdGF0dXMnLFxuICAgIHBhdGhzX2NoaWxkcmVuOiAnbG9jYXRpb25faWQsZGF0ZSx0aW1lLHN0YXR1cyx3aHlfbGVmdCx0aW1lX2luX2VsZW1lbnQnLFxuICB9LFxufTtcblxuY29uc3Qgc2Nvcm0yMDA0ID0ge1xuICAvLyBDaGlsZHJlbiBsaXN0c1xuICBjbWlfY2hpbGRyZW46ICdfdmVyc2lvbixjb21tZW50c19mcm9tX2xlYXJuZXIsY29tbWVudHNfZnJvbV9sbXMsY29tcGxldGlvbl9zdGF0dXMsY3JlZGl0LGVudHJ5LGV4aXQsaW50ZXJhY3Rpb25zLGxhdW5jaF9kYXRhLGxlYXJuZXJfaWQsbGVhcm5lcl9uYW1lLGxlYXJuZXJfcHJlZmVyZW5jZSxsb2NhdGlvbixtYXhfdGltZV9hbGxvd2VkLG1vZGUsb2JqZWN0aXZlcyxwcm9ncmVzc19tZWFzdXJlLHNjYWxlZF9wYXNzaW5nX3Njb3JlLHNjb3JlLHNlc3Npb25fdGltZSxzdWNjZXNzX3N0YXR1cyxzdXNwZW5kX2RhdGEsdGltZV9saW1pdF9hY3Rpb24sdG90YWxfdGltZScsXG4gIGNvbW1lbnRzX2NoaWxkcmVuOiAnY29tbWVudCx0aW1lc3RhbXAsbG9jYXRpb24nLFxuICBzY29yZV9jaGlsZHJlbjogJ21heCxyYXcsc2NhbGVkLG1pbicsXG4gIG9iamVjdGl2ZXNfY2hpbGRyZW46ICdwcm9ncmVzc19tZWFzdXJlLGNvbXBsZXRpb25fc3RhdHVzLHN1Y2Nlc3Nfc3RhdHVzLGRlc2NyaXB0aW9uLHNjb3JlLGlkJyxcbiAgY29ycmVjdF9yZXNwb25zZXNfY2hpbGRyZW46ICdwYXR0ZXJuJyxcbiAgc3R1ZGVudF9kYXRhX2NoaWxkcmVuOiAnbWFzdGVyeV9zY29yZSxtYXhfdGltZV9hbGxvd2VkLHRpbWVfbGltaXRfYWN0aW9uJyxcbiAgc3R1ZGVudF9wcmVmZXJlbmNlX2NoaWxkcmVuOiAnYXVkaW9fbGV2ZWwsYXVkaW9fY2FwdGlvbmluZyxkZWxpdmVyeV9zcGVlZCxsYW5ndWFnZScsXG4gIGludGVyYWN0aW9uc19jaGlsZHJlbjogJ2lkLHR5cGUsb2JqZWN0aXZlcyx0aW1lc3RhbXAsY29ycmVjdF9yZXNwb25zZXMsd2VpZ2h0aW5nLGxlYXJuZXJfcmVzcG9uc2UscmVzdWx0LGxhdGVuY3ksZGVzY3JpcHRpb24nLFxuXG4gIGVycm9yX2Rlc2NyaXB0aW9uczoge1xuICAgICcwJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnTm8gRXJyb3InLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ05vIGVycm9yIG9jY3VycmVkLCB0aGUgcHJldmlvdXMgQVBJIGNhbGwgd2FzIHN1Y2Nlc3NmdWwuJyxcbiAgICB9LFxuICAgICcxMDEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdHZW5lcmFsIEV4Y2VwdGlvbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnTm8gc3BlY2lmaWMgZXJyb3IgY29kZSBleGlzdHMgdG8gZGVzY3JpYmUgdGhlIGVycm9yLiBVc2UgR2V0RGlhZ25vc3RpYyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLFxuICAgIH0sXG4gICAgJzEwMic6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0dlbmVyYWwgSW5pdGlhbGl6YXRpb24gRmFpbHVyZScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBJbml0aWFsaXplIGZhaWxlZCBmb3IgYW4gdW5rbm93biByZWFzb24uJyxcbiAgICB9LFxuICAgICcxMDMnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdBbHJlYWR5IEluaXRpYWxpemVkJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIEluaXRpYWxpemUgZmFpbGVkIGJlY2F1c2UgSW5pdGlhbGl6ZSB3YXMgYWxyZWFkeSBjYWxsZWQuJyxcbiAgICB9LFxuICAgICcxMDQnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdDb250ZW50IEluc3RhbmNlIFRlcm1pbmF0ZWQnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gSW5pdGlhbGl6ZSBmYWlsZWQgYmVjYXVzZSBUZXJtaW5hdGUgd2FzIGFscmVhZHkgY2FsbGVkLicsXG4gICAgfSxcbiAgICAnMTExJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnR2VuZXJhbCBUZXJtaW5hdGlvbiBGYWlsdXJlJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIFRlcm1pbmF0ZSBmYWlsZWQgZm9yIGFuIHVua25vd24gcmVhc29uLicsXG4gICAgfSxcbiAgICAnMTEyJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnVGVybWluYXRpb24gQmVmb3JlIEluaXRpYWxpemF0aW9uJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIFRlcm1pbmF0ZSBmYWlsZWQgYmVjYXVzZSBpdCB3YXMgbWFkZSBiZWZvcmUgdGhlIGNhbGwgdG8gSW5pdGlhbGl6ZS4nLFxuICAgIH0sXG4gICAgJzExMyc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ1Rlcm1pbmF0aW9uIEFmdGVyIFRlcm1pbmF0aW9uJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIFRlcm1pbmF0ZSBmYWlsZWQgYmVjYXVzZSBUZXJtaW5hdGUgd2FzIGFscmVhZHkgY2FsbGVkLicsXG4gICAgfSxcbiAgICAnMTIyJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnUmV0cmlldmUgRGF0YSBCZWZvcmUgSW5pdGlhbGl6YXRpb24nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gR2V0VmFsdWUgZmFpbGVkIGJlY2F1c2UgaXQgd2FzIG1hZGUgYmVmb3JlIHRoZSBjYWxsIHRvIEluaXRpYWxpemUuJyxcbiAgICB9LFxuICAgICcxMjMnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdSZXRyaWV2ZSBEYXRhIEFmdGVyIFRlcm1pbmF0aW9uJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIEdldFZhbHVlIGZhaWxlZCBiZWNhdXNlIGl0IHdhcyBtYWRlIGFmdGVyIHRoZSBjYWxsIHRvIFRlcm1pbmF0ZS4nLFxuICAgIH0sXG4gICAgJzEzMic6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ1N0b3JlIERhdGEgQmVmb3JlIEluaXRpYWxpemF0aW9uJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIFNldFZhbHVlIGZhaWxlZCBiZWNhdXNlIGl0IHdhcyBtYWRlIGJlZm9yZSB0aGUgY2FsbCB0byBJbml0aWFsaXplLicsXG4gICAgfSxcbiAgICAnMTMzJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnU3RvcmUgRGF0YSBBZnRlciBUZXJtaW5hdGlvbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBTZXRWYWx1ZSBmYWlsZWQgYmVjYXVzZSBpdCB3YXMgbWFkZSBhZnRlciB0aGUgY2FsbCB0byBUZXJtaW5hdGUuJyxcbiAgICB9LFxuICAgICcxNDInOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdDb21taXQgQmVmb3JlIEluaXRpYWxpemF0aW9uJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIENvbW1pdCBmYWlsZWQgYmVjYXVzZSBpdCB3YXMgbWFkZSBiZWZvcmUgdGhlIGNhbGwgdG8gSW5pdGlhbGl6ZS4nLFxuICAgIH0sXG4gICAgJzE0Myc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0NvbW1pdCBBZnRlciBUZXJtaW5hdGlvbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBDb21taXQgZmFpbGVkIGJlY2F1c2UgaXQgd2FzIG1hZGUgYWZ0ZXIgdGhlIGNhbGwgdG8gVGVybWluYXRlLicsXG4gICAgfSxcbiAgICAnMjAxJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnR2VuZXJhbCBBcmd1bWVudCBFcnJvcicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQW4gaW52YWxpZCBhcmd1bWVudCB3YXMgcGFzc2VkIHRvIGFuIEFQSSBtZXRob2QgKHVzdWFsbHkgaW5kaWNhdGVzIHRoYXQgSW5pdGlhbGl6ZSwgQ29tbWl0IG9yIFRlcm1pbmF0ZSBkaWQgbm90IHJlY2VpdmUgdGhlIGV4cGVjdGVkIGVtcHR5IHN0cmluZyBhcmd1bWVudC4nLFxuICAgIH0sXG4gICAgJzMwMSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0dlbmVyYWwgR2V0IEZhaWx1cmUnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0luZGljYXRlcyBhIGZhaWxlZCBHZXRWYWx1ZSBjYWxsIHdoZXJlIG5vIG90aGVyIHNwZWNpZmljIGVycm9yIGNvZGUgaXMgYXBwbGljYWJsZS4gVXNlIEdldERpYWdub3N0aWMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyxcbiAgICB9LFxuICAgICczNTEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdHZW5lcmFsIFNldCBGYWlsdXJlJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdJbmRpY2F0ZXMgYSBmYWlsZWQgU2V0VmFsdWUgY2FsbCB3aGVyZSBubyBvdGhlciBzcGVjaWZpYyBlcnJvciBjb2RlIGlzIGFwcGxpY2FibGUuIFVzZSBHZXREaWFnbm9zdGljIGZvciBtb3JlIGluZm9ybWF0aW9uLicsXG4gICAgfSxcbiAgICAnMzkxJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnR2VuZXJhbCBDb21taXQgRmFpbHVyZScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnSW5kaWNhdGVzIGEgZmFpbGVkIENvbW1pdCBjYWxsIHdoZXJlIG5vIG90aGVyIHNwZWNpZmljIGVycm9yIGNvZGUgaXMgYXBwbGljYWJsZS4gVXNlIEdldERpYWdub3N0aWMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyxcbiAgICB9LFxuICAgICc0MDEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdVbmRlZmluZWQgRGF0YSBNb2RlbCBFbGVtZW50JyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdUaGUgZGF0YSBtb2RlbCBlbGVtZW50IG5hbWUgcGFzc2VkIHRvIEdldFZhbHVlIG9yIFNldFZhbHVlIGlzIG5vdCBhIHZhbGlkIFNDT1JNIGRhdGEgbW9kZWwgZWxlbWVudC4nLFxuICAgIH0sXG4gICAgJzQwMic6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ1VuaW1wbGVtZW50ZWQgRGF0YSBNb2RlbCBFbGVtZW50JyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdUaGUgZGF0YSBtb2RlbCBlbGVtZW50IGluZGljYXRlZCBpbiBhIGNhbGwgdG8gR2V0VmFsdWUgb3IgU2V0VmFsdWUgaXMgdmFsaWQsIGJ1dCB3YXMgbm90IGltcGxlbWVudGVkIGJ5IHRoaXMgTE1TLiBJbiBTQ09STSAyMDA0LCB0aGlzIGVycm9yIHdvdWxkIGluZGljYXRlIGFuIExNUyB0aGF0IGlzIG5vdCBmdWxseSBTQ09STSBjb25mb3JtYW50LicsXG4gICAgfSxcbiAgICAnNDAzJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRGF0YSBNb2RlbCBFbGVtZW50IFZhbHVlIE5vdCBJbml0aWFsaXplZCcsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQXR0ZW1wdCB0byByZWFkIGEgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIGJ5IHRoZSBMTVMgb3IgdGhyb3VnaCBhIFNldFZhbHVlIGNhbGwuIFRoaXMgZXJyb3IgY29uZGl0aW9uIGlzIG9mdGVuIHJlYWNoZWQgZHVyaW5nIG5vcm1hbCBleGVjdXRpb24gb2YgYSBTQ08uJyxcbiAgICB9LFxuICAgICc0MDQnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdEYXRhIE1vZGVsIEVsZW1lbnQgSXMgUmVhZCBPbmx5JyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdTZXRWYWx1ZSB3YXMgY2FsbGVkIHdpdGggYSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCBjYW4gb25seSBiZSByZWFkLicsXG4gICAgfSxcbiAgICAnNDA1Jzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRGF0YSBNb2RlbCBFbGVtZW50IElzIFdyaXRlIE9ubHknLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0dldFZhbHVlIHdhcyBjYWxsZWQgb24gYSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCBjYW4gb25seSBiZSB3cml0dGVuIHRvLicsXG4gICAgfSxcbiAgICAnNDA2Jzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRGF0YSBNb2RlbCBFbGVtZW50IFR5cGUgTWlzbWF0Y2gnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ1NldFZhbHVlIHdhcyBjYWxsZWQgd2l0aCBhIHZhbHVlIHRoYXQgaXMgbm90IGNvbnNpc3RlbnQgd2l0aCB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIHN1cHBsaWVkIGRhdGEgbW9kZWwgZWxlbWVudC4nLFxuICAgIH0sXG4gICAgJzQwNyc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0RhdGEgTW9kZWwgRWxlbWVudCBWYWx1ZSBPdXQgT2YgUmFuZ2UnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ1RoZSBudW1lcmljIHZhbHVlIHN1cHBsaWVkIHRvIGEgU2V0VmFsdWUgY2FsbCBpcyBvdXRzaWRlIG9mIHRoZSBudW1lcmljIHJhbmdlIGFsbG93ZWQgZm9yIHRoZSBzdXBwbGllZCBkYXRhIG1vZGVsIGVsZW1lbnQuJyxcbiAgICB9LFxuICAgICc0MDgnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdEYXRhIE1vZGVsIERlcGVuZGVuY3kgTm90IEVzdGFibGlzaGVkJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdTb21lIGRhdGEgbW9kZWwgZWxlbWVudHMgY2Fubm90IGJlIHNldCB1bnRpbCBhbm90aGVyIGRhdGEgbW9kZWwgZWxlbWVudCB3YXMgc2V0LiBUaGlzIGVycm9yIGNvbmRpdGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJlcmVxdWlzaXRlIGVsZW1lbnQgd2FzIG5vdCBzZXQgYmVmb3JlIHRoZSBkZXBlbmRlbnQgZWxlbWVudC4nLFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCBBUElDb25zdGFudHMgPSB7XG4gIGdsb2JhbDogZ2xvYmFsLFxuICBzY29ybTEyOiBzY29ybTEyLFxuICBhaWNjOiBhaWNjLFxuICBzY29ybTIwMDQ6IHNjb3JtMjAwNCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFQSUNvbnN0YW50cztcbiIsIi8vIEBmbG93XG5jb25zdCBnbG9iYWwgPSB7XG4gIEdFTkVSQUw6IDEwMSxcbiAgSU5JVElBTElaQVRJT05fRkFJTEVEOiAxMDEsXG4gIElOSVRJQUxJWkVEOiAxMDEsXG4gIFRFUk1JTkFURUQ6IDEwMSxcbiAgVEVSTUlOQVRJT05fRkFJTFVSRTogMTAxLFxuICBURVJNSU5BVElPTl9CRUZPUkVfSU5JVDogMTAxLFxuICBNVUxUSVBMRV9URVJNSU5BVElPTjogMTAxLFxuICBSRVRSSUVWRV9CRUZPUkVfSU5JVDogMTAxLFxuICBSRVRSSUVWRV9BRlRFUl9URVJNOiAxMDEsXG4gIFNUT1JFX0JFRk9SRV9JTklUOiAxMDEsXG4gIFNUT1JFX0FGVEVSX1RFUk06IDEwMSxcbiAgQ09NTUlUX0JFRk9SRV9JTklUOiAxMDEsXG4gIENPTU1JVF9BRlRFUl9URVJNOiAxMDEsXG4gIEFSR1VNRU5UX0VSUk9SOiAxMDEsXG4gIENISUxEUkVOX0VSUk9SOiAxMDEsXG4gIENPVU5UX0VSUk9SOiAxMDEsXG4gIEdFTkVSQUxfR0VUX0ZBSUxVUkU6IDEwMSxcbiAgR0VORVJBTF9TRVRfRkFJTFVSRTogMTAxLFxuICBHRU5FUkFMX0NPTU1JVF9GQUlMVVJFOiAxMDEsXG4gIFVOREVGSU5FRF9EQVRBX01PREVMOiAxMDEsXG4gIFVOSU1QTEVNRU5URURfRUxFTUVOVDogMTAxLFxuICBWQUxVRV9OT1RfSU5JVElBTElaRUQ6IDEwMSxcbiAgSU5WQUxJRF9TRVRfVkFMVUU6IDEwMSxcbiAgUkVBRF9PTkxZX0VMRU1FTlQ6IDEwMSxcbiAgV1JJVEVfT05MWV9FTEVNRU5UOiAxMDEsXG4gIFRZUEVfTUlTTUFUQ0g6IDEwMSxcbiAgVkFMVUVfT1VUX09GX1JBTkdFOiAxMDEsXG4gIERFUEVOREVOQ1lfTk9UX0VTVEFCTElTSEVEOiAxMDEsXG59O1xuXG5jb25zdCBzY29ybTEyID0ge1xuICAuLi5nbG9iYWwsIC4uLntcbiAgICBSRVRSSUVWRV9CRUZPUkVfSU5JVDogMzAxLFxuICAgIFNUT1JFX0JFRk9SRV9JTklUOiAzMDEsXG4gICAgQ09NTUlUX0JFRk9SRV9JTklUOiAzMDEsXG4gICAgQVJHVU1FTlRfRVJST1I6IDIwMSxcbiAgICBDSElMRFJFTl9FUlJPUjogMjAyLFxuICAgIENPVU5UX0VSUk9SOiAyMDMsXG4gICAgVU5ERUZJTkVEX0RBVEFfTU9ERUw6IDQwMSxcbiAgICBVTklNUExFTUVOVEVEX0VMRU1FTlQ6IDQwMSxcbiAgICBWQUxVRV9OT1RfSU5JVElBTElaRUQ6IDMwMSxcbiAgICBJTlZBTElEX1NFVF9WQUxVRTogNDAyLFxuICAgIFJFQURfT05MWV9FTEVNRU5UOiA0MDMsXG4gICAgV1JJVEVfT05MWV9FTEVNRU5UOiA0MDQsXG4gICAgVFlQRV9NSVNNQVRDSDogNDA1LFxuICAgIFZBTFVFX09VVF9PRl9SQU5HRTogNDA3LFxuICAgIERFUEVOREVOQ1lfTk9UX0VTVEFCTElTSEVEOiA0MDgsXG4gIH0sXG59O1xuXG5jb25zdCBzY29ybTIwMDQgPSB7XG4gIC4uLmdsb2JhbCwgLi4ue1xuICAgIElOSVRJQUxJWkFUSU9OX0ZBSUxFRDogMTAyLFxuICAgIElOSVRJQUxJWkVEOiAxMDMsXG4gICAgVEVSTUlOQVRFRDogMTA0LFxuICAgIFRFUk1JTkFUSU9OX0ZBSUxVUkU6IDExMSxcbiAgICBURVJNSU5BVElPTl9CRUZPUkVfSU5JVDogMTEyLFxuICAgIE1VTFRJUExFX1RFUk1JTkFUSU9OUzogMTEzLFxuICAgIFJFVFJJRVZFX0JFRk9SRV9JTklUOiAxMjIsXG4gICAgUkVUUklFVkVfQUZURVJfVEVSTTogMTIzLFxuICAgIFNUT1JFX0JFRk9SRV9JTklUOiAxMzIsXG4gICAgU1RPUkVfQUZURVJfVEVSTTogMTMzLFxuICAgIENPTU1JVF9CRUZPUkVfSU5JVDogMTQyLFxuICAgIENPTU1JVF9BRlRFUl9URVJNOiAxNDMsXG4gICAgQVJHVU1FTlRfRVJST1I6IDIwMSxcbiAgICBHRU5FUkFMX0dFVF9GQUlMVVJFOiAzMDEsXG4gICAgR0VORVJBTF9TRVRfRkFJTFVSRTogMzUxLFxuICAgIEdFTkVSQUxfQ09NTUlUX0ZBSUxVUkU6IDM5MSxcbiAgICBVTkRFRklORURfREFUQV9NT0RFTDogNDAxLFxuICAgIFVOSU1QTEVNRU5URURfRUxFTUVOVDogNDAyLFxuICAgIFZBTFVFX05PVF9JTklUSUFMSVpFRDogNDAzLFxuICAgIFJFQURfT05MWV9FTEVNRU5UOiA0MDQsXG4gICAgV1JJVEVfT05MWV9FTEVNRU5UOiA0MDUsXG4gICAgVFlQRV9NSVNNQVRDSDogNDA2LFxuICAgIFZBTFVFX09VVF9PRl9SQU5HRTogNDA3LFxuICAgIERFUEVOREVOQ1lfTk9UX0VTVEFCTElTSEVEOiA0MDgsXG4gIH0sXG59O1xuXG5jb25zdCBFcnJvckNvZGVzID0ge1xuICBzY29ybTEyOiBzY29ybTEyLFxuICBzY29ybTIwMDQ6IHNjb3JtMjAwNCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEVycm9yQ29kZXM7XG4iLCIvLyBAZmxvd1xuXG5jb25zdCBzY29ybTEyID0ge1xuICBDTUlTdHJpbmcyNTY6ICdeLnswLDI1NX0kJyxcbiAgQ01JU3RyaW5nNDA5NjogJ14uezAsNDA5Nn0kJyxcbiAgQ01JVGltZTogJ14oPzpbMDFdXFxcXGR8MlswMTIzXSk6KD86WzAxMjM0NV1cXFxcZCk6KD86WzAxMjM0NV1cXFxcZCkkJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBDTUlUaW1lc3BhbjogJ14oWzAtOV17Mix9KTooWzAtOV17Mn0pOihbMC05XXsyfSkoXFwuWzAtOV17MSwyfSk/JCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgQ01JSW50ZWdlcjogJ15cXFxcZCskJyxcbiAgQ01JU0ludGVnZXI6ICdeLT8oWzAtOV0rKSQnLFxuICBDTUlEZWNpbWFsOiAnXi0/KFswLTldezAsM30pKFxcLlswLTldKik/JCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgQ01JSWRlbnRpZmllcjogJ15bXFxcXHUwMDIxLVxcXFx1MDA3RVxcXFxzXXswLDI1NX0kJyxcbiAgQ01JRmVlZGJhY2s6ICdeLnswLDI1NX0kJywgLy8gVGhpcyBtdXN0IGJlIHJlZGVmaW5lZFxuICBDTUlJbmRleDogJ1suX10oXFxcXGQrKS4nLFxuXG4gIC8vIFZvY2FidWxhcnkgRGF0YSBUeXBlIERlZmluaXRpb25cbiAgQ01JU3RhdHVzOiAnXihwYXNzZWR8Y29tcGxldGVkfGZhaWxlZHxpbmNvbXBsZXRlfGJyb3dzZWQpJCcsXG4gIENNSVN0YXR1czI6ICdeKHBhc3NlZHxjb21wbGV0ZWR8ZmFpbGVkfGluY29tcGxldGV8YnJvd3NlZHxub3QgYXR0ZW1wdGVkKSQnLFxuICBDTUlFeGl0OiAnXih0aW1lLW91dHxzdXNwZW5kfGxvZ291dHwpJCcsXG4gIENNSVR5cGU6ICdeKHRydWUtZmFsc2V8Y2hvaWNlfGZpbGwtaW58bWF0Y2hpbmd8cGVyZm9ybWFuY2V8c2VxdWVuY2luZ3xsaWtlcnR8bnVtZXJpYykkJyxcbiAgQ01JUmVzdWx0OiAnXihjb3JyZWN0fHdyb25nfHVuYW50aWNpcGF0ZWR8bmV1dHJhbHwoWzAtOV17MCwzfSk/KFxcXFwuWzAtOV0qKT8pJCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgTkFWRXZlbnQ6ICdeKHByZXZpb3VzfGNvbnRpbnVlKSQnLFxuXG4gIC8vIERhdGEgcmFuZ2VzXG4gIHNjb3JlX3JhbmdlOiAnMCMxMDAnLFxuICBhdWRpb19yYW5nZTogJy0xIzEwMCcsXG4gIHNwZWVkX3JhbmdlOiAnLTEwMCMxMDAnLFxuICB3ZWlnaHRpbmdfcmFuZ2U6ICctMTAwIzEwMCcsXG4gIHRleHRfcmFuZ2U6ICctMSMxJyxcbn07XG5cbmNvbnN0IGFpY2MgPSB7XG4gIC4uLnNjb3JtMTIsIC4uLntcbiAgICBDTUlJZGVudGlmaWVyOiAnXlxcXFx3ezEsMjU1fSQnLFxuICB9LFxufTtcblxuY29uc3Qgc2Nvcm0yMDA0ID0ge1xuICBDTUlTdHJpbmcyMDA6ICdeW1xcXFx1MDAwMC1cXFxcdUZGRkZdezAsMjAwfSQnLFxuICBDTUlTdHJpbmcyNTA6ICdeW1xcXFx1MDAwMC1cXFxcdUZGRkZdezAsMjUwfSQnLFxuICBDTUlTdHJpbmcxMDAwOiAnXltcXFxcdTAwMDAtXFxcXHVGRkZGXXswLDEwMDB9JCcsXG4gIENNSVN0cmluZzQwMDA6ICdeW1xcXFx1MDAwMC1cXFxcdUZGRkZdezAsNDAwMH0kJyxcbiAgQ01JU3RyaW5nNjQwMDA6ICdeW1xcXFx1MDAwMC1cXFxcdUZGRkZdezAsNjQwMDB9JCcsXG4gIENNSUxhbmc6ICdeKFthLXpBLVpdezIsM318aXx4KShcXC1bYS16QS1aMC05XFwtXXsyLDh9KT8kfF4kJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBDTUlMYW5nU3RyaW5nMjUwOiAnXihcXHtsYW5nPShbYS16QS1aXXsyLDN9fGl8eCkoXFwtW2EtekEtWjAtOVxcLV17Miw4fSk/XFx9KT8oKD8hXFx7LiokKS57MCwyNTB9JCk/JCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgQ01JTGFuZ2NyOiAnXigoXFx7bGFuZz0oW2EtekEtWl17MiwzfXxpfHgpPyhcXC1bYS16QS1aMC05XFwtXXsyLDh9KT9cXH0pKSguKj8pJCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgQ01JTGFuZ1N0cmluZzI1MGNyOiAnXigoXFx7bGFuZz0oW2EtekEtWl17MiwzfXxpfHgpPyhcXC1bYS16QS1aMC05XFwtXXsyLDh9KT9cXH0pPyguezAsMjUwfSk/KT8kJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBDTUlMYW5nU3RyaW5nNDAwMDogJ14oXFx7bGFuZz0oW2EtekEtWl17MiwzfXxpfHgpKFxcLVthLXpBLVowLTlcXC1dezIsOH0pP1xcfSk/KCg/IVxcey4qJCkuezAsNDAwMH0kKT8kJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBDTUlUaW1lOiAnXigxOVs3LTldezF9WzAtOV17MX18MjBbMC0yXXsxfVswLTldezF9fDIwM1swLThdezF9KSgoLSgwWzEtOV17MX18MVswLTJdezF9KSkoKC0oMFsxLTldezF9fFsxLTJdezF9WzAtOV17MX18M1swLTFdezF9KSkoVChbMC0xXXsxfVswLTldezF9fDJbMC0zXXsxfSkoKDpbMC01XXsxfVswLTldezF9KSgoOlswLTVdezF9WzAtOV17MX0pKChcXFxcLlswLTldezEsMn0pKChafChbK3wtXShbMC0xXXsxfVswLTldezF9fDJbMC0zXXsxfSkpKSg6WzAtNV17MX1bMC05XXsxfSk/KT8pPyk/KT8pPyk/KT8kJyxcbiAgQ01JVGltZXNwYW46ICdeUCg/OihbLixcXFxcZF0rKVkpPyg/OihbLixcXFxcZF0rKU0pPyg/OihbLixcXFxcZF0rKVcpPyg/OihbLixcXFxcZF0rKUQpPyg/OlQ/KD86KFsuLFxcXFxkXSspSCk/KD86KFsuLFxcXFxkXSspTSk/KD86KFsuLFxcXFxkXSspUyk/KT8kJyxcbiAgQ01JSW50ZWdlcjogJ15cXFxcZCskJyxcbiAgQ01JU0ludGVnZXI6ICdeLT8oWzAtOV0rKSQnLFxuICBDTUlEZWNpbWFsOiAnXi0/KFswLTldezEsNX0pKFxcXFwuWzAtOV17MSwxOH0pPyQnLFxuICBDTUlJZGVudGlmaWVyOiAnXlxcXFxTezEsMjUwfVthLXpBLVowLTldJCcsXG4gIENNSVNob3J0SWRlbnRpZmllcjogJ15bXFxcXHdcXFxcLlxcXFwtXFxcXF9dezEsMjUwfSQnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIENNSUxvbmdJZGVudGlmaWVyOiAnXig/Oig/IXVybjopXFxcXFN7MSw0MDAwfXx1cm46W0EtWmEtejAtOS1dezEsMzF9OlxcXFxTezEsNDAwMH18LnsxLDQwMDB9KSQnLCAvLyBuZWVkIHRvIHJlLWV4YW1pbmUgdGhpc1xuICBDTUlGZWVkYmFjazogJ14uKiQnLCAvLyBUaGlzIG11c3QgYmUgcmVkZWZpbmVkXG4gIENNSUluZGV4OiAnWy5fXShcXFxcZCspLicsXG4gIENNSUluZGV4U3RvcmU6ICcuTihcXFxcZCspLicsXG5cbiAgLy8gVm9jYWJ1bGFyeSBEYXRhIFR5cGUgRGVmaW5pdGlvblxuICBDTUlDU3RhdHVzOiAnXihjb21wbGV0ZWR8aW5jb21wbGV0ZXxub3QgYXR0ZW1wdGVkfHVua25vd24pJCcsXG4gIENNSVNTdGF0dXM6ICdeKHBhc3NlZHxmYWlsZWR8dW5rbm93bikkJyxcbiAgQ01JRXhpdDogJ14odGltZS1vdXR8c3VzcGVuZHxsb2dvdXR8bm9ybWFsKSQnLFxuICBDTUlUeXBlOiAnXih0cnVlLWZhbHNlfGNob2ljZXxmaWxsLWlufGxvbmctZmlsbC1pbnxtYXRjaGluZ3xwZXJmb3JtYW5jZXxzZXF1ZW5jaW5nfGxpa2VydHxudW1lcmljfG90aGVyKSQnLFxuICBDTUlSZXN1bHQ6ICdeKGNvcnJlY3R8aW5jb3JyZWN0fHVuYW50aWNpcGF0ZWR8bmV1dHJhbHwtPyhbMC05XXsxLDR9KShcXFxcLlswLTldezEsMTh9KT8pJCcsXG4gIE5BVkV2ZW50OiAnXihwcmV2aW91c3xjb250aW51ZXxleGl0fGV4aXRBbGx8YWJhbmRvbnxhYmFuZG9uQWxsfHN1c3BlbmRBbGx8XFx7dGFyZ2V0PVxcXFxTezAsMjAwfVthLXpBLVowLTldXFx9Y2hvaWNlfGp1bXApJCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgTkFWQm9vbGVhbjogJ14odW5rbm93bnx0cnVlfGZhbHNlJCknLFxuICBOQVZUYXJnZXQ6ICdeKHByZXZpb3VzfGNvbnRpbnVlfGNob2ljZS57dGFyZ2V0PVxcXFxTezAsMjAwfVthLXpBLVowLTldfSkkJyxcblxuICAvLyBEYXRhIHJhbmdlc1xuICBzY2FsZWRfcmFuZ2U6ICctMSMxJyxcbiAgYXVkaW9fcmFuZ2U6ICcwIyonLFxuICBzcGVlZF9yYW5nZTogJzAjKicsXG4gIHRleHRfcmFuZ2U6ICctMSMxJyxcbiAgcHJvZ3Jlc3NfcmFuZ2U6ICcwIzEnLFxufTtcblxuY29uc3QgUmVnZXggPSB7XG4gIGFpY2M6IGFpY2MsXG4gIHNjb3JtMTI6IHNjb3JtMTIsXG4gIHNjb3JtMjAwNDogc2Nvcm0yMDA0LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgUmVnZXg7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgQVBJQ29uc3RhbnRzIGZyb20gJy4vY29uc3RhbnRzL2FwaV9jb25zdGFudHMnO1xuXG5jb25zdCBzY29ybTEyX2Vycm9ycyA9IEFQSUNvbnN0YW50cy5zY29ybTEyLmVycm9yX2Rlc2NyaXB0aW9ucztcbmNvbnN0IGFpY2NfZXJyb3JzID0gQVBJQ29uc3RhbnRzLmFpY2MuZXJyb3JfZGVzY3JpcHRpb25zO1xuY29uc3Qgc2Nvcm0yMDA0X2Vycm9ycyA9IEFQSUNvbnN0YW50cy5zY29ybTIwMDQuZXJyb3JfZGVzY3JpcHRpb25zO1xuXG4vKipcbiAqIEJhc2UgVmFsaWRhdGlvbiBFeGNlcHRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIHRvIHRha2UgaW4gYW4gZXJyb3IgbWVzc2FnZSBhbmQgY29kZVxuICAgKiBAcGFyYW0ge251bWJlcn0gZXJyb3JDb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlcnJvck1lc3NhZ2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRldGFpbGVkTWVzc2FnZVxuICAgKi9cbiAgY29uc3RydWN0b3IoZXJyb3JDb2RlOiBudW1iZXIsIGVycm9yTWVzc2FnZTogU3RyaW5nLCBkZXRhaWxlZE1lc3NhZ2U6IFN0cmluZykge1xuICAgIHN1cGVyKGVycm9yTWVzc2FnZSk7XG4gICAgdGhpcy4jZXJyb3JDb2RlID0gZXJyb3JDb2RlO1xuICAgIHRoaXMuI2Vycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTtcbiAgICB0aGlzLiNkZXRhaWxlZE1lc3NhZ2UgPSBkZXRhaWxlZE1lc3NhZ2U7XG4gIH1cblxuICAjZXJyb3JDb2RlO1xuICAjZXJyb3JNZXNzYWdlO1xuICAjZGV0YWlsZWRNZXNzYWdlO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNlcnJvckNvZGVcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGVycm9yQ29kZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jZXJyb3JDb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2Vycm9yTWVzc2FnZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZXJyb3JNZXNzYWdlKCkge1xuICAgIHJldHVybiB0aGlzLiNlcnJvck1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjZGV0YWlsZWRNZXNzYWdlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBkZXRhaWxlZE1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2RldGFpbGVkTWVzc2FnZTtcbiAgfVxufVxuXG4vKipcbiAqIFNDT1JNIDEuMiBWYWxpZGF0aW9uIEVycm9yXG4gKi9cbmV4cG9ydCBjbGFzcyBTY29ybTEyVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgVmFsaWRhdGlvbkVycm9yIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIHRvIHRha2UgaW4gYW4gZXJyb3IgY29kZVxuICAgKiBAcGFyYW0ge251bWJlcn0gZXJyb3JDb2RlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlcnJvckNvZGU6IG51bWJlcikge1xuICAgIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNjb3JtMTJfZXJyb3JzLCBTdHJpbmcoZXJyb3JDb2RlKSkpIHtcbiAgICAgIHN1cGVyKGVycm9yQ29kZSwgc2Nvcm0xMl9lcnJvcnNbU3RyaW5nKGVycm9yQ29kZSldLmJhc2ljTWVzc2FnZSwgc2Nvcm0xMl9lcnJvcnNbU3RyaW5nKGVycm9yQ29kZSldLmRldGFpbE1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlcigxMDEsIHNjb3JtMTJfZXJyb3JzWycxMDEnXS5iYXNpY01lc3NhZ2UsIHNjb3JtMTJfZXJyb3JzWycxMDEnXS5kZXRhaWxNZXNzYWdlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBSUNDIFZhbGlkYXRpb24gRXJyb3JcbiAqL1xuZXhwb3J0IGNsYXNzIEFJQ0NWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBWYWxpZGF0aW9uRXJyb3Ige1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgdG8gdGFrZSBpbiBhbiBlcnJvciBjb2RlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBlcnJvckNvZGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGVycm9yQ29kZTogbnVtYmVyKSB7XG4gICAgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwoYWljY19lcnJvcnMsIFN0cmluZyhlcnJvckNvZGUpKSkge1xuICAgICAgc3VwZXIoZXJyb3JDb2RlLCBhaWNjX2Vycm9yc1tTdHJpbmcoZXJyb3JDb2RlKV0uYmFzaWNNZXNzYWdlLCBhaWNjX2Vycm9yc1tTdHJpbmcoZXJyb3JDb2RlKV0uZGV0YWlsTWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyKDEwMSwgYWljY19lcnJvcnNbJzEwMSddLmJhc2ljTWVzc2FnZSwgYWljY19lcnJvcnNbJzEwMSddLmRldGFpbE1lc3NhZ2UpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNDT1JNIDIwMDQgVmFsaWRhdGlvbiBFcnJvclxuICovXG5leHBvcnQgY2xhc3MgU2Nvcm0yMDA0VmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgVmFsaWRhdGlvbkVycm9yIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIHRvIHRha2UgaW4gYW4gZXJyb3IgY29kZVxuICAgKiBAcGFyYW0ge251bWJlcn0gZXJyb3JDb2RlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlcnJvckNvZGU6IG51bWJlcikge1xuICAgIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNjb3JtMjAwNF9lcnJvcnMsIFN0cmluZyhlcnJvckNvZGUpKSkge1xuICAgICAgc3VwZXIoZXJyb3JDb2RlLCBzY29ybTIwMDRfZXJyb3JzW1N0cmluZyhlcnJvckNvZGUpXS5iYXNpY01lc3NhZ2UsIHNjb3JtMjAwNF9lcnJvcnNbU3RyaW5nKGVycm9yQ29kZSldLmRldGFpbE1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlcigxMDEsIHNjb3JtMjAwNF9lcnJvcnNbJzEwMSddLmJhc2ljTWVzc2FnZSwgc2Nvcm0yMDA0X2Vycm9yc1snMTAxJ10uZGV0YWlsTWVzc2FnZSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgQUlDQyBmcm9tICcuLi9BSUNDJztcblxud2luZG93LkFJQ0MgPSBBSUNDO1xuIiwiLy8gQGZsb3dcbmV4cG9ydCBjb25zdCBTRUNPTkRTX1BFUl9TRUNPTkQgPSAxLjA7XG5leHBvcnQgY29uc3QgU0VDT05EU19QRVJfTUlOVVRFID0gNjA7XG5leHBvcnQgY29uc3QgU0VDT05EU19QRVJfSE9VUiA9IDYwICogU0VDT05EU19QRVJfTUlOVVRFO1xuZXhwb3J0IGNvbnN0IFNFQ09ORFNfUEVSX0RBWSA9IDI0ICogU0VDT05EU19QRVJfSE9VUjtcblxuY29uc3QgZGVzaWduYXRpb25zID0gW1xuICBbJ0QnLCBTRUNPTkRTX1BFUl9EQVldLFxuICBbJ0gnLCBTRUNPTkRTX1BFUl9IT1VSXSxcbiAgWydNJywgU0VDT05EU19QRVJfTUlOVVRFXSxcbiAgWydTJywgU0VDT05EU19QRVJfU0VDT05EXSxcbl07XG5cbi8qKlxuICogQ29udmVydHMgYSBOdW1iZXIgdG8gYSBTdHJpbmcgb2YgSEg6TU06U1NcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gdG90YWxTZWNvbmRzXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWNvbmRzQXNISE1NU1ModG90YWxTZWNvbmRzOiBOdW1iZXIpIHtcbiAgLy8gU0NPUk0gc3BlYyBkb2VzIG5vdCBkZWFsIHdpdGggbmVnYXRpdmUgZHVyYXRpb25zLCBnaXZlIHplcm8gYmFja1xuICBpZiAoIXRvdGFsU2Vjb25kcyB8fCB0b3RhbFNlY29uZHMgPD0gMCkge1xuICAgIHJldHVybiAnMDA6MDA6MDAnO1xuICB9XG5cbiAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHRvdGFsU2Vjb25kcyAvIFNFQ09ORFNfUEVSX0hPVVIpO1xuXG4gIGNvbnN0IGRhdGVPYmogPSBuZXcgRGF0ZSh0b3RhbFNlY29uZHMgKiAxMDAwKTtcbiAgY29uc3QgbWludXRlcyA9IGRhdGVPYmouZ2V0VVRDTWludXRlcygpO1xuICAvLyBtYWtlIHN1cmUgd2UgYWRkIGFueSBwb3NzaWJsZSBkZWNpbWFsIHZhbHVlXG4gIGNvbnN0IHNlY29uZHMgPSBkYXRlT2JqLmdldFNlY29uZHMoKTtcbiAgY29uc3QgbXMgPSB0b3RhbFNlY29uZHMgJSAxLjA7XG4gIGxldCBtc1N0ciA9ICcnO1xuICBpZiAoY291bnREZWNpbWFscyhtcykgPiAwKSB7XG4gICAgaWYgKGNvdW50RGVjaW1hbHMobXMpID4gMikge1xuICAgICAgbXNTdHIgPSBtcy50b0ZpeGVkKDIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtc1N0ciA9IFN0cmluZyhtcyk7XG4gICAgfVxuICAgIG1zU3RyID0gJy4nICsgbXNTdHIuc3BsaXQoJy4nKVsxXTtcbiAgfVxuXG4gIHJldHVybiAoaG91cnMgKyAnOicgKyBtaW51dGVzICsgJzonICsgc2Vjb25kcykucmVwbGFjZSgvXFxiXFxkXFxiL2csXG4gICAgICAnMCQmJykgKyBtc1N0cjtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzZWNvbmRzIGZyb20gSVNPIDg2MDEgRHVyYXRpb25cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gc2Vjb25kc1xuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2Vjb25kc0FzSVNPRHVyYXRpb24oc2Vjb25kczogTnVtYmVyKSB7XG4gIC8vIFNDT1JNIHNwZWMgZG9lcyBub3QgZGVhbCB3aXRoIG5lZ2F0aXZlIGR1cmF0aW9ucywgZ2l2ZSB6ZXJvIGJhY2tcbiAgaWYgKCFzZWNvbmRzIHx8IHNlY29uZHMgPD0gMCkge1xuICAgIHJldHVybiAnUFQwUyc7XG4gIH1cblxuICBsZXQgZHVyYXRpb24gPSAnUCc7XG4gIGxldCByZW1haW5kZXIgPSBzZWNvbmRzO1xuXG4gIGRlc2lnbmF0aW9ucy5mb3JFYWNoKChbc2lnbiwgY3VycmVudF9zZWNvbmRzXSkgPT4ge1xuICAgIGxldCB2YWx1ZSA9IE1hdGguZmxvb3IocmVtYWluZGVyIC8gY3VycmVudF9zZWNvbmRzKTtcblxuICAgIHJlbWFpbmRlciA9IHJlbWFpbmRlciAlIGN1cnJlbnRfc2Vjb25kcztcbiAgICBpZiAoY291bnREZWNpbWFscyhyZW1haW5kZXIpID4gMikge1xuICAgICAgcmVtYWluZGVyID0gTnVtYmVyKE51bWJlcihyZW1haW5kZXIpLnRvRml4ZWQoMikpO1xuICAgIH1cbiAgICAvLyBJZiB3ZSBoYXZlIGFueXRoaW5nIGxlZnQgaW4gdGhlIHJlbWFpbmRlciwgYW5kIHdlJ3JlIGN1cnJlbnRseSBhZGRpbmdcbiAgICAvLyBzZWNvbmRzIHRvIHRoZSBkdXJhdGlvbiwgZ28gYWhlYWQgYW5kIGFkZCB0aGUgZGVjaW1hbCB0byB0aGUgc2Vjb25kc1xuICAgIGlmIChzaWduID09PSAnUycgJiYgcmVtYWluZGVyID4gMCkge1xuICAgICAgdmFsdWUgKz0gcmVtYWluZGVyO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKChkdXJhdGlvbi5pbmRleE9mKCdEJykgPiAwIHx8XG4gICAgICAgICAgc2lnbiA9PT0gJ0gnIHx8IHNpZ24gPT09ICdNJyB8fCBzaWduID09PSAnUycpICYmXG4gICAgICAgICAgZHVyYXRpb24uaW5kZXhPZignVCcpID09PSAtMSkge1xuICAgICAgICBkdXJhdGlvbiArPSAnVCc7XG4gICAgICB9XG4gICAgICBkdXJhdGlvbiArPSBgJHt2YWx1ZX0ke3NpZ259YDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBkdXJhdGlvbjtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzZWNvbmRzIGZyb20gSEg6TU06U1MuREREREREXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRpbWVTdHJpbmdcbiAqIEBwYXJhbSB7UmVnRXhwfSB0aW1lUmVnZXhcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWVBc1NlY29uZHModGltZVN0cmluZzogU3RyaW5nLCB0aW1lUmVnZXg6IFJlZ0V4cCkge1xuICBpZiAoIXRpbWVTdHJpbmcgfHwgdHlwZW9mIHRpbWVTdHJpbmcgIT09ICdzdHJpbmcnIHx8XG4gICAgICAhdGltZVN0cmluZy5tYXRjaCh0aW1lUmVnZXgpKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29uc3QgcGFydHMgPSB0aW1lU3RyaW5nLnNwbGl0KCc6Jyk7XG4gIGNvbnN0IGhvdXJzID0gTnVtYmVyKHBhcnRzWzBdKTtcbiAgY29uc3QgbWludXRlcyA9IE51bWJlcihwYXJ0c1sxXSk7XG4gIGNvbnN0IHNlY29uZHMgPSBOdW1iZXIocGFydHNbMl0pO1xuICByZXR1cm4gKGhvdXJzICogMzYwMCkgKyAobWludXRlcyAqIDYwKSArIHNlY29uZHM7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBmcm9tIElTTyA4NjAxIER1cmF0aW9uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGR1cmF0aW9uXG4gKiBAcGFyYW0ge1JlZ0V4cH0gZHVyYXRpb25SZWdleFxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RHVyYXRpb25Bc1NlY29uZHMoZHVyYXRpb246IFN0cmluZywgZHVyYXRpb25SZWdleDogUmVnRXhwKSB7XG4gIGlmICghZHVyYXRpb24gfHwgIWR1cmF0aW9uLm1hdGNoKGR1cmF0aW9uUmVnZXgpKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCBbLCB5ZWFycywgbW9udGhzLCAsIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzXSA9IG5ldyBSZWdFeHAoXG4gICAgICBkdXJhdGlvblJlZ2V4KS5leGVjKGR1cmF0aW9uKSB8fCBbXTtcblxuICBsZXQgcmVzdWx0ID0gMC4wO1xuXG4gIHJlc3VsdCArPSAoTnVtYmVyKHNlY29uZHMpICogMS4wIHx8IDAuMCk7XG4gIHJlc3VsdCArPSAoTnVtYmVyKG1pbnV0ZXMpICogNjAuMCB8fCAwLjApO1xuICByZXN1bHQgKz0gKE51bWJlcihob3VycykgKiAzNjAwLjAgfHwgMC4wKTtcbiAgcmVzdWx0ICs9IChOdW1iZXIoZGF5cykgKiAoNjAgKiA2MCAqIDI0LjApIHx8IDAuMCk7XG4gIHJlc3VsdCArPSAoTnVtYmVyKHllYXJzKSAqICg2MCAqIDYwICogMjQgKiAzNjUuMCkgfHwgMC4wKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEFkZHMgdG9nZXRoZXIgdHdvIElTTzg2MDEgRHVyYXRpb24gc3RyaW5nc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaXJzdFxuICogQHBhcmFtIHtzdHJpbmd9IHNlY29uZFxuICogQHBhcmFtIHtSZWdFeHB9IGR1cmF0aW9uUmVnZXhcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFR3b0R1cmF0aW9ucyhcbiAgICBmaXJzdDogU3RyaW5nLFxuICAgIHNlY29uZDogU3RyaW5nLFxuICAgIGR1cmF0aW9uUmVnZXg6IFJlZ0V4cCkge1xuICByZXR1cm4gZ2V0U2Vjb25kc0FzSVNPRHVyYXRpb24oXG4gICAgICBnZXREdXJhdGlvbkFzU2Vjb25kcyhmaXJzdCwgZHVyYXRpb25SZWdleCkgK1xuICAgICAgZ2V0RHVyYXRpb25Bc1NlY29uZHMoc2Vjb25kLCBkdXJhdGlvblJlZ2V4KSxcbiAgKTtcbn1cblxuLyoqXG4gKiBBZGQgdG9nZXRoZXIgdHdvIEhIOk1NOlNTLkREIHN0cmluZ3NcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlyc3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWNvbmRcbiAqIEBwYXJhbSB7UmVnRXhwfSB0aW1lUmVnZXhcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEhITU1TU1RpbWVTdHJpbmdzKFxuICAgIGZpcnN0OiBTdHJpbmcsXG4gICAgc2Vjb25kOiBTdHJpbmcsXG4gICAgdGltZVJlZ2V4OiBSZWdFeHApIHtcbiAgcmV0dXJuIGdldFNlY29uZHNBc0hITU1TUyhcbiAgICAgIGdldFRpbWVBc1NlY29uZHMoZmlyc3QsIHRpbWVSZWdleCkgK1xuICAgICAgZ2V0VGltZUFzU2Vjb25kcyhcbiAgICAgICAgICBzZWNvbmQsIHRpbWVSZWdleCksXG4gICk7XG59XG5cbi8qKlxuICogRmxhdHRlbiBhIEpTT04gb2JqZWN0IGRvd24gdG8gc3RyaW5nIHBhdGhzIGZvciBlYWNoIHZhbHVlc1xuICogQHBhcmFtIHtvYmplY3R9IGRhdGFcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW4oZGF0YSkge1xuICBjb25zdCByZXN1bHQgPSB7fTtcblxuICAvKipcbiAgICogUmVjdXJzZSB0aHJvdWdoIHRoZSBvYmplY3RcbiAgICogQHBhcmFtIHsqfSBjdXJcbiAgICogQHBhcmFtIHsqfSBwcm9wXG4gICAqL1xuICBmdW5jdGlvbiByZWN1cnNlKGN1ciwgcHJvcCkge1xuICAgIGlmIChPYmplY3QoY3VyKSAhPT0gY3VyKSB7XG4gICAgICByZXN1bHRbcHJvcF0gPSBjdXI7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGN1cikpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY3VyLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICByZWN1cnNlKGN1cltpXSwgcHJvcCArICdbJyArIGkgKyAnXScpO1xuICAgICAgICBpZiAobCA9PT0gMCkgcmVzdWx0W3Byb3BdID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBpc0VtcHR5ID0gdHJ1ZTtcbiAgICAgIGZvciAoY29uc3QgcCBpbiBjdXIpIHtcbiAgICAgICAgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwoY3VyLCBwKSkge1xuICAgICAgICAgIGlzRW1wdHkgPSBmYWxzZTtcbiAgICAgICAgICByZWN1cnNlKGN1cltwXSwgcHJvcCA/IHByb3AgKyAnLicgKyBwIDogcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc0VtcHR5ICYmIHByb3ApIHJlc3VsdFtwcm9wXSA9IHt9O1xuICAgIH1cbiAgfVxuXG4gIHJlY3Vyc2UoZGF0YSwgJycpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFVuLWZsYXR0ZW4gYSBmbGF0IEpTT04gb2JqZWN0XG4gKiBAcGFyYW0ge29iamVjdH0gZGF0YVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5mbGF0dGVuKGRhdGEpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICBpZiAoT2JqZWN0KGRhdGEpICE9PSBkYXRhIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHJldHVybiBkYXRhO1xuICBjb25zdCByZWdleCA9IC9cXC4/KFteLltcXF1dKyl8XFxbKFxcZCspXS9nO1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgZm9yIChjb25zdCBwIGluIGRhdGEpIHtcbiAgICBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBwKSkge1xuICAgICAgbGV0IGN1ciA9IHJlc3VsdDtcbiAgICAgIGxldCBwcm9wID0gJyc7XG4gICAgICBsZXQgbSA9IHJlZ2V4LmV4ZWMocCk7XG4gICAgICB3aGlsZSAobSkge1xuICAgICAgICBjdXIgPSBjdXJbcHJvcF0gfHwgKGN1cltwcm9wXSA9IChtWzJdID8gW10gOiB7fSkpO1xuICAgICAgICBwcm9wID0gbVsyXSB8fCBtWzFdO1xuICAgICAgICBtID0gcmVnZXguZXhlYyhwKTtcbiAgICAgIH1cbiAgICAgIGN1cltwcm9wXSA9IGRhdGFbcF07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRbJyddIHx8IHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb3VudHMgdGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlc1xuICogQHBhcmFtIHtudW1iZXJ9IG51bVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY291bnREZWNpbWFscyhudW06IG51bWJlcikge1xuICBpZiAoTWF0aC5mbG9vcihudW0pID09PSBudW0gfHwgU3RyaW5nKG51bSkuaW5kZXhPZignLicpIDwgMCkgcmV0dXJuIDA7XG4gIGNvbnN0IHBhcnRzID0gbnVtLnRvU3RyaW5nKCkuc3BsaXQoJy4nKVsxXTtcbiAgcmV0dXJuIHBhcnRzLmxlbmd0aCB8fCAwO1xufVxuIl19
+/***/ })
+
+/******/ });
+/************************************************************************/
+/******/ // 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] = {
+/******/ // no module.id needed
+/******/ // no module.loaded needed
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/************************************************************************/
+/******/ /* webpack/runtime/compat get default export */
+/******/ !function() {
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function() { return module['default']; } :
+/******/ function() { return module; };
+/******/ __webpack_require__.d(getter, { a: getter });
+/******/ return getter;
+/******/ };
+/******/ }();
+/******/
+/******/ /* webpack/runtime/define property getters */
+/******/ !function() {
+/******/ // define getter functions for harmony exports
+/******/ __webpack_require__.d = function(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/global */
+/******/ !function() {
+/******/ __webpack_require__.g = (function() {
+/******/ if (typeof globalThis === 'object') return globalThis;
+/******/ try {
+/******/ return this || new Function('return this')();
+/******/ } catch (e) {
+/******/ if (typeof window === 'object') return window;
+/******/ }
+/******/ })();
+/******/ }();
+/******/
+/******/ /* webpack/runtime/hasOwnProperty shorthand */
+/******/ !function() {
+/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
+/******/ }();
+/******/
+/******/ /* webpack/runtime/make namespace object */
+/******/ !function() {
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/ }();
+/******/
+/************************************************************************/
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be in strict mode.
+!function() {
+"use strict";
+/*!*****************************!*\
+ !*** ./src/exports/aicc.js ***!
+ \*****************************/
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _AICC__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../AICC */ "./src/AICC.js");
+
+window.AICC = _AICC__WEBPACK_IMPORTED_MODULE_0__["default"];
+}();
+/******/ })()
+;
+//# sourceMappingURL=aicc.js.map
\ No newline at end of file
diff --git a/dist/aicc.js.map b/dist/aicc.js.map
new file mode 100644
index 0000000..74710c5
--- /dev/null
+++ b/dist/aicc.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"aicc.js","mappings":"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","sources":["webpack://scorm-again/./node_modules/lodash.debounce/index.js","webpack://scorm-again/./src/AICC.js","webpack://scorm-again/./src/BaseAPI.js","webpack://scorm-again/./src/Scorm12API.js","webpack://scorm-again/./src/cmi/aicc_cmi.js","webpack://scorm-again/./src/cmi/common.js","webpack://scorm-again/./src/cmi/scorm12_cmi.js","webpack://scorm-again/./src/constants/api_constants.js","webpack://scorm-again/./src/constants/error_codes.js","webpack://scorm-again/./src/constants/regex.js","webpack://scorm-again/./src/exceptions.js","webpack://scorm-again/./src/utilities.js","webpack://scorm-again/webpack/bootstrap","webpack://scorm-again/webpack/runtime/compat get default export","webpack://scorm-again/webpack/runtime/define property getters","webpack://scorm-again/webpack/runtime/global","webpack://scorm-again/webpack/runtime/hasOwnProperty shorthand","webpack://scorm-again/webpack/runtime/make namespace object","webpack://scorm-again/./src/exports/aicc.js"],"sourcesContent":["/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n","// @flow\nimport Scorm12API from './Scorm12API';\nimport {\n CMI,\n CMIAttemptRecordsObject,\n CMIEvaluationCommentsObject,\n CMITriesObject,\n} from './cmi/aicc_cmi';\nimport {NAV} from './cmi/scorm12_cmi';\n\n/**\n * The AICC API class\n */\nexport default class AICC extends Scorm12API {\n /**\n * Constructor to create AICC API object\n * @param {object} settings\n */\n constructor(settings: {}) {\n const finalSettings = {\n ...{\n mastery_override: false,\n }, ...settings,\n };\n\n super(finalSettings);\n\n this.cmi = new CMI();\n this.nav = new NAV();\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n *\n * @param {string} CMIElement\n * @param {any} value\n * @param {boolean} foundFirstIndex\n * @return {object}\n */\n getChildElement(CMIElement, value, foundFirstIndex) {\n let newChild = super.getChildElement(CMIElement, value, foundFirstIndex);\n\n if (!newChild) {\n if (this.stringMatches(CMIElement, 'cmi\\\\.evaluation\\\\.comments\\\\.\\\\d+')) {\n newChild = new CMIEvaluationCommentsObject();\n } else if (this.stringMatches(CMIElement,\n 'cmi\\\\.student_data\\\\.tries\\\\.\\\\d+')) {\n newChild = new CMITriesObject();\n } else if (this.stringMatches(CMIElement,\n 'cmi\\\\.student_data\\\\.attempt_records\\\\.\\\\d+')) {\n newChild = new CMIAttemptRecordsObject();\n }\n }\n\n return newChild;\n }\n\n /**\n * Replace the whole API with another\n *\n * @param {AICC} newAPI\n */\n replaceWithAnotherScormAPI(newAPI) {\n // Data Model\n this.cmi = newAPI.cmi;\n this.nav = newAPI.nav;\n }\n}\n","// @flow\nimport {CMIArray} from './cmi/common';\nimport {ValidationError} from './exceptions';\nimport ErrorCodes from './constants/error_codes';\nimport APIConstants from './constants/api_constants';\nimport {unflatten} from './utilities';\nimport debounce from 'lodash.debounce';\n\nconst global_constants = APIConstants.global;\nconst scorm12_error_codes = ErrorCodes.scorm12;\n\n/**\n * Base API class for AICC, SCORM 1.2, and SCORM 2004. Should be considered\n * abstract, and never initialized on it's own.\n */\nexport default class BaseAPI {\n #timeout;\n #error_codes;\n #settings = {\n autocommit: false,\n autocommitSeconds: 10,\n asyncCommit: false,\n sendBeaconCommit: false,\n lmsCommitUrl: false,\n dataCommitFormat: 'json', // valid formats are 'json' or 'flattened', 'params'\n commitRequestDataType: 'application/json;charset=UTF-8',\n autoProgress: false,\n logLevel: global_constants.LOG_LEVEL_ERROR,\n selfReportSessionTime: false,\n alwaysSendTotalTime: false,\n strict_errors: true,\n xhrHeaders: {},\n xhrWithCredentials: false,\n responseHandler: function(xhr) {\n let result;\n if (typeof xhr !== 'undefined') {\n result = JSON.parse(xhr.responseText);\n if (result === null || !{}.hasOwnProperty.call(result, 'result')) {\n result = {};\n if (xhr.status === 200) {\n result.result = global_constants.SCORM_TRUE;\n result.errorCode = 0;\n } else {\n result.result = global_constants.SCORM_FALSE;\n result.errorCode = 101;\n }\n }\n }\n return result;\n },\n requestHandler: function(commitObject) {\n return commitObject;\n },\n onLogMessage: function(messageLevel, logMessage) {\n switch (messageLevel) {\n case global_constants.LOG_LEVEL_ERROR:\n console.error(logMessage);\n break;\n case global_constants.LOG_LEVEL_WARNING:\n console.warn(logMessage);\n break;\n case global_constants.LOG_LEVEL_INFO:\n console.info(logMessage);\n break;\n case global_constants.LOG_LEVEL_DEBUG:\n if (console.debug) {\n console.debug(logMessage);\n } else {\n console.log(logMessage);\n }\n break;\n }\n },\n };\n cmi;\n startingData: {};\n\n /**\n * Constructor for Base API class. Sets some shared API fields, as well as\n * sets up options for the API.\n * @param {object} error_codes\n * @param {object} settings\n */\n constructor(error_codes, settings) {\n if (new.target === BaseAPI) {\n throw new TypeError('Cannot construct BaseAPI instances directly');\n }\n this.currentState = global_constants.STATE_NOT_INITIALIZED;\n this.lastErrorCode = 0;\n this.listenerArray = [];\n\n this.#timeout = null;\n this.#error_codes = error_codes;\n\n this.settings = settings;\n this.apiLogLevel = this.settings.logLevel;\n this.selfReportSessionTime = this.settings.selfReportSessionTime;\n }\n\n /**\n * Initialize the API\n * @param {string} callbackName\n * @param {string} initializeMessage\n * @param {string} terminationMessage\n * @return {string}\n */\n initialize(\n callbackName: String,\n initializeMessage?: String,\n terminationMessage?: String) {\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.isInitialized()) {\n this.throwSCORMError(this.#error_codes.INITIALIZED, initializeMessage);\n } else if (this.isTerminated()) {\n this.throwSCORMError(this.#error_codes.TERMINATED, terminationMessage);\n } else {\n if (this.selfReportSessionTime) {\n this.cmi.setStartTime();\n }\n\n this.currentState = global_constants.STATE_INITIALIZED;\n this.lastErrorCode = 0;\n returnValue = global_constants.SCORM_TRUE;\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Getter for #error_codes\n * @return {object}\n */\n get error_codes() {\n return this.#error_codes;\n }\n\n /**\n * Getter for #settings\n * @return {object}\n */\n get settings() {\n return this.#settings;\n }\n\n /**\n * Setter for #settings\n * @param {object} settings\n */\n set settings(settings: Object) {\n this.#settings = {...this.#settings, ...settings};\n }\n\n /**\n * Terminates the current run of the API\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @return {string}\n */\n terminate(\n callbackName: String,\n checkTerminated: boolean) {\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.checkState(checkTerminated,\n this.#error_codes.TERMINATION_BEFORE_INIT,\n this.#error_codes.MULTIPLE_TERMINATION)) {\n this.currentState = global_constants.STATE_TERMINATED;\n\n const result = this.storeData(true);\n if (!this.settings.sendBeaconCommit && !this.settings.asyncCommit &&\n typeof result.errorCode !== 'undefined' && result.errorCode > 0) {\n this.throwSCORMError(result.errorCode);\n }\n returnValue = (typeof result !== 'undefined' && result.result) ?\n result.result : global_constants.SCORM_FALSE;\n\n if (checkTerminated) this.lastErrorCode = 0;\n\n returnValue = global_constants.SCORM_TRUE;\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Get the value of the CMIElement.\n *\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @param {string} CMIElement\n * @return {string}\n */\n getValue(\n callbackName: String,\n checkTerminated: boolean,\n CMIElement: String) {\n let returnValue;\n\n if (this.checkState(checkTerminated,\n this.#error_codes.RETRIEVE_BEFORE_INIT,\n this.#error_codes.RETRIEVE_AFTER_TERM)) {\n if (checkTerminated) this.lastErrorCode = 0;\n try {\n returnValue = this.getCMIValue(CMIElement);\n } catch (e) {\n if (e instanceof ValidationError) {\n this.lastErrorCode = e.errorCode;\n returnValue = global_constants.SCORM_FALSE;\n } else {\n if (e.message) {\n console.error(e.message);\n } else {\n console.error(e);\n }\n this.throwSCORMError(this.#error_codes.GENERAL);\n }\n }\n this.processListeners(callbackName, CMIElement);\n }\n\n this.apiLog(callbackName, CMIElement, ': returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Sets the value of the CMIElement.\n *\n * @param {string} callbackName\n * @param {string} commitCallback\n * @param {boolean} checkTerminated\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n setValue(\n callbackName: String,\n commitCallback: String,\n checkTerminated: boolean,\n CMIElement,\n value) {\n if (value !== undefined) {\n value = String(value);\n }\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.checkState(checkTerminated, this.#error_codes.STORE_BEFORE_INIT,\n this.#error_codes.STORE_AFTER_TERM)) {\n if (checkTerminated) this.lastErrorCode = 0;\n try {\n returnValue = this.setCMIValue(CMIElement, value);\n } catch (e) {\n if (e instanceof ValidationError) {\n this.lastErrorCode = e.errorCode;\n returnValue = global_constants.SCORM_FALSE;\n } else {\n if (e.message) {\n console.error(e.message);\n } else {\n console.error(e);\n }\n this.throwSCORMError(this.#error_codes.GENERAL);\n }\n }\n this.processListeners(callbackName, CMIElement, value);\n }\n\n if (returnValue === undefined) {\n returnValue = global_constants.SCORM_FALSE;\n }\n\n // If we didn't have any errors while setting the data, go ahead and\n // schedule a commit, if autocommit is turned on\n if (String(this.lastErrorCode) === '0') {\n if (this.settings.autocommit && !this.#timeout) {\n this.scheduleCommit(this.settings.autocommitSeconds * 1000, commitCallback);\n }\n }\n\n this.apiLog(callbackName, CMIElement,\n ': ' + value + ': result: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Orders LMS to store all content parameters\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @return {string}\n */\n commit(\n callbackName: String,\n checkTerminated: boolean) {\n this.clearScheduledCommit();\n\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.checkState(checkTerminated, this.#error_codes.COMMIT_BEFORE_INIT,\n this.#error_codes.COMMIT_AFTER_TERM)) {\n const result = this.storeData(false);\n if (!this.settings.sendBeaconCommit && !this.settings.asyncCommit &&\n result.errorCode && result.errorCode > 0) {\n this.throwSCORMError(result.errorCode);\n }\n returnValue = (typeof result !== 'undefined' && result.result) ?\n result.result : global_constants.SCORM_FALSE;\n\n this.apiLog(callbackName, 'HttpRequest', ' Result: ' + returnValue,\n global_constants.LOG_LEVEL_DEBUG);\n\n if (checkTerminated) this.lastErrorCode = 0;\n\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Returns last error code\n * @param {string} callbackName\n * @return {string}\n */\n getLastError(callbackName: String) {\n const returnValue = String(this.lastErrorCode);\n\n this.processListeners(callbackName);\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Returns the errorNumber error description\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getErrorString(callbackName: String, CMIErrorCode) {\n let returnValue = '';\n\n if (CMIErrorCode !== null && CMIErrorCode !== '') {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Returns a comprehensive description of the errorNumber error.\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getDiagnostic(callbackName: String, CMIErrorCode) {\n let returnValue = '';\n\n if (CMIErrorCode !== null && CMIErrorCode !== '') {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode, true);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Checks the LMS state and ensures it has been initialized.\n *\n * @param {boolean} checkTerminated\n * @param {number} beforeInitError\n * @param {number} afterTermError\n * @return {boolean}\n */\n checkState(\n checkTerminated: boolean,\n beforeInitError: number,\n afterTermError?: number) {\n if (this.isNotInitialized()) {\n this.throwSCORMError(beforeInitError);\n return false;\n } else if (checkTerminated && this.isTerminated()) {\n this.throwSCORMError(afterTermError);\n return false;\n }\n\n return true;\n }\n\n /**\n * Logging for all SCORM actions\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {string} logMessage\n * @param {number}messageLevel\n */\n apiLog(\n functionName: String,\n CMIElement: String,\n logMessage: String,\n messageLevel: number) {\n logMessage = this.formatMessage(functionName, CMIElement, logMessage);\n\n if (messageLevel >= this.apiLogLevel) {\n this.settings.onLogMessage(messageLevel, logMessage);\n }\n }\n\n /**\n * Formats the SCORM messages for easy reading\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {string} message\n * @return {string}\n */\n formatMessage(functionName: String, CMIElement: String, message: String) {\n const baseLength = 20;\n let messageString = '';\n\n messageString += functionName;\n\n let fillChars = baseLength - messageString.length;\n\n for (let i = 0; i < fillChars; i++) {\n messageString += ' ';\n }\n\n messageString += ': ';\n\n if (CMIElement) {\n const CMIElementBaseLength = 70;\n\n messageString += CMIElement;\n\n fillChars = CMIElementBaseLength - messageString.length;\n\n for (let j = 0; j < fillChars; j++) {\n messageString += ' ';\n }\n }\n\n if (message) {\n messageString += message;\n }\n\n return messageString;\n }\n\n /**\n * Checks to see if {str} contains {tester}\n *\n * @param {string} str String to check against\n * @param {string} tester String to check for\n * @return {boolean}\n */\n stringMatches(str: String, tester: String) {\n return str && tester && str.match(tester);\n }\n\n /**\n * Check to see if the specific object has the given property\n * @param {*} refObject\n * @param {string} attribute\n * @return {boolean}\n * @private\n */\n _checkObjectHasProperty(refObject, attribute: String) {\n return Object.hasOwnProperty.call(refObject, attribute) ||\n Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(refObject), attribute) ||\n (attribute in refObject);\n }\n\n /**\n * Returns the message that corresponds to errorNumber\n * APIs that inherit BaseAPI should override this function\n *\n * @param {(string|number)} _errorNumber\n * @param {boolean} _detail\n * @return {string}\n * @abstract\n */\n getLmsErrorMessageDetails(_errorNumber, _detail) {\n throw new Error(\n 'The getLmsErrorMessageDetails method has not been implemented');\n }\n\n /**\n * Gets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @return {string}\n * @abstract\n */\n getCMIValue(_CMIElement) {\n throw new Error('The getCMIValue method has not been implemented');\n }\n\n /**\n * Sets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @param {any} _value\n * @return {string}\n * @abstract\n */\n setCMIValue(_CMIElement, _value) {\n throw new Error('The setCMIValue method has not been implemented');\n }\n\n /**\n * Shared API method to set a valid for a given element.\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n _commonSetCMIValue(\n methodName: String, scorm2004: boolean, CMIElement, value) {\n if (!CMIElement || CMIElement === '') {\n return global_constants.SCORM_FALSE;\n }\n\n const structure = CMIElement.split('.');\n let refObject = this;\n let returnValue = global_constants.SCORM_FALSE;\n let foundFirstIndex = false;\n\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004 ?\n this.#error_codes.UNDEFINED_DATA_MODEL :\n this.#error_codes.GENERAL;\n\n for (let i = 0; i < structure.length; i++) {\n const attribute = structure[i];\n\n if (i === structure.length - 1) {\n if (scorm2004 && (attribute.substr(0, 8) === '{target=') &&\n (typeof refObject._isTargetValid == 'function')) {\n this.throwSCORMError(this.#error_codes.READ_ONLY_ELEMENT);\n } else if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n } else {\n if (this.isInitialized() &&\n this.stringMatches(CMIElement, '\\\\.correct_responses\\\\.\\\\d+')) {\n this.validateCorrectResponse(CMIElement, value);\n }\n\n if (!scorm2004 || this.lastErrorCode === 0) {\n refObject[attribute] = value;\n returnValue = global_constants.SCORM_TRUE;\n }\n }\n } else {\n refObject = refObject[attribute];\n if (!refObject) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[i + 1], 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n foundFirstIndex = true;\n } else {\n const newChild = this.getChildElement(CMIElement, value,\n foundFirstIndex);\n foundFirstIndex = true;\n\n if (!newChild) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n } else {\n if (refObject.initialized) newChild.initialize();\n\n refObject.childArray.push(newChild);\n refObject = newChild;\n }\n }\n\n // Have to update i value to skip the array position\n i++;\n }\n }\n }\n }\n\n if (returnValue === global_constants.SCORM_FALSE) {\n this.apiLog(methodName, null,\n `There was an error setting the value for: ${CMIElement}, value of: ${value}`,\n global_constants.LOG_LEVEL_WARNING);\n }\n\n return returnValue;\n }\n\n /**\n * Abstract method for validating that a response is correct.\n *\n * @param {string} _CMIElement\n * @param {*} _value\n */\n validateCorrectResponse(_CMIElement, _value) {\n // just a stub method\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n * APIs that inherit BaseAPI should override this method.\n *\n * @param {string} _CMIElement - unused\n * @param {*} _value - unused\n * @param {boolean} _foundFirstIndex - unused\n * @return {*}\n * @abstract\n */\n getChildElement(_CMIElement, _value, _foundFirstIndex) {\n throw new Error('The getChildElement method has not been implemented');\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @return {*}\n */\n _commonGetCMIValue(methodName: String, scorm2004: boolean, CMIElement) {\n if (!CMIElement || CMIElement === '') {\n return '';\n }\n\n const structure = CMIElement.split('.');\n let refObject = this;\n let attribute = null;\n\n const uninitializedErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) has not been initialized.`;\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004 ?\n this.#error_codes.UNDEFINED_DATA_MODEL :\n this.#error_codes.GENERAL;\n\n for (let i = 0; i < structure.length; i++) {\n attribute = structure[i];\n\n if (!scorm2004) {\n if (i === structure.length - 1) {\n if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n } else {\n if ((String(attribute).substr(0, 8) === '{target=') &&\n (typeof refObject._isTargetValid == 'function')) {\n const target = String(attribute).substr(8, String(attribute).length - 9);\n return refObject._isTargetValid(target);\n } else if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n\n refObject = refObject[attribute];\n if (refObject === undefined) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[i + 1], 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n } else {\n this.throwSCORMError(this.#error_codes.VALUE_NOT_INITIALIZED,\n uninitializedErrorMessage);\n break;\n }\n\n // Have to update i value to skip the array position\n i++;\n }\n }\n }\n\n if (refObject === null || refObject === undefined) {\n if (!scorm2004) {\n if (attribute === '_children') {\n this.throwSCORMError(scorm12_error_codes.CHILDREN_ERROR);\n } else if (attribute === '_count') {\n this.throwSCORMError(scorm12_error_codes.COUNT_ERROR);\n }\n }\n } else {\n return refObject;\n }\n }\n\n /**\n * Returns true if the API's current state is STATE_INITIALIZED\n *\n * @return {boolean}\n */\n isInitialized() {\n return this.currentState === global_constants.STATE_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_NOT_INITIALIZED\n *\n * @return {boolean}\n */\n isNotInitialized() {\n return this.currentState === global_constants.STATE_NOT_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_TERMINATED\n *\n * @return {boolean}\n */\n isTerminated() {\n return this.currentState === global_constants.STATE_TERMINATED;\n }\n\n /**\n * Provides a mechanism for attaching to a specific SCORM event\n *\n * @param {string} listenerName\n * @param {function} callback\n */\n on(listenerName: String, callback: function) {\n if (!callback) return;\n\n const listenerFunctions = listenerName.split(' ');\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split('.');\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + '.', '');\n }\n\n this.listenerArray.push({\n functionName: functionName,\n CMIElement: CMIElement,\n callback: callback,\n });\n\n this.apiLog('on', functionName, `Added event listener: ${this.listenerArray.length}`, global_constants.LOG_LEVEL_INFO);\n }\n }\n\n /**\n * Provides a mechanism for detaching a specific SCORM event listener\n *\n * @param {string} listenerName\n * @param {function} callback\n */\n off(listenerName: String, callback: function) {\n if (!callback) return;\n\n const listenerFunctions = listenerName.split(' ');\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split('.');\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + '.', '');\n }\n\n const removeIndex = this.listenerArray.findIndex((obj) =>\n obj.functionName === functionName &&\n obj.CMIElement === CMIElement &&\n obj.callback === callback,\n );\n if (removeIndex !== -1) {\n this.listenerArray.splice(removeIndex, 1);\n this.apiLog('off', functionName, `Removed event listener: ${this.listenerArray.length}`, global_constants.LOG_LEVEL_INFO);\n }\n }\n }\n\n /**\n * Provides a mechanism for clearing all listeners from a specific SCORM event\n *\n * @param {string} listenerName\n */\n clear(listenerName: String) {\n const listenerFunctions = listenerName.split(' ');\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split('.');\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + '.', '');\n }\n\n this.listenerArray = this.listenerArray.filter((obj) =>\n obj.functionName !== functionName &&\n obj.CMIElement !== CMIElement,\n );\n }\n }\n\n /**\n * Processes any 'on' listeners that have been created\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {*} value\n */\n processListeners(functionName: String, CMIElement: String, value: any) {\n this.apiLog(functionName, CMIElement, value);\n for (let i = 0; i < this.listenerArray.length; i++) {\n const listener = this.listenerArray[i];\n const functionsMatch = listener.functionName === functionName;\n const listenerHasCMIElement = !!listener.CMIElement;\n let CMIElementsMatch = false;\n if (CMIElement && listener.CMIElement &&\n listener.CMIElement.substring(listener.CMIElement.length - 1) ===\n '*') {\n CMIElementsMatch = CMIElement.indexOf(listener.CMIElement.substring(0,\n listener.CMIElement.length - 1)) === 0;\n } else {\n CMIElementsMatch = listener.CMIElement === CMIElement;\n }\n\n if (functionsMatch && (!listenerHasCMIElement || CMIElementsMatch)) {\n listener.callback(CMIElement, value);\n }\n }\n }\n\n /**\n * Throws a SCORM error\n *\n * @param {number} errorNumber\n * @param {string} message\n */\n throwSCORMError(errorNumber: number, message: String) {\n if (!message) {\n message = this.getLmsErrorMessageDetails(errorNumber);\n }\n\n this.apiLog('throwSCORMError', null, errorNumber + ': ' + message,\n global_constants.LOG_LEVEL_ERROR);\n\n this.lastErrorCode = String(errorNumber);\n }\n\n /**\n * Clears the last SCORM error code on success.\n *\n * @param {string} success\n */\n clearSCORMError(success: String) {\n if (success !== undefined && success !== global_constants.SCORM_FALSE) {\n this.lastErrorCode = 0;\n }\n }\n\n /**\n * Attempts to store the data to the LMS, logs data if no LMS configured\n * APIs that inherit BaseAPI should override this function\n *\n * @param {boolean} _calculateTotalTime\n * @return {string}\n * @abstract\n */\n storeData(_calculateTotalTime) {\n throw new Error(\n 'The storeData method has not been implemented');\n }\n\n /**\n * Load the CMI from a flattened JSON object\n * @param {object} json\n * @param {string} CMIElement\n */\n loadFromFlattenedJSON(json, CMIElement) {\n if (!this.isNotInitialized()) {\n console.error(\n 'loadFromFlattenedJSON can only be called before the call to lmsInitialize.');\n return;\n }\n\n /**\n * Test match pattern.\n *\n * @param {string} a\n * @param {string} c\n * @param {RegExp} a_pattern\n * @return {number}\n */\n function testPattern(a, c, a_pattern) {\n const a_match = a.match(a_pattern);\n\n let c_match;\n if (a_match !== null && (c_match = c.match(a_pattern)) !== null) {\n const a_num = Number(a_match[2]);\n const c_num = Number(c_match[2]);\n if (a_num === c_num) {\n if (a_match[3] === 'id') {\n return -1;\n } else if (a_match[3] === 'type') {\n if (c_match[3] === 'id') {\n return 1;\n } else {\n return -1;\n }\n } else {\n return 1;\n }\n }\n return a_num - c_num;\n }\n\n return null;\n }\n\n const int_pattern = /^(cmi\\.interactions\\.)(\\d+)\\.(.*)$/;\n const obj_pattern = /^(cmi\\.objectives\\.)(\\d+)\\.(.*)$/;\n\n const result = Object.keys(json).map(function(key) {\n return [String(key), json[key]];\n });\n\n // CMI interactions need to have id and type loaded before any other fields\n result.sort(function([a, b], [c, d]) {\n let test;\n if ((test = testPattern(a, c, int_pattern)) !== null) {\n return test;\n }\n if ((test = testPattern(a, c, obj_pattern)) !== null) {\n return test;\n }\n\n if (a < c) {\n return -1;\n }\n if (a > c) {\n return 1;\n }\n return 0;\n });\n\n let obj;\n result.forEach((element) => {\n obj = {};\n obj[element[0]] = element[1];\n this.loadFromJSON(unflatten(obj), CMIElement);\n });\n }\n\n /**\n * Loads CMI data from a JSON object.\n *\n * @param {object} json\n * @param {string} CMIElement\n */\n loadFromJSON(json, CMIElement) {\n if (!this.isNotInitialized()) {\n console.error(\n 'loadFromJSON can only be called before the call to lmsInitialize.');\n return;\n }\n\n CMIElement = CMIElement !== undefined ? CMIElement : 'cmi';\n\n this.startingData = json;\n\n // could this be refactored down to flatten(json) then setCMIValue on each?\n for (const key in json) {\n if ({}.hasOwnProperty.call(json, key) && json[key]) {\n const currentCMIElement = (CMIElement ? CMIElement + '.' : '') + key;\n const value = json[key];\n\n if (value['childArray']) {\n for (let i = 0; i < value['childArray'].length; i++) {\n this.loadFromJSON(value['childArray'][i],\n currentCMIElement + '.' + i);\n }\n } else if (value.constructor === Object) {\n this.loadFromJSON(value, currentCMIElement);\n } else {\n this.setCMIValue(currentCMIElement, value);\n }\n }\n }\n }\n\n /**\n * Render the CMI object to JSON for sending to an LMS.\n *\n * @return {string}\n */\n renderCMIToJSONString() {\n const cmi = this.cmi;\n // Do we want/need to return fields that have no set value?\n // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);\n return JSON.stringify({cmi});\n }\n\n /**\n * Returns a JS object representing the current cmi\n * @return {object}\n */\n renderCMIToJSONObject() {\n // Do we want/need to return fields that have no set value?\n // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);\n return JSON.parse(this.renderCMIToJSONString());\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n * APIs that inherit BaseAPI should override this function\n *\n * @param {boolean} _terminateCommit\n * @return {*}\n * @abstract\n */\n renderCommitCMI(_terminateCommit) {\n throw new Error(\n 'The storeData method has not been implemented');\n }\n\n /**\n * Send the request to the LMS\n * @param {string} url\n * @param {object|Array} params\n * @param {boolean} immediate\n * @return {object}\n */\n processHttpRequest(url: String, params, immediate = false) {\n const api = this;\n const process = function(url, params, settings, error_codes) {\n const genericError = {\n 'result': global_constants.SCORM_FALSE,\n 'errorCode': error_codes.GENERAL,\n };\n\n let result;\n if (!settings.sendBeaconCommit) {\n const httpReq = new XMLHttpRequest();\n httpReq.open('POST', url, settings.asyncCommit);\n\n if (Object.keys(settings.xhrHeaders).length) {\n Object.keys(settings.xhrHeaders).forEach((header) => {\n httpReq.setRequestHeader(header, settings.xhrHeaders[header]);\n });\n }\n\n httpReq.withCredentials = settings.xhrWithCredentials;\n\n if (settings.asyncCommit) {\n httpReq.onload = function(e) {\n if (typeof settings.responseHandler === 'function') {\n result = settings.responseHandler(httpReq);\n } else {\n result = JSON.parse(httpReq.responseText);\n }\n };\n }\n try {\n params = settings.requestHandler(params);\n if (params instanceof Array) {\n httpReq.setRequestHeader('Content-Type',\n 'application/x-www-form-urlencoded');\n httpReq.send(params.join('&'));\n } else {\n httpReq.setRequestHeader('Content-Type',\n settings.commitRequestDataType);\n httpReq.send(JSON.stringify(params));\n }\n\n if (!settings.asyncCommit) {\n if (typeof settings.responseHandler === 'function') {\n result = settings.responseHandler(httpReq);\n } else {\n result = JSON.parse(httpReq.responseText);\n }\n } else {\n result = {};\n result.result = global_constants.SCORM_TRUE;\n result.errorCode = 0;\n api.processListeners('CommitSuccess');\n return result;\n }\n } catch (e) {\n console.error(e);\n api.processListeners('CommitError');\n return genericError;\n }\n } else {\n try {\n const headers = {\n type: settings.commitRequestDataType,\n };\n let blob;\n if (params instanceof Array) {\n blob = new Blob([params.join('&')], headers);\n } else {\n blob = new Blob([JSON.stringify(params)], headers);\n }\n\n result = {};\n if (navigator.sendBeacon(url, blob)) {\n result.result = global_constants.SCORM_TRUE;\n result.errorCode = 0;\n } else {\n result.result = global_constants.SCORM_FALSE;\n result.errorCode = 101;\n }\n } catch (e) {\n console.error(e);\n api.processListeners('CommitError');\n return genericError;\n }\n }\n\n if (typeof result === 'undefined') {\n api.processListeners('CommitError');\n return genericError;\n }\n\n if (result.result === true ||\n result.result === global_constants.SCORM_TRUE) {\n api.processListeners('CommitSuccess');\n } else {\n api.processListeners('CommitError');\n }\n\n return result;\n };\n\n if (typeof debounce !== 'undefined') {\n const debounced = debounce(process, 500);\n debounced(url, params, this.settings, this.error_codes);\n\n // if we're terminating, go ahead and commit immediately\n if (immediate) {\n debounced.flush();\n }\n\n return {\n result: global_constants.SCORM_TRUE,\n errorCode: 0,\n };\n } else {\n return process(url, params, this.settings, this.error_codes);\n }\n }\n\n /**\n * Throws a SCORM error\n *\n * @param {number} when - the number of milliseconds to wait before committing\n * @param {string} callback - the name of the commit event callback\n */\n scheduleCommit(when: number, callback: string) {\n this.#timeout = new ScheduledCommit(this, when, callback);\n this.apiLog('scheduleCommit', '', 'scheduled',\n global_constants.LOG_LEVEL_DEBUG);\n }\n\n /**\n * Clears and cancels any currently scheduled commits\n */\n clearScheduledCommit() {\n if (this.#timeout) {\n this.#timeout.cancel();\n this.#timeout = null;\n this.apiLog('clearScheduledCommit', '', 'cleared',\n global_constants.LOG_LEVEL_DEBUG);\n }\n }\n}\n\n/**\n * Private class that wraps a timeout call to the commit() function\n */\nclass ScheduledCommit {\n #API;\n #cancelled = false;\n #timeout;\n #callback;\n\n /**\n * Constructor for ScheduledCommit\n * @param {BaseAPI} API\n * @param {number} when\n * @param {string} callback\n */\n constructor(API: any, when: number, callback: string) {\n this.#API = API;\n this.#timeout = setTimeout(this.wrapper.bind(this), when);\n this.#callback = callback;\n }\n\n /**\n * Cancel any currently scheduled commit\n */\n cancel() {\n this.#cancelled = true;\n if (this.#timeout) {\n clearTimeout(this.#timeout);\n }\n }\n\n /**\n * Wrap the API commit call to check if the call has already been cancelled\n */\n wrapper() {\n if (!this.#cancelled) {\n this.#API.commit(this.#callback);\n }\n }\n}\n","// @flow\nimport BaseAPI from './BaseAPI';\nimport {\n CMI,\n CMIInteractionsCorrectResponsesObject,\n CMIInteractionsObject,\n CMIInteractionsObjectivesObject,\n CMIObjectivesObject, NAV,\n} from './cmi/scorm12_cmi';\nimport * as Utilities from './utilities';\nimport APIConstants from './constants/api_constants';\nimport ErrorCodes from './constants/error_codes';\n\nconst scorm12_constants = APIConstants.scorm12;\nconst global_constants = APIConstants.global;\nconst scorm12_error_codes = ErrorCodes.scorm12;\n\n/**\n * API class for SCORM 1.2\n */\nexport default class Scorm12API extends BaseAPI {\n /**\n * Constructor for SCORM 1.2 API\n * @param {object} settings\n */\n constructor(settings: {}) {\n const finalSettings = {\n ...{\n mastery_override: false,\n }, ...settings,\n };\n\n super(scorm12_error_codes, finalSettings);\n\n this.cmi = new CMI();\n this.nav = new NAV();\n\n // Rename functions to match 1.2 Spec and expose to modules\n this.LMSInitialize = this.lmsInitialize;\n this.LMSFinish = this.lmsFinish;\n this.LMSGetValue = this.lmsGetValue;\n this.LMSSetValue = this.lmsSetValue;\n this.LMSCommit = this.lmsCommit;\n this.LMSGetLastError = this.lmsGetLastError;\n this.LMSGetErrorString = this.lmsGetErrorString;\n this.LMSGetDiagnostic = this.lmsGetDiagnostic;\n }\n\n /**\n * lmsInitialize function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsInitialize() {\n this.cmi.initialize();\n return this.initialize('LMSInitialize', 'LMS was already initialized!',\n 'LMS is already finished!');\n }\n\n /**\n * LMSFinish function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsFinish() {\n const result = this.terminate('LMSFinish', true);\n\n if (result === global_constants.SCORM_TRUE) {\n if (this.nav.event !== '') {\n if (this.nav.event === 'continue') {\n this.processListeners('SequenceNext');\n } else {\n this.processListeners('SequencePrevious');\n }\n } else if (this.settings.autoProgress) {\n this.processListeners('SequenceNext');\n }\n }\n\n return result;\n }\n\n /**\n * LMSGetValue function from SCORM 1.2 Spec\n *\n * @param {string} CMIElement\n * @return {string}\n */\n lmsGetValue(CMIElement) {\n return this.getValue('LMSGetValue', false, CMIElement);\n }\n\n /**\n * LMSSetValue function from SCORM 1.2 Spec\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n lmsSetValue(CMIElement, value) {\n return this.setValue('LMSSetValue', 'LMSCommit', false, CMIElement, value);\n }\n\n /**\n * LMSCommit function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsCommit() {\n return this.commit('LMSCommit', false);\n }\n\n /**\n * LMSGetLastError function from SCORM 1.2 Spec\n *\n * @return {string}\n */\n lmsGetLastError() {\n return this.getLastError('LMSGetLastError');\n }\n\n /**\n * LMSGetErrorString function from SCORM 1.2 Spec\n *\n * @param {string} CMIErrorCode\n * @return {string}\n */\n lmsGetErrorString(CMIErrorCode) {\n return this.getErrorString('LMSGetErrorString', CMIErrorCode);\n }\n\n /**\n * LMSGetDiagnostic function from SCORM 1.2 Spec\n *\n * @param {string} CMIErrorCode\n * @return {string}\n */\n lmsGetDiagnostic(CMIErrorCode) {\n return this.getDiagnostic('LMSGetDiagnostic', CMIErrorCode);\n }\n\n /**\n * Sets a value on the CMI Object\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n setCMIValue(CMIElement, value) {\n return this._commonSetCMIValue('LMSSetValue', false, CMIElement, value);\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} CMIElement\n * @return {*}\n */\n getCMIValue(CMIElement) {\n return this._commonGetCMIValue('getCMIValue', false, CMIElement);\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n *\n * @param {string} CMIElement\n * @param {*} value\n * @param {boolean} foundFirstIndex\n * @return {object}\n */\n getChildElement(CMIElement, value, foundFirstIndex) {\n let newChild;\n\n if (this.stringMatches(CMIElement, 'cmi\\\\.objectives\\\\.\\\\d+')) {\n newChild = new CMIObjectivesObject();\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d+\\\\.correct_responses\\\\.\\\\d+')) {\n newChild = new CMIInteractionsCorrectResponsesObject();\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d+\\\\.objectives\\\\.\\\\d+')) {\n newChild = new CMIInteractionsObjectivesObject();\n } else if (!foundFirstIndex &&\n this.stringMatches(CMIElement, 'cmi\\\\.interactions\\\\.\\\\d+')) {\n newChild = new CMIInteractionsObject();\n }\n\n return newChild;\n }\n\n /**\n * Validates Correct Response values\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {boolean}\n */\n validateCorrectResponse(CMIElement, value) {\n return true;\n }\n\n /**\n * Returns the message that corresponds to errorNumber.\n *\n * @param {*} errorNumber\n * @param {boolean} detail\n * @return {string}\n */\n getLmsErrorMessageDetails(errorNumber, detail) {\n let basicMessage = 'No Error';\n let detailMessage = 'No Error';\n\n // Set error number to string since inconsistent from modules if string or number\n errorNumber = String(errorNumber);\n if (scorm12_constants.error_descriptions[errorNumber]) {\n basicMessage = scorm12_constants.error_descriptions[errorNumber].basicMessage;\n detailMessage = scorm12_constants.error_descriptions[errorNumber].detailMessage;\n }\n\n return detail ? detailMessage : basicMessage;\n }\n\n /**\n * Replace the whole API with another\n *\n * @param {Scorm12API} newAPI\n */\n replaceWithAnotherScormAPI(newAPI) {\n // Data Model\n this.cmi = newAPI.cmi;\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n *\n * @param {boolean} terminateCommit\n * @return {object|Array}\n */\n renderCommitCMI(terminateCommit: boolean) {\n const cmiExport = this.renderCMIToJSONObject();\n\n if (terminateCommit) {\n cmiExport.cmi.core.total_time = this.cmi.getCurrentTotalTime();\n }\n\n const result = [];\n const flattened = Utilities.flatten(cmiExport);\n switch (this.settings.dataCommitFormat) {\n case 'flattened':\n return Utilities.flatten(cmiExport);\n case 'params':\n for (const item in flattened) {\n if ({}.hasOwnProperty.call(flattened, item)) {\n result.push(`${item}=${flattened[item]}`);\n }\n }\n return result;\n case 'json':\n default:\n return cmiExport;\n }\n }\n\n /**\n * Attempts to store the data to the LMS\n *\n * @param {boolean} terminateCommit\n * @return {string}\n */\n storeData(terminateCommit: boolean) {\n if (terminateCommit) {\n const originalStatus = this.cmi.core.lesson_status;\n if (originalStatus === 'not attempted') {\n this.cmi.core.lesson_status = 'completed';\n }\n\n if (this.cmi.core.lesson_mode === 'normal') {\n if (this.cmi.core.credit === 'credit') {\n if (this.settings.mastery_override &&\n this.cmi.student_data.mastery_score !== '' &&\n this.cmi.core.score.raw !== '') {\n if (parseFloat(this.cmi.core.score.raw) >= parseFloat(this.cmi.student_data.mastery_score)) {\n this.cmi.core.lesson_status = 'passed';\n } else {\n this.cmi.core.lesson_status = 'failed';\n }\n }\n }\n } else if (this.cmi.core.lesson_mode === 'browse') {\n if ((this.startingData?.cmi?.core?.lesson_status || '') === '' && originalStatus === 'not attempted') {\n this.cmi.core.lesson_status = 'browsed';\n }\n }\n }\n\n const commitObject = this.renderCommitCMI(terminateCommit ||\n this.settings.alwaysSendTotalTime);\n\n if (this.apiLogLevel === global_constants.LOG_LEVEL_DEBUG) {\n console.debug('Commit (terminated: ' + (terminateCommit ? 'yes' : 'no') + '): ');\n console.debug(commitObject);\n }\n if (this.settings.lmsCommitUrl) {\n return this.processHttpRequest(this.settings.lmsCommitUrl, commitObject, terminateCommit);\n } else {\n return global_constants.SCORM_TRUE;\n }\n }\n}\n","import * as Scorm12CMI from './scorm12_cmi';\nimport {BaseCMI, checkValidFormat, CMIArray, CMIScore} from './common';\nimport APIConstants from '../constants/api_constants';\nimport Regex from '../constants/regex';\nimport ErrorCodes from '../constants/error_codes';\nimport {AICCValidationError} from '../exceptions';\n\nconst aicc_constants = APIConstants.aicc;\nconst aicc_regex = Regex.aicc;\nconst aicc_error_codes = ErrorCodes.scorm12;\n\n/**\n * Helper method for throwing Read Only error\n */\nfunction throwReadOnlyError() {\n throw new AICCValidationError(aicc_error_codes.READ_ONLY_ELEMENT);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} regexPattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nfunction checkAICCValidFormat(\n value: String,\n regexPattern: String,\n allowEmptyString?: boolean) {\n return checkValidFormat(\n value,\n regexPattern,\n aicc_error_codes.TYPE_MISMATCH,\n AICCValidationError,\n allowEmptyString\n );\n}\n\n/**\n * CMI Class for AICC\n */\nexport class CMI extends Scorm12CMI.CMI {\n /**\n * Constructor for AICC CMI object\n * @param {boolean} initialized\n */\n constructor(initialized: boolean) {\n super(aicc_constants.cmi_children);\n\n if (initialized) this.initialize();\n\n this.student_preference = new AICCStudentPreferences();\n this.student_data = new AICCCMIStudentData();\n this.student_demographics = new CMIStudentDemographics();\n this.evaluation = new CMIEvaluation();\n this.paths = new CMIPaths();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.student_preference?.initialize();\n this.student_data?.initialize();\n this.student_demographics?.initialize();\n this.evaluation?.initialize();\n this.paths?.initialize();\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * suspend_data: string,\n * launch_data: string,\n * comments: string,\n * comments_from_lms: string,\n * core: CMICore,\n * objectives: CMIObjectives,\n * student_data: CMIStudentData,\n * student_preference: CMIStudentPreference,\n * interactions: CMIInteractions,\n * paths: CMIPaths\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'suspend_data': this.suspend_data,\n 'launch_data': this.launch_data,\n 'comments': this.comments,\n 'comments_from_lms': this.comments_from_lms,\n 'core': this.core,\n 'objectives': this.objectives,\n 'student_data': this.student_data,\n 'student_preference': this.student_preference,\n 'student_demographics': this.student_demographics,\n 'interactions': this.interactions,\n 'evaluation': this.evaluation,\n 'paths': this.paths,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * AICC Evaluation object\n */\nclass CMIEvaluation extends BaseCMI {\n /**\n * Constructor for AICC Evaluation object\n */\n constructor() {\n super();\n\n this.comments = new CMIEvaluationComments();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.comments?.initialize();\n }\n\n /**\n * toJSON for cmi.evaluation object\n * @return {{comments: CMIEvaluationComments}}\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'comments': this.comments,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing AICC's cmi.evaluation.comments object\n */\nclass CMIEvaluationComments extends CMIArray {\n /**\n * Constructor for AICC Evaluation Comments object\n */\n constructor() {\n super({\n children: aicc_constants.comments_children,\n errorCode: aicc_error_codes.INVALID_SET_VALUE,\n errorClass: AICCValidationError,\n });\n }\n}\n\n/**\n * StudentPreferences class for AICC\n */\nclass AICCStudentPreferences extends Scorm12CMI.CMIStudentPreference {\n /**\n * Constructor for AICC Student Preferences object\n */\n constructor() {\n super(aicc_constants.student_preference_children);\n\n this.windows = new CMIArray({\n errorCode: aicc_error_codes.INVALID_SET_VALUE,\n errorClass: AICCValidationError,\n children: '',\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.windows?.initialize();\n }\n\n #lesson_type = '';\n #text_color = '';\n #text_location = '';\n #text_size = '';\n #video = '';\n\n /**\n * Getter for #lesson_type\n * @return {string}\n */\n get lesson_type(): string {\n return this.#lesson_type;\n }\n\n /**\n * Setter for #lesson_type\n * @param {string} lesson_type\n */\n set lesson_type(lesson_type: string) {\n if (checkAICCValidFormat(lesson_type, aicc_regex.CMIString256)) {\n this.#lesson_type = lesson_type;\n }\n }\n\n /**\n * Getter for #text_color\n * @return {string}\n */\n get text_color(): string {\n return this.#text_color;\n }\n\n /**\n * Setter for #text_color\n * @param {string} text_color\n */\n set text_color(text_color: string) {\n if (checkAICCValidFormat(text_color, aicc_regex.CMIString256)) {\n this.#text_color = text_color;\n }\n }\n\n /**\n * Getter for #text_location\n * @return {string}\n */\n get text_location(): string {\n return this.#text_location;\n }\n\n /**\n * Setter for #text_location\n * @param {string} text_location\n */\n set text_location(text_location: string) {\n if (checkAICCValidFormat(text_location, aicc_regex.CMIString256)) {\n this.#text_location = text_location;\n }\n }\n\n /**\n * Getter for #text_size\n * @return {string}\n */\n get text_size(): string {\n return this.#text_size;\n }\n\n /**\n * Setter for #text_size\n * @param {string} text_size\n */\n set text_size(text_size: string) {\n if (checkAICCValidFormat(text_size, aicc_regex.CMIString256)) {\n this.#text_size = text_size;\n }\n }\n\n /**\n * Getter for #video\n * @return {string}\n */\n get video(): string {\n return this.#video;\n }\n\n /**\n * Setter for #video\n * @param {string} video\n */\n set video(video: string) {\n if (checkAICCValidFormat(video, aicc_regex.CMIString256)) {\n this.#video = video;\n }\n }\n\n /**\n * toJSON for cmi.student_preference\n *\n * @return {\n * {\n * audio: string,\n * language: string,\n * speed: string,\n * text: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'audio': this.audio,\n 'language': this.language,\n 'lesson_type': this.lesson_type,\n 'speed': this.speed,\n 'text': this.text,\n 'text_color': this.text_color,\n 'text_location': this.text_location,\n 'text_size': this.text_size,\n 'video': this.video,\n 'windows': this.windows,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * StudentData class for AICC\n */\nclass AICCCMIStudentData extends Scorm12CMI.CMIStudentData {\n /**\n * Constructor for AICC StudentData object\n */\n constructor() {\n super(aicc_constants.student_data_children);\n\n this.tries = new CMITries();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.tries?.initialize();\n }\n\n #tries_during_lesson = '';\n\n /**\n * Getter for tries_during_lesson\n * @return {string}\n */\n get tries_during_lesson() {\n return this.#tries_during_lesson;\n }\n\n /**\n * Setter for #tries_during_lesson. Sets an error if trying to set after\n * initialization.\n * @param {string} tries_during_lesson\n */\n set tries_during_lesson(tries_during_lesson) {\n !this.initialized ?\n this.#tries_during_lesson = tries_during_lesson :\n throwReadOnlyError();\n }\n\n /**\n * toJSON for cmi.student_data object\n * @return {\n * {\n * mastery_score: string,\n * max_time_allowed: string,\n * time_limit_action: string,\n * tries: CMITries\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'mastery_score': this.mastery_score,\n 'max_time_allowed': this.max_time_allowed,\n 'time_limit_action': this.time_limit_action,\n 'tries': this.tries,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing the AICC cmi.student_demographics object\n */\nexport class CMIStudentDemographics extends BaseCMI {\n /**\n * Constructor for AICC StudentDemographics object\n */\n constructor() {\n super();\n }\n\n #_children = aicc_constants.student_demographics_children;\n #city = '';\n #class = '';\n #company = '';\n #country = '';\n #experience = '';\n #familiar_name = '';\n #instructor_name = '';\n #title = '';\n #native_language = '';\n #state = '';\n #street_address = '';\n #telephone = '';\n #years_experience = '';\n\n /**\n * Getter for _children\n * @return {string}\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Getter for city\n * @return {string}\n */\n get city() {\n return this.#city;\n }\n\n /**\n * Setter for #city. Sets an error if trying to set after\n * initialization.\n * @param {string} city\n */\n set city(city) {\n !this.initialized ?\n this.#city = city :\n throwReadOnlyError();\n }\n\n /**\n * Getter for class\n * @return {string}\n */\n get class() {\n return this.#class;\n }\n\n /**\n * Setter for #class. Sets an error if trying to set after\n * initialization.\n * @param {string} clazz\n */\n set class(clazz) {\n !this.initialized ?\n this.#class = clazz :\n throwReadOnlyError();\n }\n\n /**\n * Getter for company\n * @return {string}\n */\n get company() {\n return this.#company;\n }\n\n /**\n * Setter for #company. Sets an error if trying to set after\n * initialization.\n * @param {string} company\n */\n set company(company) {\n !this.initialized ?\n this.#company = company :\n throwReadOnlyError();\n }\n\n /**\n * Getter for country\n * @return {string}\n */\n get country() {\n return this.#country;\n }\n\n /**\n * Setter for #country. Sets an error if trying to set after\n * initialization.\n * @param {string} country\n */\n set country(country) {\n !this.initialized ?\n this.#country = country :\n throwReadOnlyError();\n }\n\n /**\n * Getter for experience\n * @return {string}\n */\n get experience() {\n return this.#experience;\n }\n\n /**\n * Setter for #experience. Sets an error if trying to set after\n * initialization.\n * @param {string} experience\n */\n set experience(experience) {\n !this.initialized ?\n this.#experience = experience :\n throwReadOnlyError();\n }\n\n /**\n * Getter for familiar_name\n * @return {string}\n */\n get familiar_name() {\n return this.#familiar_name;\n }\n\n /**\n * Setter for #familiar_name. Sets an error if trying to set after\n * initialization.\n * @param {string} familiar_name\n */\n set familiar_name(familiar_name) {\n !this.initialized ?\n this.#familiar_name = familiar_name :\n throwReadOnlyError();\n }\n\n /**\n * Getter for instructor_name\n * @return {string}\n */\n get instructor_name() {\n return this.#instructor_name;\n }\n\n /**\n * Setter for #instructor_name. Sets an error if trying to set after\n * initialization.\n * @param {string} instructor_name\n */\n set instructor_name(instructor_name) {\n !this.initialized ?\n this.#instructor_name = instructor_name :\n throwReadOnlyError();\n }\n\n /**\n * Getter for title\n * @return {string}\n */\n get title() {\n return this.#title;\n }\n\n /**\n * Setter for #title. Sets an error if trying to set after\n * initialization.\n * @param {string} title\n */\n set title(title) {\n !this.initialized ?\n this.#title = title :\n throwReadOnlyError();\n }\n\n /**\n * Getter for native_language\n * @return {string}\n */\n get native_language() {\n return this.#native_language;\n }\n\n /**\n * Setter for #native_language. Sets an error if trying to set after\n * initialization.\n * @param {string} native_language\n */\n set native_language(native_language) {\n !this.initialized ?\n this.#native_language = native_language :\n throwReadOnlyError();\n }\n\n /**\n * Getter for state\n * @return {string}\n */\n get state() {\n return this.#state;\n }\n\n /**\n * Setter for #state. Sets an error if trying to set after\n * initialization.\n * @param {string} state\n */\n set state(state) {\n !this.initialized ?\n this.#state = state :\n throwReadOnlyError();\n }\n\n /**\n * Getter for street_address\n * @return {string}\n */\n get street_address() {\n return this.#street_address;\n }\n\n /**\n * Setter for #street_address. Sets an error if trying to set after\n * initialization.\n * @param {string} street_address\n */\n set street_address(street_address) {\n !this.initialized ?\n this.#street_address = street_address :\n throwReadOnlyError();\n }\n\n /**\n * Getter for telephone\n * @return {string}\n */\n get telephone() {\n return this.#telephone;\n }\n\n /**\n * Setter for #telephone. Sets an error if trying to set after\n * initialization.\n * @param {string} telephone\n */\n set telephone(telephone) {\n !this.initialized ?\n this.#telephone = telephone :\n throwReadOnlyError();\n }\n\n /**\n * Getter for years_experience\n * @return {string}\n */\n get years_experience() {\n return this.#years_experience;\n }\n\n /**\n * Setter for #years_experience. Sets an error if trying to set after\n * initialization.\n * @param {string} years_experience\n */\n set years_experience(years_experience) {\n !this.initialized ?\n this.#years_experience = years_experience :\n throwReadOnlyError();\n }\n\n /**\n * toJSON for cmi.student_demographics object\n * @return {\n * {\n * city: string,\n * class: string,\n * company: string,\n * country: string,\n * experience: string,\n * familiar_name: string,\n * instructor_name: string,\n * title: string,\n * native_language: string,\n * state: string,\n * street_address: string,\n * telephone: string,\n * years_experience: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'city': this.city,\n 'class': this.class,\n 'company': this.company,\n 'country': this.country,\n 'experience': this.experience,\n 'familiar_name': this.familiar_name,\n 'instructor_name': this.instructor_name,\n 'title': this.title,\n 'native_language': this.native_language,\n 'state': this.state,\n 'street_address': this.street_address,\n 'telephone': this.telephone,\n 'years_experience': this.years_experience,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing the AICC cmi.paths object\n */\nexport class CMIPaths extends CMIArray {\n /**\n * Constructor for inline Paths Array class\n */\n constructor() {\n super({children: aicc_constants.paths_children});\n }\n}\n\n/**\n * Class for AICC Paths\n */\nexport class CMIPathsObject extends BaseCMI {\n /**\n * Constructor for AICC Paths objects\n */\n constructor() {\n super();\n }\n\n #location_id = '';\n #date = '';\n #time = '';\n #status = '';\n #why_left = '';\n #time_in_element = '';\n\n /**\n * Getter for #location_id\n * @return {string}\n */\n get location_id() {\n return this.#location_id;\n }\n\n /**\n * Setter for #location_id\n * @param {string} location_id\n */\n set location_id(location_id) {\n if (checkAICCValidFormat(location_id, aicc_regex.CMIString256)) {\n this.#location_id = location_id;\n }\n }\n\n /**\n * Getter for #date\n * @return {string}\n */\n get date() {\n return this.#date;\n }\n\n /**\n * Setter for #date\n * @param {string} date\n */\n set date(date) {\n if (checkAICCValidFormat(date, aicc_regex.CMIString256)) {\n this.#date = date;\n }\n }\n\n /**\n * Getter for #time\n * @return {string}\n */\n get time() {\n return this.#time;\n }\n\n /**\n * Setter for #time\n * @param {string} time\n */\n set time(time) {\n if (checkAICCValidFormat(time, aicc_regex.CMITime)) {\n this.#time = time;\n }\n }\n\n /**\n * Getter for #status\n * @return {string}\n */\n get status() {\n return this.#status;\n }\n\n /**\n * Setter for #status\n * @param {string} status\n */\n set status(status) {\n if (checkAICCValidFormat(status, aicc_regex.CMIStatus2)) {\n this.#status = status;\n }\n }\n\n /**\n * Getter for #why_left\n * @return {string}\n */\n get why_left() {\n return this.#why_left;\n }\n\n /**\n * Setter for #why_left\n * @param {string} why_left\n */\n set why_left(why_left) {\n if (checkAICCValidFormat(why_left, aicc_regex.CMIString256)) {\n this.#why_left = why_left;\n }\n }\n\n /**\n * Getter for #time_in_element\n * @return {string}\n */\n get time_in_element() {\n return this.#time_in_element;\n }\n\n /**\n * Setter for #time_in_element\n * @param {string} time_in_element\n */\n set time_in_element(time_in_element) {\n if (checkAICCValidFormat(time_in_element, aicc_regex.CMITime)) {\n this.#time_in_element = time_in_element;\n }\n }\n\n /**\n * toJSON for cmi.paths.n object\n * @return {\n * {\n * location_id: string,\n * date: string,\n * time: string,\n * status: string,\n * why_left: string,\n * time_in_element: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'location_id': this.location_id,\n 'date': this.date,\n 'time': this.time,\n 'status': this.status,\n 'why_left': this.why_left,\n 'time_in_element': this.time_in_element,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing the AICC cmi.student_data.tries object\n */\nexport class CMITries extends CMIArray {\n /**\n * Constructor for inline Tries Array class\n */\n constructor() {\n super({children: aicc_constants.tries_children});\n }\n}\n\n/**\n * Class for AICC Tries\n */\nexport class CMITriesObject extends BaseCMI {\n /**\n * Constructor for AICC Tries object\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: aicc_constants.score_children,\n score_range: aicc_regex.score_range,\n invalidErrorCode: aicc_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: aicc_error_codes.TYPE_MISMATCH,\n invalidRangeCode: aicc_error_codes.VALUE_OUT_OF_RANGE,\n errorClass: AICCValidationError,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n #status = '';\n #time = '';\n\n /**\n * Getter for #status\n * @return {string}\n */\n get status() {\n return this.#status;\n }\n\n /**\n * Setter for #status\n * @param {string} status\n */\n set status(status) {\n if (checkAICCValidFormat(status, aicc_regex.CMIStatus2)) {\n this.#status = status;\n }\n }\n\n /**\n * Getter for #time\n * @return {string}\n */\n get time() {\n return this.#time;\n }\n\n /**\n * Setter for #time\n * @param {string} time\n */\n set time(time) {\n if (checkAICCValidFormat(time, aicc_regex.CMITime)) {\n this.#time = time;\n }\n }\n\n /**\n * toJSON for cmi.student_data.tries.n object\n * @return {\n * {\n * status: string,\n * time: string,\n * score: CMIScore\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'status': this.status,\n 'time': this.time,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for cmi.student_data.attempt_records array\n */\nexport class CMIAttemptRecords extends CMIArray {\n /**\n * Constructor for inline Tries Array class\n */\n constructor() {\n super({children: aicc_constants.attempt_records_children});\n }\n}\n\n/**\n * Class for AICC Attempt Records\n */\nexport class CMIAttemptRecordsObject extends BaseCMI {\n /**\n * Constructor for AICC Attempt Records object\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: aicc_constants.score_children,\n score_range: aicc_regex.score_range,\n invalidErrorCode: aicc_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: aicc_error_codes.TYPE_MISMATCH,\n invalidRangeCode: aicc_error_codes.VALUE_OUT_OF_RANGE,\n errorClass: AICCValidationError,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n #lesson_status = '';\n\n /**\n * Getter for #lesson_status\n * @return {string}\n */\n get lesson_status() {\n return this.#lesson_status;\n }\n\n /**\n * Setter for #lesson_status\n * @param {string} lesson_status\n */\n set lesson_status(lesson_status) {\n if (checkAICCValidFormat(lesson_status, aicc_regex.CMIStatus2)) {\n this.#lesson_status = lesson_status;\n }\n }\n\n /**\n * toJSON for cmi.student_data.attempt_records.n object\n * @return {\n * {\n * status: string,\n * time: string,\n * score: CMIScore\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'lesson_status': this.lesson_status,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for AICC Evaluation Comments\n */\nexport class CMIEvaluationCommentsObject extends BaseCMI {\n /**\n * Constructor for Evaluation Comments\n */\n constructor() {\n super();\n }\n\n #content = '';\n #location = '';\n #time = '';\n\n /**\n * Getter for #content\n * @return {string}\n */\n get content() {\n return this.#content;\n }\n\n /**\n * Setter for #content\n * @param {string} content\n */\n set content(content) {\n if (checkAICCValidFormat(content, aicc_regex.CMIString256)) {\n this.#content = content;\n }\n }\n\n /**\n * Getter for #location\n * @return {string}\n */\n get location() {\n return this.#location;\n }\n\n /**\n * Setter for #location\n * @param {string} location\n */\n set location(location) {\n if (checkAICCValidFormat(location, aicc_regex.CMIString256)) {\n this.#location = location;\n }\n }\n\n /**\n * Getter for #time\n * @return {string}\n */\n get time() {\n return this.#time;\n }\n\n /**\n * Setting for #time\n * @param {string} time\n */\n set time(time) {\n if (checkAICCValidFormat(time, aicc_regex.CMITime)) {\n this.#time = time;\n }\n }\n\n /**\n * toJSON for cmi.evaulation.comments.n object\n * @return {\n * {\n * content: string,\n * location: string,\n * time: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'content': this.content,\n 'location': this.location,\n 'time': this.time,\n };\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\nimport APIConstants from '../constants/api_constants';\nimport ErrorCodes from '../constants/error_codes';\nimport Regex from '../constants/regex';\n\nconst scorm12_constants = APIConstants.scorm12;\nconst scorm12_regex = Regex.scorm12;\nconst scorm12_error_codes = ErrorCodes.scorm12;\n\n/**\n * Check if the value matches the proper format. If not, throw proper error code.\n *\n * @param {string} value\n * @param {string} regexPattern\n * @param {number} errorCode\n * @param {class} errorClass\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function checkValidFormat(\n value: String,\n regexPattern: String,\n errorCode: number,\n errorClass: function,\n allowEmptyString?: boolean) {\n const formatRegex = new RegExp(regexPattern);\n const matches = value.match(formatRegex);\n if (allowEmptyString && value === '') {\n return true;\n }\n if (value === undefined || !matches || matches[0] === '') {\n throw new errorClass.prototype.constructor(errorCode);\n }\n return true;\n}\n\n/**\n * Check if the value matches the proper range. If not, throw proper error code.\n *\n * @param {*} value\n * @param {string} rangePattern\n * @param {number} errorCode\n * @param {class} errorClass\n * @return {boolean}\n */\nexport function checkValidRange(\n value: any,\n rangePattern: String,\n errorCode: number,\n errorClass: function) {\n const ranges = rangePattern.split('#');\n value = value * 1.0;\n if (value >= ranges[0]) {\n if ((ranges[1] === '*') || (value <= ranges[1])) {\n return true;\n } else {\n throw new errorClass.prototype.constructor(errorCode);\n }\n } else {\n throw new errorClass.prototype.constructor(errorCode);\n }\n}\n\n/**\n * Base class for API cmi objects\n */\nexport class BaseCMI {\n jsonString = false;\n #initialized = false;\n #start_time;\n\n /**\n * Constructor for BaseCMI, just marks the class as abstract\n */\n constructor() {\n if (new.target === BaseCMI) {\n throw new TypeError('Cannot construct BaseCMI instances directly');\n }\n }\n\n /**\n * Getter for #initialized\n * @return {boolean}\n */\n get initialized() {\n return this.#initialized;\n }\n\n /**\n * Getter for #start_time\n * @return {Number}\n */\n get start_time() {\n return this.#start_time;\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n this.#initialized = true;\n }\n\n /**\n * Called when the player should override the 'session_time' provided by\n * the module\n */\n setStartTime() {\n this.#start_time = new Date().getTime();\n }\n}\n\n/**\n * Base class for cmi *.score objects\n */\nexport class CMIScore extends BaseCMI {\n /**\n * Constructor for *.score\n * @param {string} score_children\n * @param {string} score_range\n * @param {string} max\n * @param {number} invalidErrorCode\n * @param {number} invalidTypeCode\n * @param {number} invalidRangeCode\n * @param {string} decimalRegex\n * @param {class} errorClass\n */\n constructor(\n {\n score_children,\n score_range,\n max,\n invalidErrorCode,\n invalidTypeCode,\n invalidRangeCode,\n decimalRegex,\n errorClass,\n }) {\n super();\n\n this.#_children = score_children ||\n scorm12_constants.score_children;\n this.#_score_range = !score_range ? false : scorm12_regex.score_range;\n this.#max = (max || max === '') ? max : '100';\n this.#_invalid_error_code = invalidErrorCode ||\n scorm12_error_codes.INVALID_SET_VALUE;\n this.#_invalid_type_code = invalidTypeCode ||\n scorm12_error_codes.TYPE_MISMATCH;\n this.#_invalid_range_code = invalidRangeCode ||\n scorm12_error_codes.VALUE_OUT_OF_RANGE;\n this.#_decimal_regex = decimalRegex ||\n scorm12_regex.CMIDecimal;\n this.#_error_class = errorClass;\n }\n\n #_children;\n #_score_range;\n #_invalid_error_code;\n #_invalid_type_code;\n #_invalid_range_code;\n #_decimal_regex;\n #_error_class;\n #raw = '';\n #min = '';\n #max;\n\n /**\n * Getter for _children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throw new this.#_error_class.prototype.constructor(this.#_invalid_error_code);\n }\n\n /**\n * Getter for #raw\n * @return {string}\n */\n get raw() {\n return this.#raw;\n }\n\n /**\n * Setter for #raw\n * @param {string} raw\n */\n set raw(raw) {\n if (checkValidFormat(raw, this.#_decimal_regex, this.#_invalid_type_code, this.#_error_class) &&\n (!this.#_score_range ||\n checkValidRange(raw, this.#_score_range, this.#_invalid_range_code, this.#_error_class))) {\n this.#raw = raw;\n }\n }\n\n /**\n * Getter for #min\n * @return {string}\n */\n get min() {\n return this.#min;\n }\n\n /**\n * Setter for #min\n * @param {string} min\n */\n set min(min) {\n if (checkValidFormat(min, this.#_decimal_regex, this.#_invalid_type_code, this.#_error_class) &&\n (!this.#_score_range ||\n checkValidRange(min, this.#_score_range, this.#_invalid_range_code, this.#_error_class))) {\n this.#min = min;\n }\n }\n\n /**\n * Getter for #max\n * @return {string}\n */\n get max() {\n return this.#max;\n }\n\n /**\n * Setter for #max\n * @param {string} max\n */\n set max(max) {\n if (checkValidFormat(max, this.#_decimal_regex, this.#_invalid_type_code, this.#_error_class) &&\n (!this.#_score_range ||\n checkValidRange(max, this.#_score_range, this.#_invalid_range_code, this.#_error_class))) {\n this.#max = max;\n }\n }\n\n /**\n * toJSON for *.score\n * @return {{min: string, max: string, raw: string}}\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'raw': this.raw,\n 'min': this.min,\n 'max': this.max,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Base class for cmi *.n objects\n */\nexport class CMIArray extends BaseCMI {\n /**\n * Constructor cmi *.n arrays\n * @param {string} children\n * @param {number} errorCode\n * @param {class} errorClass\n */\n constructor({children, errorCode, errorClass}) {\n super();\n this.#_children = children;\n this.#errorCode = errorCode;\n this.#errorClass = errorClass;\n this.childArray = [];\n }\n\n #errorCode;\n #errorClass;\n #_children;\n\n /**\n * Getter for _children\n * @return {*}\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n */\n set _children(_children) {\n throw new this.#errorClass.prototype.constructor(this.#errorCode);\n }\n\n /**\n * Getter for _count\n * @return {number}\n */\n get _count() {\n return this.childArray.length;\n }\n\n /**\n * Setter for _count. Just throws an error.\n * @param {number} _count\n */\n set _count(_count) {\n throw new this.#errorClass.prototype.constructor(this.#errorCode);\n }\n\n /**\n * toJSON for *.n arrays\n * @return {object}\n */\n toJSON() {\n this.jsonString = true;\n const result = {};\n for (let i = 0; i < this.childArray.length; i++) {\n result[i + ''] = this.childArray[i];\n }\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\nimport {\n BaseCMI,\n checkValidFormat,\n checkValidRange,\n CMIArray,\n CMIScore,\n} from './common';\nimport APIConstants from '../constants/api_constants';\nimport ErrorCodes from '../constants/error_codes';\nimport Regex from '../constants/regex';\nimport {Scorm12ValidationError} from '../exceptions';\nimport * as Utilities from '../utilities';\nimport * as Util from '../utilities';\n\nconst scorm12_constants = APIConstants.scorm12;\nconst scorm12_regex = Regex.scorm12;\nconst scorm12_error_codes = ErrorCodes.scorm12;\n\n/**\n * Helper method for throwing Read Only error\n */\nexport function throwReadOnlyError() {\n throw new Scorm12ValidationError(scorm12_error_codes.READ_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Write Only error\n */\nexport function throwWriteOnlyError() {\n throw new Scorm12ValidationError(scorm12_error_codes.WRITE_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Invalid Set error\n */\nfunction throwInvalidValueError() {\n throw new Scorm12ValidationError(scorm12_error_codes.INVALID_SET_VALUE);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} regexPattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function check12ValidFormat(\n value: String,\n regexPattern: String,\n allowEmptyString?: boolean) {\n return checkValidFormat(\n value,\n regexPattern,\n scorm12_error_codes.TYPE_MISMATCH,\n Scorm12ValidationError,\n allowEmptyString\n );\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} rangePattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function check12ValidRange(\n value: any,\n rangePattern: String,\n allowEmptyString?: boolean) {\n return checkValidRange(\n value,\n rangePattern,\n scorm12_error_codes.VALUE_OUT_OF_RANGE,\n Scorm12ValidationError,\n allowEmptyString\n );\n}\n\n/**\n * Class representing the cmi object for SCORM 1.2\n */\nexport class CMI extends BaseCMI {\n #_children = '';\n #_version = '3.4';\n #launch_data = '';\n #comments = '';\n #comments_from_lms = '';\n\n student_data = null;\n\n /**\n * Constructor for the SCORM 1.2 cmi object\n * @param {string} cmi_children\n * @param {(CMIStudentData|AICCCMIStudentData)} student_data\n * @param {boolean} initialized\n */\n constructor(cmi_children, student_data, initialized: boolean) {\n super();\n\n if (initialized) this.initialize();\n\n this.#_children = cmi_children ?\n cmi_children :\n scorm12_constants.cmi_children;\n this.core = new CMICore();\n this.objectives = new CMIObjectives();\n this.student_data = student_data ? student_data : new CMIStudentData();\n this.student_preference = new CMIStudentPreference();\n this.interactions = new CMIInteractions();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.core?.initialize();\n this.objectives?.initialize();\n this.student_data?.initialize();\n this.student_preference?.initialize();\n this.interactions?.initialize();\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * suspend_data: string,\n * launch_data: string,\n * comments: string,\n * comments_from_lms: string,\n * core: CMICore,\n * objectives: CMIObjectives,\n * student_data: CMIStudentData,\n * student_preference: CMIStudentPreference,\n * interactions: CMIInteractions\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'suspend_data': this.suspend_data,\n 'launch_data': this.launch_data,\n 'comments': this.comments,\n 'comments_from_lms': this.comments_from_lms,\n 'core': this.core,\n 'objectives': this.objectives,\n 'student_data': this.student_data,\n 'student_preference': this.student_preference,\n 'interactions': this.interactions,\n };\n delete this.jsonString;\n return result;\n }\n\n /**\n * Getter for #_version\n * @return {string}\n */\n get _version() {\n return this.#_version;\n }\n\n /**\n * Setter for #_version. Just throws an error.\n * @param {string} _version\n */\n set _version(_version) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #_children\n * @return {string}\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_version. Just throws an error.\n * @param {string} _children\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #suspend_data\n * @return {string}\n */\n get suspend_data() {\n return this.core?.suspend_data;\n }\n\n /**\n * Setter for #suspend_data\n * @param {string} suspend_data\n */\n set suspend_data(suspend_data) {\n if (this.core) {\n this.core.suspend_data = suspend_data;\n }\n }\n\n /**\n * Getter for #launch_data\n * @return {string}\n */\n get launch_data() {\n return this.#launch_data;\n }\n\n /**\n * Setter for #launch_data. Can only be called before initialization.\n * @param {string} launch_data\n */\n set launch_data(launch_data) {\n !this.initialized ? this.#launch_data = launch_data : throwReadOnlyError();\n }\n\n /**\n * Getter for #comments\n * @return {string}\n */\n get comments() {\n return this.#comments;\n }\n\n /**\n * Setter for #comments\n * @param {string} comments\n */\n set comments(comments) {\n if (check12ValidFormat(comments, scorm12_regex.CMIString4096, true)) {\n this.#comments = comments;\n }\n }\n\n /**\n * Getter for #comments_from_lms\n * @return {string}\n */\n get comments_from_lms() {\n return this.#comments_from_lms;\n }\n\n /**\n * Setter for #comments_from_lms. Can only be called before initialization.\n * @param {string} comments_from_lms\n */\n set comments_from_lms(comments_from_lms) {\n !this.initialized ?\n this.#comments_from_lms = comments_from_lms :\n throwReadOnlyError();\n }\n\n /**\n * Adds the current session time to the existing total time.\n *\n * @return {string}\n */\n getCurrentTotalTime() {\n return this.core.getCurrentTotalTime(this.start_time);\n }\n}\n\n/**\n * Class representing the cmi.core object\n * @extends BaseCMI\n */\nclass CMICore extends BaseCMI {\n /**\n * Constructor for cmi.core\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: scorm12_constants.score_children,\n score_range: scorm12_regex.score_range,\n invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,\n errorClass: Scorm12ValidationError,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n #_children = scorm12_constants.core_children;\n #student_id = '';\n #student_name = '';\n #lesson_location = '';\n #credit = '';\n #lesson_status = 'not attempted';\n #entry = '';\n #total_time = '';\n #lesson_mode = 'normal';\n #exit = '';\n #session_time = '00:00:00';\n #suspend_data = '';\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #student_id\n * @return {string}\n */\n get student_id() {\n return this.#student_id;\n }\n\n /**\n * Setter for #student_id. Can only be called before initialization.\n * @param {string} student_id\n */\n set student_id(student_id) {\n !this.initialized ? this.#student_id = student_id : throwReadOnlyError();\n }\n\n /**\n * Getter for #student_name\n * @return {string}\n */\n get student_name() {\n return this.#student_name;\n }\n\n /**\n * Setter for #student_name. Can only be called before initialization.\n * @param {string} student_name\n */\n set student_name(student_name) {\n !this.initialized ?\n this.#student_name = student_name :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #lesson_location\n * @return {string}\n */\n get lesson_location() {\n return this.#lesson_location;\n }\n\n /**\n * Setter for #lesson_location\n * @param {string} lesson_location\n */\n set lesson_location(lesson_location) {\n if (check12ValidFormat(lesson_location, scorm12_regex.CMIString256, true)) {\n this.#lesson_location = lesson_location;\n }\n }\n\n /**\n * Getter for #credit\n * @return {string}\n */\n get credit() {\n return this.#credit;\n }\n\n /**\n * Setter for #credit. Can only be called before initialization.\n * @param {string} credit\n */\n set credit(credit) {\n !this.initialized ? this.#credit = credit : throwReadOnlyError();\n }\n\n /**\n * Getter for #lesson_status\n * @return {string}\n */\n get lesson_status() {\n return this.#lesson_status;\n }\n\n /**\n * Setter for #lesson_status\n * @param {string} lesson_status\n */\n set lesson_status(lesson_status) {\n if (this.initialized) {\n if (check12ValidFormat(lesson_status, scorm12_regex.CMIStatus)) {\n this.#lesson_status = lesson_status;\n }\n } else {\n if (check12ValidFormat(lesson_status, scorm12_regex.CMIStatus2)) {\n this.#lesson_status = lesson_status;\n }\n }\n }\n\n /**\n * Getter for #entry\n * @return {string}\n */\n get entry() {\n return this.#entry;\n }\n\n /**\n * Setter for #entry. Can only be called before initialization.\n * @param {string} entry\n */\n set entry(entry) {\n !this.initialized ? this.#entry = entry : throwReadOnlyError();\n }\n\n /**\n * Getter for #total_time\n * @return {string}\n */\n get total_time() {\n return this.#total_time;\n }\n\n /**\n * Setter for #total_time. Can only be called before initialization.\n * @param {string} total_time\n */\n set total_time(total_time) {\n !this.initialized ? this.#total_time = total_time : throwReadOnlyError();\n }\n\n /**\n * Getter for #lesson_mode\n * @return {string}\n */\n get lesson_mode() {\n return this.#lesson_mode;\n }\n\n /**\n * Setter for #lesson_mode. Can only be called before initialization.\n * @param {string} lesson_mode\n */\n set lesson_mode(lesson_mode) {\n !this.initialized ? this.#lesson_mode = lesson_mode : throwReadOnlyError();\n }\n\n /**\n * Getter for #exit. Should only be called during JSON export.\n * @return {*}\n */\n get exit() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#exit;\n }\n\n /**\n * Setter for #exit\n * @param {string} exit\n */\n set exit(exit) {\n if (check12ValidFormat(exit, scorm12_regex.CMIExit, true)) {\n this.#exit = exit;\n }\n }\n\n /**\n * Getter for #session_time. Should only be called during JSON export.\n * @return {*}\n */\n get session_time() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#session_time;\n }\n\n /**\n * Setter for #session_time\n * @param {string} session_time\n */\n set session_time(session_time) {\n if (check12ValidFormat(session_time, scorm12_regex.CMITimespan)) {\n this.#session_time = session_time;\n }\n }\n\n /**\n * Getter for #suspend_data\n * @return {string}\n */\n get suspend_data() {\n return this.#suspend_data;\n }\n\n /**\n * Setter for #suspend_data\n * @param {string} suspend_data\n */\n set suspend_data(suspend_data) {\n if (check12ValidFormat(suspend_data, scorm12_regex.CMIString4096, true)) {\n this.#suspend_data = suspend_data;\n }\n }\n\n /**\n * Adds the current session time to the existing total time.\n * @param {Number} start_time\n * @return {string}\n */\n getCurrentTotalTime(start_time: Number) {\n let sessionTime = this.#session_time;\n const startTime = start_time;\n\n if (typeof startTime !== 'undefined' && startTime !== null) {\n const seconds = new Date().getTime() - startTime;\n sessionTime = Util.getSecondsAsHHMMSS(seconds / 1000);\n }\n\n return Utilities.addHHMMSSTimeStrings(\n this.#total_time,\n sessionTime,\n new RegExp(scorm12_regex.CMITimespan),\n );\n }\n\n /**\n * toJSON for cmi.core\n *\n * @return {\n * {\n * student_name: string,\n * entry: string,\n * exit: string,\n * score: CMIScore,\n * student_id: string,\n * lesson_mode: string,\n * lesson_location: string,\n * lesson_status: string,\n * credit: string,\n * session_time: *\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'student_id': this.student_id,\n 'student_name': this.student_name,\n 'lesson_location': this.lesson_location,\n 'credit': this.credit,\n 'lesson_status': this.lesson_status,\n 'entry': this.entry,\n 'lesson_mode': this.lesson_mode,\n 'exit': this.exit,\n 'session_time': this.session_time,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.objectives object\n * @extends CMIArray\n */\nclass CMIObjectives extends CMIArray {\n /**\n * Constructor for cmi.objectives\n */\n constructor() {\n super({\n children: scorm12_constants.objectives_children,\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n errorClass: Scorm12ValidationError,\n });\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.student_data object\n * @extends BaseCMI\n */\nexport class CMIStudentData extends BaseCMI {\n #_children;\n #mastery_score = '';\n #max_time_allowed = '';\n #time_limit_action = '';\n\n /**\n * Constructor for cmi.student_data\n * @param {string} student_data_children\n */\n constructor(student_data_children) {\n super();\n\n this.#_children = student_data_children ?\n student_data_children :\n scorm12_constants.student_data_children;\n }\n\n /**\n * Getter for #_children\n * @return {*}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #master_score\n * @return {string}\n */\n get mastery_score() {\n return this.#mastery_score;\n }\n\n /**\n * Setter for #master_score. Can only be called before initialization.\n * @param {string} mastery_score\n */\n set mastery_score(mastery_score) {\n !this.initialized ?\n this.#mastery_score = mastery_score :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #max_time_allowed\n * @return {string}\n */\n get max_time_allowed() {\n return this.#max_time_allowed;\n }\n\n /**\n * Setter for #max_time_allowed. Can only be called before initialization.\n * @param {string} max_time_allowed\n */\n set max_time_allowed(max_time_allowed) {\n !this.initialized ?\n this.#max_time_allowed = max_time_allowed :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #time_limit_action\n * @return {string}\n */\n get time_limit_action() {\n return this.#time_limit_action;\n }\n\n /**\n * Setter for #time_limit_action. Can only be called before initialization.\n * @param {string} time_limit_action\n */\n set time_limit_action(time_limit_action) {\n !this.initialized ?\n this.#time_limit_action = time_limit_action :\n throwReadOnlyError();\n }\n\n /**\n * toJSON for cmi.student_data\n *\n * @return {\n * {\n * max_time_allowed: string,\n * time_limit_action: string,\n * mastery_score: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'mastery_score': this.mastery_score,\n 'max_time_allowed': this.max_time_allowed,\n 'time_limit_action': this.time_limit_action,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.student_preference object\n * @extends BaseCMI\n */\nexport class CMIStudentPreference extends BaseCMI {\n #_children;\n\n /**\n * Constructor for cmi.student_preference\n * @param {string} student_preference_children\n */\n constructor(student_preference_children) {\n super();\n\n this.#_children = student_preference_children ?\n student_preference_children :\n scorm12_constants.student_preference_children;\n }\n\n #audio = '';\n #language = '';\n #speed = '';\n #text = '';\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #audio\n * @return {string}\n */\n get audio() {\n return this.#audio;\n }\n\n /**\n * Setter for #audio\n * @param {string} audio\n */\n set audio(audio) {\n if (check12ValidFormat(audio, scorm12_regex.CMISInteger) &&\n check12ValidRange(audio, scorm12_regex.audio_range)) {\n this.#audio = audio;\n }\n }\n\n /**\n * Getter for #language\n * @return {string}\n */\n get language() {\n return this.#language;\n }\n\n /**\n * Setter for #language\n * @param {string} language\n */\n set language(language) {\n if (check12ValidFormat(language, scorm12_regex.CMIString256)) {\n this.#language = language;\n }\n }\n\n /**\n * Getter for #speed\n * @return {string}\n */\n get speed() {\n return this.#speed;\n }\n\n /**\n * Setter for #speed\n * @param {string} speed\n */\n set speed(speed) {\n if (check12ValidFormat(speed, scorm12_regex.CMISInteger) &&\n check12ValidRange(speed, scorm12_regex.speed_range)) {\n this.#speed = speed;\n }\n }\n\n /**\n * Getter for #text\n * @return {string}\n */\n get text() {\n return this.#text;\n }\n\n /**\n * Setter for #text\n * @param {string} text\n */\n set text(text) {\n if (check12ValidFormat(text, scorm12_regex.CMISInteger) &&\n check12ValidRange(text, scorm12_regex.text_range)) {\n this.#text = text;\n }\n }\n\n /**\n * toJSON for cmi.student_preference\n *\n * @return {\n * {\n * audio: string,\n * language: string,\n * speed: string,\n * text: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'audio': this.audio,\n 'language': this.language,\n 'speed': this.speed,\n 'text': this.text,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions object\n * @extends BaseCMI\n */\nclass CMIInteractions extends CMIArray {\n /**\n * Constructor for cmi.interactions\n */\n constructor() {\n super({\n children: scorm12_constants.interactions_children,\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n errorClass: Scorm12ValidationError,\n });\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.n object\n */\n constructor() {\n super();\n\n this.objectives = new CMIArray({\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n errorClass: Scorm12ValidationError,\n children: scorm12_constants.objectives_children,\n });\n this.correct_responses = new CMIArray({\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n errorClass: Scorm12ValidationError,\n children: scorm12_constants.correct_responses_children,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.objectives?.initialize();\n this.correct_responses?.initialize();\n }\n\n #id = '';\n #time = '';\n #type = '';\n #weighting = '';\n #student_response = '';\n #result = '';\n #latency = '';\n\n /**\n * Getter for #id. Should only be called during JSON export.\n * @return {*}\n */\n get id() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check12ValidFormat(id, scorm12_regex.CMIIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #time. Should only be called during JSON export.\n * @return {*}\n */\n get time() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#time;\n }\n\n /**\n * Setter for #time\n * @param {string} time\n */\n set time(time) {\n if (check12ValidFormat(time, scorm12_regex.CMITime)) {\n this.#time = time;\n }\n }\n\n /**\n * Getter for #type. Should only be called during JSON export.\n * @return {*}\n */\n get type() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#type;\n }\n\n /**\n * Setter for #type\n * @param {string} type\n */\n set type(type) {\n if (check12ValidFormat(type, scorm12_regex.CMIType)) {\n this.#type = type;\n }\n }\n\n /**\n * Getter for #weighting. Should only be called during JSON export.\n * @return {*}\n */\n get weighting() {\n return (!this.jsonString) ?\n throwWriteOnlyError() :\n this.#weighting;\n }\n\n /**\n * Setter for #weighting\n * @param {string} weighting\n */\n set weighting(weighting) {\n if (check12ValidFormat(weighting, scorm12_regex.CMIDecimal) &&\n check12ValidRange(weighting, scorm12_regex.weighting_range)) {\n this.#weighting = weighting;\n }\n }\n\n /**\n * Getter for #student_response. Should only be called during JSON export.\n * @return {*}\n */\n get student_response() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#student_response;\n }\n\n /**\n * Setter for #student_response\n * @param {string} student_response\n */\n set student_response(student_response) {\n if (check12ValidFormat(student_response, scorm12_regex.CMIFeedback, true)) {\n this.#student_response = student_response;\n }\n }\n\n /**\n * Getter for #result. Should only be called during JSON export.\n * @return {*}\n */\n get result() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#result;\n }\n\n /**\n * Setter for #result\n * @param {string} result\n */\n set result(result) {\n if (check12ValidFormat(result, scorm12_regex.CMIResult)) {\n this.#result = result;\n }\n }\n\n /**\n * Getter for #latency. Should only be called during JSON export.\n * @return {*}\n */\n get latency() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#latency;\n }\n\n /**\n * Setter for #latency\n * @param {string} latency\n */\n set latency(latency) {\n if (check12ValidFormat(latency, scorm12_regex.CMITimespan)) {\n this.#latency = latency;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n\n *\n * @return {\n * {\n * id: string,\n * time: string,\n * type: string,\n * weighting: string,\n * student_response: string,\n * result: string,\n * latency: string,\n * objectives: CMIArray,\n * correct_responses: CMIArray\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'time': this.time,\n 'type': this.type,\n 'weighting': this.weighting,\n 'student_response': this.student_response,\n 'result': this.result,\n 'latency': this.latency,\n 'objectives': this.objectives,\n 'correct_responses': this.correct_responses,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.objectives.n object\n * @extends BaseCMI\n */\nexport class CMIObjectivesObject extends BaseCMI {\n /**\n * Constructor for cmi.objectives.n\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: scorm12_constants.score_children,\n score_range: scorm12_regex.score_range,\n invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,\n errorClass: Scorm12ValidationError,\n });\n }\n\n #id = '';\n #status = '';\n\n /**\n * Getter for #id\n * @return {\"\"}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check12ValidFormat(id, scorm12_regex.CMIIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #status\n * @return {\"\"}\n */\n get status() {\n return this.#status;\n }\n\n /**\n * Setter for #status\n * @param {string} status\n */\n set status(status) {\n if (check12ValidFormat(status, scorm12_regex.CMIStatus2)) {\n this.#status = status;\n }\n }\n\n /**\n * toJSON for cmi.objectives.n\n * @return {\n * {\n * id: string,\n * status: string,\n * score: CMIScore\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'status': this.status,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.n.objectives.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsObjectivesObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.n.objectives.n\n */\n constructor() {\n super();\n }\n\n #id = '';\n\n /**\n * Getter for #id\n * @return {\"\"}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check12ValidFormat(id, scorm12_regex.CMIIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n.objectives.n\n * @return {\n * {\n * id: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.correct_responses.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsCorrectResponsesObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.correct_responses.n\n */\n constructor() {\n super();\n }\n\n #pattern = '';\n\n /**\n * Getter for #pattern\n * @return {string}\n */\n get pattern() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#pattern;\n }\n\n /**\n * Setter for #pattern\n * @param {string} pattern\n */\n set pattern(pattern) {\n if (check12ValidFormat(pattern, scorm12_regex.CMIFeedback, true)) {\n this.#pattern = pattern;\n }\n }\n\n /**\n * toJSON for cmi.interactions.correct_responses.n\n * @return {\n * {\n * pattern: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'pattern': this.pattern,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for AICC Navigation object\n */\nexport class NAV extends BaseCMI {\n /**\n * Constructor for NAV object\n */\n constructor() {\n super();\n }\n\n #event = '';\n\n /**\n * Getter for #event\n * @return {string}\n */\n get event() {\n return this.#event;\n }\n\n /**\n * Setter for #event\n * @param {string} event\n */\n set event(event) {\n if (check12ValidFormat(event, scorm12_regex.NAVEvent)) {\n this.#event = event;\n }\n }\n\n /**\n * toJSON for nav object\n * @return {\n * {\n * event: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'event': this.event,\n };\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\n\nconst global = {\n SCORM_TRUE: 'true',\n SCORM_FALSE: 'false',\n STATE_NOT_INITIALIZED: 0,\n STATE_INITIALIZED: 1,\n STATE_TERMINATED: 2,\n LOG_LEVEL_DEBUG: 1,\n LOG_LEVEL_INFO: 2,\n LOG_LEVEL_WARNING: 3,\n LOG_LEVEL_ERROR: 4,\n LOG_LEVEL_NONE: 5,\n};\n\nconst scorm12 = {\n // Children lists\n cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions',\n core_children: 'student_id,student_name,lesson_location,credit,lesson_status,entry,score,total_time,lesson_mode,exit,session_time',\n score_children: 'raw,min,max',\n comments_children: 'content,location,time',\n objectives_children: 'id,score,status',\n correct_responses_children: 'pattern',\n student_data_children: 'mastery_score,max_time_allowed,time_limit_action',\n student_preference_children: 'audio,language,speed,text',\n interactions_children: 'id,objectives,time,type,correct_responses,weighting,student_response,result,latency',\n\n error_descriptions: {\n '101': {\n basicMessage: 'General Exception',\n detailMessage: 'No specific error code exists to describe the error. Use LMSGetDiagnostic for more information',\n },\n '201': {\n basicMessage: 'Invalid argument error',\n detailMessage: 'Indicates that an argument represents an invalid data model element or is otherwise incorrect.',\n },\n '202': {\n basicMessage: 'Element cannot have children',\n detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in \"_children\" for a data model element that does not support the \"_children\" suffix.',\n },\n '203': {\n basicMessage: 'Element not an array - cannot have count',\n detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in \"_count\" for a data model element that does not support the \"_count\" suffix.',\n },\n '301': {\n basicMessage: 'Not initialized',\n detailMessage: 'Indicates that an API call was made before the call to lmsInitialize.',\n },\n '401': {\n basicMessage: 'Not implemented error',\n detailMessage: 'The data model element indicated in a call to LMSGetValue or LMSSetValue is valid, but was not implemented by this LMS. SCORM 1.2 defines a set of data model elements as being optional for an LMS to implement.',\n },\n '402': {\n basicMessage: 'Invalid set value, element is a keyword',\n detailMessage: 'Indicates that LMSSetValue was called on a data model element that represents a keyword (elements that end in \"_children\" and \"_count\").',\n },\n '403': {\n basicMessage: 'Element is read only',\n detailMessage: 'LMSSetValue was called with a data model element that can only be read.',\n },\n '404': {\n basicMessage: 'Element is write only',\n detailMessage: 'LMSGetValue was called on a data model element that can only be written to.',\n },\n '405': {\n basicMessage: 'Incorrect Data Type',\n detailMessage: 'LMSSetValue was called with a value that is not consistent with the data format of the supplied data model element.',\n },\n '407': {\n basicMessage: 'Element Value Out Of Range',\n detailMessage: 'The numeric value supplied to a LMSSetValue call is outside of the numeric range allowed for the supplied data model element.',\n },\n '408': {\n basicMessage: 'Data Model Dependency Not Established',\n detailMessage: 'Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.',\n },\n },\n};\n\nconst aicc = {\n ...scorm12, ...{\n cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions,evaluation',\n student_preference_children: 'audio,language,lesson_type,speed,text,text_color,text_location,text_size,video,windows',\n student_data_children: 'attempt_number,tries,mastery_score,max_time_allowed,time_limit_action',\n student_demographics_children: 'city,class,company,country,experience,familiar_name,instructor_name,title,native_language,state,street_address,telephone,years_experience',\n tries_children: 'time,status,score',\n attempt_records_children: 'score,lesson_status',\n paths_children: 'location_id,date,time,status,why_left,time_in_element',\n },\n};\n\nconst scorm2004 = {\n // Children lists\n cmi_children: '_version,comments_from_learner,comments_from_lms,completion_status,credit,entry,exit,interactions,launch_data,learner_id,learner_name,learner_preference,location,max_time_allowed,mode,objectives,progress_measure,scaled_passing_score,score,session_time,success_status,suspend_data,time_limit_action,total_time',\n comments_children: 'comment,timestamp,location',\n score_children: 'max,raw,scaled,min',\n objectives_children: 'progress_measure,completion_status,success_status,description,score,id',\n correct_responses_children: 'pattern',\n student_data_children: 'mastery_score,max_time_allowed,time_limit_action',\n student_preference_children: 'audio_level,audio_captioning,delivery_speed,language',\n interactions_children: 'id,type,objectives,timestamp,correct_responses,weighting,learner_response,result,latency,description',\n\n error_descriptions: {\n '0': {\n basicMessage: 'No Error',\n detailMessage: 'No error occurred, the previous API call was successful.',\n },\n '101': {\n basicMessage: 'General Exception',\n detailMessage: 'No specific error code exists to describe the error. Use GetDiagnostic for more information.',\n },\n '102': {\n basicMessage: 'General Initialization Failure',\n detailMessage: 'Call to Initialize failed for an unknown reason.',\n },\n '103': {\n basicMessage: 'Already Initialized',\n detailMessage: 'Call to Initialize failed because Initialize was already called.',\n },\n '104': {\n basicMessage: 'Content Instance Terminated',\n detailMessage: 'Call to Initialize failed because Terminate was already called.',\n },\n '111': {\n basicMessage: 'General Termination Failure',\n detailMessage: 'Call to Terminate failed for an unknown reason.',\n },\n '112': {\n basicMessage: 'Termination Before Initialization',\n detailMessage: 'Call to Terminate failed because it was made before the call to Initialize.',\n },\n '113': {\n basicMessage: 'Termination After Termination',\n detailMessage: 'Call to Terminate failed because Terminate was already called.',\n },\n '122': {\n basicMessage: 'Retrieve Data Before Initialization',\n detailMessage: 'Call to GetValue failed because it was made before the call to Initialize.',\n },\n '123': {\n basicMessage: 'Retrieve Data After Termination',\n detailMessage: 'Call to GetValue failed because it was made after the call to Terminate.',\n },\n '132': {\n basicMessage: 'Store Data Before Initialization',\n detailMessage: 'Call to SetValue failed because it was made before the call to Initialize.',\n },\n '133': {\n basicMessage: 'Store Data After Termination',\n detailMessage: 'Call to SetValue failed because it was made after the call to Terminate.',\n },\n '142': {\n basicMessage: 'Commit Before Initialization',\n detailMessage: 'Call to Commit failed because it was made before the call to Initialize.',\n },\n '143': {\n basicMessage: 'Commit After Termination',\n detailMessage: 'Call to Commit failed because it was made after the call to Terminate.',\n },\n '201': {\n basicMessage: 'General Argument Error',\n detailMessage: 'An invalid argument was passed to an API method (usually indicates that Initialize, Commit or Terminate did not receive the expected empty string argument.',\n },\n '301': {\n basicMessage: 'General Get Failure',\n detailMessage: 'Indicates a failed GetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '351': {\n basicMessage: 'General Set Failure',\n detailMessage: 'Indicates a failed SetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '391': {\n basicMessage: 'General Commit Failure',\n detailMessage: 'Indicates a failed Commit call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '401': {\n basicMessage: 'Undefined Data Model Element',\n detailMessage: 'The data model element name passed to GetValue or SetValue is not a valid SCORM data model element.',\n },\n '402': {\n basicMessage: 'Unimplemented Data Model Element',\n detailMessage: 'The data model element indicated in a call to GetValue or SetValue is valid, but was not implemented by this LMS. In SCORM 2004, this error would indicate an LMS that is not fully SCORM conformant.',\n },\n '403': {\n basicMessage: 'Data Model Element Value Not Initialized',\n detailMessage: 'Attempt to read a data model element that has not been initialized by the LMS or through a SetValue call. This error condition is often reached during normal execution of a SCO.',\n },\n '404': {\n basicMessage: 'Data Model Element Is Read Only',\n detailMessage: 'SetValue was called with a data model element that can only be read.',\n },\n '405': {\n basicMessage: 'Data Model Element Is Write Only',\n detailMessage: 'GetValue was called on a data model element that can only be written to.',\n },\n '406': {\n basicMessage: 'Data Model Element Type Mismatch',\n detailMessage: 'SetValue was called with a value that is not consistent with the data format of the supplied data model element.',\n },\n '407': {\n basicMessage: 'Data Model Element Value Out Of Range',\n detailMessage: 'The numeric value supplied to a SetValue call is outside of the numeric range allowed for the supplied data model element.',\n },\n '408': {\n basicMessage: 'Data Model Dependency Not Established',\n detailMessage: 'Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.',\n },\n },\n};\n\nconst APIConstants = {\n global: global,\n scorm12: scorm12,\n aicc: aicc,\n scorm2004: scorm2004,\n};\n\nexport default APIConstants;\n","// @flow\nconst global = {\n GENERAL: 101,\n INITIALIZATION_FAILED: 101,\n INITIALIZED: 101,\n TERMINATED: 101,\n TERMINATION_FAILURE: 101,\n TERMINATION_BEFORE_INIT: 101,\n MULTIPLE_TERMINATION: 101,\n RETRIEVE_BEFORE_INIT: 101,\n RETRIEVE_AFTER_TERM: 101,\n STORE_BEFORE_INIT: 101,\n STORE_AFTER_TERM: 101,\n COMMIT_BEFORE_INIT: 101,\n COMMIT_AFTER_TERM: 101,\n ARGUMENT_ERROR: 101,\n CHILDREN_ERROR: 101,\n COUNT_ERROR: 101,\n GENERAL_GET_FAILURE: 101,\n GENERAL_SET_FAILURE: 101,\n GENERAL_COMMIT_FAILURE: 101,\n UNDEFINED_DATA_MODEL: 101,\n UNIMPLEMENTED_ELEMENT: 101,\n VALUE_NOT_INITIALIZED: 101,\n INVALID_SET_VALUE: 101,\n READ_ONLY_ELEMENT: 101,\n WRITE_ONLY_ELEMENT: 101,\n TYPE_MISMATCH: 101,\n VALUE_OUT_OF_RANGE: 101,\n DEPENDENCY_NOT_ESTABLISHED: 101,\n};\n\nconst scorm12 = {\n ...global, ...{\n RETRIEVE_BEFORE_INIT: 301,\n STORE_BEFORE_INIT: 301,\n COMMIT_BEFORE_INIT: 301,\n ARGUMENT_ERROR: 201,\n CHILDREN_ERROR: 202,\n COUNT_ERROR: 203,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 401,\n VALUE_NOT_INITIALIZED: 301,\n INVALID_SET_VALUE: 402,\n READ_ONLY_ELEMENT: 403,\n WRITE_ONLY_ELEMENT: 404,\n TYPE_MISMATCH: 405,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n },\n};\n\nconst scorm2004 = {\n ...global, ...{\n INITIALIZATION_FAILED: 102,\n INITIALIZED: 103,\n TERMINATED: 104,\n TERMINATION_FAILURE: 111,\n TERMINATION_BEFORE_INIT: 112,\n MULTIPLE_TERMINATIONS: 113,\n RETRIEVE_BEFORE_INIT: 122,\n RETRIEVE_AFTER_TERM: 123,\n STORE_BEFORE_INIT: 132,\n STORE_AFTER_TERM: 133,\n COMMIT_BEFORE_INIT: 142,\n COMMIT_AFTER_TERM: 143,\n ARGUMENT_ERROR: 201,\n GENERAL_GET_FAILURE: 301,\n GENERAL_SET_FAILURE: 351,\n GENERAL_COMMIT_FAILURE: 391,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 402,\n VALUE_NOT_INITIALIZED: 403,\n READ_ONLY_ELEMENT: 404,\n WRITE_ONLY_ELEMENT: 405,\n TYPE_MISMATCH: 406,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n },\n};\n\nconst ErrorCodes = {\n scorm12: scorm12,\n scorm2004: scorm2004,\n};\n\nexport default ErrorCodes;\n","// @flow\n\nconst scorm12 = {\n CMIString256: '^.{0,255}$',\n CMIString4096: '^.{0,4096}$',\n CMITime: '^(?:[01]\\\\d|2[0123]):(?:[012345]\\\\d):(?:[012345]\\\\d)$', // eslint-disable-line\n CMITimespan: '^([0-9]{2,}):([0-9]{2}):([0-9]{2})(\\.[0-9]{1,2})?$', // eslint-disable-line\n CMIInteger: '^\\\\d+$',\n CMISInteger: '^-?([0-9]+)$',\n CMIDecimal: '^-?([0-9]{0,3})(\\.[0-9]*)?$', // eslint-disable-line\n CMIIdentifier: '^[\\\\u0021-\\\\u007E\\\\s]{0,255}$',\n CMIFeedback: '^.{0,255}$', // This must be redefined\n CMIIndex: '[._](\\\\d+).',\n\n // Vocabulary Data Type Definition\n CMIStatus: '^(passed|completed|failed|incomplete|browsed)$',\n CMIStatus2: '^(passed|completed|failed|incomplete|browsed|not attempted)$',\n CMIExit: '^(time-out|suspend|logout|)$',\n CMIType: '^(true-false|choice|fill-in|matching|performance|sequencing|likert|numeric)$',\n CMIResult: '^(correct|wrong|unanticipated|neutral|([0-9]{0,3})?(\\\\.[0-9]*)?)$', // eslint-disable-line\n NAVEvent: '^(previous|continue)$',\n\n // Data ranges\n score_range: '0#100',\n audio_range: '-1#100',\n speed_range: '-100#100',\n weighting_range: '-100#100',\n text_range: '-1#1',\n};\n\nconst aicc = {\n ...scorm12, ...{\n CMIIdentifier: '^\\\\w{1,255}$',\n },\n};\n\nconst scorm2004 = {\n CMIString200: '^[\\\\u0000-\\\\uFFFF]{0,200}$',\n CMIString250: '^[\\\\u0000-\\\\uFFFF]{0,250}$',\n CMIString1000: '^[\\\\u0000-\\\\uFFFF]{0,1000}$',\n CMIString4000: '^[\\\\u0000-\\\\uFFFF]{0,4000}$',\n CMIString64000: '^[\\\\u0000-\\\\uFFFF]{0,64000}$',\n CMILang: '^([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?$|^$', // eslint-disable-line\n CMILangString250: '^(\\{lang=([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?\\})?((?!\\{.*$).{0,250}$)?$', // eslint-disable-line\n CMILangcr: '^((\\{lang=([a-zA-Z]{2,3}|i|x)?(\\-[a-zA-Z0-9\\-]{2,8})?\\}))(.*?)$', // eslint-disable-line\n CMILangString250cr: '^((\\{lang=([a-zA-Z]{2,3}|i|x)?(\\-[a-zA-Z0-9\\-]{2,8})?\\})?(.{0,250})?)?$', // eslint-disable-line\n CMILangString4000: '^(\\{lang=([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?\\})?((?!\\{.*$).{0,4000}$)?$', // eslint-disable-line\n CMITime: '^(19[7-9]{1}[0-9]{1}|20[0-2]{1}[0-9]{1}|203[0-8]{1})((-(0[1-9]{1}|1[0-2]{1}))((-(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1}))(T([0-1]{1}[0-9]{1}|2[0-3]{1})((:[0-5]{1}[0-9]{1})((:[0-5]{1}[0-9]{1})((\\\\.[0-9]{1,2})((Z|([+|-]([0-1]{1}[0-9]{1}|2[0-3]{1})))(:[0-5]{1}[0-9]{1})?)?)?)?)?)?)?)?$',\n CMITimespan: '^P(?:([.,\\\\d]+)Y)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)W)?(?:([.,\\\\d]+)D)?(?:T?(?:([.,\\\\d]+)H)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)S)?)?$',\n CMIInteger: '^\\\\d+$',\n CMISInteger: '^-?([0-9]+)$',\n CMIDecimal: '^-?([0-9]{1,5})(\\\\.[0-9]{1,18})?$',\n CMIIdentifier: '^\\\\S{1,250}[a-zA-Z0-9]$',\n CMIShortIdentifier: '^[\\\\w\\\\.\\\\-\\\\_]{1,250}$', // eslint-disable-line\n CMILongIdentifier: '^(?:(?!urn:)\\\\S{1,4000}|urn:[A-Za-z0-9-]{1,31}:\\\\S{1,4000}|.{1,4000})$', // need to re-examine this\n CMIFeedback: '^.*$', // This must be redefined\n CMIIndex: '[._](\\\\d+).',\n CMIIndexStore: '.N(\\\\d+).',\n\n // Vocabulary Data Type Definition\n CMICStatus: '^(completed|incomplete|not attempted|unknown)$',\n CMISStatus: '^(passed|failed|unknown)$',\n CMIExit: '^(time-out|suspend|logout|normal)$',\n CMIType: '^(true-false|choice|fill-in|long-fill-in|matching|performance|sequencing|likert|numeric|other)$',\n CMIResult: '^(correct|incorrect|unanticipated|neutral|-?([0-9]{1,4})(\\\\.[0-9]{1,18})?)$',\n NAVEvent: '^(previous|continue|exit|exitAll|abandon|abandonAll|suspendAll|\\{target=\\\\S{0,200}[a-zA-Z0-9]\\}choice|jump)$', // eslint-disable-line\n NAVBoolean: '^(unknown|true|false$)',\n NAVTarget: '^(previous|continue|choice.{target=\\\\S{0,200}[a-zA-Z0-9]})$',\n\n // Data ranges\n scaled_range: '-1#1',\n audio_range: '0#*',\n speed_range: '0#*',\n text_range: '-1#1',\n progress_range: '0#1',\n};\n\nconst Regex = {\n aicc: aicc,\n scorm12: scorm12,\n scorm2004: scorm2004,\n};\n\nexport default Regex;\n","// @flow\n\nimport APIConstants from './constants/api_constants';\n\nconst scorm12_errors = APIConstants.scorm12.error_descriptions;\nconst aicc_errors = APIConstants.aicc.error_descriptions;\nconst scorm2004_errors = APIConstants.scorm2004.error_descriptions;\n\n/**\n * Base Validation Exception\n */\nexport class ValidationError extends Error {\n /**\n * Constructor to take in an error message and code\n * @param {number} errorCode\n * @param {string} errorMessage\n * @param {string} detailedMessage\n */\n constructor(errorCode: number, errorMessage: String, detailedMessage: String) {\n super(errorMessage);\n this.#errorCode = errorCode;\n this.#errorMessage = errorMessage;\n this.#detailedMessage = detailedMessage;\n }\n\n #errorCode;\n #errorMessage;\n #detailedMessage;\n\n /**\n * Getter for #errorCode\n * @return {number}\n */\n get errorCode() {\n return this.#errorCode;\n }\n\n /**\n * Getter for #errorMessage\n * @return {string}\n */\n get errorMessage() {\n return this.#errorMessage;\n }\n\n /**\n * Getter for #detailedMessage\n * @return {string}\n */\n get detailedMessage() {\n return this.#detailedMessage;\n }\n}\n\n/**\n * SCORM 1.2 Validation Error\n */\nexport class Scorm12ValidationError extends ValidationError {\n /**\n * Constructor to take in an error code\n * @param {number} errorCode\n */\n constructor(errorCode: number) {\n if ({}.hasOwnProperty.call(scorm12_errors, String(errorCode))) {\n super(errorCode, scorm12_errors[String(errorCode)].basicMessage, scorm12_errors[String(errorCode)].detailMessage);\n } else {\n super(101, scorm12_errors['101'].basicMessage, scorm12_errors['101'].detailMessage);\n }\n }\n}\n\n/**\n * AICC Validation Error\n */\nexport class AICCValidationError extends ValidationError {\n /**\n * Constructor to take in an error code\n * @param {number} errorCode\n */\n constructor(errorCode: number) {\n if ({}.hasOwnProperty.call(aicc_errors, String(errorCode))) {\n super(errorCode, aicc_errors[String(errorCode)].basicMessage, aicc_errors[String(errorCode)].detailMessage);\n } else {\n super(101, aicc_errors['101'].basicMessage, aicc_errors['101'].detailMessage);\n }\n }\n}\n\n/**\n * SCORM 2004 Validation Error\n */\nexport class Scorm2004ValidationError extends ValidationError {\n /**\n * Constructor to take in an error code\n * @param {number} errorCode\n */\n constructor(errorCode: number) {\n if ({}.hasOwnProperty.call(scorm2004_errors, String(errorCode))) {\n super(errorCode, scorm2004_errors[String(errorCode)].basicMessage, scorm2004_errors[String(errorCode)].detailMessage);\n } else {\n super(101, scorm2004_errors['101'].basicMessage, scorm2004_errors['101'].detailMessage);\n }\n }\n}\n","// @flow\nexport const SECONDS_PER_SECOND = 1.0;\nexport const SECONDS_PER_MINUTE = 60;\nexport const SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE;\nexport const SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;\n\nconst designations = [\n ['D', SECONDS_PER_DAY],\n ['H', SECONDS_PER_HOUR],\n ['M', SECONDS_PER_MINUTE],\n ['S', SECONDS_PER_SECOND],\n];\n\n/**\n * Converts a Number to a String of HH:MM:SS\n *\n * @param {Number} totalSeconds\n * @return {string}\n */\nexport function getSecondsAsHHMMSS(totalSeconds: Number) {\n // SCORM spec does not deal with negative durations, give zero back\n if (!totalSeconds || totalSeconds <= 0) {\n return '00:00:00';\n }\n\n const hours = Math.floor(totalSeconds / SECONDS_PER_HOUR);\n\n const dateObj = new Date(totalSeconds * 1000);\n const minutes = dateObj.getUTCMinutes();\n // make sure we add any possible decimal value\n const seconds = dateObj.getSeconds();\n const ms = totalSeconds % 1.0;\n let msStr = '';\n if (countDecimals(ms) > 0) {\n if (countDecimals(ms) > 2) {\n msStr = ms.toFixed(2);\n } else {\n msStr = String(ms);\n }\n msStr = '.' + msStr.split('.')[1];\n }\n\n return (hours + ':' + minutes + ':' + seconds).replace(/\\b\\d\\b/g,\n '0$&') + msStr;\n}\n\n/**\n * Calculate the number of seconds from ISO 8601 Duration\n *\n * @param {Number} seconds\n * @return {String}\n */\nexport function getSecondsAsISODuration(seconds: Number) {\n // SCORM spec does not deal with negative durations, give zero back\n if (!seconds || seconds <= 0) {\n return 'PT0S';\n }\n\n let duration = 'P';\n let remainder = seconds;\n\n designations.forEach(([sign, current_seconds]) => {\n let value = Math.floor(remainder / current_seconds);\n\n remainder = remainder % current_seconds;\n if (countDecimals(remainder) > 2) {\n remainder = Number(Number(remainder).toFixed(2));\n }\n // If we have anything left in the remainder, and we're currently adding\n // seconds to the duration, go ahead and add the decimal to the seconds\n if (sign === 'S' && remainder > 0) {\n value += remainder;\n }\n\n if (value) {\n if ((duration.indexOf('D') > 0 ||\n sign === 'H' || sign === 'M' || sign === 'S') &&\n duration.indexOf('T') === -1) {\n duration += 'T';\n }\n duration += `${value}${sign}`;\n }\n });\n\n return duration;\n}\n\n/**\n * Calculate the number of seconds from HH:MM:SS.DDDDDD\n *\n * @param {string} timeString\n * @param {RegExp} timeRegex\n * @return {number}\n */\nexport function getTimeAsSeconds(timeString: String, timeRegex: RegExp) {\n if (!timeString || typeof timeString !== 'string' ||\n !timeString.match(timeRegex)) {\n return 0;\n }\n const parts = timeString.split(':');\n const hours = Number(parts[0]);\n const minutes = Number(parts[1]);\n const seconds = Number(parts[2]);\n return (hours * 3600) + (minutes * 60) + seconds;\n}\n\n/**\n * Calculate the number of seconds from ISO 8601 Duration\n *\n * @param {string} duration\n * @param {RegExp} durationRegex\n * @return {number}\n */\nexport function getDurationAsSeconds(duration: String, durationRegex: RegExp) {\n if (!duration || !duration.match(durationRegex)) {\n return 0;\n }\n\n const [, years, months, , days, hours, minutes, seconds] = new RegExp(\n durationRegex).exec(duration) || [];\n\n let result = 0.0;\n\n result += (Number(seconds) * 1.0 || 0.0);\n result += (Number(minutes) * 60.0 || 0.0);\n result += (Number(hours) * 3600.0 || 0.0);\n result += (Number(days) * (60 * 60 * 24.0) || 0.0);\n result += (Number(years) * (60 * 60 * 24 * 365.0) || 0.0);\n\n return result;\n}\n\n/**\n * Adds together two ISO8601 Duration strings\n *\n * @param {string} first\n * @param {string} second\n * @param {RegExp} durationRegex\n * @return {string}\n */\nexport function addTwoDurations(\n first: String,\n second: String,\n durationRegex: RegExp) {\n return getSecondsAsISODuration(\n getDurationAsSeconds(first, durationRegex) +\n getDurationAsSeconds(second, durationRegex),\n );\n}\n\n/**\n * Add together two HH:MM:SS.DD strings\n *\n * @param {string} first\n * @param {string} second\n * @param {RegExp} timeRegex\n * @return {string}\n */\nexport function addHHMMSSTimeStrings(\n first: String,\n second: String,\n timeRegex: RegExp) {\n return getSecondsAsHHMMSS(\n getTimeAsSeconds(first, timeRegex) +\n getTimeAsSeconds(\n second, timeRegex),\n );\n}\n\n/**\n * Flatten a JSON object down to string paths for each values\n * @param {object} data\n * @return {object}\n */\nexport function flatten(data) {\n const result = {};\n\n /**\n * Recurse through the object\n * @param {*} cur\n * @param {*} prop\n */\n function recurse(cur, prop) {\n if (Object(cur) !== cur) {\n result[prop] = cur;\n } else if (Array.isArray(cur)) {\n for (let i = 0, l = cur.length; i < l; i++) {\n recurse(cur[i], prop + '[' + i + ']');\n if (l === 0) result[prop] = [];\n }\n } else {\n let isEmpty = true;\n for (const p in cur) {\n if ({}.hasOwnProperty.call(cur, p)) {\n isEmpty = false;\n recurse(cur[p], prop ? prop + '.' + p : p);\n }\n }\n if (isEmpty && prop) result[prop] = {};\n }\n }\n\n recurse(data, '');\n return result;\n}\n\n/**\n * Un-flatten a flat JSON object\n * @param {object} data\n * @return {object}\n */\nexport function unflatten(data) {\n 'use strict';\n if (Object(data) !== data || Array.isArray(data)) return data;\n const regex = /\\.?([^.[\\]]+)|\\[(\\d+)]/g;\n const result = {};\n for (const p in data) {\n if ({}.hasOwnProperty.call(data, p)) {\n let cur = result;\n let prop = '';\n let m = regex.exec(p);\n while (m) {\n cur = cur[prop] || (cur[prop] = (m[2] ? [] : {}));\n prop = m[2] || m[1];\n m = regex.exec(p);\n }\n cur[prop] = data[p];\n }\n }\n return result[''] || result;\n}\n\n/**\n * Counts the number of decimal places\n * @param {number} num\n * @return {number}\n */\nexport function countDecimals(num: number) {\n if (Math.floor(num) === num || String(num).indexOf('.') < 0) return 0;\n const parts = num.toString().split('.')[1];\n return parts.length || 0;\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import AICC from '../AICC';\n\nwindow.AICC = AICC;\n"],"names":["FUNC_ERROR_TEXT","NAN","symbolTag","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","parseInt","freeGlobal","global","Object","freeSelf","self","root","Function","objectProto","prototype","objectToString","toString","nativeMax","Math","max","nativeMin","min","now","Date","debounce","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","TypeError","toNumber","isObject","invokeFunc","time","args","thisArg","undefined","apply","leadingEdge","setTimeout","timerExpired","remainingWait","timeSinceLastCall","timeSinceLastInvoke","shouldInvoke","trailingEdge","cancel","clearTimeout","flush","debounced","isInvoking","arguments","value","type","isObjectLike","isSymbol","call","other","valueOf","replace","isBinary","test","slice","module","exports","Scorm12API","CMI","CMIAttemptRecordsObject","CMIEvaluationCommentsObject","CMITriesObject","NAV","AICC","settings","finalSettings","mastery_override","cmi","nav","CMIElement","foundFirstIndex","newChild","stringMatches","newAPI","CMIArray","ValidationError","ErrorCodes","APIConstants","unflatten","global_constants","scorm12_error_codes","scorm12","BaseAPI","error_codes","autocommit","autocommitSeconds","asyncCommit","sendBeaconCommit","lmsCommitUrl","dataCommitFormat","commitRequestDataType","autoProgress","logLevel","LOG_LEVEL_ERROR","selfReportSessionTime","alwaysSendTotalTime","strict_errors","xhrHeaders","xhrWithCredentials","responseHandler","xhr","JSON","parse","responseText","hasOwnProperty","status","SCORM_TRUE","errorCode","SCORM_FALSE","requestHandler","commitObject","onLogMessage","messageLevel","logMessage","console","error","LOG_LEVEL_WARNING","warn","LOG_LEVEL_INFO","info","LOG_LEVEL_DEBUG","debug","log","currentState","STATE_NOT_INITIALIZED","lastErrorCode","listenerArray","apiLogLevel","callbackName","initializeMessage","terminationMessage","returnValue","isInitialized","throwSCORMError","INITIALIZED","isTerminated","TERMINATED","setStartTime","STATE_INITIALIZED","processListeners","apiLog","clearSCORMError","checkTerminated","checkState","TERMINATION_BEFORE_INIT","MULTIPLE_TERMINATION","STATE_TERMINATED","storeData","RETRIEVE_BEFORE_INIT","RETRIEVE_AFTER_TERM","getCMIValue","e","message","GENERAL","commitCallback","String","STORE_BEFORE_INIT","STORE_AFTER_TERM","setCMIValue","scheduleCommit","clearScheduledCommit","COMMIT_BEFORE_INIT","COMMIT_AFTER_TERM","CMIErrorCode","getLmsErrorMessageDetails","beforeInitError","afterTermError","isNotInitialized","functionName","formatMessage","baseLength","messageString","fillChars","length","i","CMIElementBaseLength","j","str","tester","match","refObject","attribute","getOwnPropertyDescriptor","getPrototypeOf","_errorNumber","_detail","Error","_CMIElement","_value","methodName","scorm2004","structure","split","invalidErrorMessage","invalidErrorCode","UNDEFINED_DATA_MODEL","substr","_isTargetValid","READ_ONLY_ELEMENT","_checkObjectHasProperty","validateCorrectResponse","index","isNaN","item","childArray","getChildElement","initialized","initialize","push","_foundFirstIndex","uninitializedErrorMessage","target","VALUE_NOT_INITIALIZED","CHILDREN_ERROR","COUNT_ERROR","listenerName","callback","listenerFunctions","listenerSplit","removeIndex","findIndex","obj","splice","filter","listener","functionsMatch","listenerHasCMIElement","CMIElementsMatch","substring","indexOf","errorNumber","success","_calculateTotalTime","json","testPattern","a","c","a_pattern","a_match","c_match","a_num","Number","c_num","int_pattern","obj_pattern","keys","map","key","sort","b","d","forEach","element","loadFromJSON","startingData","currentCMIElement","constructor","stringify","renderCMIToJSONString","_terminateCommit","url","params","immediate","api","process","genericError","httpReq","XMLHttpRequest","open","header","setRequestHeader","withCredentials","onload","Array","send","join","headers","blob","Blob","navigator","sendBeacon","when","ScheduledCommit","API","wrapper","bind","commit","CMIInteractionsCorrectResponsesObject","CMIInteractionsObject","CMIInteractionsObjectivesObject","CMIObjectivesObject","Utilities","scorm12_constants","LMSInitialize","lmsInitialize","LMSFinish","lmsFinish","LMSGetValue","lmsGetValue","LMSSetValue","lmsSetValue","LMSCommit","lmsCommit","LMSGetLastError","lmsGetLastError","LMSGetErrorString","lmsGetErrorString","LMSGetDiagnostic","lmsGetDiagnostic","terminate","event","getValue","setValue","getLastError","getErrorString","getDiagnostic","_commonSetCMIValue","_commonGetCMIValue","detail","basicMessage","detailMessage","error_descriptions","terminateCommit","cmiExport","renderCMIToJSONObject","core","total_time","getCurrentTotalTime","flattened","flatten","originalStatus","lesson_status","lesson_mode","credit","student_data","mastery_score","score","raw","parseFloat","renderCommitCMI","processHttpRequest","Scorm12CMI","BaseCMI","checkValidFormat","CMIScore","Regex","AICCValidationError","aicc_constants","aicc","aicc_regex","aicc_error_codes","throwReadOnlyError","checkAICCValidFormat","regexPattern","allowEmptyString","TYPE_MISMATCH","cmi_children","student_preference","AICCStudentPreferences","AICCCMIStudentData","student_demographics","CMIStudentDemographics","evaluation","CMIEvaluation","paths","CMIPaths","jsonString","suspend_data","launch_data","comments","comments_from_lms","objectives","interactions","CMIEvaluationComments","children","comments_children","INVALID_SET_VALUE","errorClass","student_preference_children","windows","lesson_type","CMIString256","text_color","text_location","text_size","video","audio","language","speed","text","CMIStudentPreference","student_data_children","tries","CMITries","tries_during_lesson","max_time_allowed","time_limit_action","CMIStudentData","student_demographics_children","city","clazz","company","country","experience","familiar_name","instructor_name","title","native_language","state","street_address","telephone","years_experience","class","paths_children","CMIPathsObject","location_id","date","CMITime","CMIStatus2","why_left","time_in_element","tries_children","score_children","score_range","invalidTypeCode","invalidRangeCode","VALUE_OUT_OF_RANGE","CMIAttemptRecords","attempt_records_children","content","location","scorm12_regex","formatRegex","RegExp","matches","checkValidRange","rangePattern","ranges","getTime","decimalRegex","CMIDecimal","_children","_count","Scorm12ValidationError","Util","throwWriteOnlyError","WRITE_ONLY_ELEMENT","throwInvalidValueError","check12ValidFormat","check12ValidRange","CMICore","CMIObjectives","CMIInteractions","_version","CMIString4096","start_time","core_children","student_id","student_name","lesson_location","CMIStatus","entry","exit","CMIExit","session_time","CMITimespan","sessionTime","startTime","seconds","getSecondsAsHHMMSS","addHHMMSSTimeStrings","objectives_children","CMISInteger","audio_range","speed_range","text_range","interactions_children","correct_responses","correct_responses_children","id","CMIIdentifier","CMIType","weighting","weighting_range","student_response","CMIFeedback","CMIResult","latency","pattern","NAVEvent","LOG_LEVEL_NONE","INITIALIZATION_FAILED","TERMINATION_FAILURE","ARGUMENT_ERROR","GENERAL_GET_FAILURE","GENERAL_SET_FAILURE","GENERAL_COMMIT_FAILURE","UNIMPLEMENTED_ELEMENT","DEPENDENCY_NOT_ESTABLISHED","MULTIPLE_TERMINATIONS","CMIInteger","CMIIndex","CMIString200","CMIString250","CMIString1000","CMIString4000","CMIString64000","CMILang","CMILangString250","CMILangcr","CMILangString250cr","CMILangString4000","CMIShortIdentifier","CMILongIdentifier","CMIIndexStore","CMICStatus","CMISStatus","NAVBoolean","NAVTarget","scaled_range","progress_range","scorm12_errors","aicc_errors","scorm2004_errors","errorMessage","detailedMessage","Scorm2004ValidationError","SECONDS_PER_SECOND","SECONDS_PER_MINUTE","SECONDS_PER_HOUR","SECONDS_PER_DAY","designations","totalSeconds","hours","floor","dateObj","minutes","getUTCMinutes","getSeconds","ms","msStr","countDecimals","toFixed","getSecondsAsISODuration","duration","remainder","sign","current_seconds","getTimeAsSeconds","timeString","timeRegex","parts","getDurationAsSeconds","durationRegex","exec","years","months","days","addTwoDurations","first","second","data","recurse","cur","prop","isArray","l","isEmpty","p","regex","m","num","window"],"sourceRoot":""}
\ No newline at end of file
diff --git a/dist/aicc.min.js b/dist/aicc.min.js
index c6f2fd3..5707134 100644
--- a/dist/aicc.min.js
+++ b/dist/aicc.min.js
@@ -1,7296 +1,40 @@
-(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i
- * Build: `lodash modularize exports="npm" -o ./`
- * Copyright jQuery Foundation and other contributors
- * Released under MIT license
- * Based on Underscore.js 1.8.3
- * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- */
-
-/** Used as the `TypeError` message for "Functions" methods. */
-var FUNC_ERROR_TEXT = 'Expected a function';
-
-/** Used as references for various `Number` constants. */
-var NAN = 0 / 0;
-
-/** `Object#toString` result references. */
-var symbolTag = '[object Symbol]';
-
-/** Used to match leading and trailing whitespace. */
-var reTrim = /^\s+|\s+$/g;
-
-/** Used to detect bad signed hexadecimal string values. */
-var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
-
-/** Used to detect binary string values. */
-var reIsBinary = /^0b[01]+$/i;
-
-/** Used to detect octal string values. */
-var reIsOctal = /^0o[0-7]+$/i;
-
-/** Built-in method references without a dependency on `root`. */
-var freeParseInt = parseInt;
-
-/** Detect free variable `global` from Node.js. */
-var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
-
-/** Detect free variable `self`. */
-var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
-
-/** Used as a reference to the global object. */
-var root = freeGlobal || freeSelf || Function('return this')();
-
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objectToString = objectProto.toString;
-
-/* Built-in method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max,
- nativeMin = Math.min;
-
-/**
- * Gets the timestamp of the number of milliseconds that have elapsed since
- * the Unix epoch (1 January 1970 00:00:00 UTC).
- *
- * @static
- * @memberOf _
- * @since 2.4.0
- * @category Date
- * @returns {number} Returns the timestamp.
- * @example
- *
- * _.defer(function(stamp) {
- * console.log(_.now() - stamp);
- * }, _.now());
- * // => Logs the number of milliseconds it took for the deferred invocation.
- */
-var now = function() {
- return root.Date.now();
-};
-
-/**
- * Creates a debounced function that delays invoking `func` until after `wait`
- * milliseconds have elapsed since the last time the debounced function was
- * invoked. The debounced function comes with a `cancel` method to cancel
- * delayed `func` invocations and a `flush` method to immediately invoke them.
- * Provide `options` to indicate whether `func` should be invoked on the
- * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
- * with the last arguments provided to the debounced function. Subsequent
- * calls to the debounced function return the result of the last `func`
- * invocation.
- *
- * **Note:** If `leading` and `trailing` options are `true`, `func` is
- * invoked on the trailing edge of the timeout only if the debounced function
- * is invoked more than once during the `wait` timeout.
- *
- * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
- * until to the next tick, similar to `setTimeout` with a timeout of `0`.
- *
- * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
- * for details over the differences between `_.debounce` and `_.throttle`.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Function
- * @param {Function} func The function to debounce.
- * @param {number} [wait=0] The number of milliseconds to delay.
- * @param {Object} [options={}] The options object.
- * @param {boolean} [options.leading=false]
- * Specify invoking on the leading edge of the timeout.
- * @param {number} [options.maxWait]
- * The maximum time `func` is allowed to be delayed before it's invoked.
- * @param {boolean} [options.trailing=true]
- * Specify invoking on the trailing edge of the timeout.
- * @returns {Function} Returns the new debounced function.
- * @example
- *
- * // Avoid costly calculations while the window size is in flux.
- * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
- *
- * // Invoke `sendMail` when clicked, debouncing subsequent calls.
- * jQuery(element).on('click', _.debounce(sendMail, 300, {
- * 'leading': true,
- * 'trailing': false
- * }));
- *
- * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
- * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
- * var source = new EventSource('/stream');
- * jQuery(source).on('message', debounced);
- *
- * // Cancel the trailing debounced invocation.
- * jQuery(window).on('popstate', debounced.cancel);
- */
-function debounce(func, wait, options) {
- var lastArgs,
- lastThis,
- maxWait,
- result,
- timerId,
- lastCallTime,
- lastInvokeTime = 0,
- leading = false,
- maxing = false,
- trailing = true;
-
- if (typeof func != 'function') {
- throw new TypeError(FUNC_ERROR_TEXT);
- }
- wait = toNumber(wait) || 0;
- if (isObject(options)) {
- leading = !!options.leading;
- maxing = 'maxWait' in options;
- maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
- trailing = 'trailing' in options ? !!options.trailing : trailing;
- }
-
- function invokeFunc(time) {
- var args = lastArgs,
- thisArg = lastThis;
-
- lastArgs = lastThis = undefined;
- lastInvokeTime = time;
- result = func.apply(thisArg, args);
- return result;
- }
-
- function leadingEdge(time) {
- // Reset any `maxWait` timer.
- lastInvokeTime = time;
- // Start the timer for the trailing edge.
- timerId = setTimeout(timerExpired, wait);
- // Invoke the leading edge.
- return leading ? invokeFunc(time) : result;
- }
-
- function remainingWait(time) {
- var timeSinceLastCall = time - lastCallTime,
- timeSinceLastInvoke = time - lastInvokeTime,
- result = wait - timeSinceLastCall;
-
- return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
- }
-
- function shouldInvoke(time) {
- var timeSinceLastCall = time - lastCallTime,
- timeSinceLastInvoke = time - lastInvokeTime;
-
- // Either this is the first call, activity has stopped and we're at the
- // trailing edge, the system time has gone backwards and we're treating
- // it as the trailing edge, or we've hit the `maxWait` limit.
- return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
- (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
- }
-
- function timerExpired() {
- var time = now();
- if (shouldInvoke(time)) {
- return trailingEdge(time);
- }
- // Restart the timer.
- timerId = setTimeout(timerExpired, remainingWait(time));
- }
-
- function trailingEdge(time) {
- timerId = undefined;
-
- // Only invoke if we have `lastArgs` which means `func` has been
- // debounced at least once.
- if (trailing && lastArgs) {
- return invokeFunc(time);
- }
- lastArgs = lastThis = undefined;
- return result;
- }
-
- function cancel() {
- if (timerId !== undefined) {
- clearTimeout(timerId);
- }
- lastInvokeTime = 0;
- lastArgs = lastCallTime = lastThis = timerId = undefined;
- }
-
- function flush() {
- return timerId === undefined ? result : trailingEdge(now());
- }
-
- function debounced() {
- var time = now(),
- isInvoking = shouldInvoke(time);
-
- lastArgs = arguments;
- lastThis = this;
- lastCallTime = time;
-
- if (isInvoking) {
- if (timerId === undefined) {
- return leadingEdge(lastCallTime);
- }
- if (maxing) {
- // Handle invocations in a tight loop.
- timerId = setTimeout(timerExpired, wait);
- return invokeFunc(lastCallTime);
- }
- }
- if (timerId === undefined) {
- timerId = setTimeout(timerExpired, wait);
- }
- return result;
- }
- debounced.cancel = cancel;
- debounced.flush = flush;
- return debounced;
-}
-
-/**
- * Checks if `value` is the
- * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
- * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(_.noop);
- * // => true
- *
- * _.isObject(null);
- * // => false
- */
-function isObject(value) {
- var type = typeof value;
- return !!value && (type == 'object' || type == 'function');
-}
-
-/**
- * Checks if `value` is object-like. A value is object-like if it's not `null`
- * and has a `typeof` result of "object".
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- * @example
- *
- * _.isObjectLike({});
- * // => true
- *
- * _.isObjectLike([1, 2, 3]);
- * // => true
- *
- * _.isObjectLike(_.noop);
- * // => false
- *
- * _.isObjectLike(null);
- * // => false
- */
-function isObjectLike(value) {
- return !!value && typeof value == 'object';
-}
-
-/**
- * Checks if `value` is classified as a `Symbol` primitive or object.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
- * @example
- *
- * _.isSymbol(Symbol.iterator);
- * // => true
- *
- * _.isSymbol('abc');
- * // => false
- */
-function isSymbol(value) {
- return typeof value == 'symbol' ||
- (isObjectLike(value) && objectToString.call(value) == symbolTag);
-}
-
-/**
- * Converts `value` to a number.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to process.
- * @returns {number} Returns the number.
- * @example
- *
- * _.toNumber(3.2);
- * // => 3.2
- *
- * _.toNumber(Number.MIN_VALUE);
- * // => 5e-324
- *
- * _.toNumber(Infinity);
- * // => Infinity
- *
- * _.toNumber('3.2');
- * // => 3.2
- */
-function toNumber(value) {
- if (typeof value == 'number') {
- return value;
- }
- if (isSymbol(value)) {
- return NAN;
- }
- if (isObject(value)) {
- var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
- value = isObject(other) ? (other + '') : other;
- }
- if (typeof value != 'string') {
- return value === 0 ? value : +value;
- }
- value = value.replace(reTrim, '');
- var isBinary = reIsBinary.test(value);
- return (isBinary || reIsOctal.test(value))
- ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
- : (reIsBadHex.test(value) ? NAN : +value);
-}
-
-module.exports = debounce;
-
-}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{}],2:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _Scorm12API2 = _interopRequireDefault(require("./Scorm12API"));
-
-var _aicc_cmi = require("./cmi/aicc_cmi");
-
-var _scorm12_cmi = require("./cmi/scorm12_cmi");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); }
-
-function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-/**
- * The AICC API class
- */
-var AICC = /*#__PURE__*/function (_Scorm12API) {
- _inherits(AICC, _Scorm12API);
-
- var _super = _createSuper(AICC);
-
- /**
- * Constructor to create AICC API object
- * @param {object} settings
- */
- function AICC(settings) {
- var _this;
-
- _classCallCheck(this, AICC);
-
- var finalSettings = _objectSpread(_objectSpread({}, {
- mastery_override: false
- }), settings);
-
- _this = _super.call(this, finalSettings);
- _this.cmi = new _aicc_cmi.CMI();
- _this.nav = new _scorm12_cmi.NAV();
- return _this;
- }
- /**
- * Gets or builds a new child element to add to the array.
- *
- * @param {string} CMIElement
- * @param {any} value
- * @param {boolean} foundFirstIndex
- * @return {object}
- */
-
-
- _createClass(AICC, [{
- key: "getChildElement",
- value: function getChildElement(CMIElement, value, foundFirstIndex) {
- var newChild = _get(_getPrototypeOf(AICC.prototype), "getChildElement", this).call(this, CMIElement, value, foundFirstIndex);
-
- if (!newChild) {
- if (this.stringMatches(CMIElement, 'cmi\\.evaluation\\.comments\\.\\d+')) {
- newChild = new _aicc_cmi.CMIEvaluationCommentsObject();
- } else if (this.stringMatches(CMIElement, 'cmi\\.student_data\\.tries\\.\\d+')) {
- newChild = new _aicc_cmi.CMITriesObject();
- } else if (this.stringMatches(CMIElement, 'cmi\\.student_data\\.attempt_records\\.\\d+')) {
- newChild = new _aicc_cmi.CMIAttemptRecordsObject();
- }
- }
-
- return newChild;
- }
- /**
- * Replace the whole API with another
- *
- * @param {AICC} newAPI
- */
-
- }, {
- key: "replaceWithAnotherScormAPI",
- value: function replaceWithAnotherScormAPI(newAPI) {
- // Data Model
- this.cmi = newAPI.cmi;
- this.nav = newAPI.nav;
- }
- }]);
-
- return AICC;
-}(_Scorm12API2["default"]);
-
-exports["default"] = AICC;
-
-},{"./Scorm12API":4,"./cmi/aicc_cmi":5,"./cmi/scorm12_cmi":7}],3:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _common = require("./cmi/common");
-
-var _exceptions = require("./exceptions");
-
-var _error_codes2 = _interopRequireDefault(require("./constants/error_codes"));
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-var _utilities = require("./utilities");
-
-var _lodash = _interopRequireDefault(require("lodash.debounce"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
-
-function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
-
-function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
-
-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; }
-
-function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
-
-function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
-
-function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
-
-function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
-
-function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-
-function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
-
-function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
-
-function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-
-var global_constants = _api_constants["default"].global;
-var scorm12_error_codes = _error_codes2["default"].scorm12;
-/**
- * Base API class for AICC, SCORM 1.2, and SCORM 2004. Should be considered
- * abstract, and never initialized on it's own.
- */
-
-var _timeout = /*#__PURE__*/new WeakMap();
-
-var _error_codes = /*#__PURE__*/new WeakMap();
-
-var _settings = /*#__PURE__*/new WeakMap();
-
-var BaseAPI = /*#__PURE__*/function () {
- /**
- * Constructor for Base API class. Sets some shared API fields, as well as
- * sets up options for the API.
- * @param {object} error_codes
- * @param {object} settings
- */
- function BaseAPI(error_codes, settings) {
- _classCallCheck(this, BaseAPI);
-
- _classPrivateFieldInitSpec(this, _timeout, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(this, _error_codes, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(this, _settings, {
- writable: true,
- value: {
- autocommit: false,
- autocommitSeconds: 10,
- asyncCommit: false,
- sendBeaconCommit: false,
- lmsCommitUrl: false,
- dataCommitFormat: 'json',
- // valid formats are 'json' or 'flattened', 'params'
- commitRequestDataType: 'application/json;charset=UTF-8',
- autoProgress: false,
- logLevel: global_constants.LOG_LEVEL_ERROR,
- selfReportSessionTime: false,
- alwaysSendTotalTime: false,
- strict_errors: true,
- xhrHeaders: {},
- xhrWithCredentials: false,
- responseHandler: function responseHandler(xhr) {
- var result;
-
- if (typeof xhr !== 'undefined') {
- result = JSON.parse(xhr.responseText);
-
- if (result === null || !{}.hasOwnProperty.call(result, 'result')) {
- result = {};
-
- if (xhr.status === 200) {
- result.result = global_constants.SCORM_TRUE;
- result.errorCode = 0;
- } else {
- result.result = global_constants.SCORM_FALSE;
- result.errorCode = 101;
- }
- }
- }
-
- return result;
- },
- onLogMessage: function onLogMessage(messageLevel, logMessage) {
- switch (messageLevel) {
- case global_constants.LOG_LEVEL_ERROR:
- console.error(logMessage);
- break;
-
- case global_constants.LOG_LEVEL_WARNING:
- console.warn(logMessage);
- break;
-
- case global_constants.LOG_LEVEL_INFO:
- console.info(logMessage);
- break;
-
- case global_constants.LOG_LEVEL_DEBUG:
- if (console.debug) {
- console.debug(logMessage);
- } else {
- console.log(logMessage);
- }
-
- break;
- }
- }
- }
- });
-
- _defineProperty(this, "cmi", void 0);
-
- _defineProperty(this, "startingData", void 0);
-
- if ((this instanceof BaseAPI ? this.constructor : void 0) === BaseAPI) {
- throw new TypeError('Cannot construct BaseAPI instances directly');
- }
-
- this.currentState = global_constants.STATE_NOT_INITIALIZED;
- this.lastErrorCode = 0;
- this.listenerArray = [];
-
- _classPrivateFieldSet(this, _timeout, null);
-
- _classPrivateFieldSet(this, _error_codes, error_codes);
-
- this.settings = settings;
- this.apiLogLevel = this.settings.logLevel;
- this.selfReportSessionTime = this.settings.selfReportSessionTime;
- }
- /**
- * Initialize the API
- * @param {string} callbackName
- * @param {string} initializeMessage
- * @param {string} terminationMessage
- * @return {string}
- */
-
-
- _createClass(BaseAPI, [{
- key: "initialize",
- value: function initialize(callbackName, initializeMessage, terminationMessage) {
- var returnValue = global_constants.SCORM_FALSE;
-
- if (this.isInitialized()) {
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).INITIALIZED, initializeMessage);
- } else if (this.isTerminated()) {
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).TERMINATED, terminationMessage);
- } else {
- if (this.selfReportSessionTime) {
- this.cmi.setStartTime();
- }
-
- this.currentState = global_constants.STATE_INITIALIZED;
- this.lastErrorCode = 0;
- returnValue = global_constants.SCORM_TRUE;
- this.processListeners(callbackName);
- }
-
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- this.clearSCORMError(returnValue);
- return returnValue;
- }
- /**
- * Getter for #error_codes
- * @return {object}
- */
-
- }, {
- key: "error_codes",
- get: function get() {
- return _classPrivateFieldGet(this, _error_codes);
- }
- /**
- * Getter for #settings
- * @return {object}
- */
-
- }, {
- key: "settings",
- get: function get() {
- return _classPrivateFieldGet(this, _settings);
- }
- /**
- * Setter for #settings
- * @param {object} settings
- */
- ,
- set: function set(settings) {
- _classPrivateFieldSet(this, _settings, _objectSpread(_objectSpread({}, _classPrivateFieldGet(this, _settings)), settings));
- }
- /**
- * Terminates the current run of the API
- * @param {string} callbackName
- * @param {boolean} checkTerminated
- * @return {string}
- */
-
- }, {
- key: "terminate",
- value: function terminate(callbackName, checkTerminated) {
- var returnValue = global_constants.SCORM_FALSE;
-
- if (this.checkState(checkTerminated, _classPrivateFieldGet(this, _error_codes).TERMINATION_BEFORE_INIT, _classPrivateFieldGet(this, _error_codes).MULTIPLE_TERMINATION)) {
- this.currentState = global_constants.STATE_TERMINATED;
- var result = this.storeData(true);
-
- if (!this.settings.sendBeaconCommit && !this.settings.asyncCommit && typeof result.errorCode !== 'undefined' && result.errorCode > 0) {
- this.throwSCORMError(result.errorCode);
- }
-
- returnValue = typeof result !== 'undefined' && result.result ? result.result : global_constants.SCORM_FALSE;
- if (checkTerminated) this.lastErrorCode = 0;
- returnValue = global_constants.SCORM_TRUE;
- this.processListeners(callbackName);
- }
-
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- this.clearSCORMError(returnValue);
- return returnValue;
- }
- /**
- * Get the value of the CMIElement.
- *
- * @param {string} callbackName
- * @param {boolean} checkTerminated
- * @param {string} CMIElement
- * @return {string}
- */
-
- }, {
- key: "getValue",
- value: function getValue(callbackName, checkTerminated, CMIElement) {
- var returnValue;
-
- if (this.checkState(checkTerminated, _classPrivateFieldGet(this, _error_codes).RETRIEVE_BEFORE_INIT, _classPrivateFieldGet(this, _error_codes).RETRIEVE_AFTER_TERM)) {
- if (checkTerminated) this.lastErrorCode = 0;
-
- try {
- returnValue = this.getCMIValue(CMIElement);
- } catch (e) {
- if (e instanceof _exceptions.ValidationError) {
- this.lastErrorCode = e.errorCode;
- returnValue = global_constants.SCORM_FALSE;
- } else {
- if (e.message) {
- console.error(e.message);
- } else {
- console.error(e);
- }
-
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).GENERAL);
- }
- }
-
- this.processListeners(callbackName, CMIElement);
- }
-
- this.apiLog(callbackName, CMIElement, ': returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- this.clearSCORMError(returnValue);
- return returnValue;
- }
- /**
- * Sets the value of the CMIElement.
- *
- * @param {string} callbackName
- * @param {string} commitCallback
- * @param {boolean} checkTerminated
- * @param {string} CMIElement
- * @param {*} value
- * @return {string}
- */
-
- }, {
- key: "setValue",
- value: function setValue(callbackName, commitCallback, checkTerminated, CMIElement, value) {
- if (value !== undefined) {
- value = String(value);
- }
-
- var returnValue = global_constants.SCORM_FALSE;
-
- if (this.checkState(checkTerminated, _classPrivateFieldGet(this, _error_codes).STORE_BEFORE_INIT, _classPrivateFieldGet(this, _error_codes).STORE_AFTER_TERM)) {
- if (checkTerminated) this.lastErrorCode = 0;
-
- try {
- returnValue = this.setCMIValue(CMIElement, value);
- } catch (e) {
- if (e instanceof _exceptions.ValidationError) {
- this.lastErrorCode = e.errorCode;
- returnValue = global_constants.SCORM_FALSE;
- } else {
- if (e.message) {
- console.error(e.message);
- } else {
- console.error(e);
- }
-
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).GENERAL);
- }
- }
-
- this.processListeners(callbackName, CMIElement, value);
- }
-
- if (returnValue === undefined) {
- returnValue = global_constants.SCORM_FALSE;
- } // If we didn't have any errors while setting the data, go ahead and
- // schedule a commit, if autocommit is turned on
-
-
- if (String(this.lastErrorCode) === '0') {
- if (this.settings.autocommit && !_classPrivateFieldGet(this, _timeout)) {
- this.scheduleCommit(this.settings.autocommitSeconds * 1000, commitCallback);
- }
- }
-
- this.apiLog(callbackName, CMIElement, ': ' + value + ': result: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- this.clearSCORMError(returnValue);
- return returnValue;
- }
- /**
- * Orders LMS to store all content parameters
- * @param {string} callbackName
- * @param {boolean} checkTerminated
- * @return {string}
- */
-
- }, {
- key: "commit",
- value: function commit(callbackName, checkTerminated) {
- this.clearScheduledCommit();
- var returnValue = global_constants.SCORM_FALSE;
-
- if (this.checkState(checkTerminated, _classPrivateFieldGet(this, _error_codes).COMMIT_BEFORE_INIT, _classPrivateFieldGet(this, _error_codes).COMMIT_AFTER_TERM)) {
- var result = this.storeData(false);
-
- if (!this.settings.sendBeaconCommit && !this.settings.asyncCommit && result.errorCode && result.errorCode > 0) {
- this.throwSCORMError(result.errorCode);
- }
-
- returnValue = typeof result !== 'undefined' && result.result ? result.result : global_constants.SCORM_FALSE;
- this.apiLog(callbackName, 'HttpRequest', ' Result: ' + returnValue, global_constants.LOG_LEVEL_DEBUG);
- if (checkTerminated) this.lastErrorCode = 0;
- this.processListeners(callbackName);
- }
-
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- this.clearSCORMError(returnValue);
- return returnValue;
- }
- /**
- * Returns last error code
- * @param {string} callbackName
- * @return {string}
- */
-
- }, {
- key: "getLastError",
- value: function getLastError(callbackName) {
- var returnValue = String(this.lastErrorCode);
- this.processListeners(callbackName);
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- return returnValue;
- }
- /**
- * Returns the errorNumber error description
- *
- * @param {string} callbackName
- * @param {(string|number)} CMIErrorCode
- * @return {string}
- */
-
- }, {
- key: "getErrorString",
- value: function getErrorString(callbackName, CMIErrorCode) {
- var returnValue = '';
-
- if (CMIErrorCode !== null && CMIErrorCode !== '') {
- returnValue = this.getLmsErrorMessageDetails(CMIErrorCode);
- this.processListeners(callbackName);
- }
-
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- return returnValue;
- }
- /**
- * Returns a comprehensive description of the errorNumber error.
- *
- * @param {string} callbackName
- * @param {(string|number)} CMIErrorCode
- * @return {string}
- */
-
- }, {
- key: "getDiagnostic",
- value: function getDiagnostic(callbackName, CMIErrorCode) {
- var returnValue = '';
-
- if (CMIErrorCode !== null && CMIErrorCode !== '') {
- returnValue = this.getLmsErrorMessageDetails(CMIErrorCode, true);
- this.processListeners(callbackName);
- }
-
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- return returnValue;
- }
- /**
- * Checks the LMS state and ensures it has been initialized.
- *
- * @param {boolean} checkTerminated
- * @param {number} beforeInitError
- * @param {number} afterTermError
- * @return {boolean}
- */
-
- }, {
- key: "checkState",
- value: function checkState(checkTerminated, beforeInitError, afterTermError) {
- if (this.isNotInitialized()) {
- this.throwSCORMError(beforeInitError);
- return false;
- } else if (checkTerminated && this.isTerminated()) {
- this.throwSCORMError(afterTermError);
- return false;
- }
-
- return true;
- }
- /**
- * Logging for all SCORM actions
- *
- * @param {string} functionName
- * @param {string} CMIElement
- * @param {string} logMessage
- * @param {number}messageLevel
- */
-
- }, {
- key: "apiLog",
- value: function apiLog(functionName, CMIElement, logMessage, messageLevel) {
- logMessage = this.formatMessage(functionName, CMIElement, logMessage);
-
- if (messageLevel >= this.apiLogLevel) {
- this.settings.onLogMessage(messageLevel, logMessage);
- }
- }
- /**
- * Formats the SCORM messages for easy reading
- *
- * @param {string} functionName
- * @param {string} CMIElement
- * @param {string} message
- * @return {string}
- */
-
- }, {
- key: "formatMessage",
- value: function formatMessage(functionName, CMIElement, message) {
- var baseLength = 20;
- var messageString = '';
- messageString += functionName;
- var fillChars = baseLength - messageString.length;
-
- for (var i = 0; i < fillChars; i++) {
- messageString += ' ';
- }
-
- messageString += ': ';
-
- if (CMIElement) {
- var CMIElementBaseLength = 70;
- messageString += CMIElement;
- fillChars = CMIElementBaseLength - messageString.length;
-
- for (var j = 0; j < fillChars; j++) {
- messageString += ' ';
- }
- }
-
- if (message) {
- messageString += message;
- }
-
- return messageString;
- }
- /**
- * Checks to see if {str} contains {tester}
- *
- * @param {string} str String to check against
- * @param {string} tester String to check for
- * @return {boolean}
- */
-
- }, {
- key: "stringMatches",
- value: function stringMatches(str, tester) {
- return str && tester && str.match(tester);
- }
- /**
- * Check to see if the specific object has the given property
- * @param {*} refObject
- * @param {string} attribute
- * @return {boolean}
- * @private
- */
-
- }, {
- key: "_checkObjectHasProperty",
- value: function _checkObjectHasProperty(refObject, attribute) {
- return Object.hasOwnProperty.call(refObject, attribute) || Object.getOwnPropertyDescriptor(Object.getPrototypeOf(refObject), attribute) || attribute in refObject;
- }
- /**
- * Returns the message that corresponds to errorNumber
- * APIs that inherit BaseAPI should override this function
- *
- * @param {(string|number)} _errorNumber
- * @param {boolean} _detail
- * @return {string}
- * @abstract
- */
-
- }, {
- key: "getLmsErrorMessageDetails",
- value: function getLmsErrorMessageDetails(_errorNumber, _detail) {
- throw new Error('The getLmsErrorMessageDetails method has not been implemented');
- }
- /**
- * Gets the value for the specific element.
- * APIs that inherit BaseAPI should override this function
- *
- * @param {string} _CMIElement
- * @return {string}
- * @abstract
- */
-
- }, {
- key: "getCMIValue",
- value: function getCMIValue(_CMIElement) {
- throw new Error('The getCMIValue method has not been implemented');
- }
- /**
- * Sets the value for the specific element.
- * APIs that inherit BaseAPI should override this function
- *
- * @param {string} _CMIElement
- * @param {any} _value
- * @return {string}
- * @abstract
- */
-
- }, {
- key: "setCMIValue",
- value: function setCMIValue(_CMIElement, _value) {
- throw new Error('The setCMIValue method has not been implemented');
- }
- /**
- * Shared API method to set a valid for a given element.
- *
- * @param {string} methodName
- * @param {boolean} scorm2004
- * @param {string} CMIElement
- * @param {*} value
- * @return {string}
- */
-
- }, {
- key: "_commonSetCMIValue",
- value: function _commonSetCMIValue(methodName, scorm2004, CMIElement, value) {
- if (!CMIElement || CMIElement === '') {
- return global_constants.SCORM_FALSE;
- }
-
- var structure = CMIElement.split('.');
- var refObject = this;
- var returnValue = global_constants.SCORM_FALSE;
- var foundFirstIndex = false;
- var invalidErrorMessage = "The data model element passed to ".concat(methodName, " (").concat(CMIElement, ") is not a valid SCORM data model element.");
- var invalidErrorCode = scorm2004 ? _classPrivateFieldGet(this, _error_codes).UNDEFINED_DATA_MODEL : _classPrivateFieldGet(this, _error_codes).GENERAL;
-
- for (var i = 0; i < structure.length; i++) {
- var attribute = structure[i];
-
- if (i === structure.length - 1) {
- if (scorm2004 && attribute.substr(0, 8) === '{target=' && typeof refObject._isTargetValid == 'function') {
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).READ_ONLY_ELEMENT);
- } else if (!this._checkObjectHasProperty(refObject, attribute)) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- } else {
- if (this.isInitialized() && this.stringMatches(CMIElement, '\\.correct_responses\\.\\d+')) {
- this.validateCorrectResponse(CMIElement, value);
- }
-
- if (!scorm2004 || this.lastErrorCode === 0) {
- refObject[attribute] = value;
- returnValue = global_constants.SCORM_TRUE;
- }
- }
- } else {
- refObject = refObject[attribute];
-
- if (!refObject) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- break;
- }
-
- if (refObject instanceof _common.CMIArray) {
- var index = parseInt(structure[i + 1], 10); // SCO is trying to set an item on an array
-
- if (!isNaN(index)) {
- var item = refObject.childArray[index];
-
- if (item) {
- refObject = item;
- foundFirstIndex = true;
- } else {
- var newChild = this.getChildElement(CMIElement, value, foundFirstIndex);
- foundFirstIndex = true;
-
- if (!newChild) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- } else {
- if (refObject.initialized) newChild.initialize();
- refObject.childArray.push(newChild);
- refObject = newChild;
- }
- } // Have to update i value to skip the array position
-
-
- i++;
- }
- }
- }
- }
-
- if (returnValue === global_constants.SCORM_FALSE) {
- this.apiLog(methodName, null, "There was an error setting the value for: ".concat(CMIElement, ", value of: ").concat(value), global_constants.LOG_LEVEL_WARNING);
- }
-
- return returnValue;
- }
- /**
- * Abstract method for validating that a response is correct.
- *
- * @param {string} _CMIElement
- * @param {*} _value
- */
-
- }, {
- key: "validateCorrectResponse",
- value: function validateCorrectResponse(_CMIElement, _value) {// just a stub method
- }
- /**
- * Gets or builds a new child element to add to the array.
- * APIs that inherit BaseAPI should override this method.
- *
- * @param {string} _CMIElement - unused
- * @param {*} _value - unused
- * @param {boolean} _foundFirstIndex - unused
- * @return {*}
- * @abstract
- */
-
- }, {
- key: "getChildElement",
- value: function getChildElement(_CMIElement, _value, _foundFirstIndex) {
- throw new Error('The getChildElement method has not been implemented');
- }
- /**
- * Gets a value from the CMI Object
- *
- * @param {string} methodName
- * @param {boolean} scorm2004
- * @param {string} CMIElement
- * @return {*}
- */
-
- }, {
- key: "_commonGetCMIValue",
- value: function _commonGetCMIValue(methodName, scorm2004, CMIElement) {
- if (!CMIElement || CMIElement === '') {
- return '';
- }
-
- var structure = CMIElement.split('.');
- var refObject = this;
- var attribute = null;
- var uninitializedErrorMessage = "The data model element passed to ".concat(methodName, " (").concat(CMIElement, ") has not been initialized.");
- var invalidErrorMessage = "The data model element passed to ".concat(methodName, " (").concat(CMIElement, ") is not a valid SCORM data model element.");
- var invalidErrorCode = scorm2004 ? _classPrivateFieldGet(this, _error_codes).UNDEFINED_DATA_MODEL : _classPrivateFieldGet(this, _error_codes).GENERAL;
-
- for (var i = 0; i < structure.length; i++) {
- attribute = structure[i];
-
- if (!scorm2004) {
- if (i === structure.length - 1) {
- if (!this._checkObjectHasProperty(refObject, attribute)) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- return;
- }
- }
- } else {
- if (String(attribute).substr(0, 8) === '{target=' && typeof refObject._isTargetValid == 'function') {
- var target = String(attribute).substr(8, String(attribute).length - 9);
- return refObject._isTargetValid(target);
- } else if (!this._checkObjectHasProperty(refObject, attribute)) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- return;
- }
- }
-
- refObject = refObject[attribute];
-
- if (refObject === undefined) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- break;
- }
-
- if (refObject instanceof _common.CMIArray) {
- var index = parseInt(structure[i + 1], 10); // SCO is trying to set an item on an array
-
- if (!isNaN(index)) {
- var item = refObject.childArray[index];
-
- if (item) {
- refObject = item;
- } else {
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).VALUE_NOT_INITIALIZED, uninitializedErrorMessage);
- break;
- } // Have to update i value to skip the array position
-
-
- i++;
- }
- }
- }
-
- if (refObject === null || refObject === undefined) {
- if (!scorm2004) {
- if (attribute === '_children') {
- this.throwSCORMError(scorm12_error_codes.CHILDREN_ERROR);
- } else if (attribute === '_count') {
- this.throwSCORMError(scorm12_error_codes.COUNT_ERROR);
- }
- }
- } else {
- return refObject;
- }
- }
- /**
- * Returns true if the API's current state is STATE_INITIALIZED
- *
- * @return {boolean}
- */
-
- }, {
- key: "isInitialized",
- value: function isInitialized() {
- return this.currentState === global_constants.STATE_INITIALIZED;
- }
- /**
- * Returns true if the API's current state is STATE_NOT_INITIALIZED
- *
- * @return {boolean}
- */
-
- }, {
- key: "isNotInitialized",
- value: function isNotInitialized() {
- return this.currentState === global_constants.STATE_NOT_INITIALIZED;
- }
- /**
- * Returns true if the API's current state is STATE_TERMINATED
- *
- * @return {boolean}
- */
-
- }, {
- key: "isTerminated",
- value: function isTerminated() {
- return this.currentState === global_constants.STATE_TERMINATED;
- }
- /**
- * Provides a mechanism for attaching to a specific SCORM event
- *
- * @param {string} listenerName
- * @param {function} callback
- */
-
- }, {
- key: "on",
- value: function on(listenerName, callback) {
- if (!callback) return;
- var listenerFunctions = listenerName.split(' ');
-
- for (var i = 0; i < listenerFunctions.length; i++) {
- var listenerSplit = listenerFunctions[i].split('.');
- if (listenerSplit.length === 0) return;
- var functionName = listenerSplit[0];
- var CMIElement = null;
-
- if (listenerSplit.length > 1) {
- CMIElement = listenerName.replace(functionName + '.', '');
- }
-
- this.listenerArray.push({
- functionName: functionName,
- CMIElement: CMIElement,
- callback: callback
- });
- this.apiLog('on', functionName, "Added event listener: ".concat(this.listenerArray.length), global_constants.LOG_LEVEL_INFO);
- }
- }
- /**
- * Provides a mechanism for detaching a specific SCORM event listener
- *
- * @param {string} listenerName
- * @param {function} callback
- */
-
- }, {
- key: "off",
- value: function off(listenerName, callback) {
- var _this = this;
-
- if (!callback) return;
- var listenerFunctions = listenerName.split(' ');
-
- var _loop = function _loop(i) {
- var listenerSplit = listenerFunctions[i].split('.');
- if (listenerSplit.length === 0) return {
- v: void 0
- };
- var functionName = listenerSplit[0];
- var CMIElement = null;
-
- if (listenerSplit.length > 1) {
- CMIElement = listenerName.replace(functionName + '.', '');
- }
-
- var removeIndex = _this.listenerArray.findIndex(function (obj) {
- return obj.functionName === functionName && obj.CMIElement === CMIElement && obj.callback === callback;
- });
-
- if (removeIndex !== -1) {
- _this.listenerArray.splice(removeIndex, 1);
-
- _this.apiLog('off', functionName, "Removed event listener: ".concat(_this.listenerArray.length), global_constants.LOG_LEVEL_INFO);
- }
- };
-
- for (var i = 0; i < listenerFunctions.length; i++) {
- var _ret = _loop(i);
-
- if (_typeof(_ret) === "object") return _ret.v;
- }
- }
- /**
- * Provides a mechanism for clearing all listeners from a specific SCORM event
- *
- * @param {string} listenerName
- */
-
- }, {
- key: "clear",
- value: function clear(listenerName) {
- var _this2 = this;
-
- var listenerFunctions = listenerName.split(' ');
-
- var _loop2 = function _loop2(i) {
- var listenerSplit = listenerFunctions[i].split('.');
- if (listenerSplit.length === 0) return {
- v: void 0
- };
- var functionName = listenerSplit[0];
- var CMIElement = null;
-
- if (listenerSplit.length > 1) {
- CMIElement = listenerName.replace(functionName + '.', '');
- }
-
- _this2.listenerArray = _this2.listenerArray.filter(function (obj) {
- return obj.functionName !== functionName && obj.CMIElement !== CMIElement;
- });
- };
-
- for (var i = 0; i < listenerFunctions.length; i++) {
- var _ret2 = _loop2(i);
-
- if (_typeof(_ret2) === "object") return _ret2.v;
- }
- }
- /**
- * Processes any 'on' listeners that have been created
- *
- * @param {string} functionName
- * @param {string} CMIElement
- * @param {*} value
- */
-
- }, {
- key: "processListeners",
- value: function processListeners(functionName, CMIElement, value) {
- this.apiLog(functionName, CMIElement, value);
-
- for (var i = 0; i < this.listenerArray.length; i++) {
- var listener = this.listenerArray[i];
- var functionsMatch = listener.functionName === functionName;
- var listenerHasCMIElement = !!listener.CMIElement;
- var CMIElementsMatch = false;
-
- if (CMIElement && listener.CMIElement && listener.CMIElement.substring(listener.CMIElement.length - 1) === '*') {
- CMIElementsMatch = CMIElement.indexOf(listener.CMIElement.substring(0, listener.CMIElement.length - 1)) === 0;
- } else {
- CMIElementsMatch = listener.CMIElement === CMIElement;
- }
-
- if (functionsMatch && (!listenerHasCMIElement || CMIElementsMatch)) {
- listener.callback(CMIElement, value);
- }
- }
- }
- /**
- * Throws a SCORM error
- *
- * @param {number} errorNumber
- * @param {string} message
- */
-
- }, {
- key: "throwSCORMError",
- value: function throwSCORMError(errorNumber, message) {
- if (!message) {
- message = this.getLmsErrorMessageDetails(errorNumber);
- }
-
- this.apiLog('throwSCORMError', null, errorNumber + ': ' + message, global_constants.LOG_LEVEL_ERROR);
- this.lastErrorCode = String(errorNumber);
- }
- /**
- * Clears the last SCORM error code on success.
- *
- * @param {string} success
- */
-
- }, {
- key: "clearSCORMError",
- value: function clearSCORMError(success) {
- if (success !== undefined && success !== global_constants.SCORM_FALSE) {
- this.lastErrorCode = 0;
- }
- }
- /**
- * Attempts to store the data to the LMS, logs data if no LMS configured
- * APIs that inherit BaseAPI should override this function
- *
- * @param {boolean} _calculateTotalTime
- * @return {string}
- * @abstract
- */
-
- }, {
- key: "storeData",
- value: function storeData(_calculateTotalTime) {
- throw new Error('The storeData method has not been implemented');
- }
- /**
- * Load the CMI from a flattened JSON object
- * @param {object} json
- * @param {string} CMIElement
- */
-
- }, {
- key: "loadFromFlattenedJSON",
- value: function loadFromFlattenedJSON(json, CMIElement) {
- var _this3 = this;
-
- if (!this.isNotInitialized()) {
- console.error('loadFromFlattenedJSON can only be called before the call to lmsInitialize.');
- return;
- }
- /**
- * Test match pattern.
- *
- * @param {string} a
- * @param {string} c
- * @param {RegExp} a_pattern
- * @return {number}
- */
-
-
- function testPattern(a, c, a_pattern) {
- var a_match = a.match(a_pattern);
- var c_match;
-
- if (a_match !== null && (c_match = c.match(a_pattern)) !== null) {
- var a_num = Number(a_match[2]);
- var c_num = Number(c_match[2]);
-
- if (a_num === c_num) {
- if (a_match[3] === 'id') {
- return -1;
- } else if (a_match[3] === 'type') {
- if (c_match[3] === 'id') {
- return 1;
- } else {
- return -1;
- }
- } else {
- return 1;
- }
- }
-
- return a_num - c_num;
- }
-
- return null;
- }
-
- var int_pattern = /^(cmi\.interactions\.)(\d+)\.(.*)$/;
- var obj_pattern = /^(cmi\.objectives\.)(\d+)\.(.*)$/;
- var result = Object.keys(json).map(function (key) {
- return [String(key), json[key]];
- }); // CMI interactions need to have id and type loaded before any other fields
-
- result.sort(function (_ref, _ref2) {
- var _ref3 = _slicedToArray(_ref, 2),
- a = _ref3[0],
- b = _ref3[1];
-
- var _ref4 = _slicedToArray(_ref2, 2),
- c = _ref4[0],
- d = _ref4[1];
-
- var test;
-
- if ((test = testPattern(a, c, int_pattern)) !== null) {
- return test;
- }
-
- if ((test = testPattern(a, c, obj_pattern)) !== null) {
- return test;
- }
-
- if (a < c) {
- return -1;
- }
-
- if (a > c) {
- return 1;
- }
-
- return 0;
- });
- var obj;
- result.forEach(function (element) {
- obj = {};
- obj[element[0]] = element[1];
-
- _this3.loadFromJSON((0, _utilities.unflatten)(obj), CMIElement);
- });
- }
- /**
- * Loads CMI data from a JSON object.
- *
- * @param {object} json
- * @param {string} CMIElement
- */
-
- }, {
- key: "loadFromJSON",
- value: function loadFromJSON(json, CMIElement) {
- if (!this.isNotInitialized()) {
- console.error('loadFromJSON can only be called before the call to lmsInitialize.');
- return;
- }
-
- CMIElement = CMIElement !== undefined ? CMIElement : 'cmi';
- this.startingData = json; // could this be refactored down to flatten(json) then setCMIValue on each?
-
- for (var key in json) {
- if ({}.hasOwnProperty.call(json, key) && json[key]) {
- var currentCMIElement = (CMIElement ? CMIElement + '.' : '') + key;
- var value = json[key];
-
- if (value['childArray']) {
- for (var i = 0; i < value['childArray'].length; i++) {
- this.loadFromJSON(value['childArray'][i], currentCMIElement + '.' + i);
- }
- } else if (value.constructor === Object) {
- this.loadFromJSON(value, currentCMIElement);
- } else {
- this.setCMIValue(currentCMIElement, value);
- }
- }
- }
- }
- /**
- * Render the CMI object to JSON for sending to an LMS.
- *
- * @return {string}
- */
-
- }, {
- key: "renderCMIToJSONString",
- value: function renderCMIToJSONString() {
- var cmi = this.cmi; // Do we want/need to return fields that have no set value?
- // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);
-
- return JSON.stringify({
- cmi: cmi
- });
- }
- /**
- * Returns a JS object representing the current cmi
- * @return {object}
- */
-
- }, {
- key: "renderCMIToJSONObject",
- value: function renderCMIToJSONObject() {
- // Do we want/need to return fields that have no set value?
- // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);
- return JSON.parse(this.renderCMIToJSONString());
- }
- /**
- * Render the cmi object to the proper format for LMS commit
- * APIs that inherit BaseAPI should override this function
- *
- * @param {boolean} _terminateCommit
- * @return {*}
- * @abstract
- */
-
- }, {
- key: "renderCommitCMI",
- value: function renderCommitCMI(_terminateCommit) {
- throw new Error('The storeData method has not been implemented');
- }
- /**
- * Send the request to the LMS
- * @param {string} url
- * @param {object|Array} params
- * @param {boolean} immediate
- * @return {object}
- */
-
- }, {
- key: "processHttpRequest",
- value: function processHttpRequest(url, params) {
- var immediate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
- var api = this;
-
- var process = function process(url, params, settings, error_codes) {
- var genericError = {
- 'result': global_constants.SCORM_FALSE,
- 'errorCode': error_codes.GENERAL
- };
- var result;
-
- if (!settings.sendBeaconCommit) {
- var httpReq = new XMLHttpRequest();
- httpReq.open('POST', url, settings.asyncCommit);
-
- if (Object.keys(settings.xhrHeaders).length) {
- Object.keys(settings.xhrHeaders).forEach(function (header) {
- httpReq.setRequestHeader(header, settings.xhrHeaders[header]);
- });
- }
-
- httpReq.withCredentials = settings.xhrWithCredentials;
-
- if (settings.asyncCommit) {
- httpReq.onload = function (e) {
- if (typeof settings.responseHandler === 'function') {
- result = settings.responseHandler(httpReq);
- } else {
- result = JSON.parse(httpReq.responseText);
- }
- };
- }
-
- try {
- if (params instanceof Array) {
- httpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
- httpReq.send(params.join('&'));
- } else {
- httpReq.setRequestHeader('Content-Type', settings.commitRequestDataType);
- httpReq.send(JSON.stringify(params));
- }
-
- if (!settings.asyncCommit) {
- if (typeof settings.responseHandler === 'function') {
- result = settings.responseHandler(httpReq);
- } else {
- result = JSON.parse(httpReq.responseText);
- }
- } else {
- result = {};
- result.result = global_constants.SCORM_TRUE;
- result.errorCode = 0;
- api.processListeners('CommitSuccess');
- return result;
- }
- } catch (e) {
- console.error(e);
- api.processListeners('CommitError');
- return genericError;
- }
- } else {
- try {
- var headers = {
- type: settings.commitRequestDataType
- };
- var blob;
-
- if (params instanceof Array) {
- blob = new Blob([params.join('&')], headers);
- } else {
- blob = new Blob([JSON.stringify(params)], headers);
- }
-
- result = {};
-
- if (navigator.sendBeacon(url, blob)) {
- result.result = global_constants.SCORM_TRUE;
- result.errorCode = 0;
- } else {
- result.result = global_constants.SCORM_FALSE;
- result.errorCode = 101;
- }
- } catch (e) {
- console.error(e);
- api.processListeners('CommitError');
- return genericError;
- }
- }
-
- if (typeof result === 'undefined') {
- api.processListeners('CommitError');
- return genericError;
- }
-
- if (result.result === true || result.result === global_constants.SCORM_TRUE) {
- api.processListeners('CommitSuccess');
- } else {
- api.processListeners('CommitError');
- }
-
- return result;
- };
-
- if (typeof _lodash["default"] !== 'undefined') {
- var debounced = (0, _lodash["default"])(process, 500);
- debounced(url, params, this.settings, this.error_codes); // if we're terminating, go ahead and commit immediately
-
- if (immediate) {
- debounced.flush();
- }
-
- return {
- result: global_constants.SCORM_TRUE,
- errorCode: 0
- };
- } else {
- return process(url, params, this.settings, this.error_codes);
- }
- }
- /**
- * Throws a SCORM error
- *
- * @param {number} when - the number of milliseconds to wait before committing
- * @param {string} callback - the name of the commit event callback
- */
-
- }, {
- key: "scheduleCommit",
- value: function scheduleCommit(when, callback) {
- _classPrivateFieldSet(this, _timeout, new ScheduledCommit(this, when, callback));
-
- this.apiLog('scheduleCommit', '', 'scheduled', global_constants.LOG_LEVEL_DEBUG);
- }
- /**
- * Clears and cancels any currently scheduled commits
- */
-
- }, {
- key: "clearScheduledCommit",
- value: function clearScheduledCommit() {
- if (_classPrivateFieldGet(this, _timeout)) {
- _classPrivateFieldGet(this, _timeout).cancel();
-
- _classPrivateFieldSet(this, _timeout, null);
-
- this.apiLog('clearScheduledCommit', '', 'cleared', global_constants.LOG_LEVEL_DEBUG);
- }
- }
- }]);
-
- return BaseAPI;
-}();
-/**
- * Private class that wraps a timeout call to the commit() function
- */
-
-
-exports["default"] = BaseAPI;
-
-var _API = /*#__PURE__*/new WeakMap();
-
-var _cancelled = /*#__PURE__*/new WeakMap();
-
-var _timeout2 = /*#__PURE__*/new WeakMap();
-
-var _callback = /*#__PURE__*/new WeakMap();
-
-var ScheduledCommit = /*#__PURE__*/function () {
- /**
- * Constructor for ScheduledCommit
- * @param {BaseAPI} API
- * @param {number} when
- * @param {string} callback
- */
- function ScheduledCommit(API, when, callback) {
- _classCallCheck(this, ScheduledCommit);
-
- _classPrivateFieldInitSpec(this, _API, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(this, _cancelled, {
- writable: true,
- value: false
- });
-
- _classPrivateFieldInitSpec(this, _timeout2, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(this, _callback, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldSet(this, _API, API);
-
- _classPrivateFieldSet(this, _timeout2, setTimeout(this.wrapper.bind(this), when));
-
- _classPrivateFieldSet(this, _callback, callback);
- }
- /**
- * Cancel any currently scheduled commit
- */
-
-
- _createClass(ScheduledCommit, [{
- key: "cancel",
- value: function cancel() {
- _classPrivateFieldSet(this, _cancelled, true);
-
- if (_classPrivateFieldGet(this, _timeout2)) {
- clearTimeout(_classPrivateFieldGet(this, _timeout2));
- }
- }
- /**
- * Wrap the API commit call to check if the call has already been cancelled
- */
-
- }, {
- key: "wrapper",
- value: function wrapper() {
- if (!_classPrivateFieldGet(this, _cancelled)) {
- _classPrivateFieldGet(this, _API).commit(_classPrivateFieldGet(this, _callback));
- }
- }
- }]);
-
- return ScheduledCommit;
-}();
-
-},{"./cmi/common":6,"./constants/api_constants":8,"./constants/error_codes":9,"./exceptions":11,"./utilities":13,"lodash.debounce":1}],4:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _BaseAPI2 = _interopRequireDefault(require("./BaseAPI"));
-
-var _scorm12_cmi = require("./cmi/scorm12_cmi");
-
-var Utilities = _interopRequireWildcard(require("./utilities"));
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("./constants/error_codes"));
-
-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; }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-var scorm12_constants = _api_constants["default"].scorm12;
-var global_constants = _api_constants["default"].global;
-var scorm12_error_codes = _error_codes["default"].scorm12;
-/**
- * API class for SCORM 1.2
- */
-
-var Scorm12API = /*#__PURE__*/function (_BaseAPI) {
- _inherits(Scorm12API, _BaseAPI);
-
- var _super = _createSuper(Scorm12API);
-
- /**
- * Constructor for SCORM 1.2 API
- * @param {object} settings
- */
- function Scorm12API(settings) {
- var _this;
-
- _classCallCheck(this, Scorm12API);
-
- var finalSettings = _objectSpread(_objectSpread({}, {
- mastery_override: false
- }), settings);
-
- _this = _super.call(this, scorm12_error_codes, finalSettings);
- _this.cmi = new _scorm12_cmi.CMI();
- _this.nav = new _scorm12_cmi.NAV(); // Rename functions to match 1.2 Spec and expose to modules
-
- _this.LMSInitialize = _this.lmsInitialize;
- _this.LMSFinish = _this.lmsFinish;
- _this.LMSGetValue = _this.lmsGetValue;
- _this.LMSSetValue = _this.lmsSetValue;
- _this.LMSCommit = _this.lmsCommit;
- _this.LMSGetLastError = _this.lmsGetLastError;
- _this.LMSGetErrorString = _this.lmsGetErrorString;
- _this.LMSGetDiagnostic = _this.lmsGetDiagnostic;
- return _this;
- }
- /**
- * lmsInitialize function from SCORM 1.2 Spec
- *
- * @return {string} bool
- */
-
-
- _createClass(Scorm12API, [{
- key: "lmsInitialize",
- value: function lmsInitialize() {
- this.cmi.initialize();
- return this.initialize('LMSInitialize', 'LMS was already initialized!', 'LMS is already finished!');
- }
- /**
- * LMSFinish function from SCORM 1.2 Spec
- *
- * @return {string} bool
- */
-
- }, {
- key: "lmsFinish",
- value: function lmsFinish() {
- var result = this.terminate('LMSFinish', true);
-
- if (result === global_constants.SCORM_TRUE) {
- if (this.nav.event !== '') {
- if (this.nav.event === 'continue') {
- this.processListeners('SequenceNext');
- } else {
- this.processListeners('SequencePrevious');
- }
- } else if (this.settings.autoProgress) {
- this.processListeners('SequenceNext');
- }
- }
-
- return result;
- }
- /**
- * LMSGetValue function from SCORM 1.2 Spec
- *
- * @param {string} CMIElement
- * @return {string}
- */
-
- }, {
- key: "lmsGetValue",
- value: function lmsGetValue(CMIElement) {
- return this.getValue('LMSGetValue', false, CMIElement);
- }
- /**
- * LMSSetValue function from SCORM 1.2 Spec
- *
- * @param {string} CMIElement
- * @param {*} value
- * @return {string}
- */
-
- }, {
- key: "lmsSetValue",
- value: function lmsSetValue(CMIElement, value) {
- return this.setValue('LMSSetValue', 'LMSCommit', false, CMIElement, value);
- }
- /**
- * LMSCommit function from SCORM 1.2 Spec
- *
- * @return {string} bool
- */
-
- }, {
- key: "lmsCommit",
- value: function lmsCommit() {
- return this.commit('LMSCommit', false);
- }
- /**
- * LMSGetLastError function from SCORM 1.2 Spec
- *
- * @return {string}
- */
-
- }, {
- key: "lmsGetLastError",
- value: function lmsGetLastError() {
- return this.getLastError('LMSGetLastError');
- }
- /**
- * LMSGetErrorString function from SCORM 1.2 Spec
- *
- * @param {string} CMIErrorCode
- * @return {string}
- */
-
- }, {
- key: "lmsGetErrorString",
- value: function lmsGetErrorString(CMIErrorCode) {
- return this.getErrorString('LMSGetErrorString', CMIErrorCode);
- }
- /**
- * LMSGetDiagnostic function from SCORM 1.2 Spec
- *
- * @param {string} CMIErrorCode
- * @return {string}
- */
-
- }, {
- key: "lmsGetDiagnostic",
- value: function lmsGetDiagnostic(CMIErrorCode) {
- return this.getDiagnostic('LMSGetDiagnostic', CMIErrorCode);
- }
- /**
- * Sets a value on the CMI Object
- *
- * @param {string} CMIElement
- * @param {*} value
- * @return {string}
- */
-
- }, {
- key: "setCMIValue",
- value: function setCMIValue(CMIElement, value) {
- return this._commonSetCMIValue('LMSSetValue', false, CMIElement, value);
- }
- /**
- * Gets a value from the CMI Object
- *
- * @param {string} CMIElement
- * @return {*}
- */
-
- }, {
- key: "getCMIValue",
- value: function getCMIValue(CMIElement) {
- return this._commonGetCMIValue('getCMIValue', false, CMIElement);
- }
- /**
- * Gets or builds a new child element to add to the array.
- *
- * @param {string} CMIElement
- * @param {*} value
- * @param {boolean} foundFirstIndex
- * @return {object}
- */
-
- }, {
- key: "getChildElement",
- value: function getChildElement(CMIElement, value, foundFirstIndex) {
- var newChild;
-
- if (this.stringMatches(CMIElement, 'cmi\\.objectives\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIObjectivesObject();
- } else if (foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+\\.correct_responses\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIInteractionsCorrectResponsesObject();
- } else if (foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+\\.objectives\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIInteractionsObjectivesObject();
- } else if (!foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIInteractionsObject();
- }
-
- return newChild;
- }
- /**
- * Validates Correct Response values
- *
- * @param {string} CMIElement
- * @param {*} value
- * @return {boolean}
- */
-
- }, {
- key: "validateCorrectResponse",
- value: function validateCorrectResponse(CMIElement, value) {
- return true;
- }
- /**
- * Returns the message that corresponds to errorNumber.
- *
- * @param {*} errorNumber
- * @param {boolean} detail
- * @return {string}
- */
-
- }, {
- key: "getLmsErrorMessageDetails",
- value: function getLmsErrorMessageDetails(errorNumber, detail) {
- var basicMessage = 'No Error';
- var detailMessage = 'No Error'; // Set error number to string since inconsistent from modules if string or number
-
- errorNumber = String(errorNumber);
-
- if (scorm12_constants.error_descriptions[errorNumber]) {
- basicMessage = scorm12_constants.error_descriptions[errorNumber].basicMessage;
- detailMessage = scorm12_constants.error_descriptions[errorNumber].detailMessage;
- }
-
- return detail ? detailMessage : basicMessage;
- }
- /**
- * Replace the whole API with another
- *
- * @param {Scorm12API} newAPI
- */
-
- }, {
- key: "replaceWithAnotherScormAPI",
- value: function replaceWithAnotherScormAPI(newAPI) {
- // Data Model
- this.cmi = newAPI.cmi;
- }
- /**
- * Render the cmi object to the proper format for LMS commit
- *
- * @param {boolean} terminateCommit
- * @return {object|Array}
- */
-
- }, {
- key: "renderCommitCMI",
- value: function renderCommitCMI(terminateCommit) {
- var cmiExport = this.renderCMIToJSONObject();
-
- if (terminateCommit) {
- cmiExport.cmi.core.total_time = this.cmi.getCurrentTotalTime();
- }
-
- var result = [];
- var flattened = Utilities.flatten(cmiExport);
-
- switch (this.settings.dataCommitFormat) {
- case 'flattened':
- return Utilities.flatten(cmiExport);
-
- case 'params':
- for (var item in flattened) {
- if ({}.hasOwnProperty.call(flattened, item)) {
- result.push("".concat(item, "=").concat(flattened[item]));
- }
- }
-
- return result;
-
- case 'json':
- default:
- return cmiExport;
- }
- }
- /**
- * Attempts to store the data to the LMS
- *
- * @param {boolean} terminateCommit
- * @return {string}
- */
-
- }, {
- key: "storeData",
- value: function storeData(terminateCommit) {
- if (terminateCommit) {
- var originalStatus = this.cmi.core.lesson_status;
-
- if (originalStatus === 'not attempted') {
- this.cmi.core.lesson_status = 'completed';
- }
-
- if (this.cmi.core.lesson_mode === 'normal') {
- if (this.cmi.core.credit === 'credit') {
- if (this.settings.mastery_override && this.cmi.student_data.mastery_score !== '' && this.cmi.core.score.raw !== '') {
- if (parseFloat(this.cmi.core.score.raw) >= parseFloat(this.cmi.student_data.mastery_score)) {
- this.cmi.core.lesson_status = 'passed';
- } else {
- this.cmi.core.lesson_status = 'failed';
- }
- }
- }
- } else if (this.cmi.core.lesson_mode === 'browse') {
- var _this$startingData, _this$startingData$cm, _this$startingData$cm2;
-
- if ((((_this$startingData = this.startingData) === null || _this$startingData === void 0 ? void 0 : (_this$startingData$cm = _this$startingData.cmi) === null || _this$startingData$cm === void 0 ? void 0 : (_this$startingData$cm2 = _this$startingData$cm.core) === null || _this$startingData$cm2 === void 0 ? void 0 : _this$startingData$cm2.lesson_status) || '') === '' && originalStatus === 'not attempted') {
- this.cmi.core.lesson_status = 'browsed';
- }
- }
- }
-
- var commitObject = this.renderCommitCMI(terminateCommit || this.settings.alwaysSendTotalTime);
-
- if (this.apiLogLevel === global_constants.LOG_LEVEL_DEBUG) {
- console.debug('Commit (terminated: ' + (terminateCommit ? 'yes' : 'no') + '): ');
- console.debug(commitObject);
- }
-
- if (this.settings.lmsCommitUrl) {
- return this.processHttpRequest(this.settings.lmsCommitUrl, commitObject, terminateCommit);
- } else {
- return global_constants.SCORM_TRUE;
- }
- }
- }]);
-
- return Scorm12API;
-}(_BaseAPI2["default"]);
-
-exports["default"] = Scorm12API;
-
-},{"./BaseAPI":3,"./cmi/scorm12_cmi":7,"./constants/api_constants":8,"./constants/error_codes":9,"./utilities":13}],5:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.CMITriesObject = exports.CMITries = exports.CMIStudentDemographics = exports.CMIPathsObject = exports.CMIPaths = exports.CMIEvaluationCommentsObject = exports.CMIAttemptRecordsObject = exports.CMIAttemptRecords = exports.CMI = void 0;
-
-var Scorm12CMI = _interopRequireWildcard(require("./scorm12_cmi"));
-
-var _common = require("./common");
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _exceptions = require("../exceptions");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-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; }
-
-function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
-
-function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
-
-function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
-
-function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-
-function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
-
-function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
-
-function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); }
-
-function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-var aicc_constants = _api_constants["default"].aicc;
-var aicc_regex = _regex["default"].aicc;
-var aicc_error_codes = _error_codes["default"].scorm12;
-/**
- * Helper method for throwing Read Only error
- */
-
-function throwReadOnlyError() {
- throw new _exceptions.AICCValidationError(aicc_error_codes.READ_ONLY_ELEMENT);
-}
-/**
- * Helper method, no reason to have to pass the same error codes every time
- * @param {*} value
- * @param {string} regexPattern
- * @param {boolean} allowEmptyString
- * @return {boolean}
- */
-
-
-function checkAICCValidFormat(value, regexPattern, allowEmptyString) {
- return (0, _common.checkValidFormat)(value, regexPattern, aicc_error_codes.TYPE_MISMATCH, _exceptions.AICCValidationError, allowEmptyString);
-}
-/**
- * CMI Class for AICC
- */
-
-
-var CMI = /*#__PURE__*/function (_Scorm12CMI$CMI) {
- _inherits(CMI, _Scorm12CMI$CMI);
-
- var _super = _createSuper(CMI);
-
- /**
- * Constructor for AICC CMI object
- * @param {boolean} initialized
- */
- function CMI(initialized) {
- var _this;
-
- _classCallCheck(this, CMI);
-
- _this = _super.call(this, aicc_constants.cmi_children);
- if (initialized) _this.initialize();
- _this.student_preference = new AICCStudentPreferences();
- _this.student_data = new AICCCMIStudentData();
- _this.student_demographics = new CMIStudentDemographics();
- _this.evaluation = new CMIEvaluation();
- _this.paths = new CMIPaths();
- return _this;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(CMI, [{
- key: "initialize",
- value: function initialize() {
- var _this$student_prefere, _this$student_data, _this$student_demogra, _this$evaluation, _this$paths;
-
- _get(_getPrototypeOf(CMI.prototype), "initialize", this).call(this);
-
- (_this$student_prefere = this.student_preference) === null || _this$student_prefere === void 0 ? void 0 : _this$student_prefere.initialize();
- (_this$student_data = this.student_data) === null || _this$student_data === void 0 ? void 0 : _this$student_data.initialize();
- (_this$student_demogra = this.student_demographics) === null || _this$student_demogra === void 0 ? void 0 : _this$student_demogra.initialize();
- (_this$evaluation = this.evaluation) === null || _this$evaluation === void 0 ? void 0 : _this$evaluation.initialize();
- (_this$paths = this.paths) === null || _this$paths === void 0 ? void 0 : _this$paths.initialize();
- }
- /**
- * toJSON for cmi
- *
- * @return {
- * {
- * suspend_data: string,
- * launch_data: string,
- * comments: string,
- * comments_from_lms: string,
- * core: CMICore,
- * objectives: CMIObjectives,
- * student_data: CMIStudentData,
- * student_preference: CMIStudentPreference,
- * interactions: CMIInteractions,
- * paths: CMIPaths
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'suspend_data': this.suspend_data,
- 'launch_data': this.launch_data,
- 'comments': this.comments,
- 'comments_from_lms': this.comments_from_lms,
- 'core': this.core,
- 'objectives': this.objectives,
- 'student_data': this.student_data,
- 'student_preference': this.student_preference,
- 'student_demographics': this.student_demographics,
- 'interactions': this.interactions,
- 'evaluation': this.evaluation,
- 'paths': this.paths
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMI;
-}(Scorm12CMI.CMI);
-/**
- * AICC Evaluation object
- */
-
-
-exports.CMI = CMI;
-
-var CMIEvaluation = /*#__PURE__*/function (_BaseCMI) {
- _inherits(CMIEvaluation, _BaseCMI);
-
- var _super2 = _createSuper(CMIEvaluation);
-
- /**
- * Constructor for AICC Evaluation object
- */
- function CMIEvaluation() {
- var _this2;
-
- _classCallCheck(this, CMIEvaluation);
-
- _this2 = _super2.call(this);
- _this2.comments = new CMIEvaluationComments();
- return _this2;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(CMIEvaluation, [{
- key: "initialize",
- value: function initialize() {
- var _this$comments;
-
- _get(_getPrototypeOf(CMIEvaluation.prototype), "initialize", this).call(this);
-
- (_this$comments = this.comments) === null || _this$comments === void 0 ? void 0 : _this$comments.initialize();
- }
- /**
- * toJSON for cmi.evaluation object
- * @return {{comments: CMIEvaluationComments}}
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'comments': this.comments
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIEvaluation;
-}(_common.BaseCMI);
-/**
- * Class representing AICC's cmi.evaluation.comments object
- */
-
-
-var CMIEvaluationComments = /*#__PURE__*/function (_CMIArray) {
- _inherits(CMIEvaluationComments, _CMIArray);
-
- var _super3 = _createSuper(CMIEvaluationComments);
-
- /**
- * Constructor for AICC Evaluation Comments object
- */
- function CMIEvaluationComments() {
- _classCallCheck(this, CMIEvaluationComments);
-
- return _super3.call(this, {
- children: aicc_constants.comments_children,
- errorCode: aicc_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.AICCValidationError
- });
- }
-
- return _createClass(CMIEvaluationComments);
-}(_common.CMIArray);
-/**
- * StudentPreferences class for AICC
- */
-
-
-var _lesson_type = /*#__PURE__*/new WeakMap();
-
-var _text_color = /*#__PURE__*/new WeakMap();
-
-var _text_location = /*#__PURE__*/new WeakMap();
-
-var _text_size = /*#__PURE__*/new WeakMap();
-
-var _video = /*#__PURE__*/new WeakMap();
-
-var AICCStudentPreferences = /*#__PURE__*/function (_Scorm12CMI$CMIStuden) {
- _inherits(AICCStudentPreferences, _Scorm12CMI$CMIStuden);
-
- var _super4 = _createSuper(AICCStudentPreferences);
-
- /**
- * Constructor for AICC Student Preferences object
- */
- function AICCStudentPreferences() {
- var _this3;
-
- _classCallCheck(this, AICCStudentPreferences);
-
- _this3 = _super4.call(this, aicc_constants.student_preference_children);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _lesson_type, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _text_color, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _text_location, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _text_size, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _video, {
- writable: true,
- value: ''
- });
-
- _this3.windows = new _common.CMIArray({
- errorCode: aicc_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.AICCValidationError,
- children: ''
- });
- return _this3;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(AICCStudentPreferences, [{
- key: "initialize",
- value: function initialize() {
- var _this$windows;
-
- _get(_getPrototypeOf(AICCStudentPreferences.prototype), "initialize", this).call(this);
-
- (_this$windows = this.windows) === null || _this$windows === void 0 ? void 0 : _this$windows.initialize();
- }
- }, {
- key: "lesson_type",
- get:
- /**
- * Getter for #lesson_type
- * @return {string}
- */
- function get() {
- return _classPrivateFieldGet(this, _lesson_type);
- }
- /**
- * Setter for #lesson_type
- * @param {string} lesson_type
- */
- ,
- set: function set(lesson_type) {
- if (checkAICCValidFormat(lesson_type, aicc_regex.CMIString256)) {
- _classPrivateFieldSet(this, _lesson_type, lesson_type);
- }
- }
- /**
- * Getter for #text_color
- * @return {string}
- */
-
- }, {
- key: "text_color",
- get: function get() {
- return _classPrivateFieldGet(this, _text_color);
- }
- /**
- * Setter for #text_color
- * @param {string} text_color
- */
- ,
- set: function set(text_color) {
- if (checkAICCValidFormat(text_color, aicc_regex.CMIString256)) {
- _classPrivateFieldSet(this, _text_color, text_color);
- }
- }
- /**
- * Getter for #text_location
- * @return {string}
- */
-
- }, {
- key: "text_location",
- get: function get() {
- return _classPrivateFieldGet(this, _text_location);
- }
- /**
- * Setter for #text_location
- * @param {string} text_location
- */
- ,
- set: function set(text_location) {
- if (checkAICCValidFormat(text_location, aicc_regex.CMIString256)) {
- _classPrivateFieldSet(this, _text_location, text_location);
- }
- }
- /**
- * Getter for #text_size
- * @return {string}
- */
-
- }, {
- key: "text_size",
- get: function get() {
- return _classPrivateFieldGet(this, _text_size);
- }
- /**
- * Setter for #text_size
- * @param {string} text_size
- */
- ,
- set: function set(text_size) {
- if (checkAICCValidFormat(text_size, aicc_regex.CMIString256)) {
- _classPrivateFieldSet(this, _text_size, text_size);
- }
- }
- /**
- * Getter for #video
- * @return {string}
- */
-
- }, {
- key: "video",
- get: function get() {
- return _classPrivateFieldGet(this, _video);
- }
- /**
- * Setter for #video
- * @param {string} video
- */
- ,
- set: function set(video) {
- if (checkAICCValidFormat(video, aicc_regex.CMIString256)) {
- _classPrivateFieldSet(this, _video, video);
- }
- }
- /**
- * toJSON for cmi.student_preference
- *
- * @return {
- * {
- * audio: string,
- * language: string,
- * speed: string,
- * text: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'audio': this.audio,
- 'language': this.language,
- 'lesson_type': this.lesson_type,
- 'speed': this.speed,
- 'text': this.text,
- 'text_color': this.text_color,
- 'text_location': this.text_location,
- 'text_size': this.text_size,
- 'video': this.video,
- 'windows': this.windows
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return AICCStudentPreferences;
-}(Scorm12CMI.CMIStudentPreference);
-/**
- * StudentData class for AICC
- */
-
-
-var _tries_during_lesson = /*#__PURE__*/new WeakMap();
-
-var AICCCMIStudentData = /*#__PURE__*/function (_Scorm12CMI$CMIStuden2) {
- _inherits(AICCCMIStudentData, _Scorm12CMI$CMIStuden2);
-
- var _super5 = _createSuper(AICCCMIStudentData);
-
- /**
- * Constructor for AICC StudentData object
- */
- function AICCCMIStudentData() {
- var _this4;
-
- _classCallCheck(this, AICCCMIStudentData);
-
- _this4 = _super5.call(this, aicc_constants.student_data_children);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _tries_during_lesson, {
- writable: true,
- value: ''
- });
-
- _this4.tries = new CMITries();
- return _this4;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(AICCCMIStudentData, [{
- key: "initialize",
- value: function initialize() {
- var _this$tries;
-
- _get(_getPrototypeOf(AICCCMIStudentData.prototype), "initialize", this).call(this);
-
- (_this$tries = this.tries) === null || _this$tries === void 0 ? void 0 : _this$tries.initialize();
- }
- }, {
- key: "tries_during_lesson",
- get:
- /**
- * Getter for tries_during_lesson
- * @return {string}
- */
- function get() {
- return _classPrivateFieldGet(this, _tries_during_lesson);
- }
- /**
- * Setter for #tries_during_lesson. Sets an error if trying to set after
- * initialization.
- * @param {string} tries_during_lesson
- */
- ,
- set: function set(tries_during_lesson) {
- !this.initialized ? _classPrivateFieldSet(this, _tries_during_lesson, tries_during_lesson) : throwReadOnlyError();
- }
- /**
- * toJSON for cmi.student_data object
- * @return {
- * {
- * mastery_score: string,
- * max_time_allowed: string,
- * time_limit_action: string,
- * tries: CMITries
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'mastery_score': this.mastery_score,
- 'max_time_allowed': this.max_time_allowed,
- 'time_limit_action': this.time_limit_action,
- 'tries': this.tries
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return AICCCMIStudentData;
-}(Scorm12CMI.CMIStudentData);
-/**
- * Class representing the AICC cmi.student_demographics object
- */
-
-
-var _children = /*#__PURE__*/new WeakMap();
-
-var _city = /*#__PURE__*/new WeakMap();
-
-var _class = /*#__PURE__*/new WeakMap();
-
-var _company = /*#__PURE__*/new WeakMap();
-
-var _country = /*#__PURE__*/new WeakMap();
-
-var _experience = /*#__PURE__*/new WeakMap();
-
-var _familiar_name = /*#__PURE__*/new WeakMap();
-
-var _instructor_name = /*#__PURE__*/new WeakMap();
-
-var _title = /*#__PURE__*/new WeakMap();
-
-var _native_language = /*#__PURE__*/new WeakMap();
-
-var _state = /*#__PURE__*/new WeakMap();
-
-var _street_address = /*#__PURE__*/new WeakMap();
-
-var _telephone = /*#__PURE__*/new WeakMap();
-
-var _years_experience = /*#__PURE__*/new WeakMap();
-
-var CMIStudentDemographics = /*#__PURE__*/function (_BaseCMI2) {
- _inherits(CMIStudentDemographics, _BaseCMI2);
-
- var _super6 = _createSuper(CMIStudentDemographics);
-
- /**
- * Constructor for AICC StudentDemographics object
- */
- function CMIStudentDemographics() {
- var _this5;
-
- _classCallCheck(this, CMIStudentDemographics);
-
- _this5 = _super6.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _children, {
- writable: true,
- value: aicc_constants.student_demographics_children
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _city, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _class, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _company, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _country, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _experience, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _familiar_name, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _instructor_name, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _title, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _native_language, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _state, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _street_address, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _telephone, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _years_experience, {
- writable: true,
- value: ''
- });
-
- return _this5;
- }
-
- _createClass(CMIStudentDemographics, [{
- key: "_children",
- get:
- /**
- * Getter for _children
- * @return {string}
- */
- function get() {
- return _classPrivateFieldGet(this, _children);
- }
- /**
- * Getter for city
- * @return {string}
- */
-
- }, {
- key: "city",
- get: function get() {
- return _classPrivateFieldGet(this, _city);
- }
- /**
- * Setter for #city. Sets an error if trying to set after
- * initialization.
- * @param {string} city
- */
- ,
- set: function set(city) {
- !this.initialized ? _classPrivateFieldSet(this, _city, city) : throwReadOnlyError();
- }
- /**
- * Getter for class
- * @return {string}
- */
-
- }, {
- key: "class",
- get: function get() {
- return _classPrivateFieldGet(this, _class);
- }
- /**
- * Setter for #class. Sets an error if trying to set after
- * initialization.
- * @param {string} clazz
- */
- ,
- set: function set(clazz) {
- !this.initialized ? _classPrivateFieldSet(this, _class, clazz) : throwReadOnlyError();
- }
- /**
- * Getter for company
- * @return {string}
- */
-
- }, {
- key: "company",
- get: function get() {
- return _classPrivateFieldGet(this, _company);
- }
- /**
- * Setter for #company. Sets an error if trying to set after
- * initialization.
- * @param {string} company
- */
- ,
- set: function set(company) {
- !this.initialized ? _classPrivateFieldSet(this, _company, company) : throwReadOnlyError();
- }
- /**
- * Getter for country
- * @return {string}
- */
-
- }, {
- key: "country",
- get: function get() {
- return _classPrivateFieldGet(this, _country);
- }
- /**
- * Setter for #country. Sets an error if trying to set after
- * initialization.
- * @param {string} country
- */
- ,
- set: function set(country) {
- !this.initialized ? _classPrivateFieldSet(this, _country, country) : throwReadOnlyError();
- }
- /**
- * Getter for experience
- * @return {string}
- */
-
- }, {
- key: "experience",
- get: function get() {
- return _classPrivateFieldGet(this, _experience);
- }
- /**
- * Setter for #experience. Sets an error if trying to set after
- * initialization.
- * @param {string} experience
- */
- ,
- set: function set(experience) {
- !this.initialized ? _classPrivateFieldSet(this, _experience, experience) : throwReadOnlyError();
- }
- /**
- * Getter for familiar_name
- * @return {string}
- */
-
- }, {
- key: "familiar_name",
- get: function get() {
- return _classPrivateFieldGet(this, _familiar_name);
- }
- /**
- * Setter for #familiar_name. Sets an error if trying to set after
- * initialization.
- * @param {string} familiar_name
- */
- ,
- set: function set(familiar_name) {
- !this.initialized ? _classPrivateFieldSet(this, _familiar_name, familiar_name) : throwReadOnlyError();
- }
- /**
- * Getter for instructor_name
- * @return {string}
- */
-
- }, {
- key: "instructor_name",
- get: function get() {
- return _classPrivateFieldGet(this, _instructor_name);
- }
- /**
- * Setter for #instructor_name. Sets an error if trying to set after
- * initialization.
- * @param {string} instructor_name
- */
- ,
- set: function set(instructor_name) {
- !this.initialized ? _classPrivateFieldSet(this, _instructor_name, instructor_name) : throwReadOnlyError();
- }
- /**
- * Getter for title
- * @return {string}
- */
-
- }, {
- key: "title",
- get: function get() {
- return _classPrivateFieldGet(this, _title);
- }
- /**
- * Setter for #title. Sets an error if trying to set after
- * initialization.
- * @param {string} title
- */
- ,
- set: function set(title) {
- !this.initialized ? _classPrivateFieldSet(this, _title, title) : throwReadOnlyError();
- }
- /**
- * Getter for native_language
- * @return {string}
- */
-
- }, {
- key: "native_language",
- get: function get() {
- return _classPrivateFieldGet(this, _native_language);
- }
- /**
- * Setter for #native_language. Sets an error if trying to set after
- * initialization.
- * @param {string} native_language
- */
- ,
- set: function set(native_language) {
- !this.initialized ? _classPrivateFieldSet(this, _native_language, native_language) : throwReadOnlyError();
- }
- /**
- * Getter for state
- * @return {string}
- */
-
- }, {
- key: "state",
- get: function get() {
- return _classPrivateFieldGet(this, _state);
- }
- /**
- * Setter for #state. Sets an error if trying to set after
- * initialization.
- * @param {string} state
- */
- ,
- set: function set(state) {
- !this.initialized ? _classPrivateFieldSet(this, _state, state) : throwReadOnlyError();
- }
- /**
- * Getter for street_address
- * @return {string}
- */
-
- }, {
- key: "street_address",
- get: function get() {
- return _classPrivateFieldGet(this, _street_address);
- }
- /**
- * Setter for #street_address. Sets an error if trying to set after
- * initialization.
- * @param {string} street_address
- */
- ,
- set: function set(street_address) {
- !this.initialized ? _classPrivateFieldSet(this, _street_address, street_address) : throwReadOnlyError();
- }
- /**
- * Getter for telephone
- * @return {string}
- */
-
- }, {
- key: "telephone",
- get: function get() {
- return _classPrivateFieldGet(this, _telephone);
- }
- /**
- * Setter for #telephone. Sets an error if trying to set after
- * initialization.
- * @param {string} telephone
- */
- ,
- set: function set(telephone) {
- !this.initialized ? _classPrivateFieldSet(this, _telephone, telephone) : throwReadOnlyError();
- }
- /**
- * Getter for years_experience
- * @return {string}
- */
-
- }, {
- key: "years_experience",
- get: function get() {
- return _classPrivateFieldGet(this, _years_experience);
- }
- /**
- * Setter for #years_experience. Sets an error if trying to set after
- * initialization.
- * @param {string} years_experience
- */
- ,
- set: function set(years_experience) {
- !this.initialized ? _classPrivateFieldSet(this, _years_experience, years_experience) : throwReadOnlyError();
- }
- /**
- * toJSON for cmi.student_demographics object
- * @return {
- * {
- * city: string,
- * class: string,
- * company: string,
- * country: string,
- * experience: string,
- * familiar_name: string,
- * instructor_name: string,
- * title: string,
- * native_language: string,
- * state: string,
- * street_address: string,
- * telephone: string,
- * years_experience: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'city': this.city,
- 'class': this["class"],
- 'company': this.company,
- 'country': this.country,
- 'experience': this.experience,
- 'familiar_name': this.familiar_name,
- 'instructor_name': this.instructor_name,
- 'title': this.title,
- 'native_language': this.native_language,
- 'state': this.state,
- 'street_address': this.street_address,
- 'telephone': this.telephone,
- 'years_experience': this.years_experience
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIStudentDemographics;
-}(_common.BaseCMI);
-/**
- * Class representing the AICC cmi.paths object
- */
-
-
-exports.CMIStudentDemographics = CMIStudentDemographics;
-
-var CMIPaths = /*#__PURE__*/function (_CMIArray2) {
- _inherits(CMIPaths, _CMIArray2);
-
- var _super7 = _createSuper(CMIPaths);
-
- /**
- * Constructor for inline Paths Array class
- */
- function CMIPaths() {
- _classCallCheck(this, CMIPaths);
-
- return _super7.call(this, {
- children: aicc_constants.paths_children
- });
- }
-
- return _createClass(CMIPaths);
-}(_common.CMIArray);
-/**
- * Class for AICC Paths
- */
-
-
-exports.CMIPaths = CMIPaths;
-
-var _location_id = /*#__PURE__*/new WeakMap();
-
-var _date = /*#__PURE__*/new WeakMap();
-
-var _time = /*#__PURE__*/new WeakMap();
-
-var _status = /*#__PURE__*/new WeakMap();
-
-var _why_left = /*#__PURE__*/new WeakMap();
-
-var _time_in_element = /*#__PURE__*/new WeakMap();
-
-var CMIPathsObject = /*#__PURE__*/function (_BaseCMI3) {
- _inherits(CMIPathsObject, _BaseCMI3);
-
- var _super8 = _createSuper(CMIPathsObject);
-
- /**
- * Constructor for AICC Paths objects
- */
- function CMIPathsObject() {
- var _this6;
-
- _classCallCheck(this, CMIPathsObject);
-
- _this6 = _super8.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _location_id, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _date, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _time, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _status, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _why_left, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _time_in_element, {
- writable: true,
- value: ''
- });
-
- return _this6;
- }
-
- _createClass(CMIPathsObject, [{
- key: "location_id",
- get:
- /**
- * Getter for #location_id
- * @return {string}
- */
- function get() {
- return _classPrivateFieldGet(this, _location_id);
- }
- /**
- * Setter for #location_id
- * @param {string} location_id
- */
- ,
- set: function set(location_id) {
- if (checkAICCValidFormat(location_id, aicc_regex.CMIString256)) {
- _classPrivateFieldSet(this, _location_id, location_id);
- }
- }
- /**
- * Getter for #date
- * @return {string}
- */
-
- }, {
- key: "date",
- get: function get() {
- return _classPrivateFieldGet(this, _date);
- }
- /**
- * Setter for #date
- * @param {string} date
- */
- ,
- set: function set(date) {
- if (checkAICCValidFormat(date, aicc_regex.CMIString256)) {
- _classPrivateFieldSet(this, _date, date);
- }
- }
- /**
- * Getter for #time
- * @return {string}
- */
-
- }, {
- key: "time",
- get: function get() {
- return _classPrivateFieldGet(this, _time);
- }
- /**
- * Setter for #time
- * @param {string} time
- */
- ,
- set: function set(time) {
- if (checkAICCValidFormat(time, aicc_regex.CMITime)) {
- _classPrivateFieldSet(this, _time, time);
- }
- }
- /**
- * Getter for #status
- * @return {string}
- */
-
- }, {
- key: "status",
- get: function get() {
- return _classPrivateFieldGet(this, _status);
- }
- /**
- * Setter for #status
- * @param {string} status
- */
- ,
- set: function set(status) {
- if (checkAICCValidFormat(status, aicc_regex.CMIStatus2)) {
- _classPrivateFieldSet(this, _status, status);
- }
- }
- /**
- * Getter for #why_left
- * @return {string}
- */
-
- }, {
- key: "why_left",
- get: function get() {
- return _classPrivateFieldGet(this, _why_left);
- }
- /**
- * Setter for #why_left
- * @param {string} why_left
- */
- ,
- set: function set(why_left) {
- if (checkAICCValidFormat(why_left, aicc_regex.CMIString256)) {
- _classPrivateFieldSet(this, _why_left, why_left);
- }
- }
- /**
- * Getter for #time_in_element
- * @return {string}
- */
-
- }, {
- key: "time_in_element",
- get: function get() {
- return _classPrivateFieldGet(this, _time_in_element);
- }
- /**
- * Setter for #time_in_element
- * @param {string} time_in_element
- */
- ,
- set: function set(time_in_element) {
- if (checkAICCValidFormat(time_in_element, aicc_regex.CMITime)) {
- _classPrivateFieldSet(this, _time_in_element, time_in_element);
- }
- }
- /**
- * toJSON for cmi.paths.n object
- * @return {
- * {
- * location_id: string,
- * date: string,
- * time: string,
- * status: string,
- * why_left: string,
- * time_in_element: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'location_id': this.location_id,
- 'date': this.date,
- 'time': this.time,
- 'status': this.status,
- 'why_left': this.why_left,
- 'time_in_element': this.time_in_element
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIPathsObject;
-}(_common.BaseCMI);
-/**
- * Class representing the AICC cmi.student_data.tries object
- */
-
-
-exports.CMIPathsObject = CMIPathsObject;
-
-var CMITries = /*#__PURE__*/function (_CMIArray3) {
- _inherits(CMITries, _CMIArray3);
-
- var _super9 = _createSuper(CMITries);
-
- /**
- * Constructor for inline Tries Array class
- */
- function CMITries() {
- _classCallCheck(this, CMITries);
-
- return _super9.call(this, {
- children: aicc_constants.tries_children
- });
- }
-
- return _createClass(CMITries);
-}(_common.CMIArray);
-/**
- * Class for AICC Tries
- */
-
-
-exports.CMITries = CMITries;
-
-var _status2 = /*#__PURE__*/new WeakMap();
-
-var _time2 = /*#__PURE__*/new WeakMap();
-
-var CMITriesObject = /*#__PURE__*/function (_BaseCMI4) {
- _inherits(CMITriesObject, _BaseCMI4);
-
- var _super10 = _createSuper(CMITriesObject);
-
- /**
- * Constructor for AICC Tries object
- */
- function CMITriesObject() {
- var _this7;
-
- _classCallCheck(this, CMITriesObject);
-
- _this7 = _super10.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this7), _status2, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this7), _time2, {
- writable: true,
- value: ''
- });
-
- _this7.score = new _common.CMIScore({
- score_children: aicc_constants.score_children,
- score_range: aicc_regex.score_range,
- invalidErrorCode: aicc_error_codes.INVALID_SET_VALUE,
- invalidTypeCode: aicc_error_codes.TYPE_MISMATCH,
- invalidRangeCode: aicc_error_codes.VALUE_OUT_OF_RANGE,
- errorClass: _exceptions.AICCValidationError
- });
- return _this7;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(CMITriesObject, [{
- key: "initialize",
- value: function initialize() {
- var _this$score;
-
- _get(_getPrototypeOf(CMITriesObject.prototype), "initialize", this).call(this);
-
- (_this$score = this.score) === null || _this$score === void 0 ? void 0 : _this$score.initialize();
- }
- }, {
- key: "status",
- get:
- /**
- * Getter for #status
- * @return {string}
- */
- function get() {
- return _classPrivateFieldGet(this, _status2);
- }
- /**
- * Setter for #status
- * @param {string} status
- */
- ,
- set: function set(status) {
- if (checkAICCValidFormat(status, aicc_regex.CMIStatus2)) {
- _classPrivateFieldSet(this, _status2, status);
- }
- }
- /**
- * Getter for #time
- * @return {string}
- */
-
- }, {
- key: "time",
- get: function get() {
- return _classPrivateFieldGet(this, _time2);
- }
- /**
- * Setter for #time
- * @param {string} time
- */
- ,
- set: function set(time) {
- if (checkAICCValidFormat(time, aicc_regex.CMITime)) {
- _classPrivateFieldSet(this, _time2, time);
- }
- }
- /**
- * toJSON for cmi.student_data.tries.n object
- * @return {
- * {
- * status: string,
- * time: string,
- * score: CMIScore
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'status': this.status,
- 'time': this.time,
- 'score': this.score
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMITriesObject;
-}(_common.BaseCMI);
-/**
- * Class for cmi.student_data.attempt_records array
- */
-
-
-exports.CMITriesObject = CMITriesObject;
-
-var CMIAttemptRecords = /*#__PURE__*/function (_CMIArray4) {
- _inherits(CMIAttemptRecords, _CMIArray4);
-
- var _super11 = _createSuper(CMIAttemptRecords);
-
- /**
- * Constructor for inline Tries Array class
- */
- function CMIAttemptRecords() {
- _classCallCheck(this, CMIAttemptRecords);
-
- return _super11.call(this, {
- children: aicc_constants.attempt_records_children
- });
- }
-
- return _createClass(CMIAttemptRecords);
-}(_common.CMIArray);
-/**
- * Class for AICC Attempt Records
- */
-
-
-exports.CMIAttemptRecords = CMIAttemptRecords;
-
-var _lesson_status = /*#__PURE__*/new WeakMap();
-
-var CMIAttemptRecordsObject = /*#__PURE__*/function (_BaseCMI5) {
- _inherits(CMIAttemptRecordsObject, _BaseCMI5);
-
- var _super12 = _createSuper(CMIAttemptRecordsObject);
-
- /**
- * Constructor for AICC Attempt Records object
- */
- function CMIAttemptRecordsObject() {
- var _this8;
-
- _classCallCheck(this, CMIAttemptRecordsObject);
-
- _this8 = _super12.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this8), _lesson_status, {
- writable: true,
- value: ''
- });
-
- _this8.score = new _common.CMIScore({
- score_children: aicc_constants.score_children,
- score_range: aicc_regex.score_range,
- invalidErrorCode: aicc_error_codes.INVALID_SET_VALUE,
- invalidTypeCode: aicc_error_codes.TYPE_MISMATCH,
- invalidRangeCode: aicc_error_codes.VALUE_OUT_OF_RANGE,
- errorClass: _exceptions.AICCValidationError
- });
- return _this8;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(CMIAttemptRecordsObject, [{
- key: "initialize",
- value: function initialize() {
- var _this$score2;
-
- _get(_getPrototypeOf(CMIAttemptRecordsObject.prototype), "initialize", this).call(this);
-
- (_this$score2 = this.score) === null || _this$score2 === void 0 ? void 0 : _this$score2.initialize();
- }
- }, {
- key: "lesson_status",
- get:
- /**
- * Getter for #lesson_status
- * @return {string}
- */
- function get() {
- return _classPrivateFieldGet(this, _lesson_status);
- }
- /**
- * Setter for #lesson_status
- * @param {string} lesson_status
- */
- ,
- set: function set(lesson_status) {
- if (checkAICCValidFormat(lesson_status, aicc_regex.CMIStatus2)) {
- _classPrivateFieldSet(this, _lesson_status, lesson_status);
- }
- }
- /**
- * toJSON for cmi.student_data.attempt_records.n object
- * @return {
- * {
- * status: string,
- * time: string,
- * score: CMIScore
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'lesson_status': this.lesson_status,
- 'score': this.score
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIAttemptRecordsObject;
-}(_common.BaseCMI);
-/**
- * Class for AICC Evaluation Comments
- */
-
-
-exports.CMIAttemptRecordsObject = CMIAttemptRecordsObject;
-
-var _content = /*#__PURE__*/new WeakMap();
-
-var _location = /*#__PURE__*/new WeakMap();
-
-var _time3 = /*#__PURE__*/new WeakMap();
-
-var CMIEvaluationCommentsObject = /*#__PURE__*/function (_BaseCMI6) {
- _inherits(CMIEvaluationCommentsObject, _BaseCMI6);
-
- var _super13 = _createSuper(CMIEvaluationCommentsObject);
-
- /**
- * Constructor for Evaluation Comments
- */
- function CMIEvaluationCommentsObject() {
- var _this9;
-
- _classCallCheck(this, CMIEvaluationCommentsObject);
-
- _this9 = _super13.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this9), _content, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this9), _location, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this9), _time3, {
- writable: true,
- value: ''
- });
-
- return _this9;
- }
-
- _createClass(CMIEvaluationCommentsObject, [{
- key: "content",
- get:
- /**
- * Getter for #content
- * @return {string}
- */
- function get() {
- return _classPrivateFieldGet(this, _content);
- }
- /**
- * Setter for #content
- * @param {string} content
- */
- ,
- set: function set(content) {
- if (checkAICCValidFormat(content, aicc_regex.CMIString256)) {
- _classPrivateFieldSet(this, _content, content);
- }
- }
- /**
- * Getter for #location
- * @return {string}
- */
-
- }, {
- key: "location",
- get: function get() {
- return _classPrivateFieldGet(this, _location);
- }
- /**
- * Setter for #location
- * @param {string} location
- */
- ,
- set: function set(location) {
- if (checkAICCValidFormat(location, aicc_regex.CMIString256)) {
- _classPrivateFieldSet(this, _location, location);
- }
- }
- /**
- * Getter for #time
- * @return {string}
- */
-
- }, {
- key: "time",
- get: function get() {
- return _classPrivateFieldGet(this, _time3);
- }
- /**
- * Setting for #time
- * @param {string} time
- */
- ,
- set: function set(time) {
- if (checkAICCValidFormat(time, aicc_regex.CMITime)) {
- _classPrivateFieldSet(this, _time3, time);
- }
- }
- /**
- * toJSON for cmi.evaulation.comments.n object
- * @return {
- * {
- * content: string,
- * location: string,
- * time: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'content': this.content,
- 'location': this.location,
- 'time': this.time
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIEvaluationCommentsObject;
-}(_common.BaseCMI);
-
-exports.CMIEvaluationCommentsObject = CMIEvaluationCommentsObject;
-
-},{"../constants/api_constants":8,"../constants/error_codes":9,"../constants/regex":10,"../exceptions":11,"./common":6,"./scorm12_cmi":7}],6:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.CMIScore = exports.CMIArray = exports.BaseCMI = void 0;
-exports.checkValidFormat = checkValidFormat;
-exports.checkValidRange = checkValidRange;
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
-
-function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
-
-function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-
-function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
-
-function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
-
-function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-
-var scorm12_constants = _api_constants["default"].scorm12;
-var scorm12_regex = _regex["default"].scorm12;
-var scorm12_error_codes = _error_codes["default"].scorm12;
-/**
- * Check if the value matches the proper format. If not, throw proper error code.
- *
- * @param {string} value
- * @param {string} regexPattern
- * @param {number} errorCode
- * @param {class} errorClass
- * @param {boolean} allowEmptyString
- * @return {boolean}
- */
-
-function checkValidFormat(value, regexPattern, errorCode, errorClass, allowEmptyString) {
- var formatRegex = new RegExp(regexPattern);
- var matches = value.match(formatRegex);
-
- if (allowEmptyString && value === '') {
- return true;
- }
-
- if (value === undefined || !matches || matches[0] === '') {
- throw new errorClass.prototype.constructor(errorCode);
- }
-
- return true;
-}
-/**
- * Check if the value matches the proper range. If not, throw proper error code.
- *
- * @param {*} value
- * @param {string} rangePattern
- * @param {number} errorCode
- * @param {class} errorClass
- * @return {boolean}
- */
-
-
-function checkValidRange(value, rangePattern, errorCode, errorClass) {
- var ranges = rangePattern.split('#');
- value = value * 1.0;
-
- if (value >= ranges[0]) {
- if (ranges[1] === '*' || value <= ranges[1]) {
- return true;
- } else {
- throw new errorClass.prototype.constructor(errorCode);
- }
- } else {
- throw new errorClass.prototype.constructor(errorCode);
- }
-}
-/**
- * Base class for API cmi objects
- */
-
-
-var _initialized = /*#__PURE__*/new WeakMap();
-
-var _start_time = /*#__PURE__*/new WeakMap();
-
-var BaseCMI = /*#__PURE__*/function () {
- /**
- * Constructor for BaseCMI, just marks the class as abstract
- */
- function BaseCMI() {
- _classCallCheck(this, BaseCMI);
-
- _defineProperty(this, "jsonString", false);
-
- _classPrivateFieldInitSpec(this, _initialized, {
- writable: true,
- value: false
- });
-
- _classPrivateFieldInitSpec(this, _start_time, {
- writable: true,
- value: void 0
- });
-
- if ((this instanceof BaseCMI ? this.constructor : void 0) === BaseCMI) {
- throw new TypeError('Cannot construct BaseCMI instances directly');
- }
- }
- /**
- * Getter for #initialized
- * @return {boolean}
- */
-
-
- _createClass(BaseCMI, [{
- key: "initialized",
- get: function get() {
- return _classPrivateFieldGet(this, _initialized);
- }
- /**
- * Getter for #start_time
- * @return {Number}
- */
-
- }, {
- key: "start_time",
- get: function get() {
- return _classPrivateFieldGet(this, _start_time);
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
- }, {
- key: "initialize",
- value: function initialize() {
- _classPrivateFieldSet(this, _initialized, true);
- }
- /**
- * Called when the player should override the 'session_time' provided by
- * the module
- */
-
- }, {
- key: "setStartTime",
- value: function setStartTime() {
- _classPrivateFieldSet(this, _start_time, new Date().getTime());
- }
- }]);
-
- return BaseCMI;
-}();
-/**
- * Base class for cmi *.score objects
- */
-
-
-exports.BaseCMI = BaseCMI;
-
-var _children2 = /*#__PURE__*/new WeakMap();
-
-var _score_range = /*#__PURE__*/new WeakMap();
-
-var _invalid_error_code = /*#__PURE__*/new WeakMap();
-
-var _invalid_type_code = /*#__PURE__*/new WeakMap();
-
-var _invalid_range_code = /*#__PURE__*/new WeakMap();
-
-var _decimal_regex = /*#__PURE__*/new WeakMap();
-
-var _error_class = /*#__PURE__*/new WeakMap();
-
-var _raw = /*#__PURE__*/new WeakMap();
-
-var _min = /*#__PURE__*/new WeakMap();
-
-var _max = /*#__PURE__*/new WeakMap();
-
-var CMIScore = /*#__PURE__*/function (_BaseCMI) {
- _inherits(CMIScore, _BaseCMI);
-
- var _super = _createSuper(CMIScore);
-
- /**
- * Constructor for *.score
- * @param {string} score_children
- * @param {string} score_range
- * @param {string} max
- * @param {number} invalidErrorCode
- * @param {number} invalidTypeCode
- * @param {number} invalidRangeCode
- * @param {string} decimalRegex
- * @param {class} errorClass
- */
- function CMIScore(_ref) {
- var _this;
-
- var score_children = _ref.score_children,
- score_range = _ref.score_range,
- max = _ref.max,
- invalidErrorCode = _ref.invalidErrorCode,
- invalidTypeCode = _ref.invalidTypeCode,
- invalidRangeCode = _ref.invalidRangeCode,
- decimalRegex = _ref.decimalRegex,
- errorClass = _ref.errorClass;
-
- _classCallCheck(this, CMIScore);
-
- _this = _super.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _children2, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _score_range, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _invalid_error_code, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _invalid_type_code, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _invalid_range_code, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _decimal_regex, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _error_class, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _raw, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _min, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _max, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _children2, score_children || scorm12_constants.score_children);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _score_range, !score_range ? false : scorm12_regex.score_range);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _max, max || max === '' ? max : '100');
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _invalid_error_code, invalidErrorCode || scorm12_error_codes.INVALID_SET_VALUE);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _invalid_type_code, invalidTypeCode || scorm12_error_codes.TYPE_MISMATCH);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _invalid_range_code, invalidRangeCode || scorm12_error_codes.VALUE_OUT_OF_RANGE);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _decimal_regex, decimalRegex || scorm12_regex.CMIDecimal);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _error_class, errorClass);
-
- return _this;
- }
-
- _createClass(CMIScore, [{
- key: "_children",
- get:
- /**
- * Getter for _children
- * @return {string}
- * @private
- */
- function get() {
- return _classPrivateFieldGet(this, _children2);
- }
- /**
- * Setter for _children. Just throws an error.
- * @param {string} _children
- * @private
- */
- ,
- set: function set(_children) {
- throw new (_classPrivateFieldGet(this, _error_class).prototype.constructor)(_classPrivateFieldGet(this, _invalid_error_code));
- }
- /**
- * Getter for #raw
- * @return {string}
- */
-
- }, {
- key: "raw",
- get: function get() {
- return _classPrivateFieldGet(this, _raw);
- }
- /**
- * Setter for #raw
- * @param {string} raw
- */
- ,
- set: function set(raw) {
- if (checkValidFormat(raw, _classPrivateFieldGet(this, _decimal_regex), _classPrivateFieldGet(this, _invalid_type_code), _classPrivateFieldGet(this, _error_class)) && (!_classPrivateFieldGet(this, _score_range) || checkValidRange(raw, _classPrivateFieldGet(this, _score_range), _classPrivateFieldGet(this, _invalid_range_code), _classPrivateFieldGet(this, _error_class)))) {
- _classPrivateFieldSet(this, _raw, raw);
- }
- }
- /**
- * Getter for #min
- * @return {string}
- */
-
- }, {
- key: "min",
- get: function get() {
- return _classPrivateFieldGet(this, _min);
- }
- /**
- * Setter for #min
- * @param {string} min
- */
- ,
- set: function set(min) {
- if (checkValidFormat(min, _classPrivateFieldGet(this, _decimal_regex), _classPrivateFieldGet(this, _invalid_type_code), _classPrivateFieldGet(this, _error_class)) && (!_classPrivateFieldGet(this, _score_range) || checkValidRange(min, _classPrivateFieldGet(this, _score_range), _classPrivateFieldGet(this, _invalid_range_code), _classPrivateFieldGet(this, _error_class)))) {
- _classPrivateFieldSet(this, _min, min);
- }
- }
- /**
- * Getter for #max
- * @return {string}
- */
-
- }, {
- key: "max",
- get: function get() {
- return _classPrivateFieldGet(this, _max);
- }
- /**
- * Setter for #max
- * @param {string} max
- */
- ,
- set: function set(max) {
- if (checkValidFormat(max, _classPrivateFieldGet(this, _decimal_regex), _classPrivateFieldGet(this, _invalid_type_code), _classPrivateFieldGet(this, _error_class)) && (!_classPrivateFieldGet(this, _score_range) || checkValidRange(max, _classPrivateFieldGet(this, _score_range), _classPrivateFieldGet(this, _invalid_range_code), _classPrivateFieldGet(this, _error_class)))) {
- _classPrivateFieldSet(this, _max, max);
- }
- }
- /**
- * toJSON for *.score
- * @return {{min: string, max: string, raw: string}}
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'raw': this.raw,
- 'min': this.min,
- 'max': this.max
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIScore;
-}(BaseCMI);
-/**
- * Base class for cmi *.n objects
- */
-
-
-exports.CMIScore = CMIScore;
-
-var _errorCode = /*#__PURE__*/new WeakMap();
-
-var _errorClass = /*#__PURE__*/new WeakMap();
-
-var _children3 = /*#__PURE__*/new WeakMap();
-
-var CMIArray = /*#__PURE__*/function (_BaseCMI2) {
- _inherits(CMIArray, _BaseCMI2);
-
- var _super2 = _createSuper(CMIArray);
-
- /**
- * Constructor cmi *.n arrays
- * @param {string} children
- * @param {number} errorCode
- * @param {class} errorClass
- */
- function CMIArray(_ref2) {
- var _this2;
-
- var children = _ref2.children,
- errorCode = _ref2.errorCode,
- errorClass = _ref2.errorClass;
-
- _classCallCheck(this, CMIArray);
-
- _this2 = _super2.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _errorCode, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _errorClass, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _children3, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldSet(_assertThisInitialized(_this2), _children3, children);
-
- _classPrivateFieldSet(_assertThisInitialized(_this2), _errorCode, errorCode);
-
- _classPrivateFieldSet(_assertThisInitialized(_this2), _errorClass, errorClass);
-
- _this2.childArray = [];
- return _this2;
- }
-
- _createClass(CMIArray, [{
- key: "_children",
- get:
- /**
- * Getter for _children
- * @return {*}
- */
- function get() {
- return _classPrivateFieldGet(this, _children3);
- }
- /**
- * Setter for _children. Just throws an error.
- * @param {string} _children
- */
- ,
- set: function set(_children) {
- throw new (_classPrivateFieldGet(this, _errorClass).prototype.constructor)(_classPrivateFieldGet(this, _errorCode));
- }
- /**
- * Getter for _count
- * @return {number}
- */
-
- }, {
- key: "_count",
- get: function get() {
- return this.childArray.length;
- }
- /**
- * Setter for _count. Just throws an error.
- * @param {number} _count
- */
- ,
- set: function set(_count) {
- throw new (_classPrivateFieldGet(this, _errorClass).prototype.constructor)(_classPrivateFieldGet(this, _errorCode));
- }
- /**
- * toJSON for *.n arrays
- * @return {object}
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {};
-
- for (var i = 0; i < this.childArray.length; i++) {
- result[i + ''] = this.childArray[i];
- }
-
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIArray;
-}(BaseCMI);
-
-exports.CMIArray = CMIArray;
-
-},{"../constants/api_constants":8,"../constants/error_codes":9,"../constants/regex":10}],7:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.NAV = exports.CMIStudentPreference = exports.CMIStudentData = exports.CMIObjectivesObject = exports.CMIInteractionsObjectivesObject = exports.CMIInteractionsObject = exports.CMIInteractionsCorrectResponsesObject = exports.CMI = void 0;
-exports.check12ValidFormat = check12ValidFormat;
-exports.check12ValidRange = check12ValidRange;
-exports.throwReadOnlyError = throwReadOnlyError;
-exports.throwWriteOnlyError = throwWriteOnlyError;
-
-var _common = require("./common");
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-var _exceptions = require("../exceptions");
-
-var Utilities = _interopRequireWildcard(require("../utilities"));
-
-var Util = Utilities;
-
-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; }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); }
-
-function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
-
-function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
-
-function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
-
-function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-
-function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
-
-function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
-
-function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-
-var scorm12_constants = _api_constants["default"].scorm12;
-var scorm12_regex = _regex["default"].scorm12;
-var scorm12_error_codes = _error_codes["default"].scorm12;
-/**
- * Helper method for throwing Read Only error
- */
-
-function throwReadOnlyError() {
- throw new _exceptions.Scorm12ValidationError(scorm12_error_codes.READ_ONLY_ELEMENT);
-}
-/**
- * Helper method for throwing Write Only error
- */
-
-
-function throwWriteOnlyError() {
- throw new _exceptions.Scorm12ValidationError(scorm12_error_codes.WRITE_ONLY_ELEMENT);
-}
-/**
- * Helper method for throwing Invalid Set error
- */
-
-
-function throwInvalidValueError() {
- throw new _exceptions.Scorm12ValidationError(scorm12_error_codes.INVALID_SET_VALUE);
-}
-/**
- * Helper method, no reason to have to pass the same error codes every time
- * @param {*} value
- * @param {string} regexPattern
- * @param {boolean} allowEmptyString
- * @return {boolean}
- */
-
-
-function check12ValidFormat(value, regexPattern, allowEmptyString) {
- return (0, _common.checkValidFormat)(value, regexPattern, scorm12_error_codes.TYPE_MISMATCH, _exceptions.Scorm12ValidationError, allowEmptyString);
-}
-/**
- * Helper method, no reason to have to pass the same error codes every time
- * @param {*} value
- * @param {string} rangePattern
- * @param {boolean} allowEmptyString
- * @return {boolean}
- */
-
-
-function check12ValidRange(value, rangePattern, allowEmptyString) {
- return (0, _common.checkValidRange)(value, rangePattern, scorm12_error_codes.VALUE_OUT_OF_RANGE, _exceptions.Scorm12ValidationError, allowEmptyString);
-}
-/**
- * Class representing the cmi object for SCORM 1.2
- */
-
-
-var _children2 = /*#__PURE__*/new WeakMap();
-
-var _version2 = /*#__PURE__*/new WeakMap();
-
-var _launch_data = /*#__PURE__*/new WeakMap();
-
-var _comments = /*#__PURE__*/new WeakMap();
-
-var _comments_from_lms = /*#__PURE__*/new WeakMap();
-
-var CMI = /*#__PURE__*/function (_BaseCMI) {
- _inherits(CMI, _BaseCMI);
-
- var _super = _createSuper(CMI);
-
- /**
- * Constructor for the SCORM 1.2 cmi object
- * @param {string} cmi_children
- * @param {(CMIStudentData|AICCCMIStudentData)} student_data
- * @param {boolean} initialized
- */
- function CMI(cmi_children, student_data, initialized) {
- var _this;
-
- _classCallCheck(this, CMI);
-
- _this = _super.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _children2, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _version2, {
- writable: true,
- value: '3.4'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _launch_data, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _comments, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _comments_from_lms, {
- writable: true,
- value: ''
- });
-
- _defineProperty(_assertThisInitialized(_this), "student_data", null);
-
- if (initialized) _this.initialize();
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _children2, cmi_children ? cmi_children : scorm12_constants.cmi_children);
-
- _this.core = new CMICore();
- _this.objectives = new CMIObjectives();
- _this.student_data = student_data ? student_data : new CMIStudentData();
- _this.student_preference = new CMIStudentPreference();
- _this.interactions = new CMIInteractions();
- return _this;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(CMI, [{
- key: "initialize",
- value: function initialize() {
- var _this$core, _this$objectives, _this$student_data, _this$student_prefere, _this$interactions;
-
- _get(_getPrototypeOf(CMI.prototype), "initialize", this).call(this);
-
- (_this$core = this.core) === null || _this$core === void 0 ? void 0 : _this$core.initialize();
- (_this$objectives = this.objectives) === null || _this$objectives === void 0 ? void 0 : _this$objectives.initialize();
- (_this$student_data = this.student_data) === null || _this$student_data === void 0 ? void 0 : _this$student_data.initialize();
- (_this$student_prefere = this.student_preference) === null || _this$student_prefere === void 0 ? void 0 : _this$student_prefere.initialize();
- (_this$interactions = this.interactions) === null || _this$interactions === void 0 ? void 0 : _this$interactions.initialize();
- }
- /**
- * toJSON for cmi
- *
- * @return {
- * {
- * suspend_data: string,
- * launch_data: string,
- * comments: string,
- * comments_from_lms: string,
- * core: CMICore,
- * objectives: CMIObjectives,
- * student_data: CMIStudentData,
- * student_preference: CMIStudentPreference,
- * interactions: CMIInteractions
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'suspend_data': this.suspend_data,
- 'launch_data': this.launch_data,
- 'comments': this.comments,
- 'comments_from_lms': this.comments_from_lms,
- 'core': this.core,
- 'objectives': this.objectives,
- 'student_data': this.student_data,
- 'student_preference': this.student_preference,
- 'interactions': this.interactions
- };
- delete this.jsonString;
- return result;
- }
- /**
- * Getter for #_version
- * @return {string}
- */
-
- }, {
- key: "_version",
- get: function get() {
- return _classPrivateFieldGet(this, _version2);
- }
- /**
- * Setter for #_version. Just throws an error.
- * @param {string} _version
- */
- ,
- set: function set(_version) {
- throwInvalidValueError();
- }
- /**
- * Getter for #_children
- * @return {string}
- */
-
- }, {
- key: "_children",
- get: function get() {
- return _classPrivateFieldGet(this, _children2);
- }
- /**
- * Setter for #_version. Just throws an error.
- * @param {string} _children
- */
- ,
- set: function set(_children) {
- throwInvalidValueError();
- }
- /**
- * Getter for #suspend_data
- * @return {string}
- */
-
- }, {
- key: "suspend_data",
- get: function get() {
- var _this$core2;
-
- return (_this$core2 = this.core) === null || _this$core2 === void 0 ? void 0 : _this$core2.suspend_data;
- }
- /**
- * Setter for #suspend_data
- * @param {string} suspend_data
- */
- ,
- set: function set(suspend_data) {
- if (this.core) {
- this.core.suspend_data = suspend_data;
- }
- }
- /**
- * Getter for #launch_data
- * @return {string}
- */
-
- }, {
- key: "launch_data",
- get: function get() {
- return _classPrivateFieldGet(this, _launch_data);
- }
- /**
- * Setter for #launch_data. Can only be called before initialization.
- * @param {string} launch_data
- */
- ,
- set: function set(launch_data) {
- !this.initialized ? _classPrivateFieldSet(this, _launch_data, launch_data) : throwReadOnlyError();
- }
- /**
- * Getter for #comments
- * @return {string}
- */
-
- }, {
- key: "comments",
- get: function get() {
- return _classPrivateFieldGet(this, _comments);
- }
- /**
- * Setter for #comments
- * @param {string} comments
- */
- ,
- set: function set(comments) {
- if (check12ValidFormat(comments, scorm12_regex.CMIString4096, true)) {
- _classPrivateFieldSet(this, _comments, comments);
- }
- }
- /**
- * Getter for #comments_from_lms
- * @return {string}
- */
-
- }, {
- key: "comments_from_lms",
- get: function get() {
- return _classPrivateFieldGet(this, _comments_from_lms);
- }
- /**
- * Setter for #comments_from_lms. Can only be called before initialization.
- * @param {string} comments_from_lms
- */
- ,
- set: function set(comments_from_lms) {
- !this.initialized ? _classPrivateFieldSet(this, _comments_from_lms, comments_from_lms) : throwReadOnlyError();
- }
- /**
- * Adds the current session time to the existing total time.
- *
- * @return {string}
- */
-
- }, {
- key: "getCurrentTotalTime",
- value: function getCurrentTotalTime() {
- return this.core.getCurrentTotalTime(this.start_time);
- }
- }]);
-
- return CMI;
-}(_common.BaseCMI);
-/**
- * Class representing the cmi.core object
- * @extends BaseCMI
- */
-
-
-exports.CMI = CMI;
-
-var _children3 = /*#__PURE__*/new WeakMap();
-
-var _student_id = /*#__PURE__*/new WeakMap();
-
-var _student_name = /*#__PURE__*/new WeakMap();
-
-var _lesson_location = /*#__PURE__*/new WeakMap();
-
-var _credit = /*#__PURE__*/new WeakMap();
-
-var _lesson_status = /*#__PURE__*/new WeakMap();
-
-var _entry = /*#__PURE__*/new WeakMap();
-
-var _total_time = /*#__PURE__*/new WeakMap();
-
-var _lesson_mode = /*#__PURE__*/new WeakMap();
-
-var _exit = /*#__PURE__*/new WeakMap();
-
-var _session_time = /*#__PURE__*/new WeakMap();
-
-var _suspend_data = /*#__PURE__*/new WeakMap();
-
-var CMICore = /*#__PURE__*/function (_BaseCMI2) {
- _inherits(CMICore, _BaseCMI2);
-
- var _super2 = _createSuper(CMICore);
-
- /**
- * Constructor for cmi.core
- */
- function CMICore() {
- var _this2;
-
- _classCallCheck(this, CMICore);
-
- _this2 = _super2.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _children3, {
- writable: true,
- value: scorm12_constants.core_children
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _student_id, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _student_name, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _lesson_location, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _credit, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _lesson_status, {
- writable: true,
- value: 'not attempted'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _entry, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _total_time, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _lesson_mode, {
- writable: true,
- value: 'normal'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _exit, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _session_time, {
- writable: true,
- value: '00:00:00'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _suspend_data, {
- writable: true,
- value: ''
- });
-
- _this2.score = new _common.CMIScore({
- score_children: scorm12_constants.score_children,
- score_range: scorm12_regex.score_range,
- invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,
- invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,
- invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,
- errorClass: _exceptions.Scorm12ValidationError
- });
- return _this2;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(CMICore, [{
- key: "initialize",
- value: function initialize() {
- var _this$score;
-
- _get(_getPrototypeOf(CMICore.prototype), "initialize", this).call(this);
-
- (_this$score = this.score) === null || _this$score === void 0 ? void 0 : _this$score.initialize();
- }
- }, {
- key: "_children",
- get:
- /**
- * Getter for #_children
- * @return {string}
- * @private
- */
- function get() {
- return _classPrivateFieldGet(this, _children3);
- }
- /**
- * Setter for #_children. Just throws an error.
- * @param {string} _children
- * @private
- */
- ,
- set: function set(_children) {
- throwInvalidValueError();
- }
- /**
- * Getter for #student_id
- * @return {string}
- */
-
- }, {
- key: "student_id",
- get: function get() {
- return _classPrivateFieldGet(this, _student_id);
- }
- /**
- * Setter for #student_id. Can only be called before initialization.
- * @param {string} student_id
- */
- ,
- set: function set(student_id) {
- !this.initialized ? _classPrivateFieldSet(this, _student_id, student_id) : throwReadOnlyError();
- }
- /**
- * Getter for #student_name
- * @return {string}
- */
-
- }, {
- key: "student_name",
- get: function get() {
- return _classPrivateFieldGet(this, _student_name);
- }
- /**
- * Setter for #student_name. Can only be called before initialization.
- * @param {string} student_name
- */
- ,
- set: function set(student_name) {
- !this.initialized ? _classPrivateFieldSet(this, _student_name, student_name) : throwReadOnlyError();
- }
- /**
- * Getter for #lesson_location
- * @return {string}
- */
-
- }, {
- key: "lesson_location",
- get: function get() {
- return _classPrivateFieldGet(this, _lesson_location);
- }
- /**
- * Setter for #lesson_location
- * @param {string} lesson_location
- */
- ,
- set: function set(lesson_location) {
- if (check12ValidFormat(lesson_location, scorm12_regex.CMIString256, true)) {
- _classPrivateFieldSet(this, _lesson_location, lesson_location);
- }
- }
- /**
- * Getter for #credit
- * @return {string}
- */
-
- }, {
- key: "credit",
- get: function get() {
- return _classPrivateFieldGet(this, _credit);
- }
- /**
- * Setter for #credit. Can only be called before initialization.
- * @param {string} credit
- */
- ,
- set: function set(credit) {
- !this.initialized ? _classPrivateFieldSet(this, _credit, credit) : throwReadOnlyError();
- }
- /**
- * Getter for #lesson_status
- * @return {string}
- */
-
- }, {
- key: "lesson_status",
- get: function get() {
- return _classPrivateFieldGet(this, _lesson_status);
- }
- /**
- * Setter for #lesson_status
- * @param {string} lesson_status
- */
- ,
- set: function set(lesson_status) {
- if (this.initialized) {
- if (check12ValidFormat(lesson_status, scorm12_regex.CMIStatus)) {
- _classPrivateFieldSet(this, _lesson_status, lesson_status);
- }
- } else {
- if (check12ValidFormat(lesson_status, scorm12_regex.CMIStatus2)) {
- _classPrivateFieldSet(this, _lesson_status, lesson_status);
- }
- }
- }
- /**
- * Getter for #entry
- * @return {string}
- */
-
- }, {
- key: "entry",
- get: function get() {
- return _classPrivateFieldGet(this, _entry);
- }
- /**
- * Setter for #entry. Can only be called before initialization.
- * @param {string} entry
- */
- ,
- set: function set(entry) {
- !this.initialized ? _classPrivateFieldSet(this, _entry, entry) : throwReadOnlyError();
- }
- /**
- * Getter for #total_time
- * @return {string}
- */
-
- }, {
- key: "total_time",
- get: function get() {
- return _classPrivateFieldGet(this, _total_time);
- }
- /**
- * Setter for #total_time. Can only be called before initialization.
- * @param {string} total_time
- */
- ,
- set: function set(total_time) {
- !this.initialized ? _classPrivateFieldSet(this, _total_time, total_time) : throwReadOnlyError();
- }
- /**
- * Getter for #lesson_mode
- * @return {string}
- */
-
- }, {
- key: "lesson_mode",
- get: function get() {
- return _classPrivateFieldGet(this, _lesson_mode);
- }
- /**
- * Setter for #lesson_mode. Can only be called before initialization.
- * @param {string} lesson_mode
- */
- ,
- set: function set(lesson_mode) {
- !this.initialized ? _classPrivateFieldSet(this, _lesson_mode, lesson_mode) : throwReadOnlyError();
- }
- /**
- * Getter for #exit. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "exit",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _exit);
- }
- /**
- * Setter for #exit
- * @param {string} exit
- */
- ,
- set: function set(exit) {
- if (check12ValidFormat(exit, scorm12_regex.CMIExit, true)) {
- _classPrivateFieldSet(this, _exit, exit);
- }
- }
- /**
- * Getter for #session_time. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "session_time",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _session_time);
- }
- /**
- * Setter for #session_time
- * @param {string} session_time
- */
- ,
- set: function set(session_time) {
- if (check12ValidFormat(session_time, scorm12_regex.CMITimespan)) {
- _classPrivateFieldSet(this, _session_time, session_time);
- }
- }
- /**
- * Getter for #suspend_data
- * @return {string}
- */
-
- }, {
- key: "suspend_data",
- get: function get() {
- return _classPrivateFieldGet(this, _suspend_data);
- }
- /**
- * Setter for #suspend_data
- * @param {string} suspend_data
- */
- ,
- set: function set(suspend_data) {
- if (check12ValidFormat(suspend_data, scorm12_regex.CMIString4096, true)) {
- _classPrivateFieldSet(this, _suspend_data, suspend_data);
- }
- }
- /**
- * Adds the current session time to the existing total time.
- * @param {Number} start_time
- * @return {string}
- */
-
- }, {
- key: "getCurrentTotalTime",
- value: function getCurrentTotalTime(start_time) {
- var sessionTime = _classPrivateFieldGet(this, _session_time);
-
- var startTime = start_time;
-
- if (typeof startTime !== 'undefined' && startTime !== null) {
- var seconds = new Date().getTime() - startTime;
- sessionTime = Util.getSecondsAsHHMMSS(seconds / 1000);
- }
-
- return Utilities.addHHMMSSTimeStrings(_classPrivateFieldGet(this, _total_time), sessionTime, new RegExp(scorm12_regex.CMITimespan));
- }
- /**
- * toJSON for cmi.core
- *
- * @return {
- * {
- * student_name: string,
- * entry: string,
- * exit: string,
- * score: CMIScore,
- * student_id: string,
- * lesson_mode: string,
- * lesson_location: string,
- * lesson_status: string,
- * credit: string,
- * session_time: *
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'student_id': this.student_id,
- 'student_name': this.student_name,
- 'lesson_location': this.lesson_location,
- 'credit': this.credit,
- 'lesson_status': this.lesson_status,
- 'entry': this.entry,
- 'lesson_mode': this.lesson_mode,
- 'exit': this.exit,
- 'session_time': this.session_time,
- 'score': this.score
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMICore;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 1.2's cmi.objectives object
- * @extends CMIArray
- */
-
-
-var CMIObjectives = /*#__PURE__*/function (_CMIArray) {
- _inherits(CMIObjectives, _CMIArray);
-
- var _super3 = _createSuper(CMIObjectives);
-
- /**
- * Constructor for cmi.objectives
- */
- function CMIObjectives() {
- _classCallCheck(this, CMIObjectives);
-
- return _super3.call(this, {
- children: scorm12_constants.objectives_children,
- errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError
- });
- }
-
- return _createClass(CMIObjectives);
-}(_common.CMIArray);
-/**
- * Class representing SCORM 1.2's cmi.student_data object
- * @extends BaseCMI
- */
-
-
-var _children4 = /*#__PURE__*/new WeakMap();
-
-var _mastery_score = /*#__PURE__*/new WeakMap();
-
-var _max_time_allowed = /*#__PURE__*/new WeakMap();
-
-var _time_limit_action = /*#__PURE__*/new WeakMap();
-
-var CMIStudentData = /*#__PURE__*/function (_BaseCMI3) {
- _inherits(CMIStudentData, _BaseCMI3);
-
- var _super4 = _createSuper(CMIStudentData);
-
- /**
- * Constructor for cmi.student_data
- * @param {string} student_data_children
- */
- function CMIStudentData(student_data_children) {
- var _this3;
-
- _classCallCheck(this, CMIStudentData);
-
- _this3 = _super4.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _children4, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _mastery_score, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _max_time_allowed, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _time_limit_action, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldSet(_assertThisInitialized(_this3), _children4, student_data_children ? student_data_children : scorm12_constants.student_data_children);
-
- return _this3;
- }
- /**
- * Getter for #_children
- * @return {*}
- * @private
- */
-
-
- _createClass(CMIStudentData, [{
- key: "_children",
- get: function get() {
- return _classPrivateFieldGet(this, _children4);
- }
- /**
- * Setter for #_children. Just throws an error.
- * @param {string} _children
- * @private
- */
- ,
- set: function set(_children) {
- throwInvalidValueError();
- }
- /**
- * Getter for #master_score
- * @return {string}
- */
-
- }, {
- key: "mastery_score",
- get: function get() {
- return _classPrivateFieldGet(this, _mastery_score);
- }
- /**
- * Setter for #master_score. Can only be called before initialization.
- * @param {string} mastery_score
- */
- ,
- set: function set(mastery_score) {
- !this.initialized ? _classPrivateFieldSet(this, _mastery_score, mastery_score) : throwReadOnlyError();
- }
- /**
- * Getter for #max_time_allowed
- * @return {string}
- */
-
- }, {
- key: "max_time_allowed",
- get: function get() {
- return _classPrivateFieldGet(this, _max_time_allowed);
- }
- /**
- * Setter for #max_time_allowed. Can only be called before initialization.
- * @param {string} max_time_allowed
- */
- ,
- set: function set(max_time_allowed) {
- !this.initialized ? _classPrivateFieldSet(this, _max_time_allowed, max_time_allowed) : throwReadOnlyError();
- }
- /**
- * Getter for #time_limit_action
- * @return {string}
- */
-
- }, {
- key: "time_limit_action",
- get: function get() {
- return _classPrivateFieldGet(this, _time_limit_action);
- }
- /**
- * Setter for #time_limit_action. Can only be called before initialization.
- * @param {string} time_limit_action
- */
- ,
- set: function set(time_limit_action) {
- !this.initialized ? _classPrivateFieldSet(this, _time_limit_action, time_limit_action) : throwReadOnlyError();
- }
- /**
- * toJSON for cmi.student_data
- *
- * @return {
- * {
- * max_time_allowed: string,
- * time_limit_action: string,
- * mastery_score: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'mastery_score': this.mastery_score,
- 'max_time_allowed': this.max_time_allowed,
- 'time_limit_action': this.time_limit_action
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIStudentData;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 1.2's cmi.student_preference object
- * @extends BaseCMI
- */
-
-
-exports.CMIStudentData = CMIStudentData;
-
-var _children5 = /*#__PURE__*/new WeakMap();
-
-var _audio = /*#__PURE__*/new WeakMap();
-
-var _language = /*#__PURE__*/new WeakMap();
-
-var _speed = /*#__PURE__*/new WeakMap();
-
-var _text = /*#__PURE__*/new WeakMap();
-
-var CMIStudentPreference = /*#__PURE__*/function (_BaseCMI4) {
- _inherits(CMIStudentPreference, _BaseCMI4);
-
- var _super5 = _createSuper(CMIStudentPreference);
-
- /**
- * Constructor for cmi.student_preference
- * @param {string} student_preference_children
- */
- function CMIStudentPreference(student_preference_children) {
- var _this4;
-
- _classCallCheck(this, CMIStudentPreference);
-
- _this4 = _super5.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _children5, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _audio, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _language, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _speed, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _text, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldSet(_assertThisInitialized(_this4), _children5, student_preference_children ? student_preference_children : scorm12_constants.student_preference_children);
-
- return _this4;
- }
-
- _createClass(CMIStudentPreference, [{
- key: "_children",
- get:
- /**
- * Getter for #_children
- * @return {string}
- * @private
- */
- function get() {
- return _classPrivateFieldGet(this, _children5);
- }
- /**
- * Setter for #_children. Just throws an error.
- * @param {string} _children
- * @private
- */
- ,
- set: function set(_children) {
- throwInvalidValueError();
- }
- /**
- * Getter for #audio
- * @return {string}
- */
-
- }, {
- key: "audio",
- get: function get() {
- return _classPrivateFieldGet(this, _audio);
- }
- /**
- * Setter for #audio
- * @param {string} audio
- */
- ,
- set: function set(audio) {
- if (check12ValidFormat(audio, scorm12_regex.CMISInteger) && check12ValidRange(audio, scorm12_regex.audio_range)) {
- _classPrivateFieldSet(this, _audio, audio);
- }
- }
- /**
- * Getter for #language
- * @return {string}
- */
-
- }, {
- key: "language",
- get: function get() {
- return _classPrivateFieldGet(this, _language);
- }
- /**
- * Setter for #language
- * @param {string} language
- */
- ,
- set: function set(language) {
- if (check12ValidFormat(language, scorm12_regex.CMIString256)) {
- _classPrivateFieldSet(this, _language, language);
- }
- }
- /**
- * Getter for #speed
- * @return {string}
- */
-
- }, {
- key: "speed",
- get: function get() {
- return _classPrivateFieldGet(this, _speed);
- }
- /**
- * Setter for #speed
- * @param {string} speed
- */
- ,
- set: function set(speed) {
- if (check12ValidFormat(speed, scorm12_regex.CMISInteger) && check12ValidRange(speed, scorm12_regex.speed_range)) {
- _classPrivateFieldSet(this, _speed, speed);
- }
- }
- /**
- * Getter for #text
- * @return {string}
- */
-
- }, {
- key: "text",
- get: function get() {
- return _classPrivateFieldGet(this, _text);
- }
- /**
- * Setter for #text
- * @param {string} text
- */
- ,
- set: function set(text) {
- if (check12ValidFormat(text, scorm12_regex.CMISInteger) && check12ValidRange(text, scorm12_regex.text_range)) {
- _classPrivateFieldSet(this, _text, text);
- }
- }
- /**
- * toJSON for cmi.student_preference
- *
- * @return {
- * {
- * audio: string,
- * language: string,
- * speed: string,
- * text: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'audio': this.audio,
- 'language': this.language,
- 'speed': this.speed,
- 'text': this.text
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIStudentPreference;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 1.2's cmi.interactions object
- * @extends BaseCMI
- */
-
-
-exports.CMIStudentPreference = CMIStudentPreference;
-
-var CMIInteractions = /*#__PURE__*/function (_CMIArray2) {
- _inherits(CMIInteractions, _CMIArray2);
-
- var _super6 = _createSuper(CMIInteractions);
-
- /**
- * Constructor for cmi.interactions
- */
- function CMIInteractions() {
- _classCallCheck(this, CMIInteractions);
-
- return _super6.call(this, {
- children: scorm12_constants.interactions_children,
- errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError
- });
- }
-
- return _createClass(CMIInteractions);
-}(_common.CMIArray);
-/**
- * Class representing SCORM 1.2's cmi.interactions.n object
- * @extends BaseCMI
- */
-
-
-var _id = /*#__PURE__*/new WeakMap();
-
-var _time = /*#__PURE__*/new WeakMap();
-
-var _type = /*#__PURE__*/new WeakMap();
-
-var _weighting = /*#__PURE__*/new WeakMap();
-
-var _student_response = /*#__PURE__*/new WeakMap();
-
-var _result = /*#__PURE__*/new WeakMap();
-
-var _latency = /*#__PURE__*/new WeakMap();
-
-var CMIInteractionsObject = /*#__PURE__*/function (_BaseCMI5) {
- _inherits(CMIInteractionsObject, _BaseCMI5);
-
- var _super7 = _createSuper(CMIInteractionsObject);
-
- /**
- * Constructor for cmi.interactions.n object
- */
- function CMIInteractionsObject() {
- var _this5;
-
- _classCallCheck(this, CMIInteractionsObject);
-
- _this5 = _super7.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _id, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _time, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _type, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _weighting, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _student_response, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _result, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _latency, {
- writable: true,
- value: ''
- });
-
- _this5.objectives = new _common.CMIArray({
- errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError,
- children: scorm12_constants.objectives_children
- });
- _this5.correct_responses = new _common.CMIArray({
- errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError,
- children: scorm12_constants.correct_responses_children
- });
- return _this5;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(CMIInteractionsObject, [{
- key: "initialize",
- value: function initialize() {
- var _this$objectives2, _this$correct_respons;
-
- _get(_getPrototypeOf(CMIInteractionsObject.prototype), "initialize", this).call(this);
-
- (_this$objectives2 = this.objectives) === null || _this$objectives2 === void 0 ? void 0 : _this$objectives2.initialize();
- (_this$correct_respons = this.correct_responses) === null || _this$correct_respons === void 0 ? void 0 : _this$correct_respons.initialize();
- }
- }, {
- key: "id",
- get:
- /**
- * Getter for #id. Should only be called during JSON export.
- * @return {*}
- */
- function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _id);
- }
- /**
- * Setter for #id
- * @param {string} id
- */
- ,
- set: function set(id) {
- if (check12ValidFormat(id, scorm12_regex.CMIIdentifier)) {
- _classPrivateFieldSet(this, _id, id);
- }
- }
- /**
- * Getter for #time. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "time",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _time);
- }
- /**
- * Setter for #time
- * @param {string} time
- */
- ,
- set: function set(time) {
- if (check12ValidFormat(time, scorm12_regex.CMITime)) {
- _classPrivateFieldSet(this, _time, time);
- }
- }
- /**
- * Getter for #type. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "type",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _type);
- }
- /**
- * Setter for #type
- * @param {string} type
- */
- ,
- set: function set(type) {
- if (check12ValidFormat(type, scorm12_regex.CMIType)) {
- _classPrivateFieldSet(this, _type, type);
- }
- }
- /**
- * Getter for #weighting. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "weighting",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _weighting);
- }
- /**
- * Setter for #weighting
- * @param {string} weighting
- */
- ,
- set: function set(weighting) {
- if (check12ValidFormat(weighting, scorm12_regex.CMIDecimal) && check12ValidRange(weighting, scorm12_regex.weighting_range)) {
- _classPrivateFieldSet(this, _weighting, weighting);
- }
- }
- /**
- * Getter for #student_response. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "student_response",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _student_response);
- }
- /**
- * Setter for #student_response
- * @param {string} student_response
- */
- ,
- set: function set(student_response) {
- if (check12ValidFormat(student_response, scorm12_regex.CMIFeedback, true)) {
- _classPrivateFieldSet(this, _student_response, student_response);
- }
- }
- /**
- * Getter for #result. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "result",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _result);
- }
- /**
- * Setter for #result
- * @param {string} result
- */
- ,
- set: function set(result) {
- if (check12ValidFormat(result, scorm12_regex.CMIResult)) {
- _classPrivateFieldSet(this, _result, result);
- }
- }
- /**
- * Getter for #latency. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "latency",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _latency);
- }
- /**
- * Setter for #latency
- * @param {string} latency
- */
- ,
- set: function set(latency) {
- if (check12ValidFormat(latency, scorm12_regex.CMITimespan)) {
- _classPrivateFieldSet(this, _latency, latency);
- }
- }
- /**
- * toJSON for cmi.interactions.n
- *
- * @return {
- * {
- * id: string,
- * time: string,
- * type: string,
- * weighting: string,
- * student_response: string,
- * result: string,
- * latency: string,
- * objectives: CMIArray,
- * correct_responses: CMIArray
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'id': this.id,
- 'time': this.time,
- 'type': this.type,
- 'weighting': this.weighting,
- 'student_response': this.student_response,
- 'result': this.result,
- 'latency': this.latency,
- 'objectives': this.objectives,
- 'correct_responses': this.correct_responses
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIInteractionsObject;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 1.2's cmi.objectives.n object
- * @extends BaseCMI
- */
-
-
-exports.CMIInteractionsObject = CMIInteractionsObject;
-
-var _id2 = /*#__PURE__*/new WeakMap();
-
-var _status = /*#__PURE__*/new WeakMap();
-
-var CMIObjectivesObject = /*#__PURE__*/function (_BaseCMI6) {
- _inherits(CMIObjectivesObject, _BaseCMI6);
-
- var _super8 = _createSuper(CMIObjectivesObject);
-
- /**
- * Constructor for cmi.objectives.n
- */
- function CMIObjectivesObject() {
- var _this6;
-
- _classCallCheck(this, CMIObjectivesObject);
-
- _this6 = _super8.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _id2, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _status, {
- writable: true,
- value: ''
- });
-
- _this6.score = new _common.CMIScore({
- score_children: scorm12_constants.score_children,
- score_range: scorm12_regex.score_range,
- invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,
- invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,
- invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,
- errorClass: _exceptions.Scorm12ValidationError
- });
- return _this6;
- }
-
- _createClass(CMIObjectivesObject, [{
- key: "id",
- get:
- /**
- * Getter for #id
- * @return {""}
- */
- function get() {
- return _classPrivateFieldGet(this, _id2);
- }
- /**
- * Setter for #id
- * @param {string} id
- */
- ,
- set: function set(id) {
- if (check12ValidFormat(id, scorm12_regex.CMIIdentifier)) {
- _classPrivateFieldSet(this, _id2, id);
- }
- }
- /**
- * Getter for #status
- * @return {""}
- */
-
- }, {
- key: "status",
- get: function get() {
- return _classPrivateFieldGet(this, _status);
- }
- /**
- * Setter for #status
- * @param {string} status
- */
- ,
- set: function set(status) {
- if (check12ValidFormat(status, scorm12_regex.CMIStatus2)) {
- _classPrivateFieldSet(this, _status, status);
- }
- }
- /**
- * toJSON for cmi.objectives.n
- * @return {
- * {
- * id: string,
- * status: string,
- * score: CMIScore
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'id': this.id,
- 'status': this.status,
- 'score': this.score
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIObjectivesObject;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 1.2's cmi.interactions.n.objectives.n object
- * @extends BaseCMI
- */
-
-
-exports.CMIObjectivesObject = CMIObjectivesObject;
-
-var _id3 = /*#__PURE__*/new WeakMap();
-
-var CMIInteractionsObjectivesObject = /*#__PURE__*/function (_BaseCMI7) {
- _inherits(CMIInteractionsObjectivesObject, _BaseCMI7);
-
- var _super9 = _createSuper(CMIInteractionsObjectivesObject);
-
- /**
- * Constructor for cmi.interactions.n.objectives.n
- */
- function CMIInteractionsObjectivesObject() {
- var _this7;
-
- _classCallCheck(this, CMIInteractionsObjectivesObject);
-
- _this7 = _super9.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this7), _id3, {
- writable: true,
- value: ''
- });
-
- return _this7;
- }
-
- _createClass(CMIInteractionsObjectivesObject, [{
- key: "id",
- get:
- /**
- * Getter for #id
- * @return {""}
- */
- function get() {
- return _classPrivateFieldGet(this, _id3);
- }
- /**
- * Setter for #id
- * @param {string} id
- */
- ,
- set: function set(id) {
- if (check12ValidFormat(id, scorm12_regex.CMIIdentifier)) {
- _classPrivateFieldSet(this, _id3, id);
- }
- }
- /**
- * toJSON for cmi.interactions.n.objectives.n
- * @return {
- * {
- * id: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'id': this.id
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIInteractionsObjectivesObject;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 1.2's cmi.interactions.correct_responses.n object
- * @extends BaseCMI
- */
-
-
-exports.CMIInteractionsObjectivesObject = CMIInteractionsObjectivesObject;
-
-var _pattern = /*#__PURE__*/new WeakMap();
-
-var CMIInteractionsCorrectResponsesObject = /*#__PURE__*/function (_BaseCMI8) {
- _inherits(CMIInteractionsCorrectResponsesObject, _BaseCMI8);
-
- var _super10 = _createSuper(CMIInteractionsCorrectResponsesObject);
-
- /**
- * Constructor for cmi.interactions.correct_responses.n
- */
- function CMIInteractionsCorrectResponsesObject() {
- var _this8;
-
- _classCallCheck(this, CMIInteractionsCorrectResponsesObject);
-
- _this8 = _super10.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this8), _pattern, {
- writable: true,
- value: ''
- });
-
- return _this8;
- }
-
- _createClass(CMIInteractionsCorrectResponsesObject, [{
- key: "pattern",
- get:
- /**
- * Getter for #pattern
- * @return {string}
- */
- function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _pattern);
- }
- /**
- * Setter for #pattern
- * @param {string} pattern
- */
- ,
- set: function set(pattern) {
- if (check12ValidFormat(pattern, scorm12_regex.CMIFeedback, true)) {
- _classPrivateFieldSet(this, _pattern, pattern);
- }
- }
- /**
- * toJSON for cmi.interactions.correct_responses.n
- * @return {
- * {
- * pattern: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'pattern': this.pattern
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIInteractionsCorrectResponsesObject;
-}(_common.BaseCMI);
-/**
- * Class for AICC Navigation object
- */
-
-
-exports.CMIInteractionsCorrectResponsesObject = CMIInteractionsCorrectResponsesObject;
-
-var _event = /*#__PURE__*/new WeakMap();
-
-var NAV = /*#__PURE__*/function (_BaseCMI9) {
- _inherits(NAV, _BaseCMI9);
-
- var _super11 = _createSuper(NAV);
-
- /**
- * Constructor for NAV object
- */
- function NAV() {
- var _this9;
-
- _classCallCheck(this, NAV);
-
- _this9 = _super11.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this9), _event, {
- writable: true,
- value: ''
- });
-
- return _this9;
- }
-
- _createClass(NAV, [{
- key: "event",
- get:
- /**
- * Getter for #event
- * @return {string}
- */
- function get() {
- return _classPrivateFieldGet(this, _event);
- }
- /**
- * Setter for #event
- * @param {string} event
- */
- ,
- set: function set(event) {
- if (check12ValidFormat(event, scorm12_regex.NAVEvent)) {
- _classPrivateFieldSet(this, _event, event);
- }
- }
- /**
- * toJSON for nav object
- * @return {
- * {
- * event: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'event': this.event
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return NAV;
-}(_common.BaseCMI);
-
-exports.NAV = NAV;
-
-},{"../constants/api_constants":8,"../constants/error_codes":9,"../constants/regex":10,"../exceptions":11,"../utilities":13,"./common":6}],8:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-var global = {
- SCORM_TRUE: 'true',
- SCORM_FALSE: 'false',
- STATE_NOT_INITIALIZED: 0,
- STATE_INITIALIZED: 1,
- STATE_TERMINATED: 2,
- LOG_LEVEL_DEBUG: 1,
- LOG_LEVEL_INFO: 2,
- LOG_LEVEL_WARNING: 3,
- LOG_LEVEL_ERROR: 4,
- LOG_LEVEL_NONE: 5
-};
-var scorm12 = {
- // Children lists
- cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions',
- core_children: 'student_id,student_name,lesson_location,credit,lesson_status,entry,score,total_time,lesson_mode,exit,session_time',
- score_children: 'raw,min,max',
- comments_children: 'content,location,time',
- objectives_children: 'id,score,status',
- correct_responses_children: 'pattern',
- student_data_children: 'mastery_score,max_time_allowed,time_limit_action',
- student_preference_children: 'audio,language,speed,text',
- interactions_children: 'id,objectives,time,type,correct_responses,weighting,student_response,result,latency',
- error_descriptions: {
- '101': {
- basicMessage: 'General Exception',
- detailMessage: 'No specific error code exists to describe the error. Use LMSGetDiagnostic for more information'
- },
- '201': {
- basicMessage: 'Invalid argument error',
- detailMessage: 'Indicates that an argument represents an invalid data model element or is otherwise incorrect.'
- },
- '202': {
- basicMessage: 'Element cannot have children',
- detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in "_children" for a data model element that does not support the "_children" suffix.'
- },
- '203': {
- basicMessage: 'Element not an array - cannot have count',
- detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in "_count" for a data model element that does not support the "_count" suffix.'
- },
- '301': {
- basicMessage: 'Not initialized',
- detailMessage: 'Indicates that an API call was made before the call to lmsInitialize.'
- },
- '401': {
- basicMessage: 'Not implemented error',
- detailMessage: 'The data model element indicated in a call to LMSGetValue or LMSSetValue is valid, but was not implemented by this LMS. SCORM 1.2 defines a set of data model elements as being optional for an LMS to implement.'
- },
- '402': {
- basicMessage: 'Invalid set value, element is a keyword',
- detailMessage: 'Indicates that LMSSetValue was called on a data model element that represents a keyword (elements that end in "_children" and "_count").'
- },
- '403': {
- basicMessage: 'Element is read only',
- detailMessage: 'LMSSetValue was called with a data model element that can only be read.'
- },
- '404': {
- basicMessage: 'Element is write only',
- detailMessage: 'LMSGetValue was called on a data model element that can only be written to.'
- },
- '405': {
- basicMessage: 'Incorrect Data Type',
- detailMessage: 'LMSSetValue was called with a value that is not consistent with the data format of the supplied data model element.'
- },
- '407': {
- basicMessage: 'Element Value Out Of Range',
- detailMessage: 'The numeric value supplied to a LMSSetValue call is outside of the numeric range allowed for the supplied data model element.'
- },
- '408': {
- basicMessage: 'Data Model Dependency Not Established',
- detailMessage: 'Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.'
- }
- }
-};
-
-var aicc = _objectSpread(_objectSpread({}, scorm12), {
- cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions,evaluation',
- student_preference_children: 'audio,language,lesson_type,speed,text,text_color,text_location,text_size,video,windows',
- student_data_children: 'attempt_number,tries,mastery_score,max_time_allowed,time_limit_action',
- student_demographics_children: 'city,class,company,country,experience,familiar_name,instructor_name,title,native_language,state,street_address,telephone,years_experience',
- tries_children: 'time,status,score',
- attempt_records_children: 'score,lesson_status',
- paths_children: 'location_id,date,time,status,why_left,time_in_element'
-});
-
-var scorm2004 = {
- // Children lists
- cmi_children: '_version,comments_from_learner,comments_from_lms,completion_status,credit,entry,exit,interactions,launch_data,learner_id,learner_name,learner_preference,location,max_time_allowed,mode,objectives,progress_measure,scaled_passing_score,score,session_time,success_status,suspend_data,time_limit_action,total_time',
- comments_children: 'comment,timestamp,location',
- score_children: 'max,raw,scaled,min',
- objectives_children: 'progress_measure,completion_status,success_status,description,score,id',
- correct_responses_children: 'pattern',
- student_data_children: 'mastery_score,max_time_allowed,time_limit_action',
- student_preference_children: 'audio_level,audio_captioning,delivery_speed,language',
- interactions_children: 'id,type,objectives,timestamp,correct_responses,weighting,learner_response,result,latency,description',
- error_descriptions: {
- '0': {
- basicMessage: 'No Error',
- detailMessage: 'No error occurred, the previous API call was successful.'
- },
- '101': {
- basicMessage: 'General Exception',
- detailMessage: 'No specific error code exists to describe the error. Use GetDiagnostic for more information.'
- },
- '102': {
- basicMessage: 'General Initialization Failure',
- detailMessage: 'Call to Initialize failed for an unknown reason.'
- },
- '103': {
- basicMessage: 'Already Initialized',
- detailMessage: 'Call to Initialize failed because Initialize was already called.'
- },
- '104': {
- basicMessage: 'Content Instance Terminated',
- detailMessage: 'Call to Initialize failed because Terminate was already called.'
- },
- '111': {
- basicMessage: 'General Termination Failure',
- detailMessage: 'Call to Terminate failed for an unknown reason.'
- },
- '112': {
- basicMessage: 'Termination Before Initialization',
- detailMessage: 'Call to Terminate failed because it was made before the call to Initialize.'
- },
- '113': {
- basicMessage: 'Termination After Termination',
- detailMessage: 'Call to Terminate failed because Terminate was already called.'
- },
- '122': {
- basicMessage: 'Retrieve Data Before Initialization',
- detailMessage: 'Call to GetValue failed because it was made before the call to Initialize.'
- },
- '123': {
- basicMessage: 'Retrieve Data After Termination',
- detailMessage: 'Call to GetValue failed because it was made after the call to Terminate.'
- },
- '132': {
- basicMessage: 'Store Data Before Initialization',
- detailMessage: 'Call to SetValue failed because it was made before the call to Initialize.'
- },
- '133': {
- basicMessage: 'Store Data After Termination',
- detailMessage: 'Call to SetValue failed because it was made after the call to Terminate.'
- },
- '142': {
- basicMessage: 'Commit Before Initialization',
- detailMessage: 'Call to Commit failed because it was made before the call to Initialize.'
- },
- '143': {
- basicMessage: 'Commit After Termination',
- detailMessage: 'Call to Commit failed because it was made after the call to Terminate.'
- },
- '201': {
- basicMessage: 'General Argument Error',
- detailMessage: 'An invalid argument was passed to an API method (usually indicates that Initialize, Commit or Terminate did not receive the expected empty string argument.'
- },
- '301': {
- basicMessage: 'General Get Failure',
- detailMessage: 'Indicates a failed GetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.'
- },
- '351': {
- basicMessage: 'General Set Failure',
- detailMessage: 'Indicates a failed SetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.'
- },
- '391': {
- basicMessage: 'General Commit Failure',
- detailMessage: 'Indicates a failed Commit call where no other specific error code is applicable. Use GetDiagnostic for more information.'
- },
- '401': {
- basicMessage: 'Undefined Data Model Element',
- detailMessage: 'The data model element name passed to GetValue or SetValue is not a valid SCORM data model element.'
- },
- '402': {
- basicMessage: 'Unimplemented Data Model Element',
- detailMessage: 'The data model element indicated in a call to GetValue or SetValue is valid, but was not implemented by this LMS. In SCORM 2004, this error would indicate an LMS that is not fully SCORM conformant.'
- },
- '403': {
- basicMessage: 'Data Model Element Value Not Initialized',
- detailMessage: 'Attempt to read a data model element that has not been initialized by the LMS or through a SetValue call. This error condition is often reached during normal execution of a SCO.'
- },
- '404': {
- basicMessage: 'Data Model Element Is Read Only',
- detailMessage: 'SetValue was called with a data model element that can only be read.'
- },
- '405': {
- basicMessage: 'Data Model Element Is Write Only',
- detailMessage: 'GetValue was called on a data model element that can only be written to.'
- },
- '406': {
- basicMessage: 'Data Model Element Type Mismatch',
- detailMessage: 'SetValue was called with a value that is not consistent with the data format of the supplied data model element.'
- },
- '407': {
- basicMessage: 'Data Model Element Value Out Of Range',
- detailMessage: 'The numeric value supplied to a SetValue call is outside of the numeric range allowed for the supplied data model element.'
- },
- '408': {
- basicMessage: 'Data Model Dependency Not Established',
- detailMessage: 'Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.'
- }
- }
-};
-var APIConstants = {
- global: global,
- scorm12: scorm12,
- aicc: aicc,
- scorm2004: scorm2004
-};
-var _default = APIConstants;
-exports["default"] = _default;
-
-},{}],9:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-var global = {
- GENERAL: 101,
- INITIALIZATION_FAILED: 101,
- INITIALIZED: 101,
- TERMINATED: 101,
- TERMINATION_FAILURE: 101,
- TERMINATION_BEFORE_INIT: 101,
- MULTIPLE_TERMINATION: 101,
- RETRIEVE_BEFORE_INIT: 101,
- RETRIEVE_AFTER_TERM: 101,
- STORE_BEFORE_INIT: 101,
- STORE_AFTER_TERM: 101,
- COMMIT_BEFORE_INIT: 101,
- COMMIT_AFTER_TERM: 101,
- ARGUMENT_ERROR: 101,
- CHILDREN_ERROR: 101,
- COUNT_ERROR: 101,
- GENERAL_GET_FAILURE: 101,
- GENERAL_SET_FAILURE: 101,
- GENERAL_COMMIT_FAILURE: 101,
- UNDEFINED_DATA_MODEL: 101,
- UNIMPLEMENTED_ELEMENT: 101,
- VALUE_NOT_INITIALIZED: 101,
- INVALID_SET_VALUE: 101,
- READ_ONLY_ELEMENT: 101,
- WRITE_ONLY_ELEMENT: 101,
- TYPE_MISMATCH: 101,
- VALUE_OUT_OF_RANGE: 101,
- DEPENDENCY_NOT_ESTABLISHED: 101
-};
-
-var scorm12 = _objectSpread(_objectSpread({}, global), {
- RETRIEVE_BEFORE_INIT: 301,
- STORE_BEFORE_INIT: 301,
- COMMIT_BEFORE_INIT: 301,
- ARGUMENT_ERROR: 201,
- CHILDREN_ERROR: 202,
- COUNT_ERROR: 203,
- UNDEFINED_DATA_MODEL: 401,
- UNIMPLEMENTED_ELEMENT: 401,
- VALUE_NOT_INITIALIZED: 301,
- INVALID_SET_VALUE: 402,
- READ_ONLY_ELEMENT: 403,
- WRITE_ONLY_ELEMENT: 404,
- TYPE_MISMATCH: 405,
- VALUE_OUT_OF_RANGE: 407,
- DEPENDENCY_NOT_ESTABLISHED: 408
-});
-
-var scorm2004 = _objectSpread(_objectSpread({}, global), {
- INITIALIZATION_FAILED: 102,
- INITIALIZED: 103,
- TERMINATED: 104,
- TERMINATION_FAILURE: 111,
- TERMINATION_BEFORE_INIT: 112,
- MULTIPLE_TERMINATIONS: 113,
- RETRIEVE_BEFORE_INIT: 122,
- RETRIEVE_AFTER_TERM: 123,
- STORE_BEFORE_INIT: 132,
- STORE_AFTER_TERM: 133,
- COMMIT_BEFORE_INIT: 142,
- COMMIT_AFTER_TERM: 143,
- ARGUMENT_ERROR: 201,
- GENERAL_GET_FAILURE: 301,
- GENERAL_SET_FAILURE: 351,
- GENERAL_COMMIT_FAILURE: 391,
- UNDEFINED_DATA_MODEL: 401,
- UNIMPLEMENTED_ELEMENT: 402,
- VALUE_NOT_INITIALIZED: 403,
- READ_ONLY_ELEMENT: 404,
- WRITE_ONLY_ELEMENT: 405,
- TYPE_MISMATCH: 406,
- VALUE_OUT_OF_RANGE: 407,
- DEPENDENCY_NOT_ESTABLISHED: 408
-});
-
-var ErrorCodes = {
- scorm12: scorm12,
- scorm2004: scorm2004
-};
-var _default = ErrorCodes;
-exports["default"] = _default;
-
-},{}],10:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-var scorm12 = {
- CMIString256: '^.{0,255}$',
- CMIString4096: '^.{0,4096}$',
- CMITime: '^(?:[01]\\d|2[0123]):(?:[012345]\\d):(?:[012345]\\d)$',
- // eslint-disable-line
- CMITimespan: '^([0-9]{2,}):([0-9]{2}):([0-9]{2})(\.[0-9]{1,2})?$',
- // eslint-disable-line
- CMIInteger: '^\\d+$',
- CMISInteger: '^-?([0-9]+)$',
- CMIDecimal: '^-?([0-9]{0,3})(\.[0-9]*)?$',
- // eslint-disable-line
- CMIIdentifier: "^[\\u0021-\\u007E\\s]{0,255}$",
- CMIFeedback: '^.{0,255}$',
- // This must be redefined
- CMIIndex: '[._](\\d+).',
- // Vocabulary Data Type Definition
- CMIStatus: '^(passed|completed|failed|incomplete|browsed)$',
- CMIStatus2: '^(passed|completed|failed|incomplete|browsed|not attempted)$',
- CMIExit: '^(time-out|suspend|logout|)$',
- CMIType: '^(true-false|choice|fill-in|matching|performance|sequencing|likert|numeric)$',
- CMIResult: '^(correct|wrong|unanticipated|neutral|([0-9]{0,3})?(\\.[0-9]*)?)$',
- // eslint-disable-line
- NAVEvent: '^(previous|continue)$',
- // Data ranges
- score_range: '0#100',
- audio_range: '-1#100',
- speed_range: '-100#100',
- weighting_range: '-100#100',
- text_range: '-1#1'
-};
-
-var aicc = _objectSpread(_objectSpread({}, scorm12), {
- CMIIdentifier: '^\\w{1,255}$'
-});
-
-var scorm2004 = {
- CMIString200: "^[\\u0000-\\uFFFF]{0,200}$",
- CMIString250: "^[\\u0000-\\uFFFF]{0,250}$",
- CMIString1000: "^[\\u0000-\\uFFFF]{0,1000}$",
- CMIString4000: "^[\\u0000-\\uFFFF]{0,4000}$",
- CMIString64000: "^[\\u0000-\\uFFFF]{0,64000}$",
- CMILang: '^([a-zA-Z]{2,3}|i|x)(\-[a-zA-Z0-9\-]{2,8})?$|^$',
- // eslint-disable-line
- CMILangString250: '^(\{lang=([a-zA-Z]{2,3}|i|x)(\-[a-zA-Z0-9\-]{2,8})?\})?((?!\{.*$).{0,250}$)?$',
- // eslint-disable-line
- CMILangcr: '^((\{lang=([a-zA-Z]{2,3}|i|x)?(\-[a-zA-Z0-9\-]{2,8})?\}))(.*?)$',
- // eslint-disable-line
- CMILangString250cr: '^((\{lang=([a-zA-Z]{2,3}|i|x)?(\-[a-zA-Z0-9\-]{2,8})?\})?(.{0,250})?)?$',
- // eslint-disable-line
- CMILangString4000: '^(\{lang=([a-zA-Z]{2,3}|i|x)(\-[a-zA-Z0-9\-]{2,8})?\})?((?!\{.*$).{0,4000}$)?$',
- // eslint-disable-line
- CMITime: '^(19[7-9]{1}[0-9]{1}|20[0-2]{1}[0-9]{1}|203[0-8]{1})((-(0[1-9]{1}|1[0-2]{1}))((-(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1}))(T([0-1]{1}[0-9]{1}|2[0-3]{1})((:[0-5]{1}[0-9]{1})((:[0-5]{1}[0-9]{1})((\\.[0-9]{1,2})((Z|([+|-]([0-1]{1}[0-9]{1}|2[0-3]{1})))(:[0-5]{1}[0-9]{1})?)?)?)?)?)?)?)?$',
- CMITimespan: '^P(?:([.,\\d]+)Y)?(?:([.,\\d]+)M)?(?:([.,\\d]+)W)?(?:([.,\\d]+)D)?(?:T?(?:([.,\\d]+)H)?(?:([.,\\d]+)M)?(?:([.,\\d]+)S)?)?$',
- CMIInteger: '^\\d+$',
- CMISInteger: '^-?([0-9]+)$',
- CMIDecimal: '^-?([0-9]{1,5})(\\.[0-9]{1,18})?$',
- CMIIdentifier: '^\\S{1,250}[a-zA-Z0-9]$',
- CMIShortIdentifier: '^[\\w\\.\\-\\_]{1,250}$',
- // eslint-disable-line
- CMILongIdentifier: '^(?:(?!urn:)\\S{1,4000}|urn:[A-Za-z0-9-]{1,31}:\\S{1,4000}|.{1,4000})$',
- // need to re-examine this
- CMIFeedback: '^.*$',
- // This must be redefined
- CMIIndex: '[._](\\d+).',
- CMIIndexStore: '.N(\\d+).',
- // Vocabulary Data Type Definition
- CMICStatus: '^(completed|incomplete|not attempted|unknown)$',
- CMISStatus: '^(passed|failed|unknown)$',
- CMIExit: '^(time-out|suspend|logout|normal)$',
- CMIType: '^(true-false|choice|fill-in|long-fill-in|matching|performance|sequencing|likert|numeric|other)$',
- CMIResult: '^(correct|incorrect|unanticipated|neutral|-?([0-9]{1,4})(\\.[0-9]{1,18})?)$',
- NAVEvent: '^(previous|continue|exit|exitAll|abandon|abandonAll|suspendAll|\{target=\\S{0,200}[a-zA-Z0-9]\}choice|jump)$',
- // eslint-disable-line
- NAVBoolean: '^(unknown|true|false$)',
- NAVTarget: '^(previous|continue|choice.{target=\\S{0,200}[a-zA-Z0-9]})$',
- // Data ranges
- scaled_range: '-1#1',
- audio_range: '0#*',
- speed_range: '0#*',
- text_range: '-1#1',
- progress_range: '0#1'
-};
-var Regex = {
- aicc: aicc,
- scorm12: scorm12,
- scorm2004: scorm2004
-};
-var _default = Regex;
-exports["default"] = _default;
-
-},{}],11:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.ValidationError = exports.Scorm2004ValidationError = exports.Scorm12ValidationError = exports.AICCValidationError = void 0;
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); }
-
-function _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
-
-function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
-
-function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
-
-function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-
-function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
-
-function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
-
-function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-
-var scorm12_errors = _api_constants["default"].scorm12.error_descriptions;
-var aicc_errors = _api_constants["default"].aicc.error_descriptions;
-var scorm2004_errors = _api_constants["default"].scorm2004.error_descriptions;
-/**
- * Base Validation Exception
- */
-
-var _errorCode = /*#__PURE__*/new WeakMap();
-
-var _errorMessage = /*#__PURE__*/new WeakMap();
-
-var _detailedMessage = /*#__PURE__*/new WeakMap();
-
-var ValidationError = /*#__PURE__*/function (_Error) {
- _inherits(ValidationError, _Error);
-
- var _super = _createSuper(ValidationError);
-
- /**
- * Constructor to take in an error message and code
- * @param {number} errorCode
- * @param {string} errorMessage
- * @param {string} detailedMessage
- */
- function ValidationError(errorCode, errorMessage, detailedMessage) {
- var _this;
-
- _classCallCheck(this, ValidationError);
-
- _this = _super.call(this, errorMessage);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _errorCode, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _errorMessage, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _detailedMessage, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _errorCode, errorCode);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _errorMessage, errorMessage);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _detailedMessage, detailedMessage);
-
- return _this;
- }
-
- _createClass(ValidationError, [{
- key: "errorCode",
- get:
- /**
- * Getter for #errorCode
- * @return {number}
- */
- function get() {
- return _classPrivateFieldGet(this, _errorCode);
- }
- /**
- * Getter for #errorMessage
- * @return {string}
- */
-
- }, {
- key: "errorMessage",
- get: function get() {
- return _classPrivateFieldGet(this, _errorMessage);
- }
- /**
- * Getter for #detailedMessage
- * @return {string}
- */
-
- }, {
- key: "detailedMessage",
- get: function get() {
- return _classPrivateFieldGet(this, _detailedMessage);
- }
- }]);
-
- return ValidationError;
-}( /*#__PURE__*/_wrapNativeSuper(Error));
-/**
- * SCORM 1.2 Validation Error
- */
-
-
-exports.ValidationError = ValidationError;
-
-var Scorm12ValidationError = /*#__PURE__*/function (_ValidationError) {
- _inherits(Scorm12ValidationError, _ValidationError);
-
- var _super2 = _createSuper(Scorm12ValidationError);
-
- /**
- * Constructor to take in an error code
- * @param {number} errorCode
- */
- function Scorm12ValidationError(errorCode) {
- var _this2;
-
- _classCallCheck(this, Scorm12ValidationError);
-
- if ({}.hasOwnProperty.call(scorm12_errors, String(errorCode))) {
- _this2 = _super2.call(this, errorCode, scorm12_errors[String(errorCode)].basicMessage, scorm12_errors[String(errorCode)].detailMessage);
- } else {
- _this2 = _super2.call(this, 101, scorm12_errors['101'].basicMessage, scorm12_errors['101'].detailMessage);
- }
-
- return _possibleConstructorReturn(_this2);
- }
-
- return _createClass(Scorm12ValidationError);
-}(ValidationError);
-/**
- * AICC Validation Error
- */
-
-
-exports.Scorm12ValidationError = Scorm12ValidationError;
-
-var AICCValidationError = /*#__PURE__*/function (_ValidationError2) {
- _inherits(AICCValidationError, _ValidationError2);
-
- var _super3 = _createSuper(AICCValidationError);
-
- /**
- * Constructor to take in an error code
- * @param {number} errorCode
- */
- function AICCValidationError(errorCode) {
- var _this3;
-
- _classCallCheck(this, AICCValidationError);
-
- if ({}.hasOwnProperty.call(aicc_errors, String(errorCode))) {
- _this3 = _super3.call(this, errorCode, aicc_errors[String(errorCode)].basicMessage, aicc_errors[String(errorCode)].detailMessage);
- } else {
- _this3 = _super3.call(this, 101, aicc_errors['101'].basicMessage, aicc_errors['101'].detailMessage);
- }
-
- return _possibleConstructorReturn(_this3);
- }
-
- return _createClass(AICCValidationError);
-}(ValidationError);
-/**
- * SCORM 2004 Validation Error
- */
-
-
-exports.AICCValidationError = AICCValidationError;
-
-var Scorm2004ValidationError = /*#__PURE__*/function (_ValidationError3) {
- _inherits(Scorm2004ValidationError, _ValidationError3);
-
- var _super4 = _createSuper(Scorm2004ValidationError);
-
- /**
- * Constructor to take in an error code
- * @param {number} errorCode
- */
- function Scorm2004ValidationError(errorCode) {
- var _this4;
-
- _classCallCheck(this, Scorm2004ValidationError);
-
- if ({}.hasOwnProperty.call(scorm2004_errors, String(errorCode))) {
- _this4 = _super4.call(this, errorCode, scorm2004_errors[String(errorCode)].basicMessage, scorm2004_errors[String(errorCode)].detailMessage);
- } else {
- _this4 = _super4.call(this, 101, scorm2004_errors['101'].basicMessage, scorm2004_errors['101'].detailMessage);
- }
-
- return _possibleConstructorReturn(_this4);
- }
-
- return _createClass(Scorm2004ValidationError);
-}(ValidationError);
-
-exports.Scorm2004ValidationError = Scorm2004ValidationError;
-
-},{"./constants/api_constants":8}],12:[function(require,module,exports){
-"use strict";
-
-var _AICC = _interopRequireDefault(require("../AICC"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-window.AICC = _AICC["default"];
-
-},{"../AICC":2}],13:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.SECONDS_PER_SECOND = exports.SECONDS_PER_MINUTE = exports.SECONDS_PER_HOUR = exports.SECONDS_PER_DAY = void 0;
-exports.addHHMMSSTimeStrings = addHHMMSSTimeStrings;
-exports.addTwoDurations = addTwoDurations;
-exports.countDecimals = countDecimals;
-exports.flatten = flatten;
-exports.getDurationAsSeconds = getDurationAsSeconds;
-exports.getSecondsAsHHMMSS = getSecondsAsHHMMSS;
-exports.getSecondsAsISODuration = getSecondsAsISODuration;
-exports.getTimeAsSeconds = getTimeAsSeconds;
-exports.unflatten = unflatten;
-
-function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
-
-function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
-
-function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
-
-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; }
-
-function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
-
-function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
-
-var SECONDS_PER_SECOND = 1.0;
-exports.SECONDS_PER_SECOND = SECONDS_PER_SECOND;
-var SECONDS_PER_MINUTE = 60;
-exports.SECONDS_PER_MINUTE = SECONDS_PER_MINUTE;
-var SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE;
-exports.SECONDS_PER_HOUR = SECONDS_PER_HOUR;
-var SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;
-exports.SECONDS_PER_DAY = SECONDS_PER_DAY;
-var designations = [['D', SECONDS_PER_DAY], ['H', SECONDS_PER_HOUR], ['M', SECONDS_PER_MINUTE], ['S', SECONDS_PER_SECOND]];
-/**
- * Converts a Number to a String of HH:MM:SS
- *
- * @param {Number} totalSeconds
- * @return {string}
- */
-
-function getSecondsAsHHMMSS(totalSeconds) {
- // SCORM spec does not deal with negative durations, give zero back
- if (!totalSeconds || totalSeconds <= 0) {
- return '00:00:00';
- }
-
- var hours = Math.floor(totalSeconds / SECONDS_PER_HOUR);
- var dateObj = new Date(totalSeconds * 1000);
- var minutes = dateObj.getUTCMinutes(); // make sure we add any possible decimal value
-
- var seconds = dateObj.getSeconds();
- var ms = totalSeconds % 1.0;
- var msStr = '';
-
- if (countDecimals(ms) > 0) {
- if (countDecimals(ms) > 2) {
- msStr = ms.toFixed(2);
- } else {
- msStr = String(ms);
- }
-
- msStr = '.' + msStr.split('.')[1];
- }
-
- return (hours + ':' + minutes + ':' + seconds).replace(/\b\d\b/g, '0$&') + msStr;
-}
-/**
- * Calculate the number of seconds from ISO 8601 Duration
- *
- * @param {Number} seconds
- * @return {String}
- */
-
-
-function getSecondsAsISODuration(seconds) {
- // SCORM spec does not deal with negative durations, give zero back
- if (!seconds || seconds <= 0) {
- return 'PT0S';
- }
-
- var duration = 'P';
- var remainder = seconds;
- designations.forEach(function (_ref) {
- var _ref2 = _slicedToArray(_ref, 2),
- sign = _ref2[0],
- current_seconds = _ref2[1];
-
- var value = Math.floor(remainder / current_seconds);
- remainder = remainder % current_seconds;
-
- if (countDecimals(remainder) > 2) {
- remainder = Number(Number(remainder).toFixed(2));
- } // If we have anything left in the remainder, and we're currently adding
- // seconds to the duration, go ahead and add the decimal to the seconds
-
-
- if (sign === 'S' && remainder > 0) {
- value += remainder;
- }
-
- if (value) {
- if ((duration.indexOf('D') > 0 || sign === 'H' || sign === 'M' || sign === 'S') && duration.indexOf('T') === -1) {
- duration += 'T';
- }
-
- duration += "".concat(value).concat(sign);
- }
- });
- return duration;
-}
-/**
- * Calculate the number of seconds from HH:MM:SS.DDDDDD
- *
- * @param {string} timeString
- * @param {RegExp} timeRegex
- * @return {number}
- */
-
-
-function getTimeAsSeconds(timeString, timeRegex) {
- if (!timeString || typeof timeString !== 'string' || !timeString.match(timeRegex)) {
- return 0;
- }
-
- var parts = timeString.split(':');
- var hours = Number(parts[0]);
- var minutes = Number(parts[1]);
- var seconds = Number(parts[2]);
- return hours * 3600 + minutes * 60 + seconds;
-}
-/**
- * Calculate the number of seconds from ISO 8601 Duration
- *
- * @param {string} duration
- * @param {RegExp} durationRegex
- * @return {number}
- */
-
-
-function getDurationAsSeconds(duration, durationRegex) {
- if (!duration || !duration.match(durationRegex)) {
- return 0;
- }
-
- var _ref3 = new RegExp(durationRegex).exec(duration) || [],
- _ref4 = _slicedToArray(_ref3, 8),
- years = _ref4[1],
- months = _ref4[2],
- days = _ref4[4],
- hours = _ref4[5],
- minutes = _ref4[6],
- seconds = _ref4[7];
-
- var result = 0.0;
- result += Number(seconds) * 1.0 || 0.0;
- result += Number(minutes) * 60.0 || 0.0;
- result += Number(hours) * 3600.0 || 0.0;
- result += Number(days) * (60 * 60 * 24.0) || 0.0;
- result += Number(years) * (60 * 60 * 24 * 365.0) || 0.0;
- return result;
-}
-/**
- * Adds together two ISO8601 Duration strings
- *
- * @param {string} first
- * @param {string} second
- * @param {RegExp} durationRegex
- * @return {string}
- */
-
-
-function addTwoDurations(first, second, durationRegex) {
- return getSecondsAsISODuration(getDurationAsSeconds(first, durationRegex) + getDurationAsSeconds(second, durationRegex));
-}
-/**
- * Add together two HH:MM:SS.DD strings
- *
- * @param {string} first
- * @param {string} second
- * @param {RegExp} timeRegex
- * @return {string}
- */
-
-
-function addHHMMSSTimeStrings(first, second, timeRegex) {
- return getSecondsAsHHMMSS(getTimeAsSeconds(first, timeRegex) + getTimeAsSeconds(second, timeRegex));
-}
-/**
- * Flatten a JSON object down to string paths for each values
- * @param {object} data
- * @return {object}
- */
-
-
-function flatten(data) {
- var result = {};
- /**
- * Recurse through the object
- * @param {*} cur
- * @param {*} prop
- */
-
- function recurse(cur, prop) {
- if (Object(cur) !== cur) {
- result[prop] = cur;
- } else if (Array.isArray(cur)) {
- for (var i = 0, l = cur.length; i < l; i++) {
- recurse(cur[i], prop + '[' + i + ']');
- if (l === 0) result[prop] = [];
- }
- } else {
- var isEmpty = true;
-
- for (var p in cur) {
- if ({}.hasOwnProperty.call(cur, p)) {
- isEmpty = false;
- recurse(cur[p], prop ? prop + '.' + p : p);
- }
- }
-
- if (isEmpty && prop) result[prop] = {};
- }
- }
-
- recurse(data, '');
- return result;
-}
-/**
- * Un-flatten a flat JSON object
- * @param {object} data
- * @return {object}
- */
-
-
-function unflatten(data) {
- 'use strict';
-
- if (Object(data) !== data || Array.isArray(data)) return data;
- var regex = /\.?([^.[\]]+)|\[(\d+)]/g;
- var result = {};
-
- for (var p in data) {
- if ({}.hasOwnProperty.call(data, p)) {
- var cur = result;
- var prop = '';
- var m = regex.exec(p);
-
- while (m) {
- cur = cur[prop] || (cur[prop] = m[2] ? [] : {});
- prop = m[2] || m[1];
- m = regex.exec(p);
- }
-
- cur[prop] = data[p];
- }
- }
-
- return result[''] || result;
-}
-/**
- * Counts the number of decimal places
- * @param {number} num
- * @return {number}
- */
-
-
-function countDecimals(num) {
- if (Math.floor(num) === num || String(num).indexOf('.') < 0) return 0;
- var parts = num.toString().split('.')[1];
- return parts.length || 0;
-}
-
-},{}]},{},[12]);
+!function(){var n={"./node_modules/lodash.debounce/index.js":
+/*!***********************************************!*\
+ !*** ./node_modules/lodash.debounce/index.js ***!
+ \***********************************************/function(e,s,t){function n(e){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _(){return h.Date.now()}var r=NaN,i="[object Symbol]",o=/^\s+|\s+$/g,a=/^[-+]0x[0-9a-f]+$/i,c=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt,t="object"==(void 0===t.g?"undefined":n(t.g))&&t.g&&t.g.Object===Object&&t.g,f="object"==("undefined"==typeof self?"undefined":n(self))&&self&&self.Object===Object&&self,h=t||f||Function("return this")(),d=Object.prototype.toString,E=Math.max,M=Math.min;function v(e){var t=n(e);return e&&("object"==t||"function"==t)}function p(e){return"symbol"==n(e)||!!(t=e)&&"object"==n(t)&&d.call(e)==i;var t}function b(e){if("number"==typeof e)return e;if(p(e))return r;if("string"!=typeof(e=v(e)?v(t="function"==typeof e.valueOf?e.valueOf():e)?t+"":t:e))return 0===e?e:+e;e=e.replace(o,"");var t=c.test(e);return t||l.test(e)?u(e.slice(2),t?2:8):a.test(e)?r:+e}e.exports=function(f,n,e){var r,i,o,a,s,c,l=0,h=!1,u=!1,t=!0;if("function"!=typeof f)throw new TypeError("Expected a function");function d(e){var t=r,n=i;return r=i=void 0,l=e,a=f.apply(n,t)}function p(e){var t=e-c;return void 0===c||n<=t||t<0||u&&o<=e-l}function m(){var e,t=_();if(p(t))return y(t);s=setTimeout(m,(e=n-((t=t)-c),u?M(e,o-(t-l)):e))}function y(e){return s=void 0,t&&r?d(e):(r=i=void 0,a)}function g(){var e=_(),t=p(e);if(r=arguments,i=this,c=e,t){if(void 0===s)return l=e=c,s=setTimeout(m,n),h?d(e):a;if(u)return s=setTimeout(m,n),d(c)}return void 0===s&&(s=setTimeout(m,n)),a}return n=b(n)||0,v(e)&&(h=!!e.leading,u="maxWait"in e,o=u?E(b(e.maxWait)||0,n):o,t="trailing"in e?!!e.trailing:t),g.cancel=function(){void 0!==s&&clearTimeout(s),r=c=i=s=void(l=0)},g.flush=function(){return void 0===s?a:y(_())},g}},"./src/AICC.js":
+/*!*********************!*\
+ !*** ./src/AICC.js ***!
+ \*********************/function(r,e,t){"use strict";t.r(e),t.d(e,{default:function(){return d}});var e=t(/*! ./Scorm12API */"./src/Scorm12API.js"),o=t(/*! ./cmi/aicc_cmi */"./src/cmi/aicc_cmi.js"),f=t(/*! ./cmi/scorm12_cmi */"./src/cmi/scorm12_cmi.js");function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function n(t,e){var n,r=Object.keys(t);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(t),e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)),r}function a(r){for(var e=1;ee.length)&&(t=e.length);for(var n=0,r=new Array(t);n=this.apiLogLevel&&this.settings.onLogMessage(r,n)}},{key:"formatMessage",value:function(e,t,n){for(var r="",i=20-(r+=e).length,o=0;o=parseFloat(this.cmi.student_data.mastery_score)?this.cmi.core.lesson_status="passed":this.cmi.core.lesson_status="failed"):"browse"===this.cmi.core.lesson_mode&&""===((null===(i=this.startingData)||void 0===i||null===(n=i.cmi)||void 0===n||null===(r=n.core)||void 0===r?void 0:r.lesson_status)||"")&&"not attempted"===t&&(this.cmi.core.lesson_status="browsed"));var t,n,r,i=this.renderCommitCMI(e||this.settings.alwaysSendTotalTime);return this.apiLogLevel===u.LOG_LEVEL_DEBUG&&(console.debug("Commit (terminated: "+(e?"yes":"no")+"): "),console.debug(i)),this.settings.lmsCommitUrl?this.processHttpRequest(this.settings.lmsCommitUrl,i,e):u.SCORM_TRUE}}])&&h(t.prototype,e),n&&h(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}(e.default)},"./src/cmi/aicc_cmi.js":
+/*!*****************************!*\
+ !*** ./src/cmi/aicc_cmi.js ***!
+ \*****************************/function(t,n,h){"use strict";h.r(n),h.d(n,{CMI:function(){return C},CMIStudentDemographics:function(){return K},CMIPaths:function(){return Q},CMIPathsObject:function(){return ae},CMITries:function(){return se},CMITriesObject:function(){return ue},CMIAttemptRecords:function(){return fe},CMIAttemptRecordsObject:function(){return de},CMIEvaluationCommentsObject:function(){return ge}});var d=h(/*! ./scorm12_cmi */"./src/cmi/scorm12_cmi.js"),r=h(/*! ./common */"./src/cmi/common.js"),n=h(/*! ../constants/api_constants */"./src/constants/api_constants.js"),p=h(/*! ../constants/regex */"./src/constants/regex.js"),m=h(/*! ../constants/error_codes */"./src/constants/error_codes.js"),y=h(/*! ../exceptions */"./src/exceptions.js");function g(e){return(g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function i(e,t,n){var r=e;if(t.has(r))throw new TypeError("Cannot initialize the same private elements twice on an object");t.set(e,n)}function o(e,t,n){var t=_(e,t,"set"),r=n;if(t.set)t.set.call(e,r);else{if(!t.writable)throw new TypeError("attempted to set read only private field");t.value=r}return n}function e(e,t){t=_(e,t,"get");return t.get?t.get.call(e):t.value}function _(e,t,n){if(!t.has(e))throw new TypeError("attempted to "+n+" private field on non-instance");return t.get(e)}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function v(e,t){for(var n=0;n=t[0]){if("*"===t[1]||e<=t[1])return!0;throw new r.prototype.constructor(n)}throw new r.prototype.constructor(n)}var C=new WeakMap,T=new WeakMap,j=function(){function r(){var e,t,n;if(v(this,r),n=!(t="jsonString"),t in(e=this)?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,h(this,C,{writable:!0,value:!1}),h(this,T,{writable:!0,value:void 0}),(this instanceof r?this.constructor:void 0)===r)throw new TypeError("Cannot construct BaseCMI instances directly")}return b(r,[{key:"initialized",get:function(){return t(this,C)}},{key:"start_time",get:function(){return t(this,T)}},{key:"initialize",value:function(){d(this,C,!0)}},{key:"setStartTime",value:function(){d(this,T,(new Date).getTime())}}]),r}(),k=new WeakMap,p=new WeakMap,R=new WeakMap,m=new WeakMap,y=new WeakMap,g=new WeakMap,_=new WeakMap,L=new WeakMap,A=new WeakMap,N=new WeakMap,D=function(){a(u,j);var l=c(u);function u(e){var t,n=e.score_children,r=e.score_range,i=e.max,o=e.invalidErrorCode,a=e.invalidTypeCode,s=e.invalidRangeCode,c=e.decimalRegex,e=e.errorClass;return v(this,u),h(f(t=l.call(this)),k,{writable:!0,value:void 0}),h(f(t),p,{writable:!0,value:void 0}),h(f(t),R,{writable:!0,value:void 0}),h(f(t),m,{writable:!0,value:void 0}),h(f(t),y,{writable:!0,value:void 0}),h(f(t),g,{writable:!0,value:void 0}),h(f(t),_,{writable:!0,value:void 0}),h(f(t),L,{writable:!0,value:""}),h(f(t),A,{writable:!0,value:""}),h(f(t),N,{writable:!0,value:void 0}),d(f(t),k,n||M.score_children),d(f(t),p,!!r&&w.score_range),d(f(t),N,i||""===i?i:"100"),d(f(t),R,o||O.INVALID_SET_VALUE),d(f(t),m,a||O.TYPE_MISMATCH),d(f(t),y,s||O.VALUE_OUT_OF_RANGE),d(f(t),g,c||w.CMIDecimal),d(f(t),_,e),t}return b(u,[{key:"_children",get:function(){return t(this,k)},set:function(e){throw new(t(this,_).prototype.constructor)(t(this,R))}},{key:"raw",get:function(){return t(this,L)},set:function(e){!S(e,t(this,g),t(this,m),t(this,_))||t(this,p)&&!I(e,t(this,p),t(this,y),t(this,_))||d(this,L,e)}},{key:"min",get:function(){return t(this,A)},set:function(e){!S(e,t(this,g),t(this,m),t(this,_))||t(this,p)&&!I(e,t(this,p),t(this,y),t(this,_))||d(this,A,e)}},{key:"max",get:function(){return t(this,N)},set:function(e){!S(e,t(this,g),t(this,m),t(this,_))||t(this,p)&&!I(e,t(this,p),t(this,y),t(this,_))||d(this,N,e)}},{key:"toJSON",value:function(){this.jsonString=!0;var e={raw:this.raw,min:this.min,max:this.max};return delete this.jsonString,e}}]),u}(),P=new WeakMap,V=new WeakMap,F=new WeakMap,x=function(){a(o,j);var i=c(o);function o(e){var t,n=e.children,r=e.errorCode,e=e.errorClass;return v(this,o),h(f(t=i.call(this)),P,{writable:!0,value:void 0}),h(f(t),V,{writable:!0,value:void 0}),h(f(t),F,{writable:!0,value:void 0}),d(f(t),F,n),d(f(t),P,r),d(f(t),V,e),t.childArray=[],t}return b(o,[{key:"_children",get:function(){return t(this,F)},set:function(e){throw new(t(this,V).prototype.constructor)(t(this,P))}},{key:"_count",get:function(){return this.childArray.length},set:function(e){throw new(t(this,V).prototype.constructor)(t(this,P))}},{key:"toJSON",value:function(){this.jsonString=!0;for(var e={},t=0;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n
* Build: `lodash modularize exports="npm" -o ./`
@@ -11,51 +20,50 @@
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = 'Expected a function';
-
/** Used as references for various `Number` constants. */
+
var NAN = 0 / 0;
-
/** `Object#toString` result references. */
+
var symbolTag = '[object Symbol]';
-
/** Used to match leading and trailing whitespace. */
+
var reTrim = /^\s+|\s+$/g;
-
/** Used to detect bad signed hexadecimal string values. */
+
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
-
/** Used to detect binary string values. */
+
var reIsBinary = /^0b[01]+$/i;
-
/** Used to detect octal string values. */
+
var reIsOctal = /^0o[0-7]+$/i;
-
/** Built-in method references without a dependency on `root`. */
+
var freeParseInt = parseInt;
-
/** Detect free variable `global` from Node.js. */
-var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
+var freeGlobal = (typeof __webpack_require__.g === "undefined" ? "undefined" : _typeof(__webpack_require__.g)) == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;
/** Detect free variable `self`. */
-var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
+var freeSelf = (typeof self === "undefined" ? "undefined" : _typeof(self)) == 'object' && self && self.Object === Object && self;
/** Used as a reference to the global object. */
+
var root = freeGlobal || freeSelf || Function('return this')();
-
/** Used for built-in method references. */
-var objectProto = Object.prototype;
+var objectProto = Object.prototype;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
* of values.
*/
-var objectToString = objectProto.toString;
+var objectToString = objectProto.toString;
/* Built-in method references for those with the same name as other `lodash` methods. */
+
var nativeMax = Math.max,
nativeMin = Math.min;
-
/**
* Gets the timestamp of the number of milliseconds that have elapsed since
* the Unix epoch (1 January 1970 00:00:00 UTC).
@@ -72,10 +80,10 @@ var nativeMax = Math.max,
* }, _.now());
* // => Logs the number of milliseconds it took for the deferred invocation.
*/
-var now = function() {
+
+var now = function now() {
return root.Date.now();
};
-
/**
* Creates a debounced function that delays invoking `func` until after `wait`
* milliseconds have elapsed since the last time the debounced function was
@@ -130,6 +138,8 @@ var now = function() {
* // Cancel the trailing debounced invocation.
* jQuery(window).on('popstate', debounced.cancel);
*/
+
+
function debounce(func, wait, options) {
var lastArgs,
lastThis,
@@ -145,7 +155,9 @@ function debounce(func, wait, options) {
if (typeof func != 'function') {
throw new TypeError(FUNC_ERROR_TEXT);
}
+
wait = toNumber(wait) || 0;
+
if (isObject(options)) {
leading = !!options.leading;
maxing = 'maxWait' in options;
@@ -156,7 +168,6 @@ function debounce(func, wait, options) {
function invokeFunc(time) {
var args = lastArgs,
thisArg = lastThis;
-
lastArgs = lastThis = undefined;
lastInvokeTime = time;
result = func.apply(thisArg, args);
@@ -165,10 +176,10 @@ function debounce(func, wait, options) {
function leadingEdge(time) {
// Reset any `maxWait` timer.
- lastInvokeTime = time;
- // Start the timer for the trailing edge.
- timerId = setTimeout(timerExpired, wait);
- // Invoke the leading edge.
+ lastInvokeTime = time; // Start the timer for the trailing edge.
+
+ timerId = setTimeout(timerExpired, wait); // Invoke the leading edge.
+
return leading ? invokeFunc(time) : result;
}
@@ -176,38 +187,37 @@ function debounce(func, wait, options) {
var timeSinceLastCall = time - lastCallTime,
timeSinceLastInvoke = time - lastInvokeTime,
result = wait - timeSinceLastCall;
-
return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
}
function shouldInvoke(time) {
var timeSinceLastCall = time - lastCallTime,
- timeSinceLastInvoke = time - lastInvokeTime;
-
- // Either this is the first call, activity has stopped and we're at the
+ timeSinceLastInvoke = time - lastInvokeTime; // Either this is the first call, activity has stopped and we're at the
// trailing edge, the system time has gone backwards and we're treating
// it as the trailing edge, or we've hit the `maxWait` limit.
- return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
- (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
+
+ return lastCallTime === undefined || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
}
function timerExpired() {
var time = now();
+
if (shouldInvoke(time)) {
return trailingEdge(time);
- }
- // Restart the timer.
+ } // Restart the timer.
+
+
timerId = setTimeout(timerExpired, remainingWait(time));
}
function trailingEdge(time) {
- timerId = undefined;
-
- // Only invoke if we have `lastArgs` which means `func` has been
+ timerId = undefined; // Only invoke if we have `lastArgs` which means `func` has been
// debounced at least once.
+
if (trailing && lastArgs) {
return invokeFunc(time);
}
+
lastArgs = lastThis = undefined;
return result;
}
@@ -216,6 +226,7 @@ function debounce(func, wait, options) {
if (timerId !== undefined) {
clearTimeout(timerId);
}
+
lastInvokeTime = 0;
lastArgs = lastCallTime = lastThis = timerId = undefined;
}
@@ -227,7 +238,6 @@ function debounce(func, wait, options) {
function debounced() {
var time = now(),
isInvoking = shouldInvoke(time);
-
lastArgs = arguments;
lastThis = this;
lastCallTime = time;
@@ -236,22 +246,25 @@ function debounce(func, wait, options) {
if (timerId === undefined) {
return leadingEdge(lastCallTime);
}
+
if (maxing) {
// Handle invocations in a tight loop.
timerId = setTimeout(timerExpired, wait);
return invokeFunc(lastCallTime);
}
}
+
if (timerId === undefined) {
timerId = setTimeout(timerExpired, wait);
}
+
return result;
}
+
debounced.cancel = cancel;
debounced.flush = flush;
return debounced;
}
-
/**
* Checks if `value` is the
* [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
@@ -277,11 +290,13 @@ function debounce(func, wait, options) {
* _.isObject(null);
* // => false
*/
+
+
function isObject(value) {
- var type = typeof value;
+ var type = _typeof(value);
+
return !!value && (type == 'object' || type == 'function');
}
-
/**
* Checks if `value` is object-like. A value is object-like if it's not `null`
* and has a `typeof` result of "object".
@@ -306,10 +321,11 @@ function isObject(value) {
* _.isObjectLike(null);
* // => false
*/
-function isObjectLike(value) {
- return !!value && typeof value == 'object';
-}
+
+function isObjectLike(value) {
+ return !!value && _typeof(value) == 'object';
+}
/**
* Checks if `value` is classified as a `Symbol` primitive or object.
*
@@ -327,11 +343,11 @@ function isObjectLike(value) {
* _.isSymbol('abc');
* // => false
*/
-function isSymbol(value) {
- return typeof value == 'symbol' ||
- (isObjectLike(value) && objectToString.call(value) == symbolTag);
-}
+
+function isSymbol(value) {
+ return _typeof(value) == 'symbol' || isObjectLike(value) && objectToString.call(value) == symbolTag;
+}
/**
* Converts `value` to a number.
*
@@ -355,49 +371,51 @@ function isSymbol(value) {
* _.toNumber('3.2');
* // => 3.2
*/
+
+
function toNumber(value) {
if (typeof value == 'number') {
return value;
}
+
if (isSymbol(value)) {
return NAN;
}
+
if (isObject(value)) {
var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
- value = isObject(other) ? (other + '') : other;
+ value = isObject(other) ? other + '' : other;
}
+
if (typeof value != 'string') {
return value === 0 ? value : +value;
}
+
value = value.replace(reTrim, '');
var isBinary = reIsBinary.test(value);
- return (isBinary || reIsOctal.test(value))
- ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
- : (reIsBadHex.test(value) ? NAN : +value);
+ return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
}
module.exports = debounce;
-}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+/***/ }),
+
+/***/ "./src/AICC.js":
+/*!*********************!*\
+ !*** ./src/AICC.js ***!
+ \*********************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{}],2:[function(require,module,exports){
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ AICC; }
+/* harmony export */ });
+/* harmony import */ var _Scorm12API__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Scorm12API */ "./src/Scorm12API.js");
+/* harmony import */ var _cmi_aicc_cmi__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cmi/aicc_cmi */ "./src/cmi/aicc_cmi.js");
+/* harmony import */ var _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./cmi/scorm12_cmi */ "./src/cmi/scorm12_cmi.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _Scorm12API2 = _interopRequireDefault(require("./Scorm12API"));
-
-var _aicc_cmi = require("./cmi/aicc_cmi");
-
-var _scorm12_cmi = require("./cmi/scorm12_cmi");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -428,9 +446,13 @@ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Re
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
+
+
+
/**
* The AICC API class
*/
+
var AICC = /*#__PURE__*/function (_Scorm12API) {
_inherits(AICC, _Scorm12API);
@@ -450,8 +472,8 @@ var AICC = /*#__PURE__*/function (_Scorm12API) {
}), settings);
_this = _super.call(this, finalSettings);
- _this.cmi = new _aicc_cmi.CMI();
- _this.nav = new _scorm12_cmi.NAV();
+ _this.cmi = new _cmi_aicc_cmi__WEBPACK_IMPORTED_MODULE_1__.CMI();
+ _this.nav = new _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_2__.NAV();
return _this;
}
/**
@@ -471,11 +493,11 @@ var AICC = /*#__PURE__*/function (_Scorm12API) {
if (!newChild) {
if (this.stringMatches(CMIElement, 'cmi\\.evaluation\\.comments\\.\\d+')) {
- newChild = new _aicc_cmi.CMIEvaluationCommentsObject();
+ newChild = new _cmi_aicc_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIEvaluationCommentsObject();
} else if (this.stringMatches(CMIElement, 'cmi\\.student_data\\.tries\\.\\d+')) {
- newChild = new _aicc_cmi.CMITriesObject();
+ newChild = new _cmi_aicc_cmi__WEBPACK_IMPORTED_MODULE_1__.CMITriesObject();
} else if (this.stringMatches(CMIElement, 'cmi\\.student_data\\.attempt_records\\.\\d+')) {
- newChild = new _aicc_cmi.CMIAttemptRecordsObject();
+ newChild = new _cmi_aicc_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIAttemptRecordsObject();
}
}
@@ -497,32 +519,30 @@ var AICC = /*#__PURE__*/function (_Scorm12API) {
}]);
return AICC;
-}(_Scorm12API2["default"]);
+}(_Scorm12API__WEBPACK_IMPORTED_MODULE_0__["default"]);
-exports["default"] = AICC;
-},{"./Scorm12API":4,"./cmi/aicc_cmi":6,"./cmi/scorm12_cmi":8}],3:[function(require,module,exports){
+
+/***/ }),
+
+/***/ "./src/BaseAPI.js":
+/*!************************!*\
+ !*** ./src/BaseAPI.js ***!
+ \************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _common = require("./cmi/common");
-
-var _exceptions = require("./exceptions");
-
-var _error_codes2 = _interopRequireDefault(require("./constants/error_codes"));
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-var _utilities = require("./utilities");
-
-var _lodash = _interopRequireDefault(require("lodash.debounce"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ BaseAPI; }
+/* harmony export */ });
+/* harmony import */ var _cmi_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cmi/common */ "./src/cmi/common.js");
+/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./exceptions */ "./src/exceptions.js");
+/* harmony import */ var _constants_error_codes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants/error_codes */ "./src/constants/error_codes.js");
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants/api_constants */ "./src/constants/api_constants.js");
+/* harmony import */ var _utilities__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utilities */ "./src/utilities.js");
+/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash.debounce */ "./node_modules/lodash.debounce/index.js");
+/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash_debounce__WEBPACK_IMPORTED_MODULE_5__);
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -563,8 +583,14 @@ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!priva
function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-var global_constants = _api_constants["default"].global;
-var scorm12_error_codes = _error_codes2["default"].scorm12;
+
+
+
+
+
+
+var global_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__["default"].global;
+var scorm12_error_codes = _constants_error_codes__WEBPACK_IMPORTED_MODULE_2__["default"].scorm12;
/**
* Base API class for AICC, SCORM 1.2, and SCORM 2004. Should be considered
* abstract, and never initialized on it's own.
@@ -635,6 +661,9 @@ var BaseAPI = /*#__PURE__*/function () {
return result;
},
+ requestHandler: function requestHandler(commitObject) {
+ return commitObject;
+ },
onLogMessage: function onLogMessage(messageLevel, logMessage) {
switch (messageLevel) {
case global_constants.LOG_LEVEL_ERROR:
@@ -793,7 +822,7 @@ var BaseAPI = /*#__PURE__*/function () {
try {
returnValue = this.getCMIValue(CMIElement);
} catch (e) {
- if (e instanceof _exceptions.ValidationError) {
+ if (e instanceof _exceptions__WEBPACK_IMPORTED_MODULE_1__.ValidationError) {
this.lastErrorCode = e.errorCode;
returnValue = global_constants.SCORM_FALSE;
} else {
@@ -840,7 +869,7 @@ var BaseAPI = /*#__PURE__*/function () {
try {
returnValue = this.setCMIValue(CMIElement, value);
} catch (e) {
- if (e instanceof _exceptions.ValidationError) {
+ if (e instanceof _exceptions__WEBPACK_IMPORTED_MODULE_1__.ValidationError) {
this.lastErrorCode = e.errorCode;
returnValue = global_constants.SCORM_FALSE;
} else {
@@ -1158,7 +1187,7 @@ var BaseAPI = /*#__PURE__*/function () {
break;
}
- if (refObject instanceof _common.CMIArray) {
+ if (refObject instanceof _cmi_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray) {
var index = parseInt(structure[i + 1], 10); // SCO is trying to set an item on an array
if (!isNaN(index)) {
@@ -1270,7 +1299,7 @@ var BaseAPI = /*#__PURE__*/function () {
break;
}
- if (refObject instanceof _common.CMIArray) {
+ if (refObject instanceof _cmi_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray) {
var index = parseInt(structure[i + 1], 10); // SCO is trying to set an item on an array
if (!isNaN(index)) {
@@ -1612,7 +1641,7 @@ var BaseAPI = /*#__PURE__*/function () {
obj = {};
obj[element[0]] = element[1];
- _this3.loadFromJSON((0, _utilities.unflatten)(obj), CMIElement);
+ _this3.loadFromJSON((0,_utilities__WEBPACK_IMPORTED_MODULE_4__.unflatten)(obj), CMIElement);
});
}
/**
@@ -1736,6 +1765,8 @@ var BaseAPI = /*#__PURE__*/function () {
}
try {
+ params = settings.requestHandler(params);
+
if (params instanceof Array) {
httpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
httpReq.send(params.join('&'));
@@ -1805,8 +1836,8 @@ var BaseAPI = /*#__PURE__*/function () {
return result;
};
- if (typeof _lodash["default"] !== 'undefined') {
- var debounced = (0, _lodash["default"])(process, 500);
+ if (typeof (lodash_debounce__WEBPACK_IMPORTED_MODULE_5___default()) !== 'undefined') {
+ var debounced = lodash_debounce__WEBPACK_IMPORTED_MODULE_5___default()(process, 500);
debounced(url, params, this.settings, this.error_codes); // if we're terminating, go ahead and commit immediately
if (immediate) {
@@ -1859,7 +1890,7 @@ var BaseAPI = /*#__PURE__*/function () {
*/
-exports["default"] = BaseAPI;
+
var _API = /*#__PURE__*/new WeakMap();
@@ -1935,32 +1966,26 @@ var ScheduledCommit = /*#__PURE__*/function () {
return ScheduledCommit;
}();
-},{"./cmi/common":7,"./constants/api_constants":10,"./constants/error_codes":11,"./exceptions":15,"./utilities":17,"lodash.debounce":1}],4:[function(require,module,exports){
+/***/ }),
+
+/***/ "./src/Scorm12API.js":
+/*!***************************!*\
+ !*** ./src/Scorm12API.js ***!
+ \***************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ Scorm12API; }
+/* harmony export */ });
+/* harmony import */ var _BaseAPI__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BaseAPI */ "./src/BaseAPI.js");
+/* harmony import */ var _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cmi/scorm12_cmi */ "./src/cmi/scorm12_cmi.js");
+/* harmony import */ var _utilities__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utilities */ "./src/utilities.js");
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants/api_constants */ "./src/constants/api_constants.js");
+/* harmony import */ var _constants_error_codes__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./constants/error_codes */ "./src/constants/error_codes.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _BaseAPI2 = _interopRequireDefault(require("./BaseAPI"));
-
-var _scorm12_cmi = require("./cmi/scorm12_cmi");
-
-var Utilities = _interopRequireWildcard(require("./utilities"));
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("./constants/error_codes"));
-
-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; }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -1987,9 +2012,14 @@ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Re
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-var scorm12_constants = _api_constants["default"].scorm12;
-var global_constants = _api_constants["default"].global;
-var scorm12_error_codes = _error_codes["default"].scorm12;
+
+
+
+
+
+var scorm12_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__["default"].scorm12;
+var global_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__["default"].global;
+var scorm12_error_codes = _constants_error_codes__WEBPACK_IMPORTED_MODULE_4__["default"].scorm12;
/**
* API class for SCORM 1.2
*/
@@ -2013,8 +2043,8 @@ var Scorm12API = /*#__PURE__*/function (_BaseAPI) {
}), settings);
_this = _super.call(this, scorm12_error_codes, finalSettings);
- _this.cmi = new _scorm12_cmi.CMI();
- _this.nav = new _scorm12_cmi.NAV(); // Rename functions to match 1.2 Spec and expose to modules
+ _this.cmi = new _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_1__.CMI();
+ _this.nav = new _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_1__.NAV(); // Rename functions to match 1.2 Spec and expose to modules
_this.LMSInitialize = _this.lmsInitialize;
_this.LMSFinish = _this.lmsFinish;
@@ -2175,13 +2205,13 @@ var Scorm12API = /*#__PURE__*/function (_BaseAPI) {
var newChild;
if (this.stringMatches(CMIElement, 'cmi\\.objectives\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIObjectivesObject();
+ newChild = new _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIObjectivesObject();
} else if (foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+\\.correct_responses\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIInteractionsCorrectResponsesObject();
+ newChild = new _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIInteractionsCorrectResponsesObject();
} else if (foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+\\.objectives\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIInteractionsObjectivesObject();
+ newChild = new _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIInteractionsObjectivesObject();
} else if (!foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIInteractionsObject();
+ newChild = new _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIInteractionsObject();
}
return newChild;
@@ -2251,11 +2281,11 @@ var Scorm12API = /*#__PURE__*/function (_BaseAPI) {
}
var result = [];
- var flattened = Utilities.flatten(cmiExport);
+ var flattened = _utilities__WEBPACK_IMPORTED_MODULE_2__.flatten(cmiExport);
switch (this.settings.dataCommitFormat) {
case 'flattened':
- return Utilities.flatten(cmiExport);
+ return _utilities__WEBPACK_IMPORTED_MODULE_2__.flatten(cmiExport);
case 'params':
for (var item in flattened) {
@@ -2323,42 +2353,33 @@ var Scorm12API = /*#__PURE__*/function (_BaseAPI) {
}]);
return Scorm12API;
-}(_BaseAPI2["default"]);
+}(_BaseAPI__WEBPACK_IMPORTED_MODULE_0__["default"]);
-exports["default"] = Scorm12API;
-},{"./BaseAPI":3,"./cmi/scorm12_cmi":8,"./constants/api_constants":10,"./constants/error_codes":11,"./utilities":17}],5:[function(require,module,exports){
+
+/***/ }),
+
+/***/ "./src/Scorm2004API.js":
+/*!*****************************!*\
+ !*** ./src/Scorm2004API.js ***!
+ \*****************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ Scorm2004API; }
+/* harmony export */ });
+/* harmony import */ var _BaseAPI__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BaseAPI */ "./src/BaseAPI.js");
+/* harmony import */ var _cmi_scorm2004_cmi__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cmi/scorm2004_cmi */ "./src/cmi/scorm2004_cmi.js");
+/* harmony import */ var _utilities__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utilities */ "./src/utilities.js");
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants/api_constants */ "./src/constants/api_constants.js");
+/* harmony import */ var _constants_error_codes__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./constants/error_codes */ "./src/constants/error_codes.js");
+/* harmony import */ var _constants_response_constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./constants/response_constants */ "./src/constants/response_constants.js");
+/* harmony import */ var _constants_language_constants__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./constants/language_constants */ "./src/constants/language_constants.js");
+/* harmony import */ var _constants_regex__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./constants/regex */ "./src/constants/regex.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _BaseAPI2 = _interopRequireDefault(require("./BaseAPI"));
-
-var _scorm2004_cmi = require("./cmi/scorm2004_cmi");
-
-var Utilities = _interopRequireWildcard(require("./utilities"));
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("./constants/error_codes"));
-
-var _response_constants = _interopRequireDefault(require("./constants/response_constants"));
-
-var _language_constants = _interopRequireDefault(require("./constants/language_constants"));
-
-var _regex = _interopRequireDefault(require("./constants/regex"));
-
-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; }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -2395,11 +2416,19 @@ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!priva
function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-var scorm2004_constants = _api_constants["default"].scorm2004;
-var global_constants = _api_constants["default"].global;
-var scorm2004_error_codes = _error_codes["default"].scorm2004;
-var correct_responses = _response_constants["default"].correct;
-var scorm2004_regex = _regex["default"].scorm2004;
+
+
+
+
+
+
+
+
+var scorm2004_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__["default"].scorm2004;
+var global_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__["default"].global;
+var scorm2004_error_codes = _constants_error_codes__WEBPACK_IMPORTED_MODULE_4__["default"].scorm2004;
+var correct_responses = _constants_response_constants__WEBPACK_IMPORTED_MODULE_5__["default"].correct;
+var scorm2004_regex = _constants_regex__WEBPACK_IMPORTED_MODULE_7__["default"].scorm2004;
/**
* API class for SCORM 2004
*/
@@ -2444,8 +2473,8 @@ var Scorm2004API = /*#__PURE__*/function (_BaseAPI) {
return found;
});
- _this.cmi = new _scorm2004_cmi.CMI();
- _this.adl = new _scorm2004_cmi.ADL(); // Rename functions to match 2004 Spec and expose to modules
+ _this.cmi = new _cmi_scorm2004_cmi__WEBPACK_IMPORTED_MODULE_1__.CMI();
+ _this.adl = new _cmi_scorm2004_cmi__WEBPACK_IMPORTED_MODULE_1__.ADL(); // Rename functions to match 2004 Spec and expose to modules
_this.Initialize = _this.lmsInitialize;
_this.Terminate = _this.lmsTerminate;
@@ -2620,7 +2649,7 @@ var Scorm2004API = /*#__PURE__*/function (_BaseAPI) {
var newChild;
if (this.stringMatches(CMIElement, 'cmi\\.objectives\\.\\d+')) {
- newChild = new _scorm2004_cmi.CMIObjectivesObject();
+ newChild = new _cmi_scorm2004_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIObjectivesObject();
} else if (foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+\\.correct_responses\\.\\d+')) {
var parts = CMIElement.split('.');
var index = Number(parts[2]);
@@ -2642,16 +2671,16 @@ var Scorm2004API = /*#__PURE__*/function (_BaseAPI) {
}
if (this.lastErrorCode === 0) {
- newChild = new _scorm2004_cmi.CMIInteractionsCorrectResponsesObject();
+ newChild = new _cmi_scorm2004_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIInteractionsCorrectResponsesObject();
}
} else if (foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+\\.objectives\\.\\d+')) {
- newChild = new _scorm2004_cmi.CMIInteractionsObjectivesObject();
+ newChild = new _cmi_scorm2004_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIInteractionsObjectivesObject();
} else if (!foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+')) {
- newChild = new _scorm2004_cmi.CMIInteractionsObject();
+ newChild = new _cmi_scorm2004_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIInteractionsObject();
} else if (this.stringMatches(CMIElement, 'cmi\\.comments_from_learner\\.\\d+')) {
- newChild = new _scorm2004_cmi.CMICommentsObject();
+ newChild = new _cmi_scorm2004_cmi__WEBPACK_IMPORTED_MODULE_1__.CMICommentsObject();
} else if (this.stringMatches(CMIElement, 'cmi\\.comments_from_lms\\.\\d+')) {
- newChild = new _scorm2004_cmi.CMICommentsObject(true);
+ newChild = new _cmi_scorm2004_cmi__WEBPACK_IMPORTED_MODULE_1__.CMICommentsObject(true);
}
return newChild;
@@ -2856,7 +2885,7 @@ var Scorm2004API = /*#__PURE__*/function (_BaseAPI) {
var lang = langMatches[3];
if (lang !== undefined && lang.length > 0) {
- if (_language_constants["default"][lang.toLowerCase()] === undefined) {
+ if (_constants_language_constants__WEBPACK_IMPORTED_MODULE_6__["default"][lang.toLowerCase()] === undefined) {
this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);
}
}
@@ -2924,11 +2953,11 @@ var Scorm2004API = /*#__PURE__*/function (_BaseAPI) {
}
var result = [];
- var flattened = Utilities.flatten(cmiExport);
+ var flattened = _utilities__WEBPACK_IMPORTED_MODULE_2__.flatten(cmiExport);
switch (this.settings.dataCommitFormat) {
case 'flattened':
- return Utilities.flatten(cmiExport);
+ return _utilities__WEBPACK_IMPORTED_MODULE_2__.flatten(cmiExport);
case 'params':
for (var item in flattened) {
@@ -3012,38 +3041,39 @@ var Scorm2004API = /*#__PURE__*/function (_BaseAPI) {
}]);
return Scorm2004API;
-}(_BaseAPI2["default"]);
+}(_BaseAPI__WEBPACK_IMPORTED_MODULE_0__["default"]);
-exports["default"] = Scorm2004API;
-},{"./BaseAPI":3,"./cmi/scorm2004_cmi":9,"./constants/api_constants":10,"./constants/error_codes":11,"./constants/language_constants":12,"./constants/regex":13,"./constants/response_constants":14,"./utilities":17}],6:[function(require,module,exports){
+
+/***/ }),
+
+/***/ "./src/cmi/aicc_cmi.js":
+/*!*****************************!*\
+ !*** ./src/cmi/aicc_cmi.js ***!
+ \*****************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "CMI": function() { return /* binding */ CMI; },
+/* harmony export */ "CMIStudentDemographics": function() { return /* binding */ CMIStudentDemographics; },
+/* harmony export */ "CMIPaths": function() { return /* binding */ CMIPaths; },
+/* harmony export */ "CMIPathsObject": function() { return /* binding */ CMIPathsObject; },
+/* harmony export */ "CMITries": function() { return /* binding */ CMITries; },
+/* harmony export */ "CMITriesObject": function() { return /* binding */ CMITriesObject; },
+/* harmony export */ "CMIAttemptRecords": function() { return /* binding */ CMIAttemptRecords; },
+/* harmony export */ "CMIAttemptRecordsObject": function() { return /* binding */ CMIAttemptRecordsObject; },
+/* harmony export */ "CMIEvaluationCommentsObject": function() { return /* binding */ CMIEvaluationCommentsObject; }
+/* harmony export */ });
+/* harmony import */ var _scorm12_cmi__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./scorm12_cmi */ "./src/cmi/scorm12_cmi.js");
+/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./common */ "./src/cmi/common.js");
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants/api_constants */ "./src/constants/api_constants.js");
+/* harmony import */ var _constants_regex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../constants/regex */ "./src/constants/regex.js");
+/* harmony import */ var _constants_error_codes__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants/error_codes */ "./src/constants/error_codes.js");
+/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../exceptions */ "./src/exceptions.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.CMITriesObject = exports.CMITries = exports.CMIStudentDemographics = exports.CMIPathsObject = exports.CMIPaths = exports.CMIEvaluationCommentsObject = exports.CMIAttemptRecordsObject = exports.CMIAttemptRecords = exports.CMI = void 0;
-
-var Scorm12CMI = _interopRequireWildcard(require("./scorm12_cmi"));
-
-var _common = require("./common");
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _exceptions = require("../exceptions");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-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; }
-
function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
@@ -3082,15 +3112,21 @@ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Re
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-var aicc_constants = _api_constants["default"].aicc;
-var aicc_regex = _regex["default"].aicc;
-var aicc_error_codes = _error_codes["default"].scorm12;
+
+
+
+
+
+
+var aicc_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_2__["default"].aicc;
+var aicc_regex = _constants_regex__WEBPACK_IMPORTED_MODULE_3__["default"].aicc;
+var aicc_error_codes = _constants_error_codes__WEBPACK_IMPORTED_MODULE_4__["default"].scorm12;
/**
* Helper method for throwing Read Only error
*/
function throwReadOnlyError() {
- throw new _exceptions.AICCValidationError(aicc_error_codes.READ_ONLY_ELEMENT);
+ throw new _exceptions__WEBPACK_IMPORTED_MODULE_5__.AICCValidationError(aicc_error_codes.READ_ONLY_ELEMENT);
}
/**
* Helper method, no reason to have to pass the same error codes every time
@@ -3102,7 +3138,7 @@ function throwReadOnlyError() {
function checkAICCValidFormat(value, regexPattern, allowEmptyString) {
- return (0, _common.checkValidFormat)(value, regexPattern, aicc_error_codes.TYPE_MISMATCH, _exceptions.AICCValidationError, allowEmptyString);
+ return (0,_common__WEBPACK_IMPORTED_MODULE_1__.checkValidFormat)(value, regexPattern, aicc_error_codes.TYPE_MISMATCH, _exceptions__WEBPACK_IMPORTED_MODULE_5__.AICCValidationError, allowEmptyString);
}
/**
* CMI Class for AICC
@@ -3193,14 +3229,11 @@ var CMI = /*#__PURE__*/function (_Scorm12CMI$CMI) {
}]);
return CMI;
-}(Scorm12CMI.CMI);
+}(_scorm12_cmi__WEBPACK_IMPORTED_MODULE_0__.CMI);
/**
* AICC Evaluation object
*/
-
-exports.CMI = CMI;
-
var CMIEvaluation = /*#__PURE__*/function (_BaseCMI) {
_inherits(CMIEvaluation, _BaseCMI);
@@ -3250,7 +3283,7 @@ var CMIEvaluation = /*#__PURE__*/function (_BaseCMI) {
}]);
return CMIEvaluation;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_1__.BaseCMI);
/**
* Class representing AICC's cmi.evaluation.comments object
*/
@@ -3270,12 +3303,12 @@ var CMIEvaluationComments = /*#__PURE__*/function (_CMIArray) {
return _super3.call(this, {
children: aicc_constants.comments_children,
errorCode: aicc_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.AICCValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.AICCValidationError
});
}
return _createClass(CMIEvaluationComments);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_1__.CMIArray);
/**
* StudentPreferences class for AICC
*/
@@ -3331,9 +3364,9 @@ var AICCStudentPreferences = /*#__PURE__*/function (_Scorm12CMI$CMIStuden) {
value: ''
});
- _this3.windows = new _common.CMIArray({
+ _this3.windows = new _common__WEBPACK_IMPORTED_MODULE_1__.CMIArray({
errorCode: aicc_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.AICCValidationError,
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.AICCValidationError,
children: ''
});
return _this3;
@@ -3487,7 +3520,7 @@ var AICCStudentPreferences = /*#__PURE__*/function (_Scorm12CMI$CMIStuden) {
}]);
return AICCStudentPreferences;
-}(Scorm12CMI.CMIStudentPreference);
+}(_scorm12_cmi__WEBPACK_IMPORTED_MODULE_0__.CMIStudentPreference);
/**
* StudentData class for AICC
*/
@@ -3579,7 +3612,7 @@ var AICCCMIStudentData = /*#__PURE__*/function (_Scorm12CMI$CMIStuden2) {
}]);
return AICCCMIStudentData;
-}(Scorm12CMI.CMIStudentData);
+}(_scorm12_cmi__WEBPACK_IMPORTED_MODULE_0__.CMIStudentData);
/**
* Class representing the AICC cmi.student_demographics object
*/
@@ -3985,7 +4018,7 @@ var CMIStudentDemographics = /*#__PURE__*/function (_BaseCMI2) {
this.jsonString = true;
var result = {
'city': this.city,
- 'class': this["class"],
+ 'class': this.class,
'company': this.company,
'country': this.country,
'experience': this.experience,
@@ -4004,14 +4037,11 @@ var CMIStudentDemographics = /*#__PURE__*/function (_BaseCMI2) {
}]);
return CMIStudentDemographics;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_1__.BaseCMI);
/**
* Class representing the AICC cmi.paths object
*/
-
-exports.CMIStudentDemographics = CMIStudentDemographics;
-
var CMIPaths = /*#__PURE__*/function (_CMIArray2) {
_inherits(CMIPaths, _CMIArray2);
@@ -4029,14 +4059,11 @@ var CMIPaths = /*#__PURE__*/function (_CMIArray2) {
}
return _createClass(CMIPaths);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_1__.CMIArray);
/**
* Class for AICC Paths
*/
-
-exports.CMIPaths = CMIPaths;
-
var _location_id = /*#__PURE__*/new WeakMap();
var _date = /*#__PURE__*/new WeakMap();
@@ -4249,14 +4276,11 @@ var CMIPathsObject = /*#__PURE__*/function (_BaseCMI3) {
}]);
return CMIPathsObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_1__.BaseCMI);
/**
* Class representing the AICC cmi.student_data.tries object
*/
-
-exports.CMIPathsObject = CMIPathsObject;
-
var CMITries = /*#__PURE__*/function (_CMIArray3) {
_inherits(CMITries, _CMIArray3);
@@ -4274,14 +4298,11 @@ var CMITries = /*#__PURE__*/function (_CMIArray3) {
}
return _createClass(CMITries);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_1__.CMIArray);
/**
* Class for AICC Tries
*/
-
-exports.CMITries = CMITries;
-
var _status2 = /*#__PURE__*/new WeakMap();
var _time2 = /*#__PURE__*/new WeakMap();
@@ -4311,13 +4332,13 @@ var CMITriesObject = /*#__PURE__*/function (_BaseCMI4) {
value: ''
});
- _this7.score = new _common.CMIScore({
+ _this7.score = new _common__WEBPACK_IMPORTED_MODULE_1__.CMIScore({
score_children: aicc_constants.score_children,
score_range: aicc_regex.score_range,
invalidErrorCode: aicc_error_codes.INVALID_SET_VALUE,
invalidTypeCode: aicc_error_codes.TYPE_MISMATCH,
invalidRangeCode: aicc_error_codes.VALUE_OUT_OF_RANGE,
- errorClass: _exceptions.AICCValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.AICCValidationError
});
return _this7;
}
@@ -4401,14 +4422,11 @@ var CMITriesObject = /*#__PURE__*/function (_BaseCMI4) {
}]);
return CMITriesObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_1__.BaseCMI);
/**
* Class for cmi.student_data.attempt_records array
*/
-
-exports.CMITriesObject = CMITriesObject;
-
var CMIAttemptRecords = /*#__PURE__*/function (_CMIArray4) {
_inherits(CMIAttemptRecords, _CMIArray4);
@@ -4426,14 +4444,11 @@ var CMIAttemptRecords = /*#__PURE__*/function (_CMIArray4) {
}
return _createClass(CMIAttemptRecords);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_1__.CMIArray);
/**
* Class for AICC Attempt Records
*/
-
-exports.CMIAttemptRecords = CMIAttemptRecords;
-
var _lesson_status = /*#__PURE__*/new WeakMap();
var CMIAttemptRecordsObject = /*#__PURE__*/function (_BaseCMI5) {
@@ -4456,13 +4471,13 @@ var CMIAttemptRecordsObject = /*#__PURE__*/function (_BaseCMI5) {
value: ''
});
- _this8.score = new _common.CMIScore({
+ _this8.score = new _common__WEBPACK_IMPORTED_MODULE_1__.CMIScore({
score_children: aicc_constants.score_children,
score_range: aicc_regex.score_range,
invalidErrorCode: aicc_error_codes.INVALID_SET_VALUE,
invalidTypeCode: aicc_error_codes.TYPE_MISMATCH,
invalidRangeCode: aicc_error_codes.VALUE_OUT_OF_RANGE,
- errorClass: _exceptions.AICCValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.AICCValidationError
});
return _this8;
}
@@ -4525,14 +4540,11 @@ var CMIAttemptRecordsObject = /*#__PURE__*/function (_BaseCMI5) {
}]);
return CMIAttemptRecordsObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_1__.BaseCMI);
/**
* Class for AICC Evaluation Comments
*/
-
-exports.CMIAttemptRecordsObject = CMIAttemptRecordsObject;
-
var _content = /*#__PURE__*/new WeakMap();
var _location = /*#__PURE__*/new WeakMap();
@@ -4658,30 +4670,30 @@ var CMIEvaluationCommentsObject = /*#__PURE__*/function (_BaseCMI6) {
}]);
return CMIEvaluationCommentsObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_1__.BaseCMI);
-exports.CMIEvaluationCommentsObject = CMIEvaluationCommentsObject;
+/***/ }),
+
+/***/ "./src/cmi/common.js":
+/*!***************************!*\
+ !*** ./src/cmi/common.js ***!
+ \***************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{"../constants/api_constants":10,"../constants/error_codes":11,"../constants/regex":13,"../exceptions":15,"./common":7,"./scorm12_cmi":8}],7:[function(require,module,exports){
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "checkValidFormat": function() { return /* binding */ checkValidFormat; },
+/* harmony export */ "checkValidRange": function() { return /* binding */ checkValidRange; },
+/* harmony export */ "BaseCMI": function() { return /* binding */ BaseCMI; },
+/* harmony export */ "CMIScore": function() { return /* binding */ CMIScore; },
+/* harmony export */ "CMIArray": function() { return /* binding */ CMIArray; }
+/* harmony export */ });
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants/api_constants */ "./src/constants/api_constants.js");
+/* harmony import */ var _constants_error_codes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants/error_codes */ "./src/constants/error_codes.js");
+/* harmony import */ var _constants_regex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants/regex */ "./src/constants/regex.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.CMIScore = exports.CMIArray = exports.BaseCMI = void 0;
-exports.checkValidFormat = checkValidFormat;
-exports.checkValidRange = checkValidRange;
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
@@ -4718,9 +4730,12 @@ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!priva
function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-var scorm12_constants = _api_constants["default"].scorm12;
-var scorm12_regex = _regex["default"].scorm12;
-var scorm12_error_codes = _error_codes["default"].scorm12;
+
+
+
+var scorm12_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__["default"].scorm12;
+var scorm12_regex = _constants_regex__WEBPACK_IMPORTED_MODULE_2__["default"].scorm12;
+var scorm12_error_codes = _constants_error_codes__WEBPACK_IMPORTED_MODULE_1__["default"].scorm12;
/**
* Check if the value matches the proper format. If not, throw proper error code.
*
@@ -4756,7 +4771,6 @@ function checkValidFormat(value, regexPattern, errorCode, errorClass, allowEmpty
* @return {boolean}
*/
-
function checkValidRange(value, rangePattern, errorCode, errorClass) {
var ranges = rangePattern.split('#');
value = value * 1.0;
@@ -4775,7 +4789,6 @@ function checkValidRange(value, rangePattern, errorCode, errorClass) {
* Base class for API cmi objects
*/
-
var _initialized = /*#__PURE__*/new WeakMap();
var _start_time = /*#__PURE__*/new WeakMap();
@@ -4851,9 +4864,6 @@ var BaseCMI = /*#__PURE__*/function () {
* Base class for cmi *.score objects
*/
-
-exports.BaseCMI = BaseCMI;
-
var _children2 = /*#__PURE__*/new WeakMap();
var _score_range = /*#__PURE__*/new WeakMap();
@@ -5080,9 +5090,6 @@ var CMIScore = /*#__PURE__*/function (_BaseCMI) {
* Base class for cmi *.n objects
*/
-
-exports.CMIScore = CMIScore;
-
var _errorCode = /*#__PURE__*/new WeakMap();
var _errorClass = /*#__PURE__*/new WeakMap();
@@ -5195,42 +5202,38 @@ var CMIArray = /*#__PURE__*/function (_BaseCMI2) {
return CMIArray;
}(BaseCMI);
-exports.CMIArray = CMIArray;
+/***/ }),
+
+/***/ "./src/cmi/scorm12_cmi.js":
+/*!********************************!*\
+ !*** ./src/cmi/scorm12_cmi.js ***!
+ \********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{"../constants/api_constants":10,"../constants/error_codes":11,"../constants/regex":13}],8:[function(require,module,exports){
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "throwReadOnlyError": function() { return /* binding */ throwReadOnlyError; },
+/* harmony export */ "throwWriteOnlyError": function() { return /* binding */ throwWriteOnlyError; },
+/* harmony export */ "check12ValidFormat": function() { return /* binding */ check12ValidFormat; },
+/* harmony export */ "check12ValidRange": function() { return /* binding */ check12ValidRange; },
+/* harmony export */ "CMI": function() { return /* binding */ CMI; },
+/* harmony export */ "CMIStudentData": function() { return /* binding */ CMIStudentData; },
+/* harmony export */ "CMIStudentPreference": function() { return /* binding */ CMIStudentPreference; },
+/* harmony export */ "CMIInteractionsObject": function() { return /* binding */ CMIInteractionsObject; },
+/* harmony export */ "CMIObjectivesObject": function() { return /* binding */ CMIObjectivesObject; },
+/* harmony export */ "CMIInteractionsObjectivesObject": function() { return /* binding */ CMIInteractionsObjectivesObject; },
+/* harmony export */ "CMIInteractionsCorrectResponsesObject": function() { return /* binding */ CMIInteractionsCorrectResponsesObject; },
+/* harmony export */ "NAV": function() { return /* binding */ NAV; }
+/* harmony export */ });
+/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./common */ "./src/cmi/common.js");
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants/api_constants */ "./src/constants/api_constants.js");
+/* harmony import */ var _constants_error_codes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants/error_codes */ "./src/constants/error_codes.js");
+/* harmony import */ var _constants_regex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../constants/regex */ "./src/constants/regex.js");
+/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../exceptions */ "./src/exceptions.js");
+/* harmony import */ var _utilities__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utilities */ "./src/utilities.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.NAV = exports.CMIStudentPreference = exports.CMIStudentData = exports.CMIObjectivesObject = exports.CMIInteractionsObjectivesObject = exports.CMIInteractionsObject = exports.CMIInteractionsCorrectResponsesObject = exports.CMI = void 0;
-exports.check12ValidFormat = check12ValidFormat;
-exports.check12ValidRange = check12ValidRange;
-exports.throwReadOnlyError = throwReadOnlyError;
-exports.throwWriteOnlyError = throwWriteOnlyError;
-
-var _common = require("./common");
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-var _exceptions = require("../exceptions");
-
-var Utilities = _interopRequireWildcard(require("../utilities"));
-
-var Util = Utilities;
-
-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; }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
@@ -5271,31 +5274,36 @@ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!priva
function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-var scorm12_constants = _api_constants["default"].scorm12;
-var scorm12_regex = _regex["default"].scorm12;
-var scorm12_error_codes = _error_codes["default"].scorm12;
+
+
+
+
+
+
+
+var scorm12_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_1__["default"].scorm12;
+var scorm12_regex = _constants_regex__WEBPACK_IMPORTED_MODULE_3__["default"].scorm12;
+var scorm12_error_codes = _constants_error_codes__WEBPACK_IMPORTED_MODULE_2__["default"].scorm12;
/**
* Helper method for throwing Read Only error
*/
function throwReadOnlyError() {
- throw new _exceptions.Scorm12ValidationError(scorm12_error_codes.READ_ONLY_ELEMENT);
+ throw new _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError(scorm12_error_codes.READ_ONLY_ELEMENT);
}
/**
* Helper method for throwing Write Only error
*/
-
function throwWriteOnlyError() {
- throw new _exceptions.Scorm12ValidationError(scorm12_error_codes.WRITE_ONLY_ELEMENT);
+ throw new _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError(scorm12_error_codes.WRITE_ONLY_ELEMENT);
}
/**
* Helper method for throwing Invalid Set error
*/
-
function throwInvalidValueError() {
- throw new _exceptions.Scorm12ValidationError(scorm12_error_codes.INVALID_SET_VALUE);
+ throw new _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError(scorm12_error_codes.INVALID_SET_VALUE);
}
/**
* Helper method, no reason to have to pass the same error codes every time
@@ -5307,7 +5315,7 @@ function throwInvalidValueError() {
function check12ValidFormat(value, regexPattern, allowEmptyString) {
- return (0, _common.checkValidFormat)(value, regexPattern, scorm12_error_codes.TYPE_MISMATCH, _exceptions.Scorm12ValidationError, allowEmptyString);
+ return (0,_common__WEBPACK_IMPORTED_MODULE_0__.checkValidFormat)(value, regexPattern, scorm12_error_codes.TYPE_MISMATCH, _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError, allowEmptyString);
}
/**
* Helper method, no reason to have to pass the same error codes every time
@@ -5317,15 +5325,13 @@ function check12ValidFormat(value, regexPattern, allowEmptyString) {
* @return {boolean}
*/
-
function check12ValidRange(value, rangePattern, allowEmptyString) {
- return (0, _common.checkValidRange)(value, rangePattern, scorm12_error_codes.VALUE_OUT_OF_RANGE, _exceptions.Scorm12ValidationError, allowEmptyString);
+ return (0,_common__WEBPACK_IMPORTED_MODULE_0__.checkValidRange)(value, rangePattern, scorm12_error_codes.VALUE_OUT_OF_RANGE, _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError, allowEmptyString);
}
/**
* Class representing the cmi object for SCORM 1.2
*/
-
var _children2 = /*#__PURE__*/new WeakMap();
var _version2 = /*#__PURE__*/new WeakMap();
@@ -5574,15 +5580,12 @@ var CMI = /*#__PURE__*/function (_BaseCMI) {
}]);
return CMI;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing the cmi.core object
* @extends BaseCMI
*/
-
-exports.CMI = CMI;
-
var _children3 = /*#__PURE__*/new WeakMap();
var _student_id = /*#__PURE__*/new WeakMap();
@@ -5682,13 +5685,13 @@ var CMICore = /*#__PURE__*/function (_BaseCMI2) {
value: ''
});
- _this2.score = new _common.CMIScore({
+ _this2.score = new _common__WEBPACK_IMPORTED_MODULE_0__.CMIScore({
score_children: scorm12_constants.score_children,
score_range: scorm12_regex.score_range,
invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,
invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,
invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,
- errorClass: _exceptions.Scorm12ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError
});
return _this2;
}
@@ -5955,10 +5958,10 @@ var CMICore = /*#__PURE__*/function (_BaseCMI2) {
if (typeof startTime !== 'undefined' && startTime !== null) {
var seconds = new Date().getTime() - startTime;
- sessionTime = Util.getSecondsAsHHMMSS(seconds / 1000);
+ sessionTime = _utilities__WEBPACK_IMPORTED_MODULE_5__.getSecondsAsHHMMSS(seconds / 1000);
}
- return Utilities.addHHMMSSTimeStrings(_classPrivateFieldGet(this, _total_time), sessionTime, new RegExp(scorm12_regex.CMITimespan));
+ return _utilities__WEBPACK_IMPORTED_MODULE_5__.addHHMMSSTimeStrings(_classPrivateFieldGet(this, _total_time), sessionTime, new RegExp(scorm12_regex.CMITimespan));
}
/**
* toJSON for cmi.core
@@ -6001,7 +6004,7 @@ var CMICore = /*#__PURE__*/function (_BaseCMI2) {
}]);
return CMICore;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 1.2's cmi.objectives object
* @extends CMIArray
@@ -6022,12 +6025,12 @@ var CMIObjectives = /*#__PURE__*/function (_CMIArray) {
return _super3.call(this, {
children: scorm12_constants.objectives_children,
errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError
});
}
return _createClass(CMIObjectives);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray);
/**
* Class representing SCORM 1.2's cmi.student_data object
* @extends BaseCMI
@@ -6184,15 +6187,12 @@ var CMIStudentData = /*#__PURE__*/function (_BaseCMI3) {
}]);
return CMIStudentData;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 1.2's cmi.student_preference object
* @extends BaseCMI
*/
-
-exports.CMIStudentData = CMIStudentData;
-
var _children5 = /*#__PURE__*/new WeakMap();
var _audio = /*#__PURE__*/new WeakMap();
@@ -6378,15 +6378,12 @@ var CMIStudentPreference = /*#__PURE__*/function (_BaseCMI4) {
}]);
return CMIStudentPreference;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 1.2's cmi.interactions object
* @extends BaseCMI
*/
-
-exports.CMIStudentPreference = CMIStudentPreference;
-
var CMIInteractions = /*#__PURE__*/function (_CMIArray2) {
_inherits(CMIInteractions, _CMIArray2);
@@ -6401,12 +6398,12 @@ var CMIInteractions = /*#__PURE__*/function (_CMIArray2) {
return _super6.call(this, {
children: scorm12_constants.interactions_children,
errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError
});
}
return _createClass(CMIInteractions);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray);
/**
* Class representing SCORM 1.2's cmi.interactions.n object
* @extends BaseCMI
@@ -6477,14 +6474,14 @@ var CMIInteractionsObject = /*#__PURE__*/function (_BaseCMI5) {
value: ''
});
- _this5.objectives = new _common.CMIArray({
+ _this5.objectives = new _common__WEBPACK_IMPORTED_MODULE_0__.CMIArray({
errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError,
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError,
children: scorm12_constants.objectives_children
});
- _this5.correct_responses = new _common.CMIArray({
+ _this5.correct_responses = new _common__WEBPACK_IMPORTED_MODULE_0__.CMIArray({
errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError,
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError,
children: scorm12_constants.correct_responses_children
});
return _this5;
@@ -6683,15 +6680,12 @@ var CMIInteractionsObject = /*#__PURE__*/function (_BaseCMI5) {
}]);
return CMIInteractionsObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 1.2's cmi.objectives.n object
* @extends BaseCMI
*/
-
-exports.CMIInteractionsObject = CMIInteractionsObject;
-
var _id2 = /*#__PURE__*/new WeakMap();
var _status = /*#__PURE__*/new WeakMap();
@@ -6721,13 +6715,13 @@ var CMIObjectivesObject = /*#__PURE__*/function (_BaseCMI6) {
value: ''
});
- _this6.score = new _common.CMIScore({
+ _this6.score = new _common__WEBPACK_IMPORTED_MODULE_0__.CMIScore({
score_children: scorm12_constants.score_children,
score_range: scorm12_regex.score_range,
invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,
invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,
invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,
- errorClass: _exceptions.Scorm12ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError
});
return _this6;
}
@@ -6798,15 +6792,12 @@ var CMIObjectivesObject = /*#__PURE__*/function (_BaseCMI6) {
}]);
return CMIObjectivesObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 1.2's cmi.interactions.n.objectives.n object
* @extends BaseCMI
*/
-
-exports.CMIObjectivesObject = CMIObjectivesObject;
-
var _id3 = /*#__PURE__*/new WeakMap();
var CMIInteractionsObjectivesObject = /*#__PURE__*/function (_BaseCMI7) {
@@ -6874,15 +6865,12 @@ var CMIInteractionsObjectivesObject = /*#__PURE__*/function (_BaseCMI7) {
}]);
return CMIInteractionsObjectivesObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 1.2's cmi.interactions.correct_responses.n object
* @extends BaseCMI
*/
-
-exports.CMIInteractionsObjectivesObject = CMIInteractionsObjectivesObject;
-
var _pattern = /*#__PURE__*/new WeakMap();
var CMIInteractionsCorrectResponsesObject = /*#__PURE__*/function (_BaseCMI8) {
@@ -6950,14 +6938,11 @@ var CMIInteractionsCorrectResponsesObject = /*#__PURE__*/function (_BaseCMI8) {
}]);
return CMIInteractionsCorrectResponsesObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class for AICC Navigation object
*/
-
-exports.CMIInteractionsCorrectResponsesObject = CMIInteractionsCorrectResponsesObject;
-
var _event = /*#__PURE__*/new WeakMap();
var NAV = /*#__PURE__*/function (_BaseCMI9) {
@@ -7025,40 +7010,36 @@ var NAV = /*#__PURE__*/function (_BaseCMI9) {
}]);
return NAV;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
-exports.NAV = NAV;
+/***/ }),
+
+/***/ "./src/cmi/scorm2004_cmi.js":
+/*!**********************************!*\
+ !*** ./src/cmi/scorm2004_cmi.js ***!
+ \**********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{"../constants/api_constants":10,"../constants/error_codes":11,"../constants/regex":13,"../exceptions":15,"../utilities":17,"./common":7}],9:[function(require,module,exports){
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "CMI": function() { return /* binding */ CMI; },
+/* harmony export */ "CMIInteractionsObject": function() { return /* binding */ CMIInteractionsObject; },
+/* harmony export */ "CMIObjectivesObject": function() { return /* binding */ CMIObjectivesObject; },
+/* harmony export */ "CMICommentsObject": function() { return /* binding */ CMICommentsObject; },
+/* harmony export */ "CMIInteractionsObjectivesObject": function() { return /* binding */ CMIInteractionsObjectivesObject; },
+/* harmony export */ "CMIInteractionsCorrectResponsesObject": function() { return /* binding */ CMIInteractionsCorrectResponsesObject; },
+/* harmony export */ "ADL": function() { return /* binding */ ADL; }
+/* harmony export */ });
+/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./common */ "./src/cmi/common.js");
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants/api_constants */ "./src/constants/api_constants.js");
+/* harmony import */ var _constants_regex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants/regex */ "./src/constants/regex.js");
+/* harmony import */ var _constants_error_codes__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../constants/error_codes */ "./src/constants/error_codes.js");
+/* harmony import */ var _constants_response_constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants/response_constants */ "./src/constants/response_constants.js");
+/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../exceptions */ "./src/exceptions.js");
+/* harmony import */ var _utilities__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utilities */ "./src/utilities.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.CMIObjectivesObject = exports.CMIInteractionsObjectivesObject = exports.CMIInteractionsObject = exports.CMIInteractionsCorrectResponsesObject = exports.CMICommentsObject = exports.CMI = exports.ADL = void 0;
-
-var _common = require("./common");
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _response_constants = _interopRequireDefault(require("../constants/response_constants"));
-
-var _exceptions = require("../exceptions");
-
-var Util = _interopRequireWildcard(require("../utilities"));
-
-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; }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
@@ -7099,16 +7080,23 @@ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!priva
function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-var scorm2004_constants = _api_constants["default"].scorm2004;
-var scorm2004_error_codes = _error_codes["default"].scorm2004;
-var learner_responses = _response_constants["default"].learner;
-var scorm2004_regex = _regex["default"].scorm2004;
+
+
+
+
+
+
+
+var scorm2004_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_1__["default"].scorm2004;
+var scorm2004_error_codes = _constants_error_codes__WEBPACK_IMPORTED_MODULE_3__["default"].scorm2004;
+var learner_responses = _constants_response_constants__WEBPACK_IMPORTED_MODULE_4__["default"].learner;
+var scorm2004_regex = _constants_regex__WEBPACK_IMPORTED_MODULE_2__["default"].scorm2004;
/**
* Helper method for throwing Read Only error
*/
function throwReadOnlyError() {
- throw new _exceptions.Scorm2004ValidationError(scorm2004_error_codes.READ_ONLY_ELEMENT);
+ throw new _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError(scorm2004_error_codes.READ_ONLY_ELEMENT);
}
/**
* Helper method for throwing Write Only error
@@ -7116,7 +7104,7 @@ function throwReadOnlyError() {
function throwWriteOnlyError() {
- throw new _exceptions.Scorm2004ValidationError(scorm2004_error_codes.WRITE_ONLY_ELEMENT);
+ throw new _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError(scorm2004_error_codes.WRITE_ONLY_ELEMENT);
}
/**
* Helper method for throwing Type Mismatch error
@@ -7124,7 +7112,7 @@ function throwWriteOnlyError() {
function throwTypeMismatchError() {
- throw new _exceptions.Scorm2004ValidationError(scorm2004_error_codes.TYPE_MISMATCH);
+ throw new _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError(scorm2004_error_codes.TYPE_MISMATCH);
}
/**
* Helper method for throwing Dependency Not Established error
@@ -7132,7 +7120,7 @@ function throwTypeMismatchError() {
function throwDependencyNotEstablishedError() {
- throw new _exceptions.Scorm2004ValidationError(scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);
+ throw new _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError(scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);
}
/**
* Helper method for throwing Dependency Not Established error
@@ -7140,7 +7128,7 @@ function throwDependencyNotEstablishedError() {
function throwGeneralSetError() {
- throw new _exceptions.Scorm2004ValidationError(scorm2004_error_codes.GENERAL_SET_FAILURE);
+ throw new _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError(scorm2004_error_codes.GENERAL_SET_FAILURE);
}
/**
* Helper method, no reason to have to pass the same error codes every time
@@ -7152,7 +7140,7 @@ function throwGeneralSetError() {
function check2004ValidFormat(value, regexPattern, allowEmptyString) {
- return (0, _common.checkValidFormat)(value, regexPattern, scorm2004_error_codes.TYPE_MISMATCH, _exceptions.Scorm2004ValidationError, allowEmptyString);
+ return (0,_common__WEBPACK_IMPORTED_MODULE_0__.checkValidFormat)(value, regexPattern, scorm2004_error_codes.TYPE_MISMATCH, _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError, allowEmptyString);
}
/**
* Helper method, no reason to have to pass the same error codes every time
@@ -7163,7 +7151,7 @@ function check2004ValidFormat(value, regexPattern, allowEmptyString) {
function check2004ValidRange(value, rangePattern) {
- return (0, _common.checkValidRange)(value, rangePattern, scorm2004_error_codes.VALUE_OUT_OF_RANGE, _exceptions.Scorm2004ValidationError);
+ return (0,_common__WEBPACK_IMPORTED_MODULE_0__.checkValidRange)(value, rangePattern, scorm2004_error_codes.VALUE_OUT_OF_RANGE, _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError);
}
/**
* Class representing cmi object for SCORM 2004
@@ -7747,10 +7735,10 @@ var CMI = /*#__PURE__*/function (_BaseCMI) {
if (typeof startTime !== 'undefined' && startTime !== null) {
var seconds = new Date().getTime() - startTime;
- sessionTime = Util.getSecondsAsISODuration(seconds / 1000);
+ sessionTime = _utilities__WEBPACK_IMPORTED_MODULE_6__.getSecondsAsISODuration(seconds / 1000);
}
- return Util.addTwoDurations(_classPrivateFieldGet(this, _total_time), sessionTime, scorm2004_regex.CMITimespan);
+ return _utilities__WEBPACK_IMPORTED_MODULE_6__.addTwoDurations(_classPrivateFieldGet(this, _total_time), sessionTime, scorm2004_regex.CMITimespan);
}
/**
* toJSON for cmi
@@ -7819,14 +7807,11 @@ var CMI = /*#__PURE__*/function (_BaseCMI) {
}]);
return CMI;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class for SCORM 2004's cmi.learner_preference object
*/
-
-exports.CMI = CMI;
-
var _children3 = /*#__PURE__*/new WeakMap();
var _audio_level = /*#__PURE__*/new WeakMap();
@@ -8009,7 +7994,7 @@ var CMILearnerPreference = /*#__PURE__*/function (_BaseCMI2) {
}]);
return CMILearnerPreference;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 2004's cmi.interactions object
*/
@@ -8029,12 +8014,12 @@ var CMIInteractions = /*#__PURE__*/function (_CMIArray) {
return _super3.call(this, {
children: scorm2004_constants.interactions_children,
errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError
});
}
return _createClass(CMIInteractions);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray);
/**
* Class representing SCORM 2004's cmi.objectives object
*/
@@ -8054,12 +8039,12 @@ var CMIObjectives = /*#__PURE__*/function (_CMIArray2) {
return _super4.call(this, {
children: scorm2004_constants.objectives_children,
errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError
});
}
return _createClass(CMIObjectives);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray);
/**
* Class representing SCORM 2004's cmi.comments_from_lms object
*/
@@ -8079,12 +8064,12 @@ var CMICommentsFromLMS = /*#__PURE__*/function (_CMIArray3) {
return _super5.call(this, {
children: scorm2004_constants.comments_children,
errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError
});
}
return _createClass(CMICommentsFromLMS);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray);
/**
* Class representing SCORM 2004's cmi.comments_from_learner object
*/
@@ -8104,12 +8089,12 @@ var CMICommentsFromLearner = /*#__PURE__*/function (_CMIArray4) {
return _super6.call(this, {
children: scorm2004_constants.comments_children,
errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError
});
}
return _createClass(CMICommentsFromLearner);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray);
/**
* Class for SCORM 2004's cmi.interaction.n object
*/
@@ -8186,14 +8171,14 @@ var CMIInteractionsObject = /*#__PURE__*/function (_BaseCMI3) {
value: ''
});
- _this3.objectives = new _common.CMIArray({
+ _this3.objectives = new _common__WEBPACK_IMPORTED_MODULE_0__.CMIArray({
errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError,
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError,
children: scorm2004_constants.objectives_children
});
- _this3.correct_responses = new _common.CMIArray({
+ _this3.correct_responses = new _common__WEBPACK_IMPORTED_MODULE_0__.CMIArray({
errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError,
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError,
children: scorm2004_constants.correct_responses_children
});
return _this3;
@@ -8486,14 +8471,11 @@ var CMIInteractionsObject = /*#__PURE__*/function (_BaseCMI3) {
}]);
return CMIInteractionsObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class for SCORM 2004's cmi.objectives.n object
*/
-
-exports.CMIInteractionsObject = CMIInteractionsObject;
-
var _id2 = /*#__PURE__*/new WeakMap();
var _success_status2 = /*#__PURE__*/new WeakMap();
@@ -8710,14 +8692,11 @@ var CMIObjectivesObject = /*#__PURE__*/function (_BaseCMI4) {
}]);
return CMIObjectivesObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class for SCORM 2004's cmi *.score object
*/
-
-exports.CMIObjectivesObject = CMIObjectivesObject;
-
var _scaled = /*#__PURE__*/new WeakMap();
var Scorm2004CMIScore = /*#__PURE__*/function (_CMIScore) {
@@ -8740,7 +8719,7 @@ var Scorm2004CMIScore = /*#__PURE__*/function (_CMIScore) {
invalidTypeCode: scorm2004_error_codes.TYPE_MISMATCH,
invalidRangeCode: scorm2004_error_codes.VALUE_OUT_OF_RANGE,
decimalRegex: scorm2004_regex.CMIDecimal,
- errorClass: _exceptions.Scorm2004ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError
});
_classPrivateFieldInitSpec(_assertThisInitialized(_this5), _scaled, {
@@ -8800,7 +8779,7 @@ var Scorm2004CMIScore = /*#__PURE__*/function (_CMIScore) {
}]);
return Scorm2004CMIScore;
-}(_common.CMIScore);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.CMIScore);
/**
* Class representing SCORM 2004's cmi.comments_from_learner.n and cmi.comments_from_lms.n object
*/
@@ -8961,14 +8940,11 @@ var CMICommentsObject = /*#__PURE__*/function (_BaseCMI5) {
}]);
return CMICommentsObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 2004's cmi.interactions.n.objectives.n object
*/
-
-exports.CMICommentsObject = CMICommentsObject;
-
var _id3 = /*#__PURE__*/new WeakMap();
var CMIInteractionsObjectivesObject = /*#__PURE__*/function (_BaseCMI6) {
@@ -9036,14 +9012,11 @@ var CMIInteractionsObjectivesObject = /*#__PURE__*/function (_BaseCMI6) {
}]);
return CMIInteractionsObjectivesObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 2004's cmi.interactions.n.correct_responses.n object
*/
-
-exports.CMIInteractionsObjectivesObject = CMIInteractionsObjectivesObject;
-
var _pattern = /*#__PURE__*/new WeakMap();
var CMIInteractionsCorrectResponsesObject = /*#__PURE__*/function (_BaseCMI7) {
@@ -9111,14 +9084,11 @@ var CMIInteractionsCorrectResponsesObject = /*#__PURE__*/function (_BaseCMI7) {
}]);
return CMIInteractionsCorrectResponsesObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 2004's adl object
*/
-
-exports.CMIInteractionsCorrectResponsesObject = CMIInteractionsCorrectResponsesObject;
-
var ADL = /*#__PURE__*/function (_BaseCMI8) {
_inherits(ADL, _BaseCMI8);
@@ -9174,14 +9144,11 @@ var ADL = /*#__PURE__*/function (_BaseCMI8) {
}]);
return ADL;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 2004's adl.nav object
*/
-
-exports.ADL = ADL;
-
var _request = /*#__PURE__*/new WeakMap();
var ADLNav = /*#__PURE__*/function (_BaseCMI9) {
@@ -9264,7 +9231,7 @@ var ADLNav = /*#__PURE__*/function (_BaseCMI9) {
}]);
return ADLNav;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 2004's adl.nav.request_valid object
*/
@@ -9379,7 +9346,7 @@ var ADLNavRequestValid = /*#__PURE__*/function (_BaseCMI10) {
this.jsonString = true;
var result = {
'previous': this.previous,
- 'continue': this["continue"]
+ 'continue': this.continue
};
delete this.jsonString;
return result;
@@ -9387,16 +9354,18 @@ var ADLNavRequestValid = /*#__PURE__*/function (_BaseCMI10) {
}]);
return ADLNavRequestValid;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
+
+/***/ }),
+
+/***/ "./src/constants/api_constants.js":
+/*!****************************************!*\
+ !*** ./src/constants/api_constants.js ***!
+ \****************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{"../constants/api_constants":10,"../constants/error_codes":11,"../constants/regex":13,"../constants/response_constants":14,"../exceptions":15,"../utilities":17,"./common":7}],10:[function(require,module,exports){
"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
+__webpack_require__.r(__webpack_exports__);
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -9611,17 +9580,18 @@ var APIConstants = {
aicc: aicc,
scorm2004: scorm2004
};
-var _default = APIConstants;
-exports["default"] = _default;
+/* harmony default export */ __webpack_exports__["default"] = (APIConstants);
+
+/***/ }),
+
+/***/ "./src/constants/error_codes.js":
+/*!**************************************!*\
+ !*** ./src/constants/error_codes.js ***!
+ \**************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{}],11:[function(require,module,exports){
"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
+__webpack_require__.r(__webpack_exports__);
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -9708,16 +9678,18 @@ var ErrorCodes = {
scorm12: scorm12,
scorm2004: scorm2004
};
-var _default = ErrorCodes;
-exports["default"] = _default;
+/* harmony default export */ __webpack_exports__["default"] = (ErrorCodes);
+
+/***/ }),
+
+/***/ "./src/constants/language_constants.js":
+/*!*********************************************!*\
+ !*** ./src/constants/language_constants.js ***!
+ \*********************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{}],12:[function(require,module,exports){
"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
+__webpack_require__.r(__webpack_exports__);
var ValidLanguages = {
'aa': 'aa',
'ab': 'ab',
@@ -10111,17 +10083,18 @@ var ValidLanguages = {
'zho': 'zho',
'zul': 'zul'
};
-var _default = ValidLanguages;
-exports["default"] = _default;
+/* harmony default export */ __webpack_exports__["default"] = (ValidLanguages);
+
+/***/ }),
+
+/***/ "./src/constants/regex.js":
+/*!********************************!*\
+ !*** ./src/constants/regex.js ***!
+ \********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{}],13:[function(require,module,exports){
"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
+__webpack_require__.r(__webpack_exports__);
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -10215,22 +10188,21 @@ var Regex = {
scorm12: scorm12,
scorm2004: scorm2004
};
-var _default = Regex;
-exports["default"] = _default;
+/* harmony default export */ __webpack_exports__["default"] = (Regex);
+
+/***/ }),
+
+/***/ "./src/constants/response_constants.js":
+/*!*********************************************!*\
+ !*** ./src/constants/response_constants.js ***!
+ \*********************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{}],14:[function(require,module,exports){
"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _regex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./regex */ "./src/constants/regex.js");
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _regex = _interopRequireDefault(require("./regex"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-var scorm2004_regex = _regex["default"].scorm2004;
+var scorm2004_regex = _regex__WEBPACK_IMPORTED_MODULE_0__["default"].scorm2004;
var learner = {
'true-false': {
format: '^true$|^false$',
@@ -10381,23 +10353,27 @@ var Responses = {
learner: learner,
correct: correct
};
-var _default = Responses;
-exports["default"] = _default;
+/* harmony default export */ __webpack_exports__["default"] = (Responses);
+
+/***/ }),
+
+/***/ "./src/exceptions.js":
+/*!***************************!*\
+ !*** ./src/exceptions.js ***!
+ \***************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{"./regex":13}],15:[function(require,module,exports){
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "ValidationError": function() { return /* binding */ ValidationError; },
+/* harmony export */ "Scorm12ValidationError": function() { return /* binding */ Scorm12ValidationError; },
+/* harmony export */ "AICCValidationError": function() { return /* binding */ AICCValidationError; },
+/* harmony export */ "Scorm2004ValidationError": function() { return /* binding */ Scorm2004ValidationError; }
+/* harmony export */ });
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants/api_constants */ "./src/constants/api_constants.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.ValidationError = exports.Scorm2004ValidationError = exports.Scorm12ValidationError = exports.AICCValidationError = void 0;
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
@@ -10438,9 +10414,10 @@ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!priva
function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-var scorm12_errors = _api_constants["default"].scorm12.error_descriptions;
-var aicc_errors = _api_constants["default"].aicc.error_descriptions;
-var scorm2004_errors = _api_constants["default"].scorm2004.error_descriptions;
+
+var scorm12_errors = _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__["default"].scorm12.error_descriptions;
+var aicc_errors = _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__["default"].aicc.error_descriptions;
+var scorm2004_errors = _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__["default"].scorm2004.error_descriptions;
/**
* Base Validation Exception
*/
@@ -10531,9 +10508,6 @@ var ValidationError = /*#__PURE__*/function (_Error) {
* SCORM 1.2 Validation Error
*/
-
-exports.ValidationError = ValidationError;
-
var Scorm12ValidationError = /*#__PURE__*/function (_ValidationError) {
_inherits(Scorm12ValidationError, _ValidationError);
@@ -10563,9 +10537,6 @@ var Scorm12ValidationError = /*#__PURE__*/function (_ValidationError) {
* AICC Validation Error
*/
-
-exports.Scorm12ValidationError = Scorm12ValidationError;
-
var AICCValidationError = /*#__PURE__*/function (_ValidationError2) {
_inherits(AICCValidationError, _ValidationError2);
@@ -10595,9 +10566,6 @@ var AICCValidationError = /*#__PURE__*/function (_ValidationError2) {
* SCORM 2004 Validation Error
*/
-
-exports.AICCValidationError = AICCValidationError;
-
var Scorm2004ValidationError = /*#__PURE__*/function (_ValidationError3) {
_inherits(Scorm2004ValidationError, _ValidationError3);
@@ -10624,40 +10592,31 @@ var Scorm2004ValidationError = /*#__PURE__*/function (_ValidationError3) {
return _createClass(Scorm2004ValidationError);
}(ValidationError);
-exports.Scorm2004ValidationError = Scorm2004ValidationError;
+/***/ }),
+
+/***/ "./src/utilities.js":
+/*!**************************!*\
+ !*** ./src/utilities.js ***!
+ \**************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{"./constants/api_constants":10}],16:[function(require,module,exports){
"use strict";
-
-var _Scorm2004API = _interopRequireDefault(require("../Scorm2004API"));
-
-var _Scorm12API = _interopRequireDefault(require("../Scorm12API"));
-
-var _AICC = _interopRequireDefault(require("../AICC"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-window.Scorm12API = _Scorm12API["default"];
-window.Scorm2004API = _Scorm2004API["default"];
-window.AICC = _AICC["default"];
-
-},{"../AICC":2,"../Scorm12API":4,"../Scorm2004API":5}],17:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.SECONDS_PER_SECOND = exports.SECONDS_PER_MINUTE = exports.SECONDS_PER_HOUR = exports.SECONDS_PER_DAY = void 0;
-exports.addHHMMSSTimeStrings = addHHMMSSTimeStrings;
-exports.addTwoDurations = addTwoDurations;
-exports.countDecimals = countDecimals;
-exports.flatten = flatten;
-exports.getDurationAsSeconds = getDurationAsSeconds;
-exports.getSecondsAsHHMMSS = getSecondsAsHHMMSS;
-exports.getSecondsAsISODuration = getSecondsAsISODuration;
-exports.getTimeAsSeconds = getTimeAsSeconds;
-exports.unflatten = unflatten;
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "SECONDS_PER_SECOND": function() { return /* binding */ SECONDS_PER_SECOND; },
+/* harmony export */ "SECONDS_PER_MINUTE": function() { return /* binding */ SECONDS_PER_MINUTE; },
+/* harmony export */ "SECONDS_PER_HOUR": function() { return /* binding */ SECONDS_PER_HOUR; },
+/* harmony export */ "SECONDS_PER_DAY": function() { return /* binding */ SECONDS_PER_DAY; },
+/* harmony export */ "getSecondsAsHHMMSS": function() { return /* binding */ getSecondsAsHHMMSS; },
+/* harmony export */ "getSecondsAsISODuration": function() { return /* binding */ getSecondsAsISODuration; },
+/* harmony export */ "getTimeAsSeconds": function() { return /* binding */ getTimeAsSeconds; },
+/* harmony export */ "getDurationAsSeconds": function() { return /* binding */ getDurationAsSeconds; },
+/* harmony export */ "addTwoDurations": function() { return /* binding */ addTwoDurations; },
+/* harmony export */ "addHHMMSSTimeStrings": function() { return /* binding */ addHHMMSSTimeStrings; },
+/* harmony export */ "flatten": function() { return /* binding */ flatten; },
+/* harmony export */ "unflatten": function() { return /* binding */ unflatten; },
+/* harmony export */ "countDecimals": function() { return /* binding */ countDecimals; }
+/* harmony export */ });
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -10671,13 +10630,9 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
var SECONDS_PER_SECOND = 1.0;
-exports.SECONDS_PER_SECOND = SECONDS_PER_SECOND;
var SECONDS_PER_MINUTE = 60;
-exports.SECONDS_PER_MINUTE = SECONDS_PER_MINUTE;
var SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE;
-exports.SECONDS_PER_HOUR = SECONDS_PER_HOUR;
var SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;
-exports.SECONDS_PER_DAY = SECONDS_PER_DAY;
var designations = [['D', SECONDS_PER_DAY], ['H', SECONDS_PER_HOUR], ['M', SECONDS_PER_MINUTE], ['S', SECONDS_PER_SECOND]];
/**
* Converts a Number to a String of HH:MM:SS
@@ -10719,7 +10674,6 @@ function getSecondsAsHHMMSS(totalSeconds) {
* @return {String}
*/
-
function getSecondsAsISODuration(seconds) {
// SCORM spec does not deal with negative durations, give zero back
if (!seconds || seconds <= 0) {
@@ -10764,7 +10718,6 @@ function getSecondsAsISODuration(seconds) {
* @return {number}
*/
-
function getTimeAsSeconds(timeString, timeRegex) {
if (!timeString || typeof timeString !== 'string' || !timeString.match(timeRegex)) {
return 0;
@@ -10784,7 +10737,6 @@ function getTimeAsSeconds(timeString, timeRegex) {
* @return {number}
*/
-
function getDurationAsSeconds(duration, durationRegex) {
if (!duration || !duration.match(durationRegex)) {
return 0;
@@ -10816,7 +10768,6 @@ function getDurationAsSeconds(duration, durationRegex) {
* @return {string}
*/
-
function addTwoDurations(first, second, durationRegex) {
return getSecondsAsISODuration(getDurationAsSeconds(first, durationRegex) + getDurationAsSeconds(second, durationRegex));
}
@@ -10829,7 +10780,6 @@ function addTwoDurations(first, second, durationRegex) {
* @return {string}
*/
-
function addHHMMSSTimeStrings(first, second, timeRegex) {
return getSecondsAsHHMMSS(getTimeAsSeconds(first, timeRegex) + getTimeAsSeconds(second, timeRegex));
}
@@ -10839,7 +10789,6 @@ function addHHMMSSTimeStrings(first, second, timeRegex) {
* @return {object}
*/
-
function flatten(data) {
var result = {};
/**
@@ -10879,7 +10828,6 @@ function flatten(data) {
* @return {object}
*/
-
function unflatten(data) {
'use strict';
@@ -10911,12 +10859,112 @@ function unflatten(data) {
* @return {number}
*/
-
function countDecimals(num) {
if (Math.floor(num) === num || String(num).indexOf('.') < 0) return 0;
var parts = num.toString().split('.')[1];
return parts.length || 0;
}
-},{}]},{},[16])
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLmRlYm91bmNlL2luZGV4LmpzIiwic3JjL0FJQ0MuanMiLCJzcmMvQmFzZUFQSS5qcyIsInNyYy9TY29ybTEyQVBJLmpzIiwic3JjL1Njb3JtMjAwNEFQSS5qcyIsInNyYy9jbWkvYWljY19jbWkuanMiLCJzcmMvY21pL2NvbW1vbi5qcyIsInNyYy9jbWkvc2Nvcm0xMl9jbWkuanMiLCJzcmMvY21pL3Njb3JtMjAwNF9jbWkuanMiLCJzcmMvY29uc3RhbnRzL2FwaV9jb25zdGFudHMuanMiLCJzcmMvY29uc3RhbnRzL2Vycm9yX2NvZGVzLmpzIiwic3JjL2NvbnN0YW50cy9sYW5ndWFnZV9jb25zdGFudHMuanMiLCJzcmMvY29uc3RhbnRzL3JlZ2V4LmpzIiwic3JjL2NvbnN0YW50cy9yZXNwb25zZV9jb25zdGFudHMuanMiLCJzcmMvZXhjZXB0aW9ucy5qcyIsInNyYy9leHBvcnRzL3Njb3JtLWFnYWluLmpzIiwic3JjL3V0aWxpdGllcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QSxZQUFZLEVBQUUsNkJBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBckJXO0FBeUJsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsbUNBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBekJXO0FBNkJsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsK0JBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBN0JXO0FBaUNsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUscUNBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBakNXO0FBcUNsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsaUNBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBckNXO0FBeUNsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsa0NBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBekNXO0FBNkNsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsOEJBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBN0NXO0FBaURsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsOEJBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBakRXO0FBcURsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsMEJBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBckRXO0FBeURsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsd0JBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBekRXO0FBNkRsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUscUJBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBN0RXO0FBaUVsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUscUJBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBakVXO0FBcUVsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsd0JBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBckVXO0FBeUVsQixXQUFPO0FBQ0wsTUFBQSxZ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QTJCLE1BQU0sQ0FBQyxHQUFELENBQU4sQ0FBWSxPQUFaLENBQW9CLEdBQXBCLElBQTJCLENBQTFELEVBQTZELE9BQU8sQ0FBUDtBQUM3RCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBSixHQUFlLEtBQWYsQ0FBcUIsR0FBckIsRUFBMEIsQ0FBMUIsQ0FBZDtBQUNBLFNBQU8sS0FBSyxDQUFDLE1BQU4sSUFBZ0IsQ0FBdkI7QUFDRCIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIi8qKlxuICogbG9kYXNoIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuXG4vKiogVXNlZCBhcyB0aGUgYFR5cGVFcnJvcmAgbWVzc2FnZSBmb3IgXCJGdW5jdGlvbnNcIiBtZXRob2RzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTkFOID0gMCAvIDA7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW0gPSAvXlxccyt8XFxzKyQvZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qKlxuICogR2V0cyB0aGUgdGltZXN0YW1wIG9mIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2ZSBlbGFwc2VkIHNpbmNlXG4gKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgRGF0ZVxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG4gKiB9LCBfLm5vdygpKTtcbiAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gKi9cbnZhciBub3cgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHJvb3QuRGF0ZS5ub3coKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAqIGludm9rZWQuIFRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgIG1ldGhvZCB0byBjYW5jZWxcbiAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gKiBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkXG4gKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICogaW52b2NhdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICpcbiAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICpcbiAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdXG4gKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gKlxuICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gKiAgICdsZWFkaW5nJzogdHJ1ZSxcbiAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAqIH0pKTtcbiAqXG4gKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7XG4gKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gKlxuICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyBkZWJvdW5jZWQgaW52b2NhdGlvbi5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICovXG5mdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBsYXN0QXJncyxcbiAgICAgIGxhc3RUaGlzLFxuICAgICAgbWF4V2FpdCxcbiAgICAgIHJlc3VsdCxcbiAgICAgIHRpbWVySWQsXG4gICAgICBsYXN0Q2FsbFRpbWUsXG4gICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICBtYXhpbmcgPSBmYWxzZSxcbiAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDtcbiAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgIG1heFdhaXQgPSBtYXhpbmcgPyBuYXRpdmVNYXgodG9OdW1iZXIob3B0aW9ucy5tYXhXYWl0KSB8fCAwLCB3YWl0KSA6IG1heFdhaXQ7XG4gICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZUZ1bmModGltZSkge1xuICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgIHRoaXNBcmcgPSBsYXN0VGhpcztcblxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpIHtcbiAgICAvLyBSZXNldCBhbnkgYG1heFdhaXRgIHRpbWVyLlxuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAvLyBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSB0cmFpbGluZyBlZGdlLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgcmV0dXJuIGxlYWRpbmcgPyBpbnZva2VGdW5jKHRpbWUpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZSxcbiAgICAgICAgcmVzdWx0ID0gd2FpdCAtIHRpbWVTaW5jZUxhc3RDYWxsO1xuXG4gICAgcmV0dXJuIG1heGluZyA/IG5hdGl2ZU1pbihyZXN1bHQsIG1heFdhaXQgLSB0aW1lU2luY2VMYXN0SW52b2tlKSA6IHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3VsZEludm9rZSh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuICAgIC8vIEVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCBhY3Rpdml0eSBoYXMgc3RvcHBlZCBhbmQgd2UncmUgYXQgdGhlXG4gICAgLy8gdHJhaWxpbmcgZWRnZSwgdGhlIHN5c3RlbSB0aW1lIGhhcyBnb25lIGJhY2t3YXJkcyBhbmQgd2UncmUgdHJlYXRpbmdcbiAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG4gICAgcmV0dXJuIChsYXN0Q2FsbFRpbWUgPT09IHVuZGVmaW5lZCB8fCAodGltZVNpbmNlTGFzdENhbGwgPj0gd2FpdCkgfHxcbiAgICAgICh0aW1lU2luY2VMYXN0Q2FsbCA8IDApIHx8IChtYXhpbmcgJiYgdGltZVNpbmNlTGFzdEludm9rZSA+PSBtYXhXYWl0KSk7XG4gIH1cblxuICBmdW5jdGlvbiB0aW1lckV4cGlyZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKTtcbiAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG4gICAgICByZXR1cm4gdHJhaWxpbmdFZGdlKHRpbWUpO1xuICAgIH1cbiAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHJlbWFpbmluZ1dhaXQodGltZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcbiAgICB0aW1lcklkID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gT25seSBpbnZva2UgaWYgd2UgaGF2ZSBgbGFzdEFyZ3NgIHdoaWNoIG1lYW5zIGBmdW5jYCBoYXMgYmVlblxuICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuICAgIGlmICh0cmFpbGluZyAmJiBsYXN0QXJncykge1xuICAgICAgcmV0dXJuIGludm9rZUZ1bmModGltZSk7XG4gICAgfVxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICBpZiAodGltZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgfVxuICAgIGxhc3RJbnZva2VUaW1lID0gMDtcbiAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93KCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVib3VuY2VkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCksXG4gICAgICAgIGlzSW52b2tpbmcgPSBzaG91bGRJbnZva2UodGltZSk7XG5cbiAgICBsYXN0QXJncyA9IGFyZ3VtZW50cztcbiAgICBsYXN0VGhpcyA9IHRoaXM7XG4gICAgbGFzdENhbGxUaW1lID0gdGltZTtcblxuICAgIGlmIChpc0ludm9raW5nKSB7XG4gICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBsZWFkaW5nRWRnZShsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgICAgaWYgKG1heGluZykge1xuICAgICAgICAvLyBIYW5kbGUgaW52b2NhdGlvbnMgaW4gYSB0aWdodCBsb29wLlxuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGRlYm91bmNlZC5jYW5jZWwgPSBjYW5jZWw7XG4gIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICByZXR1cm4gZGVib3VuY2VkO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICEhdmFsdWUgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJvdW5jZTtcbiIsIi8vIEBmbG93XG5pbXBvcnQgU2Nvcm0xMkFQSSBmcm9tICcuL1Njb3JtMTJBUEknO1xuaW1wb3J0IHtcbiAgQ01JLFxuICBDTUlBdHRlbXB0UmVjb3Jkc09iamVjdCxcbiAgQ01JRXZhbHVhdGlvbkNvbW1lbnRzT2JqZWN0LFxuICBDTUlUcmllc09iamVjdCxcbn0gZnJvbSAnLi9jbWkvYWljY19jbWknO1xuaW1wb3J0IHtOQVZ9IGZyb20gJy4vY21pL3Njb3JtMTJfY21pJztcblxuLyoqXG4gKiBUaGUgQUlDQyBBUEkgY2xhc3NcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQUlDQyBleHRlbmRzIFNjb3JtMTJBUEkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgdG8gY3JlYXRlIEFJQ0MgQVBJIG9iamVjdFxuICAgKiBAcGFyYW0ge29iamVjdH0gc2V0dGluZ3NcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNldHRpbmdzOiB7fSkge1xuICAgIGNvbnN0IGZpbmFsU2V0dGluZ3MgPSB7XG4gICAgICAuLi57XG4gICAgICAgIG1hc3Rlcnlfb3ZlcnJpZGU6IGZhbHNlLFxuICAgICAgfSwgLi4uc2V0dGluZ3MsXG4gICAgfTtcblxuICAgIHN1cGVyKGZpbmFsU2V0dGluZ3MpO1xuXG4gICAgdGhpcy5jbWkgPSBuZXcgQ01JKCk7XG4gICAgdGhpcy5uYXYgPSBuZXcgTkFWKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBvciBidWlsZHMgYSBuZXcgY2hpbGQgZWxlbWVudCB0byBhZGQgdG8gdGhlIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICogQHBhcmFtIHtib29sZWFufSBmb3VuZEZpcnN0SW5kZXhcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgZ2V0Q2hpbGRFbGVtZW50KENNSUVsZW1lbnQsIHZhbHVlLCBmb3VuZEZpcnN0SW5kZXgpIHtcbiAgICBsZXQgbmV3Q2hpbGQgPSBzdXBlci5nZXRDaGlsZEVsZW1lbnQoQ01JRWxlbWVudCwgdmFsdWUsIGZvdW5kRmlyc3RJbmRleCk7XG5cbiAgICBpZiAoIW5ld0NoaWxkKSB7XG4gICAgICBpZiAodGhpcy5zdHJpbmdNYXRjaGVzKENNSUVsZW1lbnQsICdjbWlcXFxcLmV2YWx1YXRpb25cXFxcLmNvbW1lbnRzXFxcXC5cXFxcZCsnKSkge1xuICAgICAgICBuZXdDaGlsZCA9IG5ldyBDTUlFdmFsdWF0aW9uQ29tbWVudHNPYmplY3QoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zdHJpbmdNYXRjaGVzKENNSUVsZW1lbnQsXG4gICAgICAgICAgJ2NtaVxcXFwuc3R1ZGVudF9kYXRhXFxcXC50cmllc1xcXFwuXFxcXGQrJykpIHtcbiAgICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JVHJpZXNPYmplY3QoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zdHJpbmdNYXRjaGVzKENNSUVsZW1lbnQsXG4gICAgICAgICAgJ2NtaVxcXFwuc3R1ZGVudF9kYXRhXFxcXC5hdHRlbXB0X3JlY29yZHNcXFxcLlxcXFxkKycpKSB7XG4gICAgICAgIG5ld0NoaWxkID0gbmV3IENNSUF0dGVtcHRSZWNvcmRzT2JqZWN0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0NoaWxkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgdGhlIHdob2xlIEFQSSB3aXRoIGFub3RoZXJcbiAgICpcbiAgICogQHBhcmFtIHtBSUNDfSBuZXdBUElcbiAgICovXG4gIHJlcGxhY2VXaXRoQW5vdGhlclNjb3JtQVBJKG5ld0FQSSkge1xuICAgIC8vIERhdGEgTW9kZWxcbiAgICB0aGlzLmNtaSA9IG5ld0FQSS5jbWk7XG4gICAgdGhpcy5uYXYgPSBuZXdBUEkubmF2O1xuICB9XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtDTUlBcnJheX0gZnJvbSAnLi9jbWkvY29tbW9uJztcbmltcG9ydCB7VmFsaWRhdGlvbkVycm9yfSBmcm9tICcuL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IEVycm9yQ29kZXMgZnJvbSAnLi9jb25zdGFudHMvZXJyb3JfY29kZXMnO1xuaW1wb3J0IEFQSUNvbnN0YW50cyBmcm9tICcuL2NvbnN0YW50cy9hcGlfY29uc3RhbnRzJztcbmltcG9ydCB7dW5mbGF0dGVufSBmcm9tICcuL3V0aWxpdGllcyc7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSAnbG9kYXNoLmRlYm91bmNlJztcblxuY29uc3QgZ2xvYmFsX2NvbnN0YW50cyA9IEFQSUNvbnN0YW50cy5nbG9iYWw7XG5jb25zdCBzY29ybTEyX2Vycm9yX2NvZGVzID0gRXJyb3JDb2Rlcy5zY29ybTEyO1xuXG4vKipcbiAqIEJhc2UgQVBJIGNsYXNzIGZvciBBSUNDLCBTQ09STSAxLjIsIGFuZCBTQ09STSAyMDA0LiBTaG91bGQgYmUgY29uc2lkZXJlZFxuICogYWJzdHJhY3QsIGFuZCBuZXZlciBpbml0aWFsaXplZCBvbiBpdCdzIG93bi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmFzZUFQSSB7XG4gICN0aW1lb3V0O1xuICAjZXJyb3JfY29kZXM7XG4gICNzZXR0aW5ncyA9IHtcbiAgICBhdXRvY29tbWl0OiBmYWxzZSxcbiAgICBhdXRvY29tbWl0U2Vjb25kczogMTAsXG4gICAgYXN5bmNDb21taXQ6IGZhbHNlLFxuICAgIHNlbmRCZWFjb25Db21taXQ6IGZhbHNlLFxuICAgIGxtc0NvbW1pdFVybDogZmFsc2UsXG4gICAgZGF0YUNvbW1pdEZvcm1hdDogJ2pzb24nLCAvLyB2YWxpZCBmb3JtYXRzIGFyZSAnanNvbicgb3IgJ2ZsYXR0ZW5lZCcsICdwYXJhbXMnXG4gICAgY29tbWl0UmVxdWVzdERhdGFUeXBlOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JyxcbiAgICBhdXRvUHJvZ3Jlc3M6IGZhbHNlLFxuICAgIGxvZ0xldmVsOiBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9FUlJPUixcbiAgICBzZWxmUmVwb3J0U2Vzc2lvblRpbWU6IGZhbHNlLFxuICAgIGFsd2F5c1NlbmRUb3RhbFRpbWU6IGZhbHNlLFxuICAgIHN0cmljdF9lcnJvcnM6IHRydWUsXG4gICAgeGhySGVhZGVyczoge30sXG4gICAgeGhyV2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICByZXNwb25zZUhhbmRsZXI6IGZ1bmN0aW9uKHhocikge1xuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIGlmICh0eXBlb2YgeGhyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8ICF7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3VsdCwgJ3Jlc3VsdCcpKSB7XG4gICAgICAgICAgcmVzdWx0ID0ge307XG4gICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmVzdWx0LnJlc3VsdCA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fVFJVRTtcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvckNvZGUgPSAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQucmVzdWx0ID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvckNvZGUgPSAxMDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gICAgb25Mb2dNZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlTGV2ZWwsIGxvZ01lc3NhZ2UpIHtcbiAgICAgIHN3aXRjaCAobWVzc2FnZUxldmVsKSB7XG4gICAgICAgIGNhc2UgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfRVJST1I6XG4gICAgICAgICAgY29uc29sZS5lcnJvcihsb2dNZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9XQVJOSU5HOlxuICAgICAgICAgIGNvbnNvbGUud2Fybihsb2dNZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9JTkZPOlxuICAgICAgICAgIGNvbnNvbGUuaW5mbyhsb2dNZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9ERUJVRzpcbiAgICAgICAgICBpZiAoY29uc29sZS5kZWJ1Zykge1xuICAgICAgICAgICAgY29uc29sZS5kZWJ1Zyhsb2dNZXNzYWdlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2cobG9nTWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG4gIGNtaTtcbiAgc3RhcnRpbmdEYXRhOiB7fTtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIEJhc2UgQVBJIGNsYXNzLiBTZXRzIHNvbWUgc2hhcmVkIEFQSSBmaWVsZHMsIGFzIHdlbGwgYXNcbiAgICogc2V0cyB1cCBvcHRpb25zIGZvciB0aGUgQVBJLlxuICAgKiBAcGFyYW0ge29iamVjdH0gZXJyb3JfY29kZXNcbiAgICogQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlcnJvcl9jb2Rlcywgc2V0dGluZ3MpIHtcbiAgICBpZiAobmV3LnRhcmdldCA9PT0gQmFzZUFQSSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnN0cnVjdCBCYXNlQVBJIGluc3RhbmNlcyBkaXJlY3RseScpO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IGdsb2JhbF9jb25zdGFudHMuU1RBVEVfTk9UX0lOSVRJQUxJWkVEO1xuICAgIHRoaXMubGFzdEVycm9yQ29kZSA9IDA7XG4gICAgdGhpcy5saXN0ZW5lckFycmF5ID0gW107XG5cbiAgICB0aGlzLiN0aW1lb3V0ID0gbnVsbDtcbiAgICB0aGlzLiNlcnJvcl9jb2RlcyA9IGVycm9yX2NvZGVzO1xuXG4gICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIHRoaXMuYXBpTG9nTGV2ZWwgPSB0aGlzLnNldHRpbmdzLmxvZ0xldmVsO1xuICAgIHRoaXMuc2VsZlJlcG9ydFNlc3Npb25UaW1lID0gdGhpcy5zZXR0aW5ncy5zZWxmUmVwb3J0U2Vzc2lvblRpbWU7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgQVBJXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsYmFja05hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGluaXRpYWxpemVNZXNzYWdlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXJtaW5hdGlvbk1lc3NhZ2VcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgaW5pdGlhbGl6ZShcbiAgICAgIGNhbGxiYWNrTmFtZTogU3RyaW5nLFxuICAgICAgaW5pdGlhbGl6ZU1lc3NhZ2U/OiBTdHJpbmcsXG4gICAgICB0ZXJtaW5hdGlvbk1lc3NhZ2U/OiBTdHJpbmcpIHtcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuXG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCgpKSB7XG4gICAgICB0aGlzLnRocm93U0NPUk1FcnJvcih0aGlzLiNlcnJvcl9jb2Rlcy5JTklUSUFMSVpFRCwgaW5pdGlhbGl6ZU1lc3NhZ2UpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc1Rlcm1pbmF0ZWQoKSkge1xuICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IodGhpcy4jZXJyb3JfY29kZXMuVEVSTUlOQVRFRCwgdGVybWluYXRpb25NZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuc2VsZlJlcG9ydFNlc3Npb25UaW1lKSB7XG4gICAgICAgIHRoaXMuY21pLnNldFN0YXJ0VGltZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IGdsb2JhbF9jb25zdGFudHMuU1RBVEVfSU5JVElBTElaRUQ7XG4gICAgICB0aGlzLmxhc3RFcnJvckNvZGUgPSAwO1xuICAgICAgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX1RSVUU7XG4gICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoY2FsbGJhY2tOYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLmFwaUxvZyhjYWxsYmFja05hbWUsIG51bGwsICdyZXR1cm5lZDogJyArIHJldHVyblZhbHVlLFxuICAgICAgICBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9JTkZPKTtcbiAgICB0aGlzLmNsZWFyU0NPUk1FcnJvcihyZXR1cm5WYWx1ZSk7XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjZXJyb3JfY29kZXNcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgZ2V0IGVycm9yX2NvZGVzKCkge1xuICAgIHJldHVybiB0aGlzLiNlcnJvcl9jb2RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzZXR0aW5nc1xuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICBnZXQgc2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NldHRpbmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3NldHRpbmdzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5nc1xuICAgKi9cbiAgc2V0IHNldHRpbmdzKHNldHRpbmdzOiBPYmplY3QpIHtcbiAgICB0aGlzLiNzZXR0aW5ncyA9IHsuLi50aGlzLiNzZXR0aW5ncywgLi4uc2V0dGluZ3N9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRlcm1pbmF0ZXMgdGhlIGN1cnJlbnQgcnVuIG9mIHRoZSBBUElcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrTmFtZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNoZWNrVGVybWluYXRlZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICB0ZXJtaW5hdGUoXG4gICAgICBjYWxsYmFja05hbWU6IFN0cmluZyxcbiAgICAgIGNoZWNrVGVybWluYXRlZDogYm9vbGVhbikge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0U7XG5cbiAgICBpZiAodGhpcy5jaGVja1N0YXRlKGNoZWNrVGVybWluYXRlZCxcbiAgICAgICAgdGhpcy4jZXJyb3JfY29kZXMuVEVSTUlOQVRJT05fQkVGT1JFX0lOSVQsXG4gICAgICAgIHRoaXMuI2Vycm9yX2NvZGVzLk1VTFRJUExFX1RFUk1JTkFUSU9OKSkge1xuICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSBnbG9iYWxfY29uc3RhbnRzLlNUQVRFX1RFUk1JTkFURUQ7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc3RvcmVEYXRhKHRydWUpO1xuICAgICAgaWYgKCF0aGlzLnNldHRpbmdzLnNlbmRCZWFjb25Db21taXQgJiYgIXRoaXMuc2V0dGluZ3MuYXN5bmNDb21taXQgJiZcbiAgICAgICAgICB0eXBlb2YgcmVzdWx0LmVycm9yQ29kZSAhPT0gJ3VuZGVmaW5lZCcgJiYgcmVzdWx0LmVycm9yQ29kZSA+IDApIHtcbiAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IocmVzdWx0LmVycm9yQ29kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm5WYWx1ZSA9ICh0eXBlb2YgcmVzdWx0ICE9PSAndW5kZWZpbmVkJyAmJiByZXN1bHQucmVzdWx0KSA/XG4gICAgICAgICAgcmVzdWx0LnJlc3VsdCA6IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0U7XG5cbiAgICAgIGlmIChjaGVja1Rlcm1pbmF0ZWQpIHRoaXMubGFzdEVycm9yQ29kZSA9IDA7XG5cbiAgICAgIHJldHVyblZhbHVlID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFO1xuICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKGNhbGxiYWNrTmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCBudWxsLCAncmV0dXJuZWQ6ICcgKyByZXR1cm5WYWx1ZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG4gICAgdGhpcy5jbGVhclNDT1JNRXJyb3IocmV0dXJuVmFsdWUpO1xuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIENNSUVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsYmFja05hbWVcbiAgICogQHBhcmFtIHtib29sZWFufSBjaGVja1Rlcm1pbmF0ZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0VmFsdWUoXG4gICAgICBjYWxsYmFja05hbWU6IFN0cmluZyxcbiAgICAgIGNoZWNrVGVybWluYXRlZDogYm9vbGVhbixcbiAgICAgIENNSUVsZW1lbnQ6IFN0cmluZykge1xuICAgIGxldCByZXR1cm5WYWx1ZTtcblxuICAgIGlmICh0aGlzLmNoZWNrU3RhdGUoY2hlY2tUZXJtaW5hdGVkLFxuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5SRVRSSUVWRV9CRUZPUkVfSU5JVCxcbiAgICAgICAgdGhpcy4jZXJyb3JfY29kZXMuUkVUUklFVkVfQUZURVJfVEVSTSkpIHtcbiAgICAgIGlmIChjaGVja1Rlcm1pbmF0ZWQpIHRoaXMubGFzdEVycm9yQ29kZSA9IDA7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm5WYWx1ZSA9IHRoaXMuZ2V0Q01JVmFsdWUoQ01JRWxlbWVudCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICAgICAgdGhpcy5sYXN0RXJyb3JDb2RlID0gZS5lcnJvckNvZGU7XG4gICAgICAgICAgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChlLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IodGhpcy4jZXJyb3JfY29kZXMuR0VORVJBTCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycyhjYWxsYmFja05hbWUsIENNSUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHRoaXMuYXBpTG9nKGNhbGxiYWNrTmFtZSwgQ01JRWxlbWVudCwgJzogcmV0dXJuZWQ6ICcgKyByZXR1cm5WYWx1ZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG4gICAgdGhpcy5jbGVhclNDT1JNRXJyb3IocmV0dXJuVmFsdWUpO1xuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBDTUlFbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2tOYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb21taXRDYWxsYmFja1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNoZWNrVGVybWluYXRlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHNldFZhbHVlKFxuICAgICAgY2FsbGJhY2tOYW1lOiBTdHJpbmcsXG4gICAgICBjb21taXRDYWxsYmFjazogU3RyaW5nLFxuICAgICAgY2hlY2tUZXJtaW5hdGVkOiBib29sZWFuLFxuICAgICAgQ01JRWxlbWVudCxcbiAgICAgIHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbHVlID0gU3RyaW5nKHZhbHVlKTtcbiAgICB9XG4gICAgbGV0IHJldHVyblZhbHVlID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcblxuICAgIGlmICh0aGlzLmNoZWNrU3RhdGUoY2hlY2tUZXJtaW5hdGVkLCB0aGlzLiNlcnJvcl9jb2Rlcy5TVE9SRV9CRUZPUkVfSU5JVCxcbiAgICAgICAgdGhpcy4jZXJyb3JfY29kZXMuU1RPUkVfQUZURVJfVEVSTSkpIHtcbiAgICAgIGlmIChjaGVja1Rlcm1pbmF0ZWQpIHRoaXMubGFzdEVycm9yQ29kZSA9IDA7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm5WYWx1ZSA9IHRoaXMuc2V0Q01JVmFsdWUoQ01JRWxlbWVudCwgdmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFZhbGlkYXRpb25FcnJvcikge1xuICAgICAgICAgIHRoaXMubGFzdEVycm9yQ29kZSA9IGUuZXJyb3JDb2RlO1xuICAgICAgICAgIHJldHVyblZhbHVlID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZS5tZXNzYWdlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUubWVzc2FnZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHRoaXMuI2Vycm9yX2NvZGVzLkdFTkVSQUwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoY2FsbGJhY2tOYW1lLCBDTUlFbGVtZW50LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHJldHVyblZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVyblZhbHVlID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBkaWRuJ3QgaGF2ZSBhbnkgZXJyb3JzIHdoaWxlIHNldHRpbmcgdGhlIGRhdGEsIGdvIGFoZWFkIGFuZFxuICAgIC8vIHNjaGVkdWxlIGEgY29tbWl0LCBpZiBhdXRvY29tbWl0IGlzIHR1cm5lZCBvblxuICAgIGlmIChTdHJpbmcodGhpcy5sYXN0RXJyb3JDb2RlKSA9PT0gJzAnKSB7XG4gICAgICBpZiAodGhpcy5zZXR0aW5ncy5hdXRvY29tbWl0ICYmICF0aGlzLiN0aW1lb3V0KSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVDb21taXQodGhpcy5zZXR0aW5ncy5hdXRvY29tbWl0U2Vjb25kcyAqIDEwMDAsIGNvbW1pdENhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmFwaUxvZyhjYWxsYmFja05hbWUsIENNSUVsZW1lbnQsXG4gICAgICAgICc6ICcgKyB2YWx1ZSArICc6IHJlc3VsdDogJyArIHJldHVyblZhbHVlLFxuICAgICAgICBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9JTkZPKTtcbiAgICB0aGlzLmNsZWFyU0NPUk1FcnJvcihyZXR1cm5WYWx1ZSk7XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogT3JkZXJzIExNUyB0byBzdG9yZSBhbGwgY29udGVudCBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsYmFja05hbWVcbiAgICogQHBhcmFtIHtib29sZWFufSBjaGVja1Rlcm1pbmF0ZWRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgY29tbWl0KFxuICAgICAgY2FsbGJhY2tOYW1lOiBTdHJpbmcsXG4gICAgICBjaGVja1Rlcm1pbmF0ZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNsZWFyU2NoZWR1bGVkQ29tbWl0KCk7XG5cbiAgICBsZXQgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuXG4gICAgaWYgKHRoaXMuY2hlY2tTdGF0ZShjaGVja1Rlcm1pbmF0ZWQsIHRoaXMuI2Vycm9yX2NvZGVzLkNPTU1JVF9CRUZPUkVfSU5JVCxcbiAgICAgICAgdGhpcy4jZXJyb3JfY29kZXMuQ09NTUlUX0FGVEVSX1RFUk0pKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnN0b3JlRGF0YShmYWxzZSk7XG4gICAgICBpZiAoIXRoaXMuc2V0dGluZ3Muc2VuZEJlYWNvbkNvbW1pdCAmJiAhdGhpcy5zZXR0aW5ncy5hc3luY0NvbW1pdCAmJlxuICAgICAgICAgIHJlc3VsdC5lcnJvckNvZGUgJiYgcmVzdWx0LmVycm9yQ29kZSA+IDApIHtcbiAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IocmVzdWx0LmVycm9yQ29kZSk7XG4gICAgICB9XG4gICAgICByZXR1cm5WYWx1ZSA9ICh0eXBlb2YgcmVzdWx0ICE9PSAndW5kZWZpbmVkJyAmJiByZXN1bHQucmVzdWx0KSA/XG4gICAgICAgICAgcmVzdWx0LnJlc3VsdCA6IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0U7XG5cbiAgICAgIHRoaXMuYXBpTG9nKGNhbGxiYWNrTmFtZSwgJ0h0dHBSZXF1ZXN0JywgJyBSZXN1bHQ6ICcgKyByZXR1cm5WYWx1ZSxcbiAgICAgICAgICBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9ERUJVRyk7XG5cbiAgICAgIGlmIChjaGVja1Rlcm1pbmF0ZWQpIHRoaXMubGFzdEVycm9yQ29kZSA9IDA7XG5cbiAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycyhjYWxsYmFja05hbWUpO1xuICAgIH1cblxuICAgIHRoaXMuYXBpTG9nKGNhbGxiYWNrTmFtZSwgbnVsbCwgJ3JldHVybmVkOiAnICsgcmV0dXJuVmFsdWUsXG4gICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0lORk8pO1xuICAgIHRoaXMuY2xlYXJTQ09STUVycm9yKHJldHVyblZhbHVlKTtcblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGxhc3QgZXJyb3IgY29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2tOYW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldExhc3RFcnJvcihjYWxsYmFja05hbWU6IFN0cmluZykge1xuICAgIGNvbnN0IHJldHVyblZhbHVlID0gU3RyaW5nKHRoaXMubGFzdEVycm9yQ29kZSk7XG5cbiAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoY2FsbGJhY2tOYW1lKTtcblxuICAgIHRoaXMuYXBpTG9nKGNhbGxiYWNrTmFtZSwgbnVsbCwgJ3JldHVybmVkOiAnICsgcmV0dXJuVmFsdWUsXG4gICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0lORk8pO1xuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVycm9yTnVtYmVyIGVycm9yIGRlc2NyaXB0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsYmFja05hbWVcbiAgICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcil9IENNSUVycm9yQ29kZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXRFcnJvclN0cmluZyhjYWxsYmFja05hbWU6IFN0cmluZywgQ01JRXJyb3JDb2RlKSB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gJyc7XG5cbiAgICBpZiAoQ01JRXJyb3JDb2RlICE9PSBudWxsICYmIENNSUVycm9yQ29kZSAhPT0gJycpIHtcbiAgICAgIHJldHVyblZhbHVlID0gdGhpcy5nZXRMbXNFcnJvck1lc3NhZ2VEZXRhaWxzKENNSUVycm9yQ29kZSk7XG4gICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoY2FsbGJhY2tOYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLmFwaUxvZyhjYWxsYmFja05hbWUsIG51bGwsICdyZXR1cm5lZDogJyArIHJldHVyblZhbHVlLFxuICAgICAgICBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9JTkZPKTtcblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29tcHJlaGVuc2l2ZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3JOdW1iZXIgZXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsYmFja05hbWVcbiAgICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcil9IENNSUVycm9yQ29kZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXREaWFnbm9zdGljKGNhbGxiYWNrTmFtZTogU3RyaW5nLCBDTUlFcnJvckNvZGUpIHtcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSAnJztcblxuICAgIGlmIChDTUlFcnJvckNvZGUgIT09IG51bGwgJiYgQ01JRXJyb3JDb2RlICE9PSAnJykge1xuICAgICAgcmV0dXJuVmFsdWUgPSB0aGlzLmdldExtc0Vycm9yTWVzc2FnZURldGFpbHMoQ01JRXJyb3JDb2RlLCB0cnVlKTtcbiAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycyhjYWxsYmFja05hbWUpO1xuICAgIH1cblxuICAgIHRoaXMuYXBpTG9nKGNhbGxiYWNrTmFtZSwgbnVsbCwgJ3JldHVybmVkOiAnICsgcmV0dXJuVmFsdWUsXG4gICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0lORk8pO1xuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB0aGUgTE1TIHN0YXRlIGFuZCBlbnN1cmVzIGl0IGhhcyBiZWVuIGluaXRpYWxpemVkLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNoZWNrVGVybWluYXRlZFxuICAgKiBAcGFyYW0ge251bWJlcn0gYmVmb3JlSW5pdEVycm9yXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBhZnRlclRlcm1FcnJvclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgY2hlY2tTdGF0ZShcbiAgICAgIGNoZWNrVGVybWluYXRlZDogYm9vbGVhbixcbiAgICAgIGJlZm9yZUluaXRFcnJvcjogbnVtYmVyLFxuICAgICAgYWZ0ZXJUZXJtRXJyb3I/OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5pc05vdEluaXRpYWxpemVkKCkpIHtcbiAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKGJlZm9yZUluaXRFcnJvcik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChjaGVja1Rlcm1pbmF0ZWQgJiYgdGhpcy5pc1Rlcm1pbmF0ZWQoKSkge1xuICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IoYWZ0ZXJUZXJtRXJyb3IpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ2dpbmcgZm9yIGFsbCBTQ09STSBhY3Rpb25zXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jdGlvbk5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ01lc3NhZ2VcbiAgICogQHBhcmFtIHtudW1iZXJ9bWVzc2FnZUxldmVsXG4gICAqL1xuICBhcGlMb2coXG4gICAgICBmdW5jdGlvbk5hbWU6IFN0cmluZyxcbiAgICAgIENNSUVsZW1lbnQ6IFN0cmluZyxcbiAgICAgIGxvZ01lc3NhZ2U6IFN0cmluZyxcbiAgICAgIG1lc3NhZ2VMZXZlbDogbnVtYmVyKSB7XG4gICAgbG9nTWVzc2FnZSA9IHRoaXMuZm9ybWF0TWVzc2FnZShmdW5jdGlvbk5hbWUsIENNSUVsZW1lbnQsIGxvZ01lc3NhZ2UpO1xuXG4gICAgaWYgKG1lc3NhZ2VMZXZlbCA+PSB0aGlzLmFwaUxvZ0xldmVsKSB7XG4gICAgICB0aGlzLnNldHRpbmdzLm9uTG9nTWVzc2FnZShtZXNzYWdlTGV2ZWwsIGxvZ01lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXRzIHRoZSBTQ09STSBtZXNzYWdlcyBmb3IgZWFzeSByZWFkaW5nXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jdGlvbk5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZm9ybWF0TWVzc2FnZShmdW5jdGlvbk5hbWU6IFN0cmluZywgQ01JRWxlbWVudDogU3RyaW5nLCBtZXNzYWdlOiBTdHJpbmcpIHtcbiAgICBjb25zdCBiYXNlTGVuZ3RoID0gMjA7XG4gICAgbGV0IG1lc3NhZ2VTdHJpbmcgPSAnJztcblxuICAgIG1lc3NhZ2VTdHJpbmcgKz0gZnVuY3Rpb25OYW1lO1xuXG4gICAgbGV0IGZpbGxDaGFycyA9IGJhc2VMZW5ndGggLSBtZXNzYWdlU3RyaW5nLmxlbmd0aDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsbENoYXJzOyBpKyspIHtcbiAgICAgIG1lc3NhZ2VTdHJpbmcgKz0gJyAnO1xuICAgIH1cblxuICAgIG1lc3NhZ2VTdHJpbmcgKz0gJzogJztcblxuICAgIGlmIChDTUlFbGVtZW50KSB7XG4gICAgICBjb25zdCBDTUlFbGVtZW50QmFzZUxlbmd0aCA9IDcwO1xuXG4gICAgICBtZXNzYWdlU3RyaW5nICs9IENNSUVsZW1lbnQ7XG5cbiAgICAgIGZpbGxDaGFycyA9IENNSUVsZW1lbnRCYXNlTGVuZ3RoIC0gbWVzc2FnZVN0cmluZy5sZW5ndGg7XG5cbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZmlsbENoYXJzOyBqKyspIHtcbiAgICAgICAgbWVzc2FnZVN0cmluZyArPSAnICc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgIG1lc3NhZ2VTdHJpbmcgKz0gbWVzc2FnZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVzc2FnZVN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgdG8gc2VlIGlmIHtzdHJ9IGNvbnRhaW5zIHt0ZXN0ZXJ9XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgU3RyaW5nIHRvIGNoZWNrIGFnYWluc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlc3RlciBTdHJpbmcgdG8gY2hlY2sgZm9yXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBzdHJpbmdNYXRjaGVzKHN0cjogU3RyaW5nLCB0ZXN0ZXI6IFN0cmluZykge1xuICAgIHJldHVybiBzdHIgJiYgdGVzdGVyICYmIHN0ci5tYXRjaCh0ZXN0ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgc3BlY2lmaWMgb2JqZWN0IGhhcyB0aGUgZ2l2ZW4gcHJvcGVydHlcbiAgICogQHBhcmFtIHsqfSByZWZPYmplY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NoZWNrT2JqZWN0SGFzUHJvcGVydHkocmVmT2JqZWN0LCBhdHRyaWJ1dGU6IFN0cmluZykge1xuICAgIHJldHVybiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChyZWZPYmplY3QsIGF0dHJpYnV0ZSkgfHxcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihyZWZPYmplY3QpLCBhdHRyaWJ1dGUpIHx8XG4gICAgICAgIChhdHRyaWJ1dGUgaW4gcmVmT2JqZWN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHRoYXQgY29ycmVzcG9uZHMgdG8gZXJyb3JOdW1iZXJcbiAgICogQVBJcyB0aGF0IGluaGVyaXQgQmFzZUFQSSBzaG91bGQgb3ZlcnJpZGUgdGhpcyBmdW5jdGlvblxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gX2Vycm9yTnVtYmVyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gX2RldGFpbFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgZ2V0TG1zRXJyb3JNZXNzYWdlRGV0YWlscyhfZXJyb3JOdW1iZXIsIF9kZXRhaWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdUaGUgZ2V0TG1zRXJyb3JNZXNzYWdlRGV0YWlscyBtZXRob2QgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpYyBlbGVtZW50LlxuICAgKiBBUElzIHRoYXQgaW5oZXJpdCBCYXNlQVBJIHNob3VsZCBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfQ01JRWxlbWVudFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgZ2V0Q01JVmFsdWUoX0NNSUVsZW1lbnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBnZXRDTUlWYWx1ZSBtZXRob2QgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpYyBlbGVtZW50LlxuICAgKiBBUElzIHRoYXQgaW5oZXJpdCBCYXNlQVBJIHNob3VsZCBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfQ01JRWxlbWVudFxuICAgKiBAcGFyYW0ge2FueX0gX3ZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBzZXRDTUlWYWx1ZShfQ01JRWxlbWVudCwgX3ZhbHVlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgc2V0Q01JVmFsdWUgbWV0aG9kIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlZCBBUEkgbWV0aG9kIHRvIHNldCBhIHZhbGlkIGZvciBhIGdpdmVuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2Nvcm0yMDA0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgX2NvbW1vblNldENNSVZhbHVlKFxuICAgICAgbWV0aG9kTmFtZTogU3RyaW5nLCBzY29ybTIwMDQ6IGJvb2xlYW4sIENNSUVsZW1lbnQsIHZhbHVlKSB7XG4gICAgaWYgKCFDTUlFbGVtZW50IHx8IENNSUVsZW1lbnQgPT09ICcnKSB7XG4gICAgICByZXR1cm4gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcbiAgICB9XG5cbiAgICBjb25zdCBzdHJ1Y3R1cmUgPSBDTUlFbGVtZW50LnNwbGl0KCcuJyk7XG4gICAgbGV0IHJlZk9iamVjdCA9IHRoaXM7XG4gICAgbGV0IHJldHVyblZhbHVlID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcbiAgICBsZXQgZm91bmRGaXJzdEluZGV4ID0gZmFsc2U7XG5cbiAgICBjb25zdCBpbnZhbGlkRXJyb3JNZXNzYWdlID0gYFRoZSBkYXRhIG1vZGVsIGVsZW1lbnQgcGFzc2VkIHRvICR7bWV0aG9kTmFtZX0gKCR7Q01JRWxlbWVudH0pIGlzIG5vdCBhIHZhbGlkIFNDT1JNIGRhdGEgbW9kZWwgZWxlbWVudC5gO1xuICAgIGNvbnN0IGludmFsaWRFcnJvckNvZGUgPSBzY29ybTIwMDQgP1xuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5VTkRFRklORURfREFUQV9NT0RFTCA6XG4gICAgICAgIHRoaXMuI2Vycm9yX2NvZGVzLkdFTkVSQUw7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cnVjdHVyZS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYXR0cmlidXRlID0gc3RydWN0dXJlW2ldO1xuXG4gICAgICBpZiAoaSA9PT0gc3RydWN0dXJlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgaWYgKHNjb3JtMjAwNCAmJiAoYXR0cmlidXRlLnN1YnN0cigwLCA4KSA9PT0gJ3t0YXJnZXQ9JykgJiZcbiAgICAgICAgICAgICh0eXBlb2YgcmVmT2JqZWN0Ll9pc1RhcmdldFZhbGlkID09ICdmdW5jdGlvbicpKSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IodGhpcy4jZXJyb3JfY29kZXMuUkVBRF9PTkxZX0VMRU1FTlQpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9jaGVja09iamVjdEhhc1Byb3BlcnR5KHJlZk9iamVjdCwgYXR0cmlidXRlKSkge1xuICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKGludmFsaWRFcnJvckNvZGUsIGludmFsaWRFcnJvck1lc3NhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQoKSAmJlxuICAgICAgICAgICAgICB0aGlzLnN0cmluZ01hdGNoZXMoQ01JRWxlbWVudCwgJ1xcXFwuY29ycmVjdF9yZXNwb25zZXNcXFxcLlxcXFxkKycpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlQ29ycmVjdFJlc3BvbnNlKENNSUVsZW1lbnQsIHZhbHVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIXNjb3JtMjAwNCB8fCB0aGlzLmxhc3RFcnJvckNvZGUgPT09IDApIHtcbiAgICAgICAgICAgIHJlZk9iamVjdFthdHRyaWJ1dGVdID0gdmFsdWU7XG4gICAgICAgICAgICByZXR1cm5WYWx1ZSA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fVFJVRTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlZk9iamVjdCA9IHJlZk9iamVjdFthdHRyaWJ1dGVdO1xuICAgICAgICBpZiAoIXJlZk9iamVjdCkge1xuICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKGludmFsaWRFcnJvckNvZGUsIGludmFsaWRFcnJvck1lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlZk9iamVjdCBpbnN0YW5jZW9mIENNSUFycmF5KSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChzdHJ1Y3R1cmVbaSArIDFdLCAxMCk7XG5cbiAgICAgICAgICAvLyBTQ08gaXMgdHJ5aW5nIHRvIHNldCBhbiBpdGVtIG9uIGFuIGFycmF5XG4gICAgICAgICAgaWYgKCFpc05hTihpbmRleCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSByZWZPYmplY3QuY2hpbGRBcnJheVtpbmRleF07XG5cbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgIHJlZk9iamVjdCA9IGl0ZW07XG4gICAgICAgICAgICAgIGZvdW5kRmlyc3RJbmRleCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBuZXdDaGlsZCA9IHRoaXMuZ2V0Q2hpbGRFbGVtZW50KENNSUVsZW1lbnQsIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgZm91bmRGaXJzdEluZGV4KTtcbiAgICAgICAgICAgICAgZm91bmRGaXJzdEluZGV4ID0gdHJ1ZTtcblxuICAgICAgICAgICAgICBpZiAoIW5ld0NoaWxkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IoaW52YWxpZEVycm9yQ29kZSwgaW52YWxpZEVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlZk9iamVjdC5pbml0aWFsaXplZCkgbmV3Q2hpbGQuaW5pdGlhbGl6ZSgpO1xuXG4gICAgICAgICAgICAgICAgcmVmT2JqZWN0LmNoaWxkQXJyYXkucHVzaChuZXdDaGlsZCk7XG4gICAgICAgICAgICAgICAgcmVmT2JqZWN0ID0gbmV3Q2hpbGQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSGF2ZSB0byB1cGRhdGUgaSB2YWx1ZSB0byBza2lwIHRoZSBhcnJheSBwb3NpdGlvblxuICAgICAgICAgICAgaSsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZXR1cm5WYWx1ZSA9PT0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRSkge1xuICAgICAgdGhpcy5hcGlMb2cobWV0aG9kTmFtZSwgbnVsbCxcbiAgICAgICAgICBgVGhlcmUgd2FzIGFuIGVycm9yIHNldHRpbmcgdGhlIHZhbHVlIGZvcjogJHtDTUlFbGVtZW50fSwgdmFsdWUgb2Y6ICR7dmFsdWV9YCxcbiAgICAgICAgICBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9XQVJOSU5HKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQWJzdHJhY3QgbWV0aG9kIGZvciB2YWxpZGF0aW5nIHRoYXQgYSByZXNwb25zZSBpcyBjb3JyZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gX0NNSUVsZW1lbnRcbiAgICogQHBhcmFtIHsqfSBfdmFsdWVcbiAgICovXG4gIHZhbGlkYXRlQ29ycmVjdFJlc3BvbnNlKF9DTUlFbGVtZW50LCBfdmFsdWUpIHtcbiAgICAvLyBqdXN0IGEgc3R1YiBtZXRob2RcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIGJ1aWxkcyBhIG5ldyBjaGlsZCBlbGVtZW50IHRvIGFkZCB0byB0aGUgYXJyYXkuXG4gICAqIEFQSXMgdGhhdCBpbmhlcml0IEJhc2VBUEkgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gX0NNSUVsZW1lbnQgLSB1bnVzZWRcbiAgICogQHBhcmFtIHsqfSBfdmFsdWUgLSB1bnVzZWRcbiAgICogQHBhcmFtIHtib29sZWFufSBfZm91bmRGaXJzdEluZGV4IC0gdW51c2VkXG4gICAqIEByZXR1cm4geyp9XG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgZ2V0Q2hpbGRFbGVtZW50KF9DTUlFbGVtZW50LCBfdmFsdWUsIF9mb3VuZEZpcnN0SW5kZXgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBnZXRDaGlsZEVsZW1lbnQgbWV0aG9kIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSB2YWx1ZSBmcm9tIHRoZSBDTUkgT2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2Nvcm0yMDA0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBfY29tbW9uR2V0Q01JVmFsdWUobWV0aG9kTmFtZTogU3RyaW5nLCBzY29ybTIwMDQ6IGJvb2xlYW4sIENNSUVsZW1lbnQpIHtcbiAgICBpZiAoIUNNSUVsZW1lbnQgfHwgQ01JRWxlbWVudCA9PT0gJycpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBjb25zdCBzdHJ1Y3R1cmUgPSBDTUlFbGVtZW50LnNwbGl0KCcuJyk7XG4gICAgbGV0IHJlZk9iamVjdCA9IHRoaXM7XG4gICAgbGV0IGF0dHJpYnV0ZSA9IG51bGw7XG5cbiAgICBjb25zdCB1bmluaXRpYWxpemVkRXJyb3JNZXNzYWdlID0gYFRoZSBkYXRhIG1vZGVsIGVsZW1lbnQgcGFzc2VkIHRvICR7bWV0aG9kTmFtZX0gKCR7Q01JRWxlbWVudH0pIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC5gO1xuICAgIGNvbnN0IGludmFsaWRFcnJvck1lc3NhZ2UgPSBgVGhlIGRhdGEgbW9kZWwgZWxlbWVudCBwYXNzZWQgdG8gJHttZXRob2ROYW1lfSAoJHtDTUlFbGVtZW50fSkgaXMgbm90IGEgdmFsaWQgU0NPUk0gZGF0YSBtb2RlbCBlbGVtZW50LmA7XG4gICAgY29uc3QgaW52YWxpZEVycm9yQ29kZSA9IHNjb3JtMjAwNCA/XG4gICAgICAgIHRoaXMuI2Vycm9yX2NvZGVzLlVOREVGSU5FRF9EQVRBX01PREVMIDpcbiAgICAgICAgdGhpcy4jZXJyb3JfY29kZXMuR0VORVJBTDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RydWN0dXJlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhdHRyaWJ1dGUgPSBzdHJ1Y3R1cmVbaV07XG5cbiAgICAgIGlmICghc2Nvcm0yMDA0KSB7XG4gICAgICAgIGlmIChpID09PSBzdHJ1Y3R1cmUubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGlmICghdGhpcy5fY2hlY2tPYmplY3RIYXNQcm9wZXJ0eShyZWZPYmplY3QsIGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKGludmFsaWRFcnJvckNvZGUsIGludmFsaWRFcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKChTdHJpbmcoYXR0cmlidXRlKS5zdWJzdHIoMCwgOCkgPT09ICd7dGFyZ2V0PScpICYmXG4gICAgICAgICAgICAodHlwZW9mIHJlZk9iamVjdC5faXNUYXJnZXRWYWxpZCA9PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IFN0cmluZyhhdHRyaWJ1dGUpLlxuICAgICAgICAgICAgICBzdWJzdHIoOCwgU3RyaW5nKGF0dHJpYnV0ZSkubGVuZ3RoIC0gOSk7XG4gICAgICAgICAgcmV0dXJuIHJlZk9iamVjdC5faXNUYXJnZXRWYWxpZCh0YXJnZXQpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9jaGVja09iamVjdEhhc1Byb3BlcnR5KHJlZk9iamVjdCwgYXR0cmlidXRlKSkge1xuICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKGludmFsaWRFcnJvckNvZGUsIGludmFsaWRFcnJvck1lc3NhZ2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZWZPYmplY3QgPSByZWZPYmplY3RbYXR0cmlidXRlXTtcbiAgICAgIGlmIChyZWZPYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihpbnZhbGlkRXJyb3JDb2RlLCBpbnZhbGlkRXJyb3JNZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWZPYmplY3QgaW5zdGFuY2VvZiBDTUlBcnJheSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KHN0cnVjdHVyZVtpICsgMV0sIDEwKTtcblxuICAgICAgICAvLyBTQ08gaXMgdHJ5aW5nIHRvIHNldCBhbiBpdGVtIG9uIGFuIGFycmF5XG4gICAgICAgIGlmICghaXNOYU4oaW5kZXgpKSB7XG4gICAgICAgICAgY29uc3QgaXRlbSA9IHJlZk9iamVjdC5jaGlsZEFycmF5W2luZGV4XTtcblxuICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICByZWZPYmplY3QgPSBpdGVtO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcih0aGlzLiNlcnJvcl9jb2Rlcy5WQUxVRV9OT1RfSU5JVElBTElaRUQsXG4gICAgICAgICAgICAgICAgdW5pbml0aWFsaXplZEVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBIYXZlIHRvIHVwZGF0ZSBpIHZhbHVlIHRvIHNraXAgdGhlIGFycmF5IHBvc2l0aW9uXG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlZk9iamVjdCA9PT0gbnVsbCB8fCByZWZPYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFzY29ybTIwMDQpIHtcbiAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PT0gJ19jaGlsZHJlbicpIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTEyX2Vycm9yX2NvZGVzLkNISUxEUkVOX0VSUk9SKTtcbiAgICAgICAgfSBlbHNlIGlmIChhdHRyaWJ1dGUgPT09ICdfY291bnQnKSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3Ioc2Nvcm0xMl9lcnJvcl9jb2Rlcy5DT1VOVF9FUlJPUik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlZk9iamVjdDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBBUEkncyBjdXJyZW50IHN0YXRlIGlzIFNUQVRFX0lOSVRJQUxJWkVEXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBpc0luaXRpYWxpemVkKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZSA9PT0gZ2xvYmFsX2NvbnN0YW50cy5TVEFURV9JTklUSUFMSVpFRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEFQSSdzIGN1cnJlbnQgc3RhdGUgaXMgU1RBVEVfTk9UX0lOSVRJQUxJWkVEXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBpc05vdEluaXRpYWxpemVkKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZSA9PT0gZ2xvYmFsX2NvbnN0YW50cy5TVEFURV9OT1RfSU5JVElBTElaRUQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBBUEkncyBjdXJyZW50IHN0YXRlIGlzIFNUQVRFX1RFUk1JTkFURURcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGlzVGVybWluYXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUgPT09IGdsb2JhbF9jb25zdGFudHMuU1RBVEVfVEVSTUlOQVRFRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgYXR0YWNoaW5nIHRvIGEgc3BlY2lmaWMgU0NPUk0gZXZlbnRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpc3RlbmVyTmFtZVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb24obGlzdGVuZXJOYW1lOiBTdHJpbmcsIGNhbGxiYWNrOiBmdW5jdGlvbikge1xuICAgIGlmICghY2FsbGJhY2spIHJldHVybjtcblxuICAgIGNvbnN0IGxpc3RlbmVyRnVuY3Rpb25zID0gbGlzdGVuZXJOYW1lLnNwbGl0KCcgJyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0ZW5lckZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbGlzdGVuZXJTcGxpdCA9IGxpc3RlbmVyRnVuY3Rpb25zW2ldLnNwbGl0KCcuJyk7XG4gICAgICBpZiAobGlzdGVuZXJTcGxpdC5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gbGlzdGVuZXJTcGxpdFswXTtcblxuICAgICAgbGV0IENNSUVsZW1lbnQgPSBudWxsO1xuICAgICAgaWYgKGxpc3RlbmVyU3BsaXQubGVuZ3RoID4gMSkge1xuICAgICAgICBDTUlFbGVtZW50ID0gbGlzdGVuZXJOYW1lLnJlcGxhY2UoZnVuY3Rpb25OYW1lICsgJy4nLCAnJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGlzdGVuZXJBcnJheS5wdXNoKHtcbiAgICAgICAgZnVuY3Rpb25OYW1lOiBmdW5jdGlvbk5hbWUsXG4gICAgICAgIENNSUVsZW1lbnQ6IENNSUVsZW1lbnQsXG4gICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmFwaUxvZygnb24nLCBmdW5jdGlvbk5hbWUsIGBBZGRlZCBldmVudCBsaXN0ZW5lcjogJHt0aGlzLmxpc3RlbmVyQXJyYXkubGVuZ3RofWAsIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0lORk8pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgZGV0YWNoaW5nIGEgc3BlY2lmaWMgU0NPUk0gZXZlbnQgbGlzdGVuZXJcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpc3RlbmVyTmFtZVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb2ZmKGxpc3RlbmVyTmFtZTogU3RyaW5nLCBjYWxsYmFjazogZnVuY3Rpb24pIHtcbiAgICBpZiAoIWNhbGxiYWNrKSByZXR1cm47XG5cbiAgICBjb25zdCBsaXN0ZW5lckZ1bmN0aW9ucyA9IGxpc3RlbmVyTmFtZS5zcGxpdCgnICcpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdGVuZXJGdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGxpc3RlbmVyU3BsaXQgPSBsaXN0ZW5lckZ1bmN0aW9uc1tpXS5zcGxpdCgnLicpO1xuICAgICAgaWYgKGxpc3RlbmVyU3BsaXQubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGxpc3RlbmVyU3BsaXRbMF07XG5cbiAgICAgIGxldCBDTUlFbGVtZW50ID0gbnVsbDtcbiAgICAgIGlmIChsaXN0ZW5lclNwbGl0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgQ01JRWxlbWVudCA9IGxpc3RlbmVyTmFtZS5yZXBsYWNlKGZ1bmN0aW9uTmFtZSArICcuJywgJycpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZW1vdmVJbmRleCA9IHRoaXMubGlzdGVuZXJBcnJheS5maW5kSW5kZXgoKG9iaikgPT5cbiAgICAgICAgb2JqLmZ1bmN0aW9uTmFtZSA9PT0gZnVuY3Rpb25OYW1lICYmXG4gICAgICAgIG9iai5DTUlFbGVtZW50ID09PSBDTUlFbGVtZW50ICYmXG4gICAgICAgIG9iai5jYWxsYmFjayA9PT0gY2FsbGJhY2tcbiAgICAgICk7XG4gICAgICBpZiAocmVtb3ZlSW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJBcnJheS5zcGxpY2UocmVtb3ZlSW5kZXgsIDEpO1xuICAgICAgICB0aGlzLmFwaUxvZygnb2ZmJywgZnVuY3Rpb25OYW1lLCBgUmVtb3ZlZCBldmVudCBsaXN0ZW5lcjogJHt0aGlzLmxpc3RlbmVyQXJyYXkubGVuZ3RofWAsIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0lORk8pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgY2xlYXJpbmcgYWxsIGxpc3RlbmVycyBmcm9tIGEgc3BlY2lmaWMgU0NPUk0gZXZlbnRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpc3RlbmVyTmFtZVxuICAgKi9cbiAgY2xlYXIobGlzdGVuZXJOYW1lOiBTdHJpbmcpIHtcbiAgICBjb25zdCBsaXN0ZW5lckZ1bmN0aW9ucyA9IGxpc3RlbmVyTmFtZS5zcGxpdCgnICcpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdGVuZXJGdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGxpc3RlbmVyU3BsaXQgPSBsaXN0ZW5lckZ1bmN0aW9uc1tpXS5zcGxpdCgnLicpO1xuICAgICAgaWYgKGxpc3RlbmVyU3BsaXQubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGxpc3RlbmVyU3BsaXRbMF07XG5cbiAgICAgIGxldCBDTUlFbGVtZW50ID0gbnVsbDtcbiAgICAgIGlmIChsaXN0ZW5lclNwbGl0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgQ01JRWxlbWVudCA9IGxpc3RlbmVyTmFtZS5yZXBsYWNlKGZ1bmN0aW9uTmFtZSArICcuJywgJycpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxpc3RlbmVyQXJyYXkgPSB0aGlzLmxpc3RlbmVyQXJyYXkuZmlsdGVyKChvYmopID0+XG4gICAgICAgIG9iai5mdW5jdGlvbk5hbWUgIT09IGZ1bmN0aW9uTmFtZSAmJlxuICAgICAgICBvYmouQ01JRWxlbWVudCAhPT0gQ01JRWxlbWVudCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBhbnkgJ29uJyBsaXN0ZW5lcnMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZnVuY3Rpb25OYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICovXG4gIHByb2Nlc3NMaXN0ZW5lcnMoZnVuY3Rpb25OYW1lOiBTdHJpbmcsIENNSUVsZW1lbnQ6IFN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIHRoaXMuYXBpTG9nKGZ1bmN0aW9uTmFtZSwgQ01JRWxlbWVudCwgdmFsdWUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5saXN0ZW5lckFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBsaXN0ZW5lciA9IHRoaXMubGlzdGVuZXJBcnJheVtpXTtcbiAgICAgIGNvbnN0IGZ1bmN0aW9uc01hdGNoID0gbGlzdGVuZXIuZnVuY3Rpb25OYW1lID09PSBmdW5jdGlvbk5hbWU7XG4gICAgICBjb25zdCBsaXN0ZW5lckhhc0NNSUVsZW1lbnQgPSAhIWxpc3RlbmVyLkNNSUVsZW1lbnQ7XG4gICAgICBsZXQgQ01JRWxlbWVudHNNYXRjaCA9IGZhbHNlO1xuICAgICAgaWYgKENNSUVsZW1lbnQgJiYgbGlzdGVuZXIuQ01JRWxlbWVudCAmJlxuICAgICAgICAgIGxpc3RlbmVyLkNNSUVsZW1lbnQuc3Vic3RyaW5nKGxpc3RlbmVyLkNNSUVsZW1lbnQubGVuZ3RoIC0gMSkgPT09XG4gICAgICAgICAgJyonKSB7XG4gICAgICAgIENNSUVsZW1lbnRzTWF0Y2ggPSBDTUlFbGVtZW50LmluZGV4T2YobGlzdGVuZXIuQ01JRWxlbWVudC5zdWJzdHJpbmcoMCxcbiAgICAgICAgICAgIGxpc3RlbmVyLkNNSUVsZW1lbnQubGVuZ3RoIC0gMSkpID09PSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQ01JRWxlbWVudHNNYXRjaCA9IGxpc3RlbmVyLkNNSUVsZW1lbnQgPT09IENNSUVsZW1lbnQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChmdW5jdGlvbnNNYXRjaCAmJiAoIWxpc3RlbmVySGFzQ01JRWxlbWVudCB8fCBDTUlFbGVtZW50c01hdGNoKSkge1xuICAgICAgICBsaXN0ZW5lci5jYWxsYmFjayhDTUlFbGVtZW50LCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhIFNDT1JNIGVycm9yXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBlcnJvck51bWJlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgKi9cbiAgdGhyb3dTQ09STUVycm9yKGVycm9yTnVtYmVyOiBudW1iZXIsIG1lc3NhZ2U6IFN0cmluZykge1xuICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgbWVzc2FnZSA9IHRoaXMuZ2V0TG1zRXJyb3JNZXNzYWdlRGV0YWlscyhlcnJvck51bWJlcik7XG4gICAgfVxuXG4gICAgdGhpcy5hcGlMb2coJ3Rocm93U0NPUk1FcnJvcicsIG51bGwsIGVycm9yTnVtYmVyICsgJzogJyArIG1lc3NhZ2UsXG4gICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0VSUk9SKTtcblxuICAgIHRoaXMubGFzdEVycm9yQ29kZSA9IFN0cmluZyhlcnJvck51bWJlcik7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIHRoZSBsYXN0IFNDT1JNIGVycm9yIGNvZGUgb24gc3VjY2Vzcy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1Y2Nlc3NcbiAgICovXG4gIGNsZWFyU0NPUk1FcnJvcihzdWNjZXNzOiBTdHJpbmcpIHtcbiAgICBpZiAoc3VjY2VzcyAhPT0gdW5kZWZpbmVkICYmIHN1Y2Nlc3MgIT09IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0UpIHtcbiAgICAgIHRoaXMubGFzdEVycm9yQ29kZSA9IDA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIHN0b3JlIHRoZSBkYXRhIHRvIHRoZSBMTVMsIGxvZ3MgZGF0YSBpZiBubyBMTVMgY29uZmlndXJlZFxuICAgKiBBUElzIHRoYXQgaW5oZXJpdCBCYXNlQVBJIHNob3VsZCBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gX2NhbGN1bGF0ZVRvdGFsVGltZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgc3RvcmVEYXRhKF9jYWxjdWxhdGVUb3RhbFRpbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdUaGUgc3RvcmVEYXRhIG1ldGhvZCBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHRoZSBDTUkgZnJvbSBhIGZsYXR0ZW5lZCBKU09OIG9iamVjdFxuICAgKiBAcGFyYW0ge29iamVjdH0ganNvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKi9cbiAgbG9hZEZyb21GbGF0dGVuZWRKU09OKGpzb24sIENNSUVsZW1lbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNOb3RJbml0aWFsaXplZCgpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICdsb2FkRnJvbUZsYXR0ZW5lZEpTT04gY2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSB0aGUgY2FsbCB0byBsbXNJbml0aWFsaXplLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRlc3QgbWF0Y2ggcGF0dGVybi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNcbiAgICAgKiBAcGFyYW0ge1JlZ0V4cH0gYV9wYXR0ZXJuXG4gICAgICogQHJldHVybiB7bnVtYmVyfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRlc3RQYXR0ZXJuKGEsIGMsIGFfcGF0dGVybikge1xuICAgICAgY29uc3QgYV9tYXRjaCA9IGEubWF0Y2goYV9wYXR0ZXJuKTtcblxuICAgICAgbGV0IGNfbWF0Y2g7XG4gICAgICBpZiAoYV9tYXRjaCAhPT0gbnVsbCAmJiAoY19tYXRjaCA9IGMubWF0Y2goYV9wYXR0ZXJuKSkgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgYV9udW0gPSBOdW1iZXIoYV9tYXRjaFsyXSk7XG4gICAgICAgIGNvbnN0IGNfbnVtID0gTnVtYmVyKGNfbWF0Y2hbMl0pO1xuICAgICAgICBpZiAoYV9udW0gPT09IGNfbnVtKSB7XG4gICAgICAgICAgaWYgKGFfbWF0Y2hbM10gPT09ICdpZCcpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGFfbWF0Y2hbM10gPT09ICd0eXBlJykge1xuICAgICAgICAgICAgaWYgKGNfbWF0Y2hbM10gPT09ICdpZCcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYV9udW0gLSBjX251bTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgaW50X3BhdHRlcm4gPSAvXihjbWlcXC5pbnRlcmFjdGlvbnNcXC4pKFxcZCspXFwuKC4qKSQvO1xuICAgIGNvbnN0IG9ial9wYXR0ZXJuID0gL14oY21pXFwub2JqZWN0aXZlc1xcLikoXFxkKylcXC4oLiopJC87XG5cbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3Qua2V5cyhqc29uKS5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gW1N0cmluZyhrZXkpLCBqc29uW2tleV1dO1xuICAgIH0pO1xuXG4gICAgLy8gQ01JIGludGVyYWN0aW9ucyBuZWVkIHRvIGhhdmUgaWQgYW5kIHR5cGUgbG9hZGVkIGJlZm9yZSBhbnkgb3RoZXIgZmllbGRzXG4gICAgcmVzdWx0LnNvcnQoZnVuY3Rpb24oW2EsIGJdLCBbYywgZF0pIHtcbiAgICAgIGxldCB0ZXN0O1xuICAgICAgaWYgKCh0ZXN0ID0gdGVzdFBhdHRlcm4oYSwgYywgaW50X3BhdHRlcm4pKSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGVzdDtcbiAgICAgIH1cbiAgICAgIGlmICgodGVzdCA9IHRlc3RQYXR0ZXJuKGEsIGMsIG9ial9wYXR0ZXJuKSkgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRlc3Q7XG4gICAgICB9XG5cbiAgICAgIGlmIChhIDwgYykge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICBpZiAoYSA+IGMpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9KTtcblxuICAgIGxldCBvYmo7XG4gICAgcmVzdWx0LmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIG9iaiA9IHt9O1xuICAgICAgb2JqW2VsZW1lbnRbMF1dID0gZWxlbWVudFsxXTtcbiAgICAgIHRoaXMubG9hZEZyb21KU09OKHVuZmxhdHRlbihvYmopLCBDTUlFbGVtZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBDTUkgZGF0YSBmcm9tIGEgSlNPTiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBqc29uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqL1xuICBsb2FkRnJvbUpTT04oanNvbiwgQ01JRWxlbWVudCkge1xuICAgIGlmICghdGhpcy5pc05vdEluaXRpYWxpemVkKCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgJ2xvYWRGcm9tSlNPTiBjYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjYWxsIHRvIGxtc0luaXRpYWxpemUuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgQ01JRWxlbWVudCA9IENNSUVsZW1lbnQgIT09IHVuZGVmaW5lZCA/IENNSUVsZW1lbnQgOiAnY21pJztcblxuICAgIHRoaXMuc3RhcnRpbmdEYXRhID0ganNvbjtcblxuICAgIC8vIGNvdWxkIHRoaXMgYmUgcmVmYWN0b3JlZCBkb3duIHRvIGZsYXR0ZW4oanNvbikgdGhlbiBzZXRDTUlWYWx1ZSBvbiBlYWNoP1xuICAgIGZvciAoY29uc3Qga2V5IGluIGpzb24pIHtcbiAgICAgIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGpzb24sIGtleSkgJiYganNvbltrZXldKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDTUlFbGVtZW50ID0gKENNSUVsZW1lbnQgPyBDTUlFbGVtZW50ICsgJy4nIDogJycpICsga2V5O1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGpzb25ba2V5XTtcblxuICAgICAgICBpZiAodmFsdWVbJ2NoaWxkQXJyYXknXSkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVbJ2NoaWxkQXJyYXknXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5sb2FkRnJvbUpTT04odmFsdWVbJ2NoaWxkQXJyYXknXVtpXSxcbiAgICAgICAgICAgICAgICBjdXJyZW50Q01JRWxlbWVudCArICcuJyArIGkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG4gICAgICAgICAgdGhpcy5sb2FkRnJvbUpTT04odmFsdWUsIGN1cnJlbnRDTUlFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldENNSVZhbHVlKGN1cnJlbnRDTUlFbGVtZW50LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBDTUkgb2JqZWN0IHRvIEpTT04gZm9yIHNlbmRpbmcgdG8gYW4gTE1TLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICByZW5kZXJDTUlUb0pTT05TdHJpbmcoKSB7XG4gICAgY29uc3QgY21pID0gdGhpcy5jbWk7XG4gICAgLy8gRG8gd2Ugd2FudC9uZWVkIHRvIHJldHVybiBmaWVsZHMgdGhhdCBoYXZlIG5vIHNldCB2YWx1ZT9cbiAgICAvLyByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyBjbWkgfSwgKGssIHYpID0+IHYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB2LCAyKTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe2NtaX0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBKUyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGNtaVxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICByZW5kZXJDTUlUb0pTT05PYmplY3QoKSB7XG4gICAgLy8gRG8gd2Ugd2FudC9uZWVkIHRvIHJldHVybiBmaWVsZHMgdGhhdCBoYXZlIG5vIHNldCB2YWx1ZT9cbiAgICAvLyByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyBjbWkgfSwgKGssIHYpID0+IHYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB2LCAyKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0aGlzLnJlbmRlckNNSVRvSlNPTlN0cmluZygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGNtaSBvYmplY3QgdG8gdGhlIHByb3BlciBmb3JtYXQgZm9yIExNUyBjb21taXRcbiAgICogQVBJcyB0aGF0IGluaGVyaXQgQmFzZUFQSSBzaG91bGQgb3ZlcnJpZGUgdGhpcyBmdW5jdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IF90ZXJtaW5hdGVDb21taXRcbiAgICogQHJldHVybiB7Kn1cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICByZW5kZXJDb21taXRDTUkoX3Rlcm1pbmF0ZUNvbW1pdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSBzdG9yZURhdGEgbWV0aG9kIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgdGhlIHJlcXVlc3QgdG8gdGhlIExNU1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7b2JqZWN0fEFycmF5fSBwYXJhbXNcbiAgICogQHBhcmFtIHtib29sZWFufSBpbW1lZGlhdGVcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgcHJvY2Vzc0h0dHBSZXF1ZXN0KHVybDogU3RyaW5nLCBwYXJhbXMsIGltbWVkaWF0ZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgYXBpID0gdGhpcztcbiAgICBjb25zdCBwcm9jZXNzID0gZnVuY3Rpb24odXJsLCBwYXJhbXMsIHNldHRpbmdzLCBlcnJvcl9jb2Rlcykge1xuICAgICAgY29uc3QgZ2VuZXJpY0Vycm9yID0ge1xuICAgICAgICAncmVzdWx0JzogZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRSxcbiAgICAgICAgJ2Vycm9yQ29kZSc6IGVycm9yX2NvZGVzLkdFTkVSQUwsXG4gICAgICB9O1xuXG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgaWYgKCFzZXR0aW5ncy5zZW5kQmVhY29uQ29tbWl0KSB7XG4gICAgICAgIGNvbnN0IGh0dHBSZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgaHR0cFJlcS5vcGVuKCdQT1NUJywgdXJsLCBzZXR0aW5ncy5hc3luY0NvbW1pdCk7XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHNldHRpbmdzLnhockhlYWRlcnMpLmxlbmd0aCkge1xuICAgICAgICAgIE9iamVjdC5rZXlzKHNldHRpbmdzLnhockhlYWRlcnMpLmZvckVhY2goKGhlYWRlcikgPT4ge1xuICAgICAgICAgICAgaHR0cFJlcS5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgc2V0dGluZ3MueGhySGVhZGVyc1toZWFkZXJdKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGh0dHBSZXEud2l0aENyZWRlbnRpYWxzID0gc2V0dGluZ3MueGhyV2l0aENyZWRlbnRpYWxzO1xuXG4gICAgICAgIGlmIChzZXR0aW5ncy5hc3luY0NvbW1pdCkge1xuICAgICAgICAgIGh0dHBSZXEub25sb2FkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXR0aW5ncy5yZXNwb25zZUhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gc2V0dGluZ3MucmVzcG9uc2VIYW5kbGVyKGh0dHBSZXEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShodHRwUmVxLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChwYXJhbXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgaHR0cFJlcS5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKTtcbiAgICAgICAgICAgIGh0dHBSZXEuc2VuZChwYXJhbXMuam9pbignJicpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaHR0cFJlcS5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLFxuICAgICAgICAgICAgICAgIHNldHRpbmdzLmNvbW1pdFJlcXVlc3REYXRhVHlwZSk7XG4gICAgICAgICAgICBodHRwUmVxLnNlbmQoSlNPTi5zdHJpbmdpZnkocGFyYW1zKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFzZXR0aW5ncy5hc3luY0NvbW1pdCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXR0aW5ncy5yZXNwb25zZUhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gc2V0dGluZ3MucmVzcG9uc2VIYW5kbGVyKGh0dHBSZXEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShodHRwUmVxLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHt9O1xuICAgICAgICAgICAgcmVzdWx0LnJlc3VsdCA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fVFJVRTtcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvckNvZGUgPSAwO1xuICAgICAgICAgICAgYXBpLnByb2Nlc3NMaXN0ZW5lcnMoJ0NvbW1pdFN1Y2Nlc3MnKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICBhcGkucHJvY2Vzc0xpc3RlbmVycygnQ29tbWl0RXJyb3InKTtcbiAgICAgICAgICByZXR1cm4gZ2VuZXJpY0Vycm9yO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAgICAgICB0eXBlOiBzZXR0aW5ncy5jb21taXRSZXF1ZXN0RGF0YVR5cGUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBsZXQgYmxvYjtcbiAgICAgICAgICBpZiAocGFyYW1zIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIGJsb2IgPSBuZXcgQmxvYihbcGFyYW1zLmpvaW4oJyYnKV0sIGhlYWRlcnMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBibG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KHBhcmFtcyldLCBoZWFkZXJzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXN1bHQgPSB7fTtcbiAgICAgICAgICBpZiAobmF2aWdhdG9yLnNlbmRCZWFjb24odXJsLCBibG9iKSkge1xuICAgICAgICAgICAgcmVzdWx0LnJlc3VsdCA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fVFJVRTtcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvckNvZGUgPSAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQucmVzdWx0ID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvckNvZGUgPSAxMDE7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICBhcGkucHJvY2Vzc0xpc3RlbmVycygnQ29tbWl0RXJyb3InKTtcbiAgICAgICAgICByZXR1cm4gZ2VuZXJpY0Vycm9yO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBhcGkucHJvY2Vzc0xpc3RlbmVycygnQ29tbWl0RXJyb3InKTtcbiAgICAgICAgcmV0dXJuIGdlbmVyaWNFcnJvcjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC5yZXN1bHQgPT09IHRydWUgfHxcbiAgICAgICAgICByZXN1bHQucmVzdWx0ID09PSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX1RSVUUpIHtcbiAgICAgICAgYXBpLnByb2Nlc3NMaXN0ZW5lcnMoJ0NvbW1pdFN1Y2Nlc3MnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFwaS5wcm9jZXNzTGlzdGVuZXJzKCdDb21taXRFcnJvcicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIGRlYm91bmNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc3QgZGVib3VuY2VkID0gZGVib3VuY2UocHJvY2VzcywgNTAwKTtcbiAgICAgIGRlYm91bmNlZCh1cmwsIHBhcmFtcywgdGhpcy5zZXR0aW5ncywgdGhpcy5lcnJvcl9jb2Rlcyk7XG5cbiAgICAgIC8vIGlmIHdlJ3JlIHRlcm1pbmF0aW5nLCBnbyBhaGVhZCBhbmQgY29tbWl0IGltbWVkaWF0ZWx5XG4gICAgICBpZiAoaW1tZWRpYXRlKSB7XG4gICAgICAgIGRlYm91bmNlZC5mbHVzaCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN1bHQ6IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fVFJVRSxcbiAgICAgICAgZXJyb3JDb2RlOiAwLFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHByb2Nlc3ModXJsLCBwYXJhbXMsIHRoaXMuc2V0dGluZ3MsIHRoaXMuZXJyb3JfY29kZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYSBTQ09STSBlcnJvclxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gd2hlbiAtIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGNvbW1pdHRpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrIC0gdGhlIG5hbWUgb2YgdGhlIGNvbW1pdCBldmVudCBjYWxsYmFja1xuICAgKi9cbiAgc2NoZWR1bGVDb21taXQod2hlbjogbnVtYmVyLCBjYWxsYmFjazogc3RyaW5nKSB7XG4gICAgdGhpcy4jdGltZW91dCA9IG5ldyBTY2hlZHVsZWRDb21taXQodGhpcywgd2hlbiwgY2FsbGJhY2spO1xuICAgIHRoaXMuYXBpTG9nKCdzY2hlZHVsZUNvbW1pdCcsICcnLCAnc2NoZWR1bGVkJyxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfREVCVUcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbmQgY2FuY2VscyBhbnkgY3VycmVudGx5IHNjaGVkdWxlZCBjb21taXRzXG4gICAqL1xuICBjbGVhclNjaGVkdWxlZENvbW1pdCgpIHtcbiAgICBpZiAodGhpcy4jdGltZW91dCkge1xuICAgICAgdGhpcy4jdGltZW91dC5jYW5jZWwoKTtcbiAgICAgIHRoaXMuI3RpbWVvdXQgPSBudWxsO1xuICAgICAgdGhpcy5hcGlMb2coJ2NsZWFyU2NoZWR1bGVkQ29tbWl0JywgJycsICdjbGVhcmVkJyxcbiAgICAgICAgICBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9ERUJVRyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUHJpdmF0ZSBjbGFzcyB0aGF0IHdyYXBzIGEgdGltZW91dCBjYWxsIHRvIHRoZSBjb21taXQoKSBmdW5jdGlvblxuICovXG5jbGFzcyBTY2hlZHVsZWRDb21taXQge1xuICAjQVBJO1xuICAjY2FuY2VsbGVkID0gZmFsc2U7XG4gICN0aW1lb3V0O1xuICAjY2FsbGJhY2s7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBTY2hlZHVsZWRDb21taXRcbiAgICogQHBhcmFtIHtCYXNlQVBJfSBBUElcbiAgICogQHBhcmFtIHtudW1iZXJ9IHdoZW5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrXG4gICAqL1xuICBjb25zdHJ1Y3RvcihBUEk6IGFueSwgd2hlbjogbnVtYmVyLCBjYWxsYmFjazogc3RyaW5nKSB7XG4gICAgdGhpcy4jQVBJID0gQVBJO1xuICAgIHRoaXMuI3RpbWVvdXQgPSBzZXRUaW1lb3V0KHRoaXMud3JhcHBlci5iaW5kKHRoaXMpLCB3aGVuKTtcbiAgICB0aGlzLiNjYWxsYmFjayA9IGNhbGxiYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCBhbnkgY3VycmVudGx5IHNjaGVkdWxlZCBjb21taXRcbiAgICovXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLiNjYW5jZWxsZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLiN0aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy4jdGltZW91dCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyYXAgdGhlIEFQSSBjb21taXQgY2FsbCB0byBjaGVjayBpZiB0aGUgY2FsbCBoYXMgYWxyZWFkeSBiZWVuIGNhbmNlbGxlZFxuICAgKi9cbiAgd3JhcHBlcigpIHtcbiAgICBpZiAoIXRoaXMuI2NhbmNlbGxlZCkge1xuICAgICAgdGhpcy4jQVBJLmNvbW1pdCh0aGlzLiNjYWxsYmFjayk7XG4gICAgfVxuICB9XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IEJhc2VBUEkgZnJvbSAnLi9CYXNlQVBJJztcbmltcG9ydCB7XG4gIENNSSxcbiAgQ01JSW50ZXJhY3Rpb25zQ29ycmVjdFJlc3BvbnNlc09iamVjdCxcbiAgQ01JSW50ZXJhY3Rpb25zT2JqZWN0LFxuICBDTUlJbnRlcmFjdGlvbnNPYmplY3RpdmVzT2JqZWN0LFxuICBDTUlPYmplY3RpdmVzT2JqZWN0LCBOQVYsXG59IGZyb20gJy4vY21pL3Njb3JtMTJfY21pJztcbmltcG9ydCAqIGFzIFV0aWxpdGllcyBmcm9tICcuL3V0aWxpdGllcyc7XG5pbXBvcnQgQVBJQ29uc3RhbnRzIGZyb20gJy4vY29uc3RhbnRzL2FwaV9jb25zdGFudHMnO1xuaW1wb3J0IEVycm9yQ29kZXMgZnJvbSAnLi9jb25zdGFudHMvZXJyb3JfY29kZXMnO1xuXG5jb25zdCBzY29ybTEyX2NvbnN0YW50cyA9IEFQSUNvbnN0YW50cy5zY29ybTEyO1xuY29uc3QgZ2xvYmFsX2NvbnN0YW50cyA9IEFQSUNvbnN0YW50cy5nbG9iYWw7XG5jb25zdCBzY29ybTEyX2Vycm9yX2NvZGVzID0gRXJyb3JDb2Rlcy5zY29ybTEyO1xuXG4vKipcbiAqIEFQSSBjbGFzcyBmb3IgU0NPUk0gMS4yXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjb3JtMTJBUEkgZXh0ZW5kcyBCYXNlQVBJIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBTQ09STSAxLjIgQVBJXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5nc1xuICAgKi9cbiAgY29uc3RydWN0b3Ioc2V0dGluZ3M6IHt9KSB7XG4gICAgY29uc3QgZmluYWxTZXR0aW5ncyA9IHtcbiAgICAgIC4uLntcbiAgICAgICAgbWFzdGVyeV9vdmVycmlkZTogZmFsc2UsXG4gICAgICB9LCAuLi5zZXR0aW5ncyxcbiAgICB9O1xuXG4gICAgc3VwZXIoc2Nvcm0xMl9lcnJvcl9jb2RlcywgZmluYWxTZXR0aW5ncyk7XG5cbiAgICB0aGlzLmNtaSA9IG5ldyBDTUkoKTtcbiAgICB0aGlzLm5hdiA9IG5ldyBOQVYoKTtcblxuICAgIC8vIFJlbmFtZSBmdW5jdGlvbnMgdG8gbWF0Y2ggMS4yIFNwZWMgYW5kIGV4cG9zZSB0byBtb2R1bGVzXG4gICAgdGhpcy5MTVNJbml0aWFsaXplID0gdGhpcy5sbXNJbml0aWFsaXplO1xuICAgIHRoaXMuTE1TRmluaXNoID0gdGhpcy5sbXNGaW5pc2g7XG4gICAgdGhpcy5MTVNHZXRWYWx1ZSA9IHRoaXMubG1zR2V0VmFsdWU7XG4gICAgdGhpcy5MTVNTZXRWYWx1ZSA9IHRoaXMubG1zU2V0VmFsdWU7XG4gICAgdGhpcy5MTVNDb21taXQgPSB0aGlzLmxtc0NvbW1pdDtcbiAgICB0aGlzLkxNU0dldExhc3RFcnJvciA9IHRoaXMubG1zR2V0TGFzdEVycm9yO1xuICAgIHRoaXMuTE1TR2V0RXJyb3JTdHJpbmcgPSB0aGlzLmxtc0dldEVycm9yU3RyaW5nO1xuICAgIHRoaXMuTE1TR2V0RGlhZ25vc3RpYyA9IHRoaXMubG1zR2V0RGlhZ25vc3RpYztcbiAgfVxuXG4gIC8qKlxuICAgKiBsbXNJbml0aWFsaXplIGZ1bmN0aW9uIGZyb20gU0NPUk0gMS4yIFNwZWNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSBib29sXG4gICAqL1xuICBsbXNJbml0aWFsaXplKCkge1xuICAgIHRoaXMuY21pLmluaXRpYWxpemUoKTtcbiAgICByZXR1cm4gdGhpcy5pbml0aWFsaXplKCdMTVNJbml0aWFsaXplJywgJ0xNUyB3YXMgYWxyZWFkeSBpbml0aWFsaXplZCEnLFxuICAgICAgICAnTE1TIGlzIGFscmVhZHkgZmluaXNoZWQhJyk7XG4gIH1cblxuICAvKipcbiAgICogTE1TRmluaXNoIGZ1bmN0aW9uIGZyb20gU0NPUk0gMS4yIFNwZWNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSBib29sXG4gICAqL1xuICBsbXNGaW5pc2goKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy50ZXJtaW5hdGUoJ0xNU0ZpbmlzaCcsIHRydWUpO1xuXG4gICAgaWYgKHJlc3VsdCA9PT0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFKSB7XG4gICAgICBpZiAodGhpcy5uYXYuZXZlbnQgIT09ICcnKSB7XG4gICAgICAgIGlmICh0aGlzLm5hdi5ldmVudCA9PT0gJ2NvbnRpbnVlJykge1xuICAgICAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycygnU2VxdWVuY2VOZXh0Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZVByZXZpb3VzJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZXR0aW5ncy5hdXRvUHJvZ3Jlc3MpIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZU5leHQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIExNU0dldFZhbHVlIGZ1bmN0aW9uIGZyb20gU0NPUk0gMS4yIFNwZWNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgbG1zR2V0VmFsdWUoQ01JRWxlbWVudCkge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlKCdMTVNHZXRWYWx1ZScsIGZhbHNlLCBDTUlFbGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMTVNTZXRWYWx1ZSBmdW5jdGlvbiBmcm9tIFNDT1JNIDEuMiBTcGVjXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgbG1zU2V0VmFsdWUoQ01JRWxlbWVudCwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5zZXRWYWx1ZSgnTE1TU2V0VmFsdWUnLCAnTE1TQ29tbWl0JywgZmFsc2UsIENNSUVsZW1lbnQsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMTVNDb21taXQgZnVuY3Rpb24gZnJvbSBTQ09STSAxLjIgU3BlY1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IGJvb2xcbiAgICovXG4gIGxtc0NvbW1pdCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb21taXQoJ0xNU0NvbW1pdCcsIGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMTVNHZXRMYXN0RXJyb3IgZnVuY3Rpb24gZnJvbSBTQ09STSAxLjIgU3BlY1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBsbXNHZXRMYXN0RXJyb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGFzdEVycm9yKCdMTVNHZXRMYXN0RXJyb3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMTVNHZXRFcnJvclN0cmluZyBmdW5jdGlvbiBmcm9tIFNDT1JNIDEuMiBTcGVjXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFcnJvckNvZGVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgbG1zR2V0RXJyb3JTdHJpbmcoQ01JRXJyb3JDb2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RXJyb3JTdHJpbmcoJ0xNU0dldEVycm9yU3RyaW5nJywgQ01JRXJyb3JDb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMTVNHZXREaWFnbm9zdGljIGZ1bmN0aW9uIGZyb20gU0NPUk0gMS4yIFNwZWNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVycm9yQ29kZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBsbXNHZXREaWFnbm9zdGljKENNSUVycm9yQ29kZSkge1xuICAgIHJldHVybiB0aGlzLmdldERpYWdub3N0aWMoJ0xNU0dldERpYWdub3N0aWMnLCBDTUlFcnJvckNvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgYSB2YWx1ZSBvbiB0aGUgQ01JIE9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHNldENNSVZhbHVlKENNSUVsZW1lbnQsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbW1vblNldENNSVZhbHVlKCdMTVNTZXRWYWx1ZScsIGZhbHNlLCBDTUlFbGVtZW50LCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHZhbHVlIGZyb20gdGhlIENNSSBPYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldENNSVZhbHVlKENNSUVsZW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5fY29tbW9uR2V0Q01JVmFsdWUoJ2dldENNSVZhbHVlJywgZmFsc2UsIENNSUVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3IgYnVpbGRzIGEgbmV3IGNoaWxkIGVsZW1lbnQgdG8gYWRkIHRvIHRoZSBhcnJheS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvdW5kRmlyc3RJbmRleFxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICBnZXRDaGlsZEVsZW1lbnQoQ01JRWxlbWVudCwgdmFsdWUsIGZvdW5kRmlyc3RJbmRleCkge1xuICAgIGxldCBuZXdDaGlsZDtcblxuICAgIGlmICh0aGlzLnN0cmluZ01hdGNoZXMoQ01JRWxlbWVudCwgJ2NtaVxcXFwub2JqZWN0aXZlc1xcXFwuXFxcXGQrJykpIHtcbiAgICAgIG5ld0NoaWxkID0gbmV3IENNSU9iamVjdGl2ZXNPYmplY3QoKTtcbiAgICB9IGVsc2UgaWYgKGZvdW5kRmlyc3RJbmRleCAmJiB0aGlzLnN0cmluZ01hdGNoZXMoQ01JRWxlbWVudCxcbiAgICAgICAgJ2NtaVxcXFwuaW50ZXJhY3Rpb25zXFxcXC5cXFxcZCtcXFxcLmNvcnJlY3RfcmVzcG9uc2VzXFxcXC5cXFxcZCsnKSkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JSW50ZXJhY3Rpb25zQ29ycmVjdFJlc3BvbnNlc09iamVjdCgpO1xuICAgIH0gZWxzZSBpZiAoZm91bmRGaXJzdEluZGV4ICYmIHRoaXMuc3RyaW5nTWF0Y2hlcyhDTUlFbGVtZW50LFxuICAgICAgICAnY21pXFxcXC5pbnRlcmFjdGlvbnNcXFxcLlxcXFxkK1xcXFwub2JqZWN0aXZlc1xcXFwuXFxcXGQrJykpIHtcbiAgICAgIG5ld0NoaWxkID0gbmV3IENNSUludGVyYWN0aW9uc09iamVjdGl2ZXNPYmplY3QoKTtcbiAgICB9IGVsc2UgaWYgKCFmb3VuZEZpcnN0SW5kZXggJiZcbiAgICAgICAgdGhpcy5zdHJpbmdNYXRjaGVzKENNSUVsZW1lbnQsICdjbWlcXFxcLmludGVyYWN0aW9uc1xcXFwuXFxcXGQrJykpIHtcbiAgICAgIG5ld0NoaWxkID0gbmV3IENNSUludGVyYWN0aW9uc09iamVjdCgpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdDaGlsZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgQ29ycmVjdCBSZXNwb25zZSB2YWx1ZXNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgdmFsaWRhdGVDb3JyZWN0UmVzcG9uc2UoQ01JRWxlbWVudCwgdmFsdWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHRoYXQgY29ycmVzcG9uZHMgdG8gZXJyb3JOdW1iZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gZXJyb3JOdW1iZXJcbiAgICogQHBhcmFtIHtib29sZWFufSBkZXRhaWxcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0TG1zRXJyb3JNZXNzYWdlRGV0YWlscyhlcnJvck51bWJlciwgZGV0YWlsKSB7XG4gICAgbGV0IGJhc2ljTWVzc2FnZSA9ICdObyBFcnJvcic7XG4gICAgbGV0IGRldGFpbE1lc3NhZ2UgPSAnTm8gRXJyb3InO1xuXG4gICAgLy8gU2V0IGVycm9yIG51bWJlciB0byBzdHJpbmcgc2luY2UgaW5jb25zaXN0ZW50IGZyb20gbW9kdWxlcyBpZiBzdHJpbmcgb3IgbnVtYmVyXG4gICAgZXJyb3JOdW1iZXIgPSBTdHJpbmcoZXJyb3JOdW1iZXIpO1xuICAgIGlmIChzY29ybTEyX2NvbnN0YW50cy5lcnJvcl9kZXNjcmlwdGlvbnNbZXJyb3JOdW1iZXJdKSB7XG4gICAgICBiYXNpY01lc3NhZ2UgPSBzY29ybTEyX2NvbnN0YW50cy5lcnJvcl9kZXNjcmlwdGlvbnNbZXJyb3JOdW1iZXJdLmJhc2ljTWVzc2FnZTtcbiAgICAgIGRldGFpbE1lc3NhZ2UgPSBzY29ybTEyX2NvbnN0YW50cy5lcnJvcl9kZXNjcmlwdGlvbnNbZXJyb3JOdW1iZXJdLmRldGFpbE1lc3NhZ2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRldGFpbCA/IGRldGFpbE1lc3NhZ2UgOiBiYXNpY01lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgd2hvbGUgQVBJIHdpdGggYW5vdGhlclxuICAgKlxuICAgKiBAcGFyYW0ge1Njb3JtMTJBUEl9IG5ld0FQSVxuICAgKi9cbiAgcmVwbGFjZVdpdGhBbm90aGVyU2Nvcm1BUEkobmV3QVBJKSB7XG4gICAgLy8gRGF0YSBNb2RlbFxuICAgIHRoaXMuY21pID0gbmV3QVBJLmNtaTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGNtaSBvYmplY3QgdG8gdGhlIHByb3BlciBmb3JtYXQgZm9yIExNUyBjb21taXRcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSB0ZXJtaW5hdGVDb21taXRcbiAgICogQHJldHVybiB7b2JqZWN0fEFycmF5fVxuICAgKi9cbiAgcmVuZGVyQ29tbWl0Q01JKHRlcm1pbmF0ZUNvbW1pdDogYm9vbGVhbikge1xuICAgIGNvbnN0IGNtaUV4cG9ydCA9IHRoaXMucmVuZGVyQ01JVG9KU09OT2JqZWN0KCk7XG5cbiAgICBpZiAodGVybWluYXRlQ29tbWl0KSB7XG4gICAgICBjbWlFeHBvcnQuY21pLmNvcmUudG90YWxfdGltZSA9IHRoaXMuY21pLmdldEN1cnJlbnRUb3RhbFRpbWUoKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICBjb25zdCBmbGF0dGVuZWQgPSBVdGlsaXRpZXMuZmxhdHRlbihjbWlFeHBvcnQpO1xuICAgIHN3aXRjaCAodGhpcy5zZXR0aW5ncy5kYXRhQ29tbWl0Rm9ybWF0KSB7XG4gICAgICBjYXNlICdmbGF0dGVuZWQnOlxuICAgICAgICByZXR1cm4gVXRpbGl0aWVzLmZsYXR0ZW4oY21pRXhwb3J0KTtcbiAgICAgIGNhc2UgJ3BhcmFtcyc6XG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBpbiBmbGF0dGVuZWQpIHtcbiAgICAgICAgICBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChmbGF0dGVuZWQsIGl0ZW0pKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaChgJHtpdGVtfT0ke2ZsYXR0ZW5lZFtpdGVtXX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGNtaUV4cG9ydDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdHMgdG8gc3RvcmUgdGhlIGRhdGEgdG8gdGhlIExNU1xuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHRlcm1pbmF0ZUNvbW1pdFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBzdG9yZURhdGEodGVybWluYXRlQ29tbWl0OiBib29sZWFuKSB7XG4gICAgaWYgKHRlcm1pbmF0ZUNvbW1pdCkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxTdGF0dXMgPSB0aGlzLmNtaS5jb3JlLmxlc3Nvbl9zdGF0dXM7XG4gICAgICBpZiAob3JpZ2luYWxTdGF0dXMgPT09ICdub3QgYXR0ZW1wdGVkJykge1xuICAgICAgICB0aGlzLmNtaS5jb3JlLmxlc3Nvbl9zdGF0dXMgPSAnY29tcGxldGVkJztcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY21pLmNvcmUubGVzc29uX21vZGUgPT09ICdub3JtYWwnKSB7XG4gICAgICAgIGlmICh0aGlzLmNtaS5jb3JlLmNyZWRpdCA9PT0gJ2NyZWRpdCcpIHtcbiAgICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5tYXN0ZXJ5X292ZXJyaWRlICYmXG4gICAgICAgICAgICAgIHRoaXMuY21pLnN0dWRlbnRfZGF0YS5tYXN0ZXJ5X3Njb3JlICE9PSAnJyAmJlxuICAgICAgICAgICAgICB0aGlzLmNtaS5jb3JlLnNjb3JlLnJhdyAhPT0gJycpIHtcbiAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KHRoaXMuY21pLmNvcmUuc2NvcmUucmF3KSA+PSBwYXJzZUZsb2F0KHRoaXMuY21pLnN0dWRlbnRfZGF0YS5tYXN0ZXJ5X3Njb3JlKSkge1xuICAgICAgICAgICAgICB0aGlzLmNtaS5jb3JlLmxlc3Nvbl9zdGF0dXMgPSAncGFzc2VkJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuY21pLmNvcmUubGVzc29uX3N0YXR1cyA9ICdmYWlsZWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNtaS5jb3JlLmxlc3Nvbl9tb2RlID09PSAnYnJvd3NlJykge1xuICAgICAgICBpZiAoKHRoaXMuc3RhcnRpbmdEYXRhPy5jbWk/LmNvcmU/Lmxlc3Nvbl9zdGF0dXMgfHwgJycpID09PSAnJyAmJiBvcmlnaW5hbFN0YXR1cyA9PT0gJ25vdCBhdHRlbXB0ZWQnKSB7XG4gICAgICAgICAgdGhpcy5jbWkuY29yZS5sZXNzb25fc3RhdHVzID0gJ2Jyb3dzZWQnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tbWl0T2JqZWN0ID0gdGhpcy5yZW5kZXJDb21taXRDTUkodGVybWluYXRlQ29tbWl0IHx8XG4gICAgICAgIHRoaXMuc2V0dGluZ3MuYWx3YXlzU2VuZFRvdGFsVGltZSk7XG5cbiAgICBpZiAodGhpcy5hcGlMb2dMZXZlbCA9PT0gZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfREVCVUcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ0NvbW1pdCAodGVybWluYXRlZDogJyArICh0ZXJtaW5hdGVDb21taXQgPyAneWVzJyA6ICdubycpICsgJyk6ICcpO1xuICAgICAgY29uc29sZS5kZWJ1Zyhjb21taXRPYmplY3QpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5sbXNDb21taXRVcmwpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NIdHRwUmVxdWVzdCh0aGlzLnNldHRpbmdzLmxtc0NvbW1pdFVybCwgY29tbWl0T2JqZWN0LCB0ZXJtaW5hdGVDb21taXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFO1xuICAgIH1cbiAgfVxufVxuIiwiLy8gQGZsb3dcbmltcG9ydCBCYXNlQVBJIGZyb20gJy4vQmFzZUFQSSc7XG5pbXBvcnQge1xuICBBREwsXG4gIENNSSxcbiAgQ01JQ29tbWVudHNPYmplY3QsXG4gIENNSUludGVyYWN0aW9uc0NvcnJlY3RSZXNwb25zZXNPYmplY3QsXG4gIENNSUludGVyYWN0aW9uc09iamVjdCxcbiAgQ01JSW50ZXJhY3Rpb25zT2JqZWN0aXZlc09iamVjdCxcbiAgQ01JT2JqZWN0aXZlc09iamVjdCxcbn0gZnJvbSAnLi9jbWkvc2Nvcm0yMDA0X2NtaSc7XG5pbXBvcnQgKiBhcyBVdGlsaXRpZXMgZnJvbSAnLi91dGlsaXRpZXMnO1xuaW1wb3J0IEFQSUNvbnN0YW50cyBmcm9tICcuL2NvbnN0YW50cy9hcGlfY29uc3RhbnRzJztcbmltcG9ydCBFcnJvckNvZGVzIGZyb20gJy4vY29uc3RhbnRzL2Vycm9yX2NvZGVzJztcbmltcG9ydCBSZXNwb25zZXMgZnJvbSAnLi9jb25zdGFudHMvcmVzcG9uc2VfY29uc3RhbnRzJztcbmltcG9ydCBWYWxpZExhbmd1YWdlcyBmcm9tICcuL2NvbnN0YW50cy9sYW5ndWFnZV9jb25zdGFudHMnO1xuaW1wb3J0IFJlZ2V4IGZyb20gJy4vY29uc3RhbnRzL3JlZ2V4JztcblxuY29uc3Qgc2Nvcm0yMDA0X2NvbnN0YW50cyA9IEFQSUNvbnN0YW50cy5zY29ybTIwMDQ7XG5jb25zdCBnbG9iYWxfY29uc3RhbnRzID0gQVBJQ29uc3RhbnRzLmdsb2JhbDtcbmNvbnN0IHNjb3JtMjAwNF9lcnJvcl9jb2RlcyA9IEVycm9yQ29kZXMuc2Nvcm0yMDA0O1xuY29uc3QgY29ycmVjdF9yZXNwb25zZXMgPSBSZXNwb25zZXMuY29ycmVjdDtcbmNvbnN0IHNjb3JtMjAwNF9yZWdleCA9IFJlZ2V4LnNjb3JtMjAwNDtcblxuLyoqXG4gKiBBUEkgY2xhc3MgZm9yIFNDT1JNIDIwMDRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2Nvcm0yMDA0QVBJIGV4dGVuZHMgQmFzZUFQSSB7XG4gICN2ZXJzaW9uOiAnMS4wJztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIFNDT1JNIDIwMDQgQVBJXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5nc1xuICAgKi9cbiAgY29uc3RydWN0b3Ioc2V0dGluZ3M6IHt9KSB7XG4gICAgY29uc3QgZmluYWxTZXR0aW5ncyA9IHtcbiAgICAgIC4uLntcbiAgICAgICAgbWFzdGVyeV9vdmVycmlkZTogZmFsc2UsXG4gICAgICB9LCAuLi5zZXR0aW5ncyxcbiAgICB9O1xuXG4gICAgc3VwZXIoc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLCBmaW5hbFNldHRpbmdzKTtcblxuICAgIHRoaXMuY21pID0gbmV3IENNSSgpO1xuICAgIHRoaXMuYWRsID0gbmV3IEFETCgpO1xuXG4gICAgLy8gUmVuYW1lIGZ1bmN0aW9ucyB0byBtYXRjaCAyMDA0IFNwZWMgYW5kIGV4cG9zZSB0byBtb2R1bGVzXG4gICAgdGhpcy5Jbml0aWFsaXplID0gdGhpcy5sbXNJbml0aWFsaXplO1xuICAgIHRoaXMuVGVybWluYXRlID0gdGhpcy5sbXNUZXJtaW5hdGU7XG4gICAgdGhpcy5HZXRWYWx1ZSA9IHRoaXMubG1zR2V0VmFsdWU7XG4gICAgdGhpcy5TZXRWYWx1ZSA9IHRoaXMubG1zU2V0VmFsdWU7XG4gICAgdGhpcy5Db21taXQgPSB0aGlzLmxtc0NvbW1pdDtcbiAgICB0aGlzLkdldExhc3RFcnJvciA9IHRoaXMubG1zR2V0TGFzdEVycm9yO1xuICAgIHRoaXMuR2V0RXJyb3JTdHJpbmcgPSB0aGlzLmxtc0dldEVycm9yU3RyaW5nO1xuICAgIHRoaXMuR2V0RGlhZ25vc3RpYyA9IHRoaXMubG1zR2V0RGlhZ25vc3RpYztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN2ZXJzaW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB2ZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLiN2ZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gYm9vbFxuICAgKi9cbiAgbG1zSW5pdGlhbGl6ZSgpIHtcbiAgICB0aGlzLmNtaS5pbml0aWFsaXplKCk7XG4gICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZSgnSW5pdGlhbGl6ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gYm9vbFxuICAgKi9cbiAgbG1zVGVybWluYXRlKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudGVybWluYXRlKCdUZXJtaW5hdGUnLCB0cnVlKTtcblxuICAgIGlmIChyZXN1bHQgPT09IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fVFJVRSkge1xuICAgICAgaWYgKHRoaXMuYWRsLm5hdi5yZXF1ZXN0ICE9PSAnX25vbmVfJykge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuYWRsLm5hdi5yZXF1ZXN0KSB7XG4gICAgICAgICAgY2FzZSAnY29udGludWUnOlxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZU5leHQnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3ByZXZpb3VzJzpcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycygnU2VxdWVuY2VQcmV2aW91cycpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnY2hvaWNlJzpcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycygnU2VxdWVuY2VDaG9pY2UnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2V4aXQnOlxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZUV4aXQnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2V4aXRBbGwnOlxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZUV4aXRBbGwnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2FiYW5kb24nOlxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZUFiYW5kb24nKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2FiYW5kb25BbGwnOlxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZUFiYW5kb25BbGwnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2V0dGluZ3MuYXV0b1Byb2dyZXNzKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycygnU2VxdWVuY2VOZXh0Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBsbXNHZXRWYWx1ZShDTUlFbGVtZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoJ0dldFZhbHVlJywgdHJ1ZSwgQ01JRWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGxtc1NldFZhbHVlKENNSUVsZW1lbnQsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0VmFsdWUoJ1NldFZhbHVlJywgJ0NvbW1pdCcsIHRydWUsIENNSUVsZW1lbnQsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcmRlcnMgTE1TIHRvIHN0b3JlIGFsbCBjb250ZW50IHBhcmFtZXRlcnNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSBib29sXG4gICAqL1xuICBsbXNDb21taXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29tbWl0KCdDb21taXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGxhc3QgZXJyb3IgY29kZVxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBsbXNHZXRMYXN0RXJyb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGFzdEVycm9yKCdHZXRMYXN0RXJyb3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlcnJvck51bWJlciBlcnJvciBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gQ01JRXJyb3JDb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGxtc0dldEVycm9yU3RyaW5nKENNSUVycm9yQ29kZSkge1xuICAgIHJldHVybiB0aGlzLmdldEVycm9yU3RyaW5nKCdHZXRFcnJvclN0cmluZycsIENNSUVycm9yQ29kZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvbXByZWhlbnNpdmUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yTnVtYmVyIGVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gQ01JRXJyb3JDb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGxtc0dldERpYWdub3N0aWMoQ01JRXJyb3JDb2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGlhZ25vc3RpYygnR2V0RGlhZ25vc3RpYycsIENNSUVycm9yQ29kZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIHZhbHVlIG9uIHRoZSBDTUkgT2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBzZXRDTUlWYWx1ZShDTUlFbGVtZW50LCB2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9jb21tb25TZXRDTUlWYWx1ZSgnU2V0VmFsdWUnLCB0cnVlLCBDTUlFbGVtZW50LCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBvciBidWlsZHMgYSBuZXcgY2hpbGQgZWxlbWVudCB0byBhZGQgdG8gdGhlIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICogQHBhcmFtIHtib29sZWFufSBmb3VuZEZpcnN0SW5kZXhcbiAgICogQHJldHVybiB7YW55fVxuICAgKi9cbiAgZ2V0Q2hpbGRFbGVtZW50KENNSUVsZW1lbnQsIHZhbHVlLCBmb3VuZEZpcnN0SW5kZXgpIHtcbiAgICBsZXQgbmV3Q2hpbGQ7XG5cbiAgICBpZiAodGhpcy5zdHJpbmdNYXRjaGVzKENNSUVsZW1lbnQsICdjbWlcXFxcLm9iamVjdGl2ZXNcXFxcLlxcXFxkKycpKSB7XG4gICAgICBuZXdDaGlsZCA9IG5ldyBDTUlPYmplY3RpdmVzT2JqZWN0KCk7XG4gICAgfSBlbHNlIGlmIChmb3VuZEZpcnN0SW5kZXggJiYgdGhpcy5zdHJpbmdNYXRjaGVzKENNSUVsZW1lbnQsXG4gICAgICAgICdjbWlcXFxcLmludGVyYWN0aW9uc1xcXFwuXFxcXGQrXFxcXC5jb3JyZWN0X3Jlc3BvbnNlc1xcXFwuXFxcXGQrJykpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gQ01JRWxlbWVudC5zcGxpdCgnLicpO1xuICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIocGFydHNbMl0pO1xuICAgICAgY29uc3QgaW50ZXJhY3Rpb24gPSB0aGlzLmNtaS5pbnRlcmFjdGlvbnMuY2hpbGRBcnJheVtpbmRleF07XG4gICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKCkpIHtcbiAgICAgICAgaWYgKCFpbnRlcmFjdGlvbi50eXBlKSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IoXG4gICAgICAgICAgICAgIHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5ERVBFTkRFTkNZX05PVF9FU1RBQkxJU0hFRCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jaGVja0R1cGxpY2F0ZUNob2ljZVJlc3BvbnNlKGludGVyYWN0aW9uLCB2YWx1ZSk7XG5cbiAgICAgICAgICBjb25zdCByZXNwb25zZV90eXBlID0gY29ycmVjdF9yZXNwb25zZXNbaW50ZXJhY3Rpb24udHlwZV07XG4gICAgICAgICAgaWYgKHJlc3BvbnNlX3R5cGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tWYWxpZFJlc3BvbnNlVHlwZShyZXNwb25zZV90eXBlLCB2YWx1ZSwgaW50ZXJhY3Rpb24udHlwZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5HRU5FUkFMX1NFVF9GQUlMVVJFLFxuICAgICAgICAgICAgICAgICdJbmNvcnJlY3QgUmVzcG9uc2UgVHlwZTogJyArIGludGVyYWN0aW9uLnR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMubGFzdEVycm9yQ29kZSA9PT0gMCkge1xuICAgICAgICBuZXdDaGlsZCA9IG5ldyBDTUlJbnRlcmFjdGlvbnNDb3JyZWN0UmVzcG9uc2VzT2JqZWN0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmb3VuZEZpcnN0SW5kZXggJiYgdGhpcy5zdHJpbmdNYXRjaGVzKENNSUVsZW1lbnQsXG4gICAgICAgICdjbWlcXFxcLmludGVyYWN0aW9uc1xcXFwuXFxcXGQrXFxcXC5vYmplY3RpdmVzXFxcXC5cXFxcZCsnKSkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JSW50ZXJhY3Rpb25zT2JqZWN0aXZlc09iamVjdCgpO1xuICAgIH0gZWxzZSBpZiAoIWZvdW5kRmlyc3RJbmRleCAmJlxuICAgICAgICB0aGlzLnN0cmluZ01hdGNoZXMoQ01JRWxlbWVudCwgJ2NtaVxcXFwuaW50ZXJhY3Rpb25zXFxcXC5cXFxcZCsnKSkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JSW50ZXJhY3Rpb25zT2JqZWN0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0cmluZ01hdGNoZXMoQ01JRWxlbWVudCxcbiAgICAgICAgJ2NtaVxcXFwuY29tbWVudHNfZnJvbV9sZWFybmVyXFxcXC5cXFxcZCsnKSkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JQ29tbWVudHNPYmplY3QoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RyaW5nTWF0Y2hlcyhDTUlFbGVtZW50LFxuICAgICAgICAnY21pXFxcXC5jb21tZW50c19mcm9tX2xtc1xcXFwuXFxcXGQrJykpIHtcbiAgICAgIG5ld0NoaWxkID0gbmV3IENNSUNvbW1lbnRzT2JqZWN0KHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdDaGlsZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgZm9yIHZhbGlkIHJlc3BvbnNlIHR5cGVzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSByZXNwb25zZV90eXBlXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW50ZXJhY3Rpb25fdHlwZVxuICAgKi9cbiAgY2hlY2tWYWxpZFJlc3BvbnNlVHlwZShyZXNwb25zZV90eXBlLCB2YWx1ZSwgaW50ZXJhY3Rpb25fdHlwZSkge1xuICAgIGxldCBub2RlcyA9IFtdO1xuICAgIGlmIChyZXNwb25zZV90eXBlPy5kZWxpbWl0ZXIpIHtcbiAgICAgIG5vZGVzID0gU3RyaW5nKHZhbHVlKS5zcGxpdChyZXNwb25zZV90eXBlLmRlbGltaXRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGVzWzBdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGVzLmxlbmd0aCA+IDAgJiYgbm9kZXMubGVuZ3RoIDw9IHJlc3BvbnNlX3R5cGUubWF4KSB7XG4gICAgICB0aGlzLmNoZWNrQ29ycmVjdFJlc3BvbnNlVmFsdWUoaW50ZXJhY3Rpb25fdHlwZSwgbm9kZXMsIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKG5vZGVzLmxlbmd0aCA+IHJlc3BvbnNlX3R5cGUubWF4KSB7XG4gICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuR0VORVJBTF9TRVRfRkFJTFVSRSxcbiAgICAgICAgICAnRGF0YSBNb2RlbCBFbGVtZW50IFBhdHRlcm4gVG9vIExvbmcnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGZvciBkdXBsaWNhdGUgJ2Nob2ljZScgcmVzcG9uc2VzLlxuICAgKiBAcGFyYW0ge0NNSUludGVyYWN0aW9uc09iamVjdH0gaW50ZXJhY3Rpb25cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqL1xuICBjaGVja0R1cGxpY2F0ZUNob2ljZVJlc3BvbnNlKGludGVyYWN0aW9uLCB2YWx1ZSkge1xuICAgIGNvbnN0IGludGVyYWN0aW9uX2NvdW50ID0gaW50ZXJhY3Rpb24uY29ycmVjdF9yZXNwb25zZXMuX2NvdW50O1xuICAgIGlmIChpbnRlcmFjdGlvbi50eXBlID09PSAnY2hvaWNlJykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcmFjdGlvbl9jb3VudCAmJiB0aGlzLmxhc3RFcnJvckNvZGUgPT09XG4gICAgICAwOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBpbnRlcmFjdGlvbi5jb3JyZWN0X3Jlc3BvbnNlcy5jaGlsZEFycmF5W2ldO1xuICAgICAgICBpZiAocmVzcG9uc2UucGF0dGVybiA9PT0gdmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuR0VORVJBTF9TRVRfRkFJTFVSRSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgY29ycmVjdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKi9cbiAgdmFsaWRhdGVDb3JyZWN0UmVzcG9uc2UoQ01JRWxlbWVudCwgdmFsdWUpIHtcbiAgICBjb25zdCBwYXJ0cyA9IENNSUVsZW1lbnQuc3BsaXQoJy4nKTtcbiAgICBjb25zdCBpbmRleCA9IE51bWJlcihwYXJ0c1syXSk7XG4gICAgY29uc3QgcGF0dGVybl9pbmRleCA9IE51bWJlcihwYXJ0c1s0XSk7XG4gICAgY29uc3QgaW50ZXJhY3Rpb24gPSB0aGlzLmNtaS5pbnRlcmFjdGlvbnMuY2hpbGRBcnJheVtpbmRleF07XG5cbiAgICBjb25zdCBpbnRlcmFjdGlvbl9jb3VudCA9IGludGVyYWN0aW9uLmNvcnJlY3RfcmVzcG9uc2VzLl9jb3VudDtcbiAgICB0aGlzLmNoZWNrRHVwbGljYXRlQ2hvaWNlUmVzcG9uc2UoaW50ZXJhY3Rpb24sIHZhbHVlKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlX3R5cGUgPSBjb3JyZWN0X3Jlc3BvbnNlc1tpbnRlcmFjdGlvbi50eXBlXTtcbiAgICBpZiAodHlwZW9mIHJlc3BvbnNlX3R5cGUubGltaXQgPT09ICd1bmRlZmluZWQnIHx8IGludGVyYWN0aW9uX2NvdW50IDw9XG4gICAgICAgIHJlc3BvbnNlX3R5cGUubGltaXQpIHtcbiAgICAgIHRoaXMuY2hlY2tWYWxpZFJlc3BvbnNlVHlwZShyZXNwb25zZV90eXBlLCB2YWx1ZSwgaW50ZXJhY3Rpb24udHlwZSk7XG5cbiAgICAgIGlmICh0aGlzLmxhc3RFcnJvckNvZGUgPT09IDAgJiZcbiAgICAgICAgICAoIXJlc3BvbnNlX3R5cGUuZHVwbGljYXRlIHx8XG4gICAgICAgICAgICAgICF0aGlzLmNoZWNrRHVwbGljYXRlZFBhdHRlcm4oaW50ZXJhY3Rpb24uY29ycmVjdF9yZXNwb25zZXMsXG4gICAgICAgICAgICAgICAgICBwYXR0ZXJuX2luZGV4LCB2YWx1ZSkpIHx8XG4gICAgICAgICAgKHRoaXMubGFzdEVycm9yQ29kZSA9PT0gMCAmJiB2YWx1ZSA9PT0gJycpKSB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmcsIHdlIHdhbnQgdGhlIGludmVyc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmxhc3RFcnJvckNvZGUgPT09IDApIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuR0VORVJBTF9TRVRfRkFJTFVSRSxcbiAgICAgICAgICAgICAgJ0RhdGEgTW9kZWwgRWxlbWVudCBQYXR0ZXJuIEFscmVhZHkgRXhpc3RzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLkdFTkVSQUxfU0VUX0ZBSUxVUkUsXG4gICAgICAgICAgJ0RhdGEgTW9kZWwgRWxlbWVudCBDb2xsZWN0aW9uIExpbWl0IFJlYWNoZWQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHZhbHVlIGZyb20gdGhlIENNSSBPYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldENNSVZhbHVlKENNSUVsZW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5fY29tbW9uR2V0Q01JVmFsdWUoJ0dldFZhbHVlJywgdHJ1ZSwgQ01JRWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbWVzc2FnZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGVycm9yTnVtYmVyLlxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gZXJyb3JOdW1iZXJcbiAgICogQHBhcmFtIHtib29sZWFufSBkZXRhaWxcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0TG1zRXJyb3JNZXNzYWdlRGV0YWlscyhlcnJvck51bWJlciwgZGV0YWlsKSB7XG4gICAgbGV0IGJhc2ljTWVzc2FnZSA9ICcnO1xuICAgIGxldCBkZXRhaWxNZXNzYWdlID0gJyc7XG5cbiAgICAvLyBTZXQgZXJyb3IgbnVtYmVyIHRvIHN0cmluZyBzaW5jZSBpbmNvbnNpc3RlbnQgZnJvbSBtb2R1bGVzIGlmIHN0cmluZyBvciBudW1iZXJcbiAgICBlcnJvck51bWJlciA9IFN0cmluZyhlcnJvck51bWJlcik7XG4gICAgaWYgKHNjb3JtMjAwNF9jb25zdGFudHMuZXJyb3JfZGVzY3JpcHRpb25zW2Vycm9yTnVtYmVyXSkge1xuICAgICAgYmFzaWNNZXNzYWdlID0gc2Nvcm0yMDA0X2NvbnN0YW50cy5lcnJvcl9kZXNjcmlwdGlvbnNbZXJyb3JOdW1iZXJdLmJhc2ljTWVzc2FnZTtcbiAgICAgIGRldGFpbE1lc3NhZ2UgPSBzY29ybTIwMDRfY29uc3RhbnRzLmVycm9yX2Rlc2NyaXB0aW9uc1tlcnJvck51bWJlcl0uZGV0YWlsTWVzc2FnZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGV0YWlsID8gZGV0YWlsTWVzc2FnZSA6IGJhc2ljTWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0byBzZWUgaWYgYSBjb3JyZWN0X3Jlc3BvbnNlIHZhbHVlIGhhcyBiZWVuIGR1cGxpY2F0ZWRcbiAgICogQHBhcmFtIHtDTUlBcnJheX0gY29ycmVjdF9yZXNwb25zZVxuICAgKiBAcGFyYW0ge251bWJlcn0gY3VycmVudF9pbmRleFxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBjaGVja0R1cGxpY2F0ZWRQYXR0ZXJuID0gKGNvcnJlY3RfcmVzcG9uc2UsIGN1cnJlbnRfaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgY29uc3QgY291bnQgPSBjb3JyZWN0X3Jlc3BvbnNlLl9jb3VudDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50ICYmICFmb3VuZDsgaSsrKSB7XG4gICAgICBpZiAoaSAhPT0gY3VycmVudF9pbmRleCAmJiBjb3JyZWN0X3Jlc3BvbnNlLmNoaWxkQXJyYXlbaV0gPT09IHZhbHVlKSB7XG4gICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVja3MgZm9yIGEgdmFsaWQgY29ycmVjdF9yZXNwb25zZSB2YWx1ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW50ZXJhY3Rpb25fdHlwZVxuICAgKiBAcGFyYW0ge0FycmF5fSBub2Rlc1xuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqL1xuICBjaGVja0NvcnJlY3RSZXNwb25zZVZhbHVlKGludGVyYWN0aW9uX3R5cGUsIG5vZGVzLCB2YWx1ZSkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gY29ycmVjdF9yZXNwb25zZXNbaW50ZXJhY3Rpb25fdHlwZV07XG4gICAgY29uc3QgZm9ybWF0UmVnZXggPSBuZXcgUmVnRXhwKHJlc3BvbnNlLmZvcm1hdCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGggJiYgdGhpcy5sYXN0RXJyb3JDb2RlID09PSAwOyBpKyspIHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbl90eXBlLm1hdGNoKFxuICAgICAgICAgICdeKGZpbGwtaW58bG9uZy1maWxsLWlufG1hdGNoaW5nfHBlcmZvcm1hbmNlfHNlcXVlbmNpbmcpJCcpKSB7XG4gICAgICAgIG5vZGVzW2ldID0gdGhpcy5yZW1vdmVDb3JyZWN0UmVzcG9uc2VQcmVmaXhlcyhub2Rlc1tpXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNwb25zZT8uZGVsaW1pdGVyMikge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBub2Rlc1tpXS5zcGxpdChyZXNwb25zZS5kZWxpbWl0ZXIyKTtcbiAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICBjb25zdCBtYXRjaGVzID0gdmFsdWVzWzBdLm1hdGNoKGZvcm1hdFJlZ2V4KTtcbiAgICAgICAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENIKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF2YWx1ZXNbMV0ubWF0Y2gobmV3IFJlZ0V4cChyZXNwb25zZS5mb3JtYXQyKSkpIHtcbiAgICAgICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlRZUEVfTUlTTUFUQ0gpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSBub2Rlc1tpXS5tYXRjaChmb3JtYXRSZWdleCk7XG4gICAgICAgIGlmICgoIW1hdGNoZXMgJiYgdmFsdWUgIT09ICcnKSB8fFxuICAgICAgICAgICAgKCFtYXRjaGVzICYmIGludGVyYWN0aW9uX3R5cGUgPT09ICd0cnVlLWZhbHNlJykpIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGludGVyYWN0aW9uX3R5cGUgPT09ICdudW1lcmljJyAmJiBub2Rlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBpZiAoTnVtYmVyKG5vZGVzWzBdKSA+IE51bWJlcihub2Rlc1sxXSkpIHtcbiAgICAgICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlRZUEVfTUlTTUFUQ0gpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobm9kZXNbaV0gIT09ICcnICYmIHJlc3BvbnNlLnVuaXF1ZSkge1xuICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGkgJiYgdGhpcy5sYXN0RXJyb3JDb2RlID09PSAwOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZXNbaV0gPT09IG5vZGVzW2pdKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBwcmVmaXhlcyBmcm9tIGNvcnJlY3RfcmVzcG9uc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5vZGVcbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIHJlbW92ZUNvcnJlY3RSZXNwb25zZVByZWZpeGVzKG5vZGUpIHtcbiAgICBsZXQgc2Vlbk9yZGVyID0gZmFsc2U7XG4gICAgbGV0IHNlZW5DYXNlID0gZmFsc2U7XG4gICAgbGV0IHNlZW5MYW5nID0gZmFsc2U7XG5cbiAgICBjb25zdCBwcmVmaXhSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICdeKHsobGFuZ3xjYXNlX21hdHRlcnN8b3JkZXJfbWF0dGVycyk9KFtefV0rKX0pJyk7XG4gICAgbGV0IG1hdGNoZXMgPSBub2RlLm1hdGNoKHByZWZpeFJlZ2V4KTtcbiAgICBsZXQgbGFuZ01hdGNoZXMgPSBudWxsO1xuICAgIHdoaWxlIChtYXRjaGVzKSB7XG4gICAgICBzd2l0Y2ggKG1hdGNoZXNbMl0pIHtcbiAgICAgICAgY2FzZSAnbGFuZyc6XG4gICAgICAgICAgbGFuZ01hdGNoZXMgPSBub2RlLm1hdGNoKHNjb3JtMjAwNF9yZWdleC5DTUlMYW5nY3IpO1xuICAgICAgICAgIGlmIChsYW5nTWF0Y2hlcykge1xuICAgICAgICAgICAgY29uc3QgbGFuZyA9IGxhbmdNYXRjaGVzWzNdO1xuICAgICAgICAgICAgaWYgKGxhbmcgIT09IHVuZGVmaW5lZCAmJiBsYW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgaWYgKFZhbGlkTGFuZ3VhZ2VzW2xhbmcudG9Mb3dlckNhc2UoKV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENIKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZWVuTGFuZyA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Nhc2VfbWF0dGVycyc6XG4gICAgICAgICAgaWYgKCFzZWVuTGFuZyAmJiAhc2Vlbk9yZGVyICYmICFzZWVuQ2FzZSkge1xuICAgICAgICAgICAgaWYgKG1hdGNoZXNbM10gIT09ICd0cnVlJyAmJiBtYXRjaGVzWzNdICE9PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENIKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWVuQ2FzZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ29yZGVyX21hdHRlcnMnOlxuICAgICAgICAgIGlmICghc2VlbkNhc2UgJiYgIXNlZW5MYW5nICYmICFzZWVuT3JkZXIpIHtcbiAgICAgICAgICAgIGlmIChtYXRjaGVzWzNdICE9PSAndHJ1ZScgJiYgbWF0Y2hlc1szXSAhPT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2Vlbk9yZGVyID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIG5vZGUgPSBub2RlLnN1YnN0cihtYXRjaGVzWzFdLmxlbmd0aCk7XG4gICAgICBtYXRjaGVzID0gbm9kZS5tYXRjaChwcmVmaXhSZWdleCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgd2hvbGUgQVBJIHdpdGggYW5vdGhlclxuICAgKiBAcGFyYW0ge1Njb3JtMjAwNEFQSX0gbmV3QVBJXG4gICAqL1xuICByZXBsYWNlV2l0aEFub3RoZXJTY29ybUFQSShuZXdBUEkpIHtcbiAgICAvLyBEYXRhIE1vZGVsXG4gICAgdGhpcy5jbWkgPSBuZXdBUEkuY21pO1xuICAgIHRoaXMuYWRsID0gbmV3QVBJLmFkbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGNtaSBvYmplY3QgdG8gdGhlIHByb3BlciBmb3JtYXQgZm9yIExNUyBjb21taXRcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSB0ZXJtaW5hdGVDb21taXRcbiAgICogQHJldHVybiB7b2JqZWN0fEFycmF5fVxuICAgKi9cbiAgcmVuZGVyQ29tbWl0Q01JKHRlcm1pbmF0ZUNvbW1pdDogYm9vbGVhbikge1xuICAgIGNvbnN0IGNtaUV4cG9ydCA9IHRoaXMucmVuZGVyQ01JVG9KU09OT2JqZWN0KCk7XG5cbiAgICBpZiAodGVybWluYXRlQ29tbWl0KSB7XG4gICAgICBjbWlFeHBvcnQuY21pLnRvdGFsX3RpbWUgPSB0aGlzLmNtaS5nZXRDdXJyZW50VG90YWxUaW1lKCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgY29uc3QgZmxhdHRlbmVkID0gVXRpbGl0aWVzLmZsYXR0ZW4oY21pRXhwb3J0KTtcbiAgICBzd2l0Y2ggKHRoaXMuc2V0dGluZ3MuZGF0YUNvbW1pdEZvcm1hdCkge1xuICAgICAgY2FzZSAnZmxhdHRlbmVkJzpcbiAgICAgICAgcmV0dXJuIFV0aWxpdGllcy5mbGF0dGVuKGNtaUV4cG9ydCk7XG4gICAgICBjYXNlICdwYXJhbXMnOlxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gaW4gZmxhdHRlbmVkKSB7XG4gICAgICAgICAgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwoZmxhdHRlbmVkLCBpdGVtKSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goYCR7aXRlbX09JHtmbGF0dGVuZWRbaXRlbV19YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICBjYXNlICdqc29uJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBjbWlFeHBvcnQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIHN0b3JlIHRoZSBkYXRhIHRvIHRoZSBMTVNcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSB0ZXJtaW5hdGVDb21taXRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgc3RvcmVEYXRhKHRlcm1pbmF0ZUNvbW1pdDogYm9vbGVhbikge1xuICAgIGlmICh0ZXJtaW5hdGVDb21taXQpIHtcbiAgICAgIGlmICh0aGlzLmNtaS5tb2RlID09PSAnbm9ybWFsJykge1xuICAgICAgICBpZiAodGhpcy5jbWkuY3JlZGl0ID09PSAnY3JlZGl0Jykge1xuICAgICAgICAgIGlmICh0aGlzLmNtaS5jb21wbGV0aW9uX3RocmVzaG9sZCAmJiB0aGlzLmNtaS5wcm9ncmVzc19tZWFzdXJlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jbWkucHJvZ3Jlc3NfbWVhc3VyZSA+PSB0aGlzLmNtaS5jb21wbGV0aW9uX3RocmVzaG9sZCkge1xuICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdTZXR0aW5nIENvbXBsZXRpb24gU3RhdHVzOiBDb21wbGV0ZWQnKTtcbiAgICAgICAgICAgICAgdGhpcy5jbWkuY29tcGxldGlvbl9zdGF0dXMgPSAnY29tcGxldGVkJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1NldHRpbmcgQ29tcGxldGlvbiBTdGF0dXM6IEluY29tcGxldGUnKTtcbiAgICAgICAgICAgICAgdGhpcy5jbWkuY29tcGxldGlvbl9zdGF0dXMgPSAnaW5jb21wbGV0ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLmNtaS5zY2FsZWRfcGFzc2luZ19zY29yZSAmJiB0aGlzLmNtaS5zY29yZS5zY2FsZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNtaS5zY29yZS5zY2FsZWQgPj0gdGhpcy5jbWkuc2NhbGVkX3Bhc3Npbmdfc2NvcmUpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygnU2V0dGluZyBTdWNjZXNzIFN0YXR1czogUGFzc2VkJyk7XG4gICAgICAgICAgICAgIHRoaXMuY21pLnN1Y2Nlc3Nfc3RhdHVzID0gJ3Bhc3NlZCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdTZXR0aW5nIFN1Y2Nlc3MgU3RhdHVzOiBGYWlsZWQnKTtcbiAgICAgICAgICAgICAgdGhpcy5jbWkuc3VjY2Vzc19zdGF0dXMgPSAnZmFpbGVkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgbmF2UmVxdWVzdCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmFkbC5uYXYucmVxdWVzdCAhPT0gKHRoaXMuc3RhcnRpbmdEYXRhPy5hZGw/Lm5hdj8ucmVxdWVzdCkgJiZcbiAgICAgICAgdGhpcy5hZGwubmF2LnJlcXVlc3QgIT09ICdfbm9uZV8nKSB7XG4gICAgICB0aGlzLmFkbC5uYXYucmVxdWVzdCA9IGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmFkbC5uYXYucmVxdWVzdCk7XG4gICAgICBuYXZSZXF1ZXN0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21taXRPYmplY3QgPSB0aGlzLnJlbmRlckNvbW1pdENNSSh0ZXJtaW5hdGVDb21taXQgfHxcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5hbHdheXNTZW5kVG90YWxUaW1lKTtcblxuICAgIGlmICh0aGlzLmFwaUxvZ0xldmVsID09PSBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9ERUJVRykge1xuICAgICAgY29uc29sZS5kZWJ1ZygnQ29tbWl0ICh0ZXJtaW5hdGVkOiAnICtcbiAgICAgICAgICAgICh0ZXJtaW5hdGVDb21taXQgPyAneWVzJyA6ICdubycpICsgJyk6ICcpO1xuICAgICAgY29uc29sZS5kZWJ1Zyhjb21taXRPYmplY3QpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5sbXNDb21taXRVcmwpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucHJvY2Vzc0h0dHBSZXF1ZXN0KHRoaXMuc2V0dGluZ3MubG1zQ29tbWl0VXJsLFxuICAgICAgICAgIGNvbW1pdE9iamVjdCwgdGVybWluYXRlQ29tbWl0KTtcblxuICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBhIHNlcXVlbmNpbmcgY2FsbCwgYW5kIHRoZW4gY2FsbCB0aGUgbmVjZXNzYXJ5IEpTXG4gICAgICB7XG4gICAgICAgIGlmIChuYXZSZXF1ZXN0ICYmIHJlc3VsdC5uYXZSZXF1ZXN0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHJlc3VsdC5uYXZSZXF1ZXN0ICE9PSAnJykge1xuICAgICAgICAgIEZ1bmN0aW9uKGBcInVzZSBzdHJpY3RcIjsoKCkgPT4geyAke3Jlc3VsdC5uYXZSZXF1ZXN0fSB9KSgpYCkoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdsb2JhbF9jb25zdGFudHMuU0NPUk1fVFJVRTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIFNjb3JtMTJDTUkgZnJvbSAnLi9zY29ybTEyX2NtaSc7XG5pbXBvcnQge0Jhc2VDTUksIGNoZWNrVmFsaWRGb3JtYXQsIENNSUFycmF5LCBDTUlTY29yZX0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IEFQSUNvbnN0YW50cyBmcm9tICcuLi9jb25zdGFudHMvYXBpX2NvbnN0YW50cyc7XG5pbXBvcnQgUmVnZXggZnJvbSAnLi4vY29uc3RhbnRzL3JlZ2V4JztcbmltcG9ydCBFcnJvckNvZGVzIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9jb2Rlcyc7XG5pbXBvcnQge0FJQ0NWYWxpZGF0aW9uRXJyb3J9IGZyb20gJy4uL2V4Y2VwdGlvbnMnO1xuXG5jb25zdCBhaWNjX2NvbnN0YW50cyA9IEFQSUNvbnN0YW50cy5haWNjO1xuY29uc3QgYWljY19yZWdleCA9IFJlZ2V4LmFpY2M7XG5jb25zdCBhaWNjX2Vycm9yX2NvZGVzID0gRXJyb3JDb2Rlcy5zY29ybTEyO1xuXG4vKipcbiAqIEhlbHBlciBtZXRob2QgZm9yIHRocm93aW5nIFJlYWQgT25seSBlcnJvclxuICovXG5mdW5jdGlvbiB0aHJvd1JlYWRPbmx5RXJyb3IoKSB7XG4gIHRocm93IG5ldyBBSUNDVmFsaWRhdGlvbkVycm9yKGFpY2NfZXJyb3JfY29kZXMuUkVBRF9PTkxZX0VMRU1FTlQpO1xufVxuXG4vKipcbiAqIEhlbHBlciBtZXRob2QsIG5vIHJlYXNvbiB0byBoYXZlIHRvIHBhc3MgdGhlIHNhbWUgZXJyb3IgY29kZXMgZXZlcnkgdGltZVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ2V4UGF0dGVyblxuICogQHBhcmFtIHtib29sZWFufSBhbGxvd0VtcHR5U3RyaW5nXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBjaGVja0FJQ0NWYWxpZEZvcm1hdChcbiAgICB2YWx1ZTogU3RyaW5nLFxuICAgIHJlZ2V4UGF0dGVybjogU3RyaW5nLFxuICAgIGFsbG93RW1wdHlTdHJpbmc/OiBib29sZWFuKSB7XG4gIHJldHVybiBjaGVja1ZhbGlkRm9ybWF0KFxuICAgICAgdmFsdWUsXG4gICAgICByZWdleFBhdHRlcm4sXG4gICAgICBhaWNjX2Vycm9yX2NvZGVzLlRZUEVfTUlTTUFUQ0gsXG4gICAgICBBSUNDVmFsaWRhdGlvbkVycm9yLFxuICAgICAgYWxsb3dFbXB0eVN0cmluZ1xuICApO1xufVxuXG4vKipcbiAqIENNSSBDbGFzcyBmb3IgQUlDQ1xuICovXG5leHBvcnQgY2xhc3MgQ01JIGV4dGVuZHMgU2Nvcm0xMkNNSS5DTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIEFJQ0MgQ01JIG9iamVjdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluaXRpYWxpemVkXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihpbml0aWFsaXplZDogYm9vbGVhbikge1xuICAgIHN1cGVyKGFpY2NfY29uc3RhbnRzLmNtaV9jaGlsZHJlbik7XG5cbiAgICBpZiAoaW5pdGlhbGl6ZWQpIHRoaXMuaW5pdGlhbGl6ZSgpO1xuXG4gICAgdGhpcy5zdHVkZW50X3ByZWZlcmVuY2UgPSBuZXcgQUlDQ1N0dWRlbnRQcmVmZXJlbmNlcygpO1xuICAgIHRoaXMuc3R1ZGVudF9kYXRhID0gbmV3IEFJQ0NDTUlTdHVkZW50RGF0YSgpO1xuICAgIHRoaXMuc3R1ZGVudF9kZW1vZ3JhcGhpY3MgPSBuZXcgQ01JU3R1ZGVudERlbW9ncmFwaGljcygpO1xuICAgIHRoaXMuZXZhbHVhdGlvbiA9IG5ldyBDTUlFdmFsdWF0aW9uKCk7XG4gICAgdGhpcy5wYXRocyA9IG5ldyBDTUlQYXRocygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIENNSSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBpbml0aWFsaXplKCkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLnN0dWRlbnRfcHJlZmVyZW5jZT8uaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuc3R1ZGVudF9kYXRhPy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5zdHVkZW50X2RlbW9ncmFwaGljcz8uaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuZXZhbHVhdGlvbj8uaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMucGF0aHM/LmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaVxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIHN1c3BlbmRfZGF0YTogc3RyaW5nLFxuICAgKiAgICAgIGxhdW5jaF9kYXRhOiBzdHJpbmcsXG4gICAqICAgICAgY29tbWVudHM6IHN0cmluZyxcbiAgICogICAgICBjb21tZW50c19mcm9tX2xtczogc3RyaW5nLFxuICAgKiAgICAgIGNvcmU6IENNSUNvcmUsXG4gICAqICAgICAgb2JqZWN0aXZlczogQ01JT2JqZWN0aXZlcyxcbiAgICogICAgICBzdHVkZW50X2RhdGE6IENNSVN0dWRlbnREYXRhLFxuICAgKiAgICAgIHN0dWRlbnRfcHJlZmVyZW5jZTogQ01JU3R1ZGVudFByZWZlcmVuY2UsXG4gICAqICAgICAgaW50ZXJhY3Rpb25zOiBDTUlJbnRlcmFjdGlvbnMsXG4gICAqICAgICAgcGF0aHM6IENNSVBhdGhzXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdzdXNwZW5kX2RhdGEnOiB0aGlzLnN1c3BlbmRfZGF0YSxcbiAgICAgICdsYXVuY2hfZGF0YSc6IHRoaXMubGF1bmNoX2RhdGEsXG4gICAgICAnY29tbWVudHMnOiB0aGlzLmNvbW1lbnRzLFxuICAgICAgJ2NvbW1lbnRzX2Zyb21fbG1zJzogdGhpcy5jb21tZW50c19mcm9tX2xtcyxcbiAgICAgICdjb3JlJzogdGhpcy5jb3JlLFxuICAgICAgJ29iamVjdGl2ZXMnOiB0aGlzLm9iamVjdGl2ZXMsXG4gICAgICAnc3R1ZGVudF9kYXRhJzogdGhpcy5zdHVkZW50X2RhdGEsXG4gICAgICAnc3R1ZGVudF9wcmVmZXJlbmNlJzogdGhpcy5zdHVkZW50X3ByZWZlcmVuY2UsXG4gICAgICAnc3R1ZGVudF9kZW1vZ3JhcGhpY3MnOiB0aGlzLnN0dWRlbnRfZGVtb2dyYXBoaWNzLFxuICAgICAgJ2ludGVyYWN0aW9ucyc6IHRoaXMuaW50ZXJhY3Rpb25zLFxuICAgICAgJ2V2YWx1YXRpb24nOiB0aGlzLmV2YWx1YXRpb24sXG4gICAgICAncGF0aHMnOiB0aGlzLnBhdGhzLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQUlDQyBFdmFsdWF0aW9uIG9iamVjdFxuICovXG5jbGFzcyBDTUlFdmFsdWF0aW9uIGV4dGVuZHMgQmFzZUNNSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgQUlDQyBFdmFsdWF0aW9uIG9iamVjdFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuY29tbWVudHMgPSBuZXcgQ01JRXZhbHVhdGlvbkNvbW1lbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZCBhZnRlciB0aGUgQ01JIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIGluaXRpYWxpemUoKSB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuY29tbWVudHM/LmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5ldmFsdWF0aW9uIG9iamVjdFxuICAgKiBAcmV0dXJuIHt7Y29tbWVudHM6IENNSUV2YWx1YXRpb25Db21tZW50c319XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnY29tbWVudHMnOiB0aGlzLmNvbW1lbnRzLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIEFJQ0MncyBjbWkuZXZhbHVhdGlvbi5jb21tZW50cyBvYmplY3RcbiAqL1xuY2xhc3MgQ01JRXZhbHVhdGlvbkNvbW1lbnRzIGV4dGVuZHMgQ01JQXJyYXkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIEFJQ0MgRXZhbHVhdGlvbiBDb21tZW50cyBvYmplY3RcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHtcbiAgICAgIGNoaWxkcmVuOiBhaWNjX2NvbnN0YW50cy5jb21tZW50c19jaGlsZHJlbixcbiAgICAgIGVycm9yQ29kZTogYWljY19lcnJvcl9jb2Rlcy5JTlZBTElEX1NFVF9WQUxVRSxcbiAgICAgIGVycm9yQ2xhc3M6IEFJQ0NWYWxpZGF0aW9uRXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTdHVkZW50UHJlZmVyZW5jZXMgY2xhc3MgZm9yIEFJQ0NcbiAqL1xuY2xhc3MgQUlDQ1N0dWRlbnRQcmVmZXJlbmNlcyBleHRlbmRzIFNjb3JtMTJDTUkuQ01JU3R1ZGVudFByZWZlcmVuY2Uge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIEFJQ0MgU3R1ZGVudCBQcmVmZXJlbmNlcyBvYmplY3RcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGFpY2NfY29uc3RhbnRzLnN0dWRlbnRfcHJlZmVyZW5jZV9jaGlsZHJlbik7XG5cbiAgICB0aGlzLndpbmRvd3MgPSBuZXcgQ01JQXJyYXkoe1xuICAgICAgZXJyb3JDb2RlOiBhaWNjX2Vycm9yX2NvZGVzLklOVkFMSURfU0VUX1ZBTFVFLFxuICAgICAgZXJyb3JDbGFzczogQUlDQ1ZhbGlkYXRpb25FcnJvcixcbiAgICAgIGNoaWxkcmVuOiAnJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy53aW5kb3dzPy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAjbGVzc29uX3R5cGUgPSAnJztcbiAgI3RleHRfY29sb3IgPSAnJztcbiAgI3RleHRfbG9jYXRpb24gPSAnJztcbiAgI3RleHRfc2l6ZSA9ICcnO1xuICAjdmlkZW8gPSAnJztcblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbGVzc29uX3R5cGVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxlc3Nvbl90eXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuI2xlc3Nvbl90eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xlc3Nvbl90eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsZXNzb25fdHlwZVxuICAgKi9cbiAgc2V0IGxlc3Nvbl90eXBlKGxlc3Nvbl90eXBlOiBzdHJpbmcpIHtcbiAgICBpZiAoY2hlY2tBSUNDVmFsaWRGb3JtYXQobGVzc29uX3R5cGUsIGFpY2NfcmVnZXguQ01JU3RyaW5nMjU2KSkge1xuICAgICAgdGhpcy4jbGVzc29uX3R5cGUgPSBsZXNzb25fdHlwZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjdGV4dF9jb2xvclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdGV4dF9jb2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiN0ZXh0X2NvbG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RleHRfY29sb3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRfY29sb3JcbiAgICovXG4gIHNldCB0ZXh0X2NvbG9yKHRleHRfY29sb3I6IHN0cmluZykge1xuICAgIGlmIChjaGVja0FJQ0NWYWxpZEZvcm1hdCh0ZXh0X2NvbG9yLCBhaWNjX3JlZ2V4LkNNSVN0cmluZzI1NikpIHtcbiAgICAgIHRoaXMuI3RleHRfY29sb3IgPSB0ZXh0X2NvbG9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0ZXh0X2xvY2F0aW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB0ZXh0X2xvY2F0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuI3RleHRfbG9jYXRpb247XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdGV4dF9sb2NhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dF9sb2NhdGlvblxuICAgKi9cbiAgc2V0IHRleHRfbG9jYXRpb24odGV4dF9sb2NhdGlvbjogc3RyaW5nKSB7XG4gICAgaWYgKGNoZWNrQUlDQ1ZhbGlkRm9ybWF0KHRleHRfbG9jYXRpb24sIGFpY2NfcmVnZXguQ01JU3RyaW5nMjU2KSkge1xuICAgICAgdGhpcy4jdGV4dF9sb2NhdGlvbiA9IHRleHRfbG9jYXRpb247XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3RleHRfc2l6ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdGV4dF9zaXplKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuI3RleHRfc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICN0ZXh0X3NpemVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRfc2l6ZVxuICAgKi9cbiAgc2V0IHRleHRfc2l6ZSh0ZXh0X3NpemU6IHN0cmluZykge1xuICAgIGlmIChjaGVja0FJQ0NWYWxpZEZvcm1hdCh0ZXh0X3NpemUsIGFpY2NfcmVnZXguQ01JU3RyaW5nMjU2KSkge1xuICAgICAgdGhpcy4jdGV4dF9zaXplID0gdGV4dF9zaXplO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN2aWRlb1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdmlkZW8oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy4jdmlkZW87XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdmlkZW9cbiAgICogQHBhcmFtIHtzdHJpbmd9IHZpZGVvXG4gICAqL1xuICBzZXQgdmlkZW8odmlkZW86IHN0cmluZykge1xuICAgIGlmIChjaGVja0FJQ0NWYWxpZEZvcm1hdCh2aWRlbywgYWljY19yZWdleC5DTUlTdHJpbmcyNTYpKSB7XG4gICAgICB0aGlzLiN2aWRlbyA9IHZpZGVvO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5zdHVkZW50X3ByZWZlcmVuY2VcbiAgICpcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBhdWRpbzogc3RyaW5nLFxuICAgKiAgICAgIGxhbmd1YWdlOiBzdHJpbmcsXG4gICAqICAgICAgc3BlZWQ6IHN0cmluZyxcbiAgICogICAgICB0ZXh0OiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ2F1ZGlvJzogdGhpcy5hdWRpbyxcbiAgICAgICdsYW5ndWFnZSc6IHRoaXMubGFuZ3VhZ2UsXG4gICAgICAnbGVzc29uX3R5cGUnOiB0aGlzLmxlc3Nvbl90eXBlLFxuICAgICAgJ3NwZWVkJzogdGhpcy5zcGVlZCxcbiAgICAgICd0ZXh0JzogdGhpcy50ZXh0LFxuICAgICAgJ3RleHRfY29sb3InOiB0aGlzLnRleHRfY29sb3IsXG4gICAgICAndGV4dF9sb2NhdGlvbic6IHRoaXMudGV4dF9sb2NhdGlvbixcbiAgICAgICd0ZXh0X3NpemUnOiB0aGlzLnRleHRfc2l6ZSxcbiAgICAgICd2aWRlbyc6IHRoaXMudmlkZW8sXG4gICAgICAnd2luZG93cyc6IHRoaXMud2luZG93cyxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIFN0dWRlbnREYXRhIGNsYXNzIGZvciBBSUNDXG4gKi9cbmNsYXNzIEFJQ0NDTUlTdHVkZW50RGF0YSBleHRlbmRzIFNjb3JtMTJDTUkuQ01JU3R1ZGVudERhdGEge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIEFJQ0MgU3R1ZGVudERhdGEgb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihhaWNjX2NvbnN0YW50cy5zdHVkZW50X2RhdGFfY2hpbGRyZW4pO1xuXG4gICAgdGhpcy50cmllcyA9IG5ldyBDTUlUcmllcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIENNSSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBpbml0aWFsaXplKCkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLnRyaWVzPy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAjdHJpZXNfZHVyaW5nX2xlc3NvbiA9ICcnO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yIHRyaWVzX2R1cmluZ19sZXNzb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHRyaWVzX2R1cmluZ19sZXNzb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RyaWVzX2R1cmluZ19sZXNzb247XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdHJpZXNfZHVyaW5nX2xlc3Nvbi4gU2V0cyBhbiBlcnJvciBpZiB0cnlpbmcgdG8gc2V0IGFmdGVyXG4gICAqICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyaWVzX2R1cmluZ19sZXNzb25cbiAgICovXG4gIHNldCB0cmllc19kdXJpbmdfbGVzc29uKHRyaWVzX2R1cmluZ19sZXNzb24pIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICAgIHRoaXMuI3RyaWVzX2R1cmluZ19sZXNzb24gPSB0cmllc19kdXJpbmdfbGVzc29uIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuc3R1ZGVudF9kYXRhIG9iamVjdFxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIG1hc3Rlcnlfc2NvcmU6IHN0cmluZyxcbiAgICogICAgICBtYXhfdGltZV9hbGxvd2VkOiBzdHJpbmcsXG4gICAqICAgICAgdGltZV9saW1pdF9hY3Rpb246IHN0cmluZyxcbiAgICogICAgICB0cmllczogQ01JVHJpZXNcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ21hc3Rlcnlfc2NvcmUnOiB0aGlzLm1hc3Rlcnlfc2NvcmUsXG4gICAgICAnbWF4X3RpbWVfYWxsb3dlZCc6IHRoaXMubWF4X3RpbWVfYWxsb3dlZCxcbiAgICAgICd0aW1lX2xpbWl0X2FjdGlvbic6IHRoaXMudGltZV9saW1pdF9hY3Rpb24sXG4gICAgICAndHJpZXMnOiB0aGlzLnRyaWVzLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIHRoZSBBSUNDIGNtaS5zdHVkZW50X2RlbW9ncmFwaGljcyBvYmplY3RcbiAqL1xuZXhwb3J0IGNsYXNzIENNSVN0dWRlbnREZW1vZ3JhcGhpY3MgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBBSUNDIFN0dWRlbnREZW1vZ3JhcGhpY3Mgb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgI19jaGlsZHJlbiA9IGFpY2NfY29uc3RhbnRzLnN0dWRlbnRfZGVtb2dyYXBoaWNzX2NoaWxkcmVuO1xuICAjY2l0eSA9ICcnO1xuICAjY2xhc3MgPSAnJztcbiAgI2NvbXBhbnkgPSAnJztcbiAgI2NvdW50cnkgPSAnJztcbiAgI2V4cGVyaWVuY2UgPSAnJztcbiAgI2ZhbWlsaWFyX25hbWUgPSAnJztcbiAgI2luc3RydWN0b3JfbmFtZSA9ICcnO1xuICAjdGl0bGUgPSAnJztcbiAgI25hdGl2ZV9sYW5ndWFnZSA9ICcnO1xuICAjc3RhdGUgPSAnJztcbiAgI3N0cmVldF9hZGRyZXNzID0gJyc7XG4gICN0ZWxlcGhvbmUgPSAnJztcbiAgI3llYXJzX2V4cGVyaWVuY2UgPSAnJztcblxuICAvKipcbiAgICogR2V0dGVyIGZvciBfY2hpbGRyZW5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IF9jaGlsZHJlbigpIHtcbiAgICByZXR1cm4gdGhpcy4jX2NoaWxkcmVuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgY2l0eVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgY2l0eSgpIHtcbiAgICByZXR1cm4gdGhpcy4jY2l0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNjaXR5LiBTZXRzIGFuIGVycm9yIGlmIHRyeWluZyB0byBzZXQgYWZ0ZXJcbiAgICogIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2l0eVxuICAgKi9cbiAgc2V0IGNpdHkoY2l0eSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgICAgdGhpcy4jY2l0eSA9IGNpdHkgOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yIGNsYXNzXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBjbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy4jY2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjY2xhc3MuIFNldHMgYW4gZXJyb3IgaWYgdHJ5aW5nIHRvIHNldCBhZnRlclxuICAgKiAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6elxuICAgKi9cbiAgc2V0IGNsYXNzKGNsYXp6KSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiNjbGFzcyA9IGNsYXp6IDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciBjb21wYW55XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBjb21wYW55KCkge1xuICAgIHJldHVybiB0aGlzLiNjb21wYW55O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2NvbXBhbnkuIFNldHMgYW4gZXJyb3IgaWYgdHJ5aW5nIHRvIHNldCBhZnRlclxuICAgKiAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb21wYW55XG4gICAqL1xuICBzZXQgY29tcGFueShjb21wYW55KSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiNjb21wYW55ID0gY29tcGFueSA6XG4gICAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgY291bnRyeVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgY291bnRyeSgpIHtcbiAgICByZXR1cm4gdGhpcy4jY291bnRyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNjb3VudHJ5LiBTZXRzIGFuIGVycm9yIGlmIHRyeWluZyB0byBzZXQgYWZ0ZXJcbiAgICogIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY291bnRyeVxuICAgKi9cbiAgc2V0IGNvdW50cnkoY291bnRyeSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgICAgdGhpcy4jY291bnRyeSA9IGNvdW50cnkgOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yIGV4cGVyaWVuY2VcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGV4cGVyaWVuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2V4cGVyaWVuY2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjZXhwZXJpZW5jZS4gU2V0cyBhbiBlcnJvciBpZiB0cnlpbmcgdG8gc2V0IGFmdGVyXG4gICAqICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVyaWVuY2VcbiAgICovXG4gIHNldCBleHBlcmllbmNlKGV4cGVyaWVuY2UpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICAgIHRoaXMuI2V4cGVyaWVuY2UgPSBleHBlcmllbmNlIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciBmYW1pbGlhcl9uYW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBmYW1pbGlhcl9uYW1lKCkge1xuICAgIHJldHVybiB0aGlzLiNmYW1pbGlhcl9uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2ZhbWlsaWFyX25hbWUuIFNldHMgYW4gZXJyb3IgaWYgdHJ5aW5nIHRvIHNldCBhZnRlclxuICAgKiAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmYW1pbGlhcl9uYW1lXG4gICAqL1xuICBzZXQgZmFtaWxpYXJfbmFtZShmYW1pbGlhcl9uYW1lKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiNmYW1pbGlhcl9uYW1lID0gZmFtaWxpYXJfbmFtZSA6XG4gICAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgaW5zdHJ1Y3Rvcl9uYW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBpbnN0cnVjdG9yX25hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2luc3RydWN0b3JfbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNpbnN0cnVjdG9yX25hbWUuIFNldHMgYW4gZXJyb3IgaWYgdHJ5aW5nIHRvIHNldCBhZnRlclxuICAgKiAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0cnVjdG9yX25hbWVcbiAgICovXG4gIHNldCBpbnN0cnVjdG9yX25hbWUoaW5zdHJ1Y3Rvcl9uYW1lKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiNpbnN0cnVjdG9yX25hbWUgPSBpbnN0cnVjdG9yX25hbWUgOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yIHRpdGxlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB0aXRsZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jdGl0bGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdGl0bGUuIFNldHMgYW4gZXJyb3IgaWYgdHJ5aW5nIHRvIHNldCBhZnRlclxuICAgKiAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZVxuICAgKi9cbiAgc2V0IHRpdGxlKHRpdGxlKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiN0aXRsZSA9IHRpdGxlIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciBuYXRpdmVfbGFuZ3VhZ2VcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG5hdGl2ZV9sYW5ndWFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jbmF0aXZlX2xhbmd1YWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI25hdGl2ZV9sYW5ndWFnZS4gU2V0cyBhbiBlcnJvciBpZiB0cnlpbmcgdG8gc2V0IGFmdGVyXG4gICAqICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hdGl2ZV9sYW5ndWFnZVxuICAgKi9cbiAgc2V0IG5hdGl2ZV9sYW5ndWFnZShuYXRpdmVfbGFuZ3VhZ2UpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICAgIHRoaXMuI25hdGl2ZV9sYW5ndWFnZSA9IG5hdGl2ZV9sYW5ndWFnZSA6XG4gICAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3Igc3RhdGVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHN0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLiNzdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzdGF0ZS4gU2V0cyBhbiBlcnJvciBpZiB0cnlpbmcgdG8gc2V0IGFmdGVyXG4gICAqICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0YXRlXG4gICAqL1xuICBzZXQgc3RhdGUoc3RhdGUpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICAgIHRoaXMuI3N0YXRlID0gc3RhdGUgOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yIHN0cmVldF9hZGRyZXNzXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzdHJlZXRfYWRkcmVzcygpIHtcbiAgICByZXR1cm4gdGhpcy4jc3RyZWV0X2FkZHJlc3M7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc3RyZWV0X2FkZHJlc3MuIFNldHMgYW4gZXJyb3IgaWYgdHJ5aW5nIHRvIHNldCBhZnRlclxuICAgKiAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJlZXRfYWRkcmVzc1xuICAgKi9cbiAgc2V0IHN0cmVldF9hZGRyZXNzKHN0cmVldF9hZGRyZXNzKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiNzdHJlZXRfYWRkcmVzcyA9IHN0cmVldF9hZGRyZXNzIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciB0ZWxlcGhvbmVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHRlbGVwaG9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jdGVsZXBob25lO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RlbGVwaG9uZS4gU2V0cyBhbiBlcnJvciBpZiB0cnlpbmcgdG8gc2V0IGFmdGVyXG4gICAqICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlbGVwaG9uZVxuICAgKi9cbiAgc2V0IHRlbGVwaG9uZSh0ZWxlcGhvbmUpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICAgIHRoaXMuI3RlbGVwaG9uZSA9IHRlbGVwaG9uZSA6XG4gICAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgeWVhcnNfZXhwZXJpZW5jZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgeWVhcnNfZXhwZXJpZW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jeWVhcnNfZXhwZXJpZW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICN5ZWFyc19leHBlcmllbmNlLiBTZXRzIGFuIGVycm9yIGlmIHRyeWluZyB0byBzZXQgYWZ0ZXJcbiAgICogIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30geWVhcnNfZXhwZXJpZW5jZVxuICAgKi9cbiAgc2V0IHllYXJzX2V4cGVyaWVuY2UoeWVhcnNfZXhwZXJpZW5jZSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgICAgdGhpcy4jeWVhcnNfZXhwZXJpZW5jZSA9IHllYXJzX2V4cGVyaWVuY2UgOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5zdHVkZW50X2RlbW9ncmFwaGljcyBvYmplY3RcbiAgICogQHJldHVybiB7XG4gICAqICAgICAge1xuICAgKiAgICAgICAgY2l0eTogc3RyaW5nLFxuICAgKiAgICAgICAgY2xhc3M6IHN0cmluZyxcbiAgICogICAgICAgIGNvbXBhbnk6IHN0cmluZyxcbiAgICogICAgICAgIGNvdW50cnk6IHN0cmluZyxcbiAgICogICAgICAgIGV4cGVyaWVuY2U6IHN0cmluZyxcbiAgICogICAgICAgIGZhbWlsaWFyX25hbWU6IHN0cmluZyxcbiAgICogICAgICAgIGluc3RydWN0b3JfbmFtZTogc3RyaW5nLFxuICAgKiAgICAgICAgdGl0bGU6IHN0cmluZyxcbiAgICogICAgICAgIG5hdGl2ZV9sYW5ndWFnZTogc3RyaW5nLFxuICAgKiAgICAgICAgc3RhdGU6IHN0cmluZyxcbiAgICogICAgICAgIHN0cmVldF9hZGRyZXNzOiBzdHJpbmcsXG4gICAqICAgICAgICB0ZWxlcGhvbmU6IHN0cmluZyxcbiAgICogICAgICAgIHllYXJzX2V4cGVyaWVuY2U6IHN0cmluZ1xuICAgKiAgICAgIH1cbiAgICogICAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ2NpdHknOiB0aGlzLmNpdHksXG4gICAgICAnY2xhc3MnOiB0aGlzLmNsYXNzLFxuICAgICAgJ2NvbXBhbnknOiB0aGlzLmNvbXBhbnksXG4gICAgICAnY291bnRyeSc6IHRoaXMuY291bnRyeSxcbiAgICAgICdleHBlcmllbmNlJzogdGhpcy5leHBlcmllbmNlLFxuICAgICAgJ2ZhbWlsaWFyX25hbWUnOiB0aGlzLmZhbWlsaWFyX25hbWUsXG4gICAgICAnaW5zdHJ1Y3Rvcl9uYW1lJzogdGhpcy5pbnN0cnVjdG9yX25hbWUsXG4gICAgICAndGl0bGUnOiB0aGlzLnRpdGxlLFxuICAgICAgJ25hdGl2ZV9sYW5ndWFnZSc6IHRoaXMubmF0aXZlX2xhbmd1YWdlLFxuICAgICAgJ3N0YXRlJzogdGhpcy5zdGF0ZSxcbiAgICAgICdzdHJlZXRfYWRkcmVzcyc6IHRoaXMuc3RyZWV0X2FkZHJlc3MsXG4gICAgICAndGVsZXBob25lJzogdGhpcy50ZWxlcGhvbmUsXG4gICAgICAneWVhcnNfZXhwZXJpZW5jZSc6IHRoaXMueWVhcnNfZXhwZXJpZW5jZSxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyB0aGUgQUlDQyBjbWkucGF0aHMgb2JqZWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlQYXRocyBleHRlbmRzIENNSUFycmF5IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBpbmxpbmUgUGF0aHMgQXJyYXkgY2xhc3NcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHtjaGlsZHJlbjogYWljY19jb25zdGFudHMucGF0aHNfY2hpbGRyZW59KTtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIGZvciBBSUNDIFBhdGhzXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlQYXRoc09iamVjdCBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIEFJQ0MgUGF0aHMgb2JqZWN0c1xuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gICNsb2NhdGlvbl9pZCA9ICcnO1xuICAjZGF0ZSA9ICcnO1xuICAjdGltZSA9ICcnO1xuICAjc3RhdHVzID0gJyc7XG4gICN3aHlfbGVmdCA9ICcnO1xuICAjdGltZV9pbl9lbGVtZW50ID0gJyc7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xvY2F0aW9uX2lkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsb2NhdGlvbl9pZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jbG9jYXRpb25faWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbG9jYXRpb25faWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uX2lkXG4gICAqL1xuICBzZXQgbG9jYXRpb25faWQobG9jYXRpb25faWQpIHtcbiAgICBpZiAoY2hlY2tBSUNDVmFsaWRGb3JtYXQobG9jYXRpb25faWQsIGFpY2NfcmVnZXguQ01JU3RyaW5nMjU2KSkge1xuICAgICAgdGhpcy4jbG9jYXRpb25faWQgPSBsb2NhdGlvbl9pZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjZGF0ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jZGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNkYXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRlXG4gICAqL1xuICBzZXQgZGF0ZShkYXRlKSB7XG4gICAgaWYgKGNoZWNrQUlDQ1ZhbGlkRm9ybWF0KGRhdGUsIGFpY2NfcmVnZXguQ01JU3RyaW5nMjU2KSkge1xuICAgICAgdGhpcy4jZGF0ZSA9IGRhdGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3RpbWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RpbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGltZVxuICAgKi9cbiAgc2V0IHRpbWUodGltZSkge1xuICAgIGlmIChjaGVja0FJQ0NWYWxpZEZvcm1hdCh0aW1lLCBhaWNjX3JlZ2V4LkNNSVRpbWUpKSB7XG4gICAgICB0aGlzLiN0aW1lID0gdGltZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc3RhdHVzXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N0YXR1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzdGF0dXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0YXR1c1xuICAgKi9cbiAgc2V0IHN0YXR1cyhzdGF0dXMpIHtcbiAgICBpZiAoY2hlY2tBSUNDVmFsaWRGb3JtYXQoc3RhdHVzLCBhaWNjX3JlZ2V4LkNNSVN0YXR1czIpKSB7XG4gICAgICB0aGlzLiNzdGF0dXMgPSBzdGF0dXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3doeV9sZWZ0XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB3aHlfbGVmdCgpIHtcbiAgICByZXR1cm4gdGhpcy4jd2h5X2xlZnQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjd2h5X2xlZnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHdoeV9sZWZ0XG4gICAqL1xuICBzZXQgd2h5X2xlZnQod2h5X2xlZnQpIHtcbiAgICBpZiAoY2hlY2tBSUNDVmFsaWRGb3JtYXQod2h5X2xlZnQsIGFpY2NfcmVnZXguQ01JU3RyaW5nMjU2KSkge1xuICAgICAgdGhpcy4jd2h5X2xlZnQgPSB3aHlfbGVmdDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjdGltZV9pbl9lbGVtZW50XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB0aW1lX2luX2VsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RpbWVfaW5fZWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICN0aW1lX2luX2VsZW1lbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWVfaW5fZWxlbWVudFxuICAgKi9cbiAgc2V0IHRpbWVfaW5fZWxlbWVudCh0aW1lX2luX2VsZW1lbnQpIHtcbiAgICBpZiAoY2hlY2tBSUNDVmFsaWRGb3JtYXQodGltZV9pbl9lbGVtZW50LCBhaWNjX3JlZ2V4LkNNSVRpbWUpKSB7XG4gICAgICB0aGlzLiN0aW1lX2luX2VsZW1lbnQgPSB0aW1lX2luX2VsZW1lbnQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLnBhdGhzLm4gb2JqZWN0XG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgbG9jYXRpb25faWQ6IHN0cmluZyxcbiAgICogICAgICBkYXRlOiBzdHJpbmcsXG4gICAqICAgICAgdGltZTogc3RyaW5nLFxuICAgKiAgICAgIHN0YXR1czogc3RyaW5nLFxuICAgKiAgICAgIHdoeV9sZWZ0OiBzdHJpbmcsXG4gICAqICAgICAgdGltZV9pbl9lbGVtZW50OiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ2xvY2F0aW9uX2lkJzogdGhpcy5sb2NhdGlvbl9pZCxcbiAgICAgICdkYXRlJzogdGhpcy5kYXRlLFxuICAgICAgJ3RpbWUnOiB0aGlzLnRpbWUsXG4gICAgICAnc3RhdHVzJzogdGhpcy5zdGF0dXMsXG4gICAgICAnd2h5X2xlZnQnOiB0aGlzLndoeV9sZWZ0LFxuICAgICAgJ3RpbWVfaW5fZWxlbWVudCc6IHRoaXMudGltZV9pbl9lbGVtZW50LFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIHRoZSBBSUNDIGNtaS5zdHVkZW50X2RhdGEudHJpZXMgb2JqZWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlUcmllcyBleHRlbmRzIENNSUFycmF5IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBpbmxpbmUgVHJpZXMgQXJyYXkgY2xhc3NcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHtjaGlsZHJlbjogYWljY19jb25zdGFudHMudHJpZXNfY2hpbGRyZW59KTtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIGZvciBBSUNDIFRyaWVzXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlUcmllc09iamVjdCBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIEFJQ0MgVHJpZXMgb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5zY29yZSA9IG5ldyBDTUlTY29yZShcbiAgICAgICAge1xuICAgICAgICAgIHNjb3JlX2NoaWxkcmVuOiBhaWNjX2NvbnN0YW50cy5zY29yZV9jaGlsZHJlbixcbiAgICAgICAgICBzY29yZV9yYW5nZTogYWljY19yZWdleC5zY29yZV9yYW5nZSxcbiAgICAgICAgICBpbnZhbGlkRXJyb3JDb2RlOiBhaWNjX2Vycm9yX2NvZGVzLklOVkFMSURfU0VUX1ZBTFVFLFxuICAgICAgICAgIGludmFsaWRUeXBlQ29kZTogYWljY19lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENILFxuICAgICAgICAgIGludmFsaWRSYW5nZUNvZGU6IGFpY2NfZXJyb3JfY29kZXMuVkFMVUVfT1VUX09GX1JBTkdFLFxuICAgICAgICAgIGVycm9yQ2xhc3M6IEFJQ0NWYWxpZGF0aW9uRXJyb3IsXG4gICAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIENNSSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBpbml0aWFsaXplKCkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLnNjb3JlPy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAjc3RhdHVzID0gJyc7XG4gICN0aW1lID0gJyc7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3N0YXR1c1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgc3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLiNzdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc3RhdHVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0dXNcbiAgICovXG4gIHNldCBzdGF0dXMoc3RhdHVzKSB7XG4gICAgaWYgKGNoZWNrQUlDQ1ZhbGlkRm9ybWF0KHN0YXR1cywgYWljY19yZWdleC5DTUlTdGF0dXMyKSkge1xuICAgICAgdGhpcy4jc3RhdHVzID0gc3RhdHVzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0aW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB0aW1lKCkge1xuICAgIHJldHVybiB0aGlzLiN0aW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWVcbiAgICovXG4gIHNldCB0aW1lKHRpbWUpIHtcbiAgICBpZiAoY2hlY2tBSUNDVmFsaWRGb3JtYXQodGltZSwgYWljY19yZWdleC5DTUlUaW1lKSkge1xuICAgICAgdGhpcy4jdGltZSA9IHRpbWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLnN0dWRlbnRfZGF0YS50cmllcy5uIG9iamVjdFxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIHN0YXR1czogc3RyaW5nLFxuICAgKiAgICAgIHRpbWU6IHN0cmluZyxcbiAgICogICAgICBzY29yZTogQ01JU2NvcmVcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ3N0YXR1cyc6IHRoaXMuc3RhdHVzLFxuICAgICAgJ3RpbWUnOiB0aGlzLnRpbWUsXG4gICAgICAnc2NvcmUnOiB0aGlzLnNjb3JlLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgZm9yIGNtaS5zdHVkZW50X2RhdGEuYXR0ZW1wdF9yZWNvcmRzIGFycmF5XG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlBdHRlbXB0UmVjb3JkcyBleHRlbmRzIENNSUFycmF5IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBpbmxpbmUgVHJpZXMgQXJyYXkgY2xhc3NcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHtjaGlsZHJlbjogYWljY19jb25zdGFudHMuYXR0ZW1wdF9yZWNvcmRzX2NoaWxkcmVufSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyBmb3IgQUlDQyBBdHRlbXB0IFJlY29yZHNcbiAqL1xuZXhwb3J0IGNsYXNzIENNSUF0dGVtcHRSZWNvcmRzT2JqZWN0IGV4dGVuZHMgQmFzZUNNSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgQUlDQyBBdHRlbXB0IFJlY29yZHMgb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5zY29yZSA9IG5ldyBDTUlTY29yZShcbiAgICAgICAge1xuICAgICAgICAgIHNjb3JlX2NoaWxkcmVuOiBhaWNjX2NvbnN0YW50cy5zY29yZV9jaGlsZHJlbixcbiAgICAgICAgICBzY29yZV9yYW5nZTogYWljY19yZWdleC5zY29yZV9yYW5nZSxcbiAgICAgICAgICBpbnZhbGlkRXJyb3JDb2RlOiBhaWNjX2Vycm9yX2NvZGVzLklOVkFMSURfU0VUX1ZBTFVFLFxuICAgICAgICAgIGludmFsaWRUeXBlQ29kZTogYWljY19lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENILFxuICAgICAgICAgIGludmFsaWRSYW5nZUNvZGU6IGFpY2NfZXJyb3JfY29kZXMuVkFMVUVfT1VUX09GX1JBTkdFLFxuICAgICAgICAgIGVycm9yQ2xhc3M6IEFJQ0NWYWxpZGF0aW9uRXJyb3IsXG4gICAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIENNSSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBpbml0aWFsaXplKCkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLnNjb3JlPy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAjbGVzc29uX3N0YXR1cyA9ICcnO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsZXNzb25fc3RhdHVzXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsZXNzb25fc3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLiNsZXNzb25fc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xlc3Nvbl9zdGF0dXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxlc3Nvbl9zdGF0dXNcbiAgICovXG4gIHNldCBsZXNzb25fc3RhdHVzKGxlc3Nvbl9zdGF0dXMpIHtcbiAgICBpZiAoY2hlY2tBSUNDVmFsaWRGb3JtYXQobGVzc29uX3N0YXR1cywgYWljY19yZWdleC5DTUlTdGF0dXMyKSkge1xuICAgICAgdGhpcy4jbGVzc29uX3N0YXR1cyA9IGxlc3Nvbl9zdGF0dXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLnN0dWRlbnRfZGF0YS5hdHRlbXB0X3JlY29yZHMubiBvYmplY3RcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBzdGF0dXM6IHN0cmluZyxcbiAgICogICAgICB0aW1lOiBzdHJpbmcsXG4gICAqICAgICAgc2NvcmU6IENNSVNjb3JlXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdsZXNzb25fc3RhdHVzJzogdGhpcy5sZXNzb25fc3RhdHVzLFxuICAgICAgJ3Njb3JlJzogdGhpcy5zY29yZSxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIGZvciBBSUNDIEV2YWx1YXRpb24gQ29tbWVudHNcbiAqL1xuZXhwb3J0IGNsYXNzIENNSUV2YWx1YXRpb25Db21tZW50c09iamVjdCBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIEV2YWx1YXRpb24gQ29tbWVudHNcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAjY29udGVudCA9ICcnO1xuICAjbG9jYXRpb24gPSAnJztcbiAgI3RpbWUgPSAnJztcblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjY29udGVudFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgY29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy4jY29udGVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNjb250ZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50XG4gICAqL1xuICBzZXQgY29udGVudChjb250ZW50KSB7XG4gICAgaWYgKGNoZWNrQUlDQ1ZhbGlkRm9ybWF0KGNvbnRlbnQsIGFpY2NfcmVnZXguQ01JU3RyaW5nMjU2KSkge1xuICAgICAgdGhpcy4jY29udGVudCA9IGNvbnRlbnQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xvY2F0aW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsb2NhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy4jbG9jYXRpb247XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbG9jYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uXG4gICAqL1xuICBzZXQgbG9jYXRpb24obG9jYXRpb24pIHtcbiAgICBpZiAoY2hlY2tBSUNDVmFsaWRGb3JtYXQobG9jYXRpb24sIGFpY2NfcmVnZXguQ01JU3RyaW5nMjU2KSkge1xuICAgICAgdGhpcy4jbG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjdGltZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jdGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0aW5nIGZvciAjdGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGltZVxuICAgKi9cbiAgc2V0IHRpbWUodGltZSkge1xuICAgIGlmIChjaGVja0FJQ0NWYWxpZEZvcm1hdCh0aW1lLCBhaWNjX3JlZ2V4LkNNSVRpbWUpKSB7XG4gICAgICB0aGlzLiN0aW1lID0gdGltZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuZXZhdWxhdGlvbi5jb21tZW50cy5uIG9iamVjdFxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGNvbnRlbnQ6IHN0cmluZyxcbiAgICogICAgICBsb2NhdGlvbjogc3RyaW5nLFxuICAgKiAgICAgIHRpbWU6IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnY29udGVudCc6IHRoaXMuY29udGVudCxcbiAgICAgICdsb2NhdGlvbic6IHRoaXMubG9jYXRpb24sXG4gICAgICAndGltZSc6IHRoaXMudGltZSxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIiwiLy8gQGZsb3dcbmltcG9ydCBBUElDb25zdGFudHMgZnJvbSAnLi4vY29uc3RhbnRzL2FwaV9jb25zdGFudHMnO1xuaW1wb3J0IEVycm9yQ29kZXMgZnJvbSAnLi4vY29uc3RhbnRzL2Vycm9yX2NvZGVzJztcbmltcG9ydCBSZWdleCBmcm9tICcuLi9jb25zdGFudHMvcmVnZXgnO1xuXG5jb25zdCBzY29ybTEyX2NvbnN0YW50cyA9IEFQSUNvbnN0YW50cy5zY29ybTEyO1xuY29uc3Qgc2Nvcm0xMl9yZWdleCA9IFJlZ2V4LnNjb3JtMTI7XG5jb25zdCBzY29ybTEyX2Vycm9yX2NvZGVzID0gRXJyb3JDb2Rlcy5zY29ybTEyO1xuXG4vKipcbiAqIENoZWNrIGlmIHRoZSB2YWx1ZSBtYXRjaGVzIHRoZSBwcm9wZXIgZm9ybWF0LiBJZiBub3QsIHRocm93IHByb3BlciBlcnJvciBjb2RlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ2V4UGF0dGVyblxuICogQHBhcmFtIHtudW1iZXJ9IGVycm9yQ29kZVxuICogQHBhcmFtIHtjbGFzc30gZXJyb3JDbGFzc1xuICogQHBhcmFtIHtib29sZWFufSBhbGxvd0VtcHR5U3RyaW5nXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tWYWxpZEZvcm1hdChcbiAgICB2YWx1ZTogU3RyaW5nLFxuICAgIHJlZ2V4UGF0dGVybjogU3RyaW5nLFxuICAgIGVycm9yQ29kZTogbnVtYmVyLFxuICAgIGVycm9yQ2xhc3M6IGZ1bmN0aW9uLFxuICAgIGFsbG93RW1wdHlTdHJpbmc/OiBib29sZWFuKSB7XG4gIGNvbnN0IGZvcm1hdFJlZ2V4ID0gbmV3IFJlZ0V4cChyZWdleFBhdHRlcm4pO1xuICBjb25zdCBtYXRjaGVzID0gdmFsdWUubWF0Y2goZm9ybWF0UmVnZXgpO1xuICBpZiAoYWxsb3dFbXB0eVN0cmluZyAmJiB2YWx1ZSA9PT0gJycpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCAhbWF0Y2hlcyB8fCBtYXRjaGVzWzBdID09PSAnJykge1xuICAgIHRocm93IG5ldyBlcnJvckNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvcihlcnJvckNvZGUpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSB2YWx1ZSBtYXRjaGVzIHRoZSBwcm9wZXIgcmFuZ2UuIElmIG5vdCwgdGhyb3cgcHJvcGVyIGVycm9yIGNvZGUuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IHJhbmdlUGF0dGVyblxuICogQHBhcmFtIHtudW1iZXJ9IGVycm9yQ29kZVxuICogQHBhcmFtIHtjbGFzc30gZXJyb3JDbGFzc1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrVmFsaWRSYW5nZShcbiAgICB2YWx1ZTogYW55LFxuICAgIHJhbmdlUGF0dGVybjogU3RyaW5nLFxuICAgIGVycm9yQ29kZTogbnVtYmVyLFxuICAgIGVycm9yQ2xhc3M6IGZ1bmN0aW9uKSB7XG4gIGNvbnN0IHJhbmdlcyA9IHJhbmdlUGF0dGVybi5zcGxpdCgnIycpO1xuICB2YWx1ZSA9IHZhbHVlICogMS4wO1xuICBpZiAodmFsdWUgPj0gcmFuZ2VzWzBdKSB7XG4gICAgaWYgKChyYW5nZXNbMV0gPT09ICcqJykgfHwgKHZhbHVlIDw9IHJhbmdlc1sxXSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IoZXJyb3JDb2RlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IGVycm9yQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yKGVycm9yQ29kZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBBUEkgY21pIG9iamVjdHNcbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VDTUkge1xuICBqc29uU3RyaW5nID0gZmFsc2U7XG4gICNpbml0aWFsaXplZCA9IGZhbHNlO1xuICAjc3RhcnRfdGltZTtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIEJhc2VDTUksIGp1c3QgbWFya3MgdGhlIGNsYXNzIGFzIGFic3RyYWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAobmV3LnRhcmdldCA9PT0gQmFzZUNNSSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnN0cnVjdCBCYXNlQ01JIGluc3RhbmNlcyBkaXJlY3RseScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNpbml0aWFsaXplZFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZ2V0IGluaXRpYWxpemVkKCkge1xuICAgIHJldHVybiB0aGlzLiNpbml0aWFsaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzdGFydF90aW1lXG4gICAqIEByZXR1cm4ge051bWJlcn1cbiAgICovXG4gIGdldCBzdGFydF90aW1lKCkge1xuICAgIHJldHVybiB0aGlzLiNzdGFydF90aW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIENNSSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBpbml0aWFsaXplKCkge1xuICAgIHRoaXMuI2luaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGxheWVyIHNob3VsZCBvdmVycmlkZSB0aGUgJ3Nlc3Npb25fdGltZScgcHJvdmlkZWQgYnlcbiAgICogdGhlIG1vZHVsZVxuICAgKi9cbiAgc2V0U3RhcnRUaW1lKCkge1xuICAgIHRoaXMuI3N0YXJ0X3RpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgfVxufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNtaSAqLnNjb3JlIG9iamVjdHNcbiAqL1xuZXhwb3J0IGNsYXNzIENNSVNjb3JlIGV4dGVuZHMgQmFzZUNNSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgKi5zY29yZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NvcmVfY2hpbGRyZW5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjb3JlX3JhbmdlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXhcbiAgICogQHBhcmFtIHtudW1iZXJ9IGludmFsaWRFcnJvckNvZGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGludmFsaWRUeXBlQ29kZVxuICAgKiBAcGFyYW0ge251bWJlcn0gaW52YWxpZFJhbmdlQ29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVjaW1hbFJlZ2V4XG4gICAqIEBwYXJhbSB7Y2xhc3N9IGVycm9yQ2xhc3NcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgICAge1xuICAgICAgICBzY29yZV9jaGlsZHJlbixcbiAgICAgICAgc2NvcmVfcmFuZ2UsXG4gICAgICAgIG1heCxcbiAgICAgICAgaW52YWxpZEVycm9yQ29kZSxcbiAgICAgICAgaW52YWxpZFR5cGVDb2RlLFxuICAgICAgICBpbnZhbGlkUmFuZ2VDb2RlLFxuICAgICAgICBkZWNpbWFsUmVnZXgsXG4gICAgICAgIGVycm9yQ2xhc3MsXG4gICAgICB9KSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuI19jaGlsZHJlbiA9IHNjb3JlX2NoaWxkcmVuIHx8XG4gICAgICAgIHNjb3JtMTJfY29uc3RhbnRzLnNjb3JlX2NoaWxkcmVuO1xuICAgIHRoaXMuI19zY29yZV9yYW5nZSA9ICFzY29yZV9yYW5nZSA/IGZhbHNlIDogc2Nvcm0xMl9yZWdleC5zY29yZV9yYW5nZTtcbiAgICB0aGlzLiNtYXggPSAobWF4IHx8IG1heCA9PT0gJycpID8gbWF4IDogJzEwMCc7XG4gICAgdGhpcy4jX2ludmFsaWRfZXJyb3JfY29kZSA9IGludmFsaWRFcnJvckNvZGUgfHxcbiAgICAgICAgc2Nvcm0xMl9lcnJvcl9jb2Rlcy5JTlZBTElEX1NFVF9WQUxVRTtcbiAgICB0aGlzLiNfaW52YWxpZF90eXBlX2NvZGUgPSBpbnZhbGlkVHlwZUNvZGUgfHxcbiAgICAgICAgc2Nvcm0xMl9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENIO1xuICAgIHRoaXMuI19pbnZhbGlkX3JhbmdlX2NvZGUgPSBpbnZhbGlkUmFuZ2VDb2RlIHx8XG4gICAgICAgIHNjb3JtMTJfZXJyb3JfY29kZXMuVkFMVUVfT1VUX09GX1JBTkdFO1xuICAgIHRoaXMuI19kZWNpbWFsX3JlZ2V4ID0gZGVjaW1hbFJlZ2V4IHx8XG4gICAgICAgIHNjb3JtMTJfcmVnZXguQ01JRGVjaW1hbDtcbiAgICB0aGlzLiNfZXJyb3JfY2xhc3MgPSBlcnJvckNsYXNzO1xuICB9XG5cbiAgI19jaGlsZHJlbjtcbiAgI19zY29yZV9yYW5nZTtcbiAgI19pbnZhbGlkX2Vycm9yX2NvZGU7XG4gICNfaW52YWxpZF90eXBlX2NvZGU7XG4gICNfaW52YWxpZF9yYW5nZV9jb2RlO1xuICAjX2RlY2ltYWxfcmVnZXg7XG4gICNfZXJyb3JfY2xhc3M7XG4gICNyYXcgPSAnJztcbiAgI21pbiA9ICcnO1xuICAjbWF4O1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yIF9jaGlsZHJlblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXQgX2NoaWxkcmVuKCkge1xuICAgIHJldHVybiB0aGlzLiNfY2hpbGRyZW47XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciBfY2hpbGRyZW4uIEp1c3QgdGhyb3dzIGFuIGVycm9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gX2NoaWxkcmVuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZXQgX2NoaWxkcmVuKF9jaGlsZHJlbikge1xuICAgIHRocm93IG5ldyB0aGlzLiNfZXJyb3JfY2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yKHRoaXMuI19pbnZhbGlkX2Vycm9yX2NvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3Jhd1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgcmF3KCkge1xuICAgIHJldHVybiB0aGlzLiNyYXc7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjcmF3XG4gICAqIEBwYXJhbSB7c3RyaW5nfSByYXdcbiAgICovXG4gIHNldCByYXcocmF3KSB7XG4gICAgaWYgKGNoZWNrVmFsaWRGb3JtYXQocmF3LCB0aGlzLiNfZGVjaW1hbF9yZWdleCwgdGhpcy4jX2ludmFsaWRfdHlwZV9jb2RlLCB0aGlzLiNfZXJyb3JfY2xhc3MpICYmXG4gICAgICAgICghdGhpcy4jX3Njb3JlX3JhbmdlIHx8XG4gICAgICAgICAgICBjaGVja1ZhbGlkUmFuZ2UocmF3LCB0aGlzLiNfc2NvcmVfcmFuZ2UsIHRoaXMuI19pbnZhbGlkX3JhbmdlX2NvZGUsIHRoaXMuI19lcnJvcl9jbGFzcykpKSB7XG4gICAgICB0aGlzLiNyYXcgPSByYXc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI21pblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbWluKCkge1xuICAgIHJldHVybiB0aGlzLiNtaW47XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbWluXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtaW5cbiAgICovXG4gIHNldCBtaW4obWluKSB7XG4gICAgaWYgKGNoZWNrVmFsaWRGb3JtYXQobWluLCB0aGlzLiNfZGVjaW1hbF9yZWdleCwgdGhpcy4jX2ludmFsaWRfdHlwZV9jb2RlLCB0aGlzLiNfZXJyb3JfY2xhc3MpICYmXG4gICAgICAgICghdGhpcy4jX3Njb3JlX3JhbmdlIHx8XG4gICAgICAgICAgICBjaGVja1ZhbGlkUmFuZ2UobWluLCB0aGlzLiNfc2NvcmVfcmFuZ2UsIHRoaXMuI19pbnZhbGlkX3JhbmdlX2NvZGUsIHRoaXMuI19lcnJvcl9jbGFzcykpKSB7XG4gICAgICB0aGlzLiNtaW4gPSBtaW47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI21heFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbWF4KCkge1xuICAgIHJldHVybiB0aGlzLiNtYXg7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbWF4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXhcbiAgICovXG4gIHNldCBtYXgobWF4KSB7XG4gICAgaWYgKGNoZWNrVmFsaWRGb3JtYXQobWF4LCB0aGlzLiNfZGVjaW1hbF9yZWdleCwgdGhpcy4jX2ludmFsaWRfdHlwZV9jb2RlLCB0aGlzLiNfZXJyb3JfY2xhc3MpICYmXG4gICAgICAgICghdGhpcy4jX3Njb3JlX3JhbmdlIHx8XG4gICAgICAgICAgICBjaGVja1ZhbGlkUmFuZ2UobWF4LCB0aGlzLiNfc2NvcmVfcmFuZ2UsIHRoaXMuI19pbnZhbGlkX3JhbmdlX2NvZGUsIHRoaXMuI19lcnJvcl9jbGFzcykpKSB7XG4gICAgICB0aGlzLiNtYXggPSBtYXg7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgKi5zY29yZVxuICAgKiBAcmV0dXJuIHt7bWluOiBzdHJpbmcsIG1heDogc3RyaW5nLCByYXc6IHN0cmluZ319XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAncmF3JzogdGhpcy5yYXcsXG4gICAgICAnbWluJzogdGhpcy5taW4sXG4gICAgICAnbWF4JzogdGhpcy5tYXgsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBjbWkgKi5uIG9iamVjdHNcbiAqL1xuZXhwb3J0IGNsYXNzIENNSUFycmF5IGV4dGVuZHMgQmFzZUNNSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBjbWkgKi5uIGFycmF5c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hpbGRyZW5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGVycm9yQ29kZVxuICAgKiBAcGFyYW0ge2NsYXNzfSBlcnJvckNsYXNzXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y2hpbGRyZW4sIGVycm9yQ29kZSwgZXJyb3JDbGFzc30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuI19jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgIHRoaXMuI2Vycm9yQ29kZSA9IGVycm9yQ29kZTtcbiAgICB0aGlzLiNlcnJvckNsYXNzID0gZXJyb3JDbGFzcztcbiAgICB0aGlzLmNoaWxkQXJyYXkgPSBbXTtcbiAgfVxuXG4gICNlcnJvckNvZGU7XG4gICNlcnJvckNsYXNzO1xuICAjX2NoaWxkcmVuO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yIF9jaGlsZHJlblxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0IF9jaGlsZHJlbigpIHtcbiAgICByZXR1cm4gdGhpcy4jX2NoaWxkcmVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgX2NoaWxkcmVuLiBKdXN0IHRocm93cyBhbiBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IF9jaGlsZHJlblxuICAgKi9cbiAgc2V0IF9jaGlsZHJlbihfY2hpbGRyZW4pIHtcbiAgICB0aHJvdyBuZXcgdGhpcy4jZXJyb3JDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IodGhpcy4jZXJyb3JDb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yIF9jb3VudFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgX2NvdW50KCkge1xuICAgIHJldHVybiB0aGlzLmNoaWxkQXJyYXkubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgX2NvdW50LiBKdXN0IHRocm93cyBhbiBlcnJvci5cbiAgICogQHBhcmFtIHtudW1iZXJ9IF9jb3VudFxuICAgKi9cbiAgc2V0IF9jb3VudChfY291bnQpIHtcbiAgICB0aHJvdyBuZXcgdGhpcy4jZXJyb3JDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IodGhpcy4jZXJyb3JDb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yICoubiBhcnJheXNcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdFtpICsgJyddID0gdGhpcy5jaGlsZEFycmF5W2ldO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQge1xuICBCYXNlQ01JLFxuICBjaGVja1ZhbGlkRm9ybWF0LFxuICBjaGVja1ZhbGlkUmFuZ2UsXG4gIENNSUFycmF5LFxuICBDTUlTY29yZSxcbn0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IEFQSUNvbnN0YW50cyBmcm9tICcuLi9jb25zdGFudHMvYXBpX2NvbnN0YW50cyc7XG5pbXBvcnQgRXJyb3JDb2RlcyBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JfY29kZXMnO1xuaW1wb3J0IFJlZ2V4IGZyb20gJy4uL2NvbnN0YW50cy9yZWdleCc7XG5pbXBvcnQge1Njb3JtMTJWYWxpZGF0aW9uRXJyb3J9IGZyb20gJy4uL2V4Y2VwdGlvbnMnO1xuaW1wb3J0ICogYXMgVXRpbGl0aWVzIGZyb20gJy4uL3V0aWxpdGllcyc7XG5pbXBvcnQgKiBhcyBVdGlsIGZyb20gJy4uL3V0aWxpdGllcyc7XG5cbmNvbnN0IHNjb3JtMTJfY29uc3RhbnRzID0gQVBJQ29uc3RhbnRzLnNjb3JtMTI7XG5jb25zdCBzY29ybTEyX3JlZ2V4ID0gUmVnZXguc2Nvcm0xMjtcbmNvbnN0IHNjb3JtMTJfZXJyb3JfY29kZXMgPSBFcnJvckNvZGVzLnNjb3JtMTI7XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCBmb3IgdGhyb3dpbmcgUmVhZCBPbmx5IGVycm9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aHJvd1JlYWRPbmx5RXJyb3IoKSB7XG4gIHRocm93IG5ldyBTY29ybTEyVmFsaWRhdGlvbkVycm9yKHNjb3JtMTJfZXJyb3JfY29kZXMuUkVBRF9PTkxZX0VMRU1FTlQpO1xufVxuXG4vKipcbiAqIEhlbHBlciBtZXRob2QgZm9yIHRocm93aW5nIFdyaXRlIE9ubHkgZXJyb3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRocm93V3JpdGVPbmx5RXJyb3IoKSB7XG4gIHRocm93IG5ldyBTY29ybTEyVmFsaWRhdGlvbkVycm9yKHNjb3JtMTJfZXJyb3JfY29kZXMuV1JJVEVfT05MWV9FTEVNRU5UKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kIGZvciB0aHJvd2luZyBJbnZhbGlkIFNldCBlcnJvclxuICovXG5mdW5jdGlvbiB0aHJvd0ludmFsaWRWYWx1ZUVycm9yKCkge1xuICB0aHJvdyBuZXcgU2Nvcm0xMlZhbGlkYXRpb25FcnJvcihzY29ybTEyX2Vycm9yX2NvZGVzLklOVkFMSURfU0VUX1ZBTFVFKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kLCBubyByZWFzb24gdG8gaGF2ZSB0byBwYXNzIHRoZSBzYW1lIGVycm9yIGNvZGVzIGV2ZXJ5IHRpbWVcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWdleFBhdHRlcm5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dFbXB0eVN0cmluZ1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrMTJWYWxpZEZvcm1hdChcbiAgICB2YWx1ZTogU3RyaW5nLFxuICAgIHJlZ2V4UGF0dGVybjogU3RyaW5nLFxuICAgIGFsbG93RW1wdHlTdHJpbmc/OiBib29sZWFuKSB7XG4gIHJldHVybiBjaGVja1ZhbGlkRm9ybWF0KFxuICAgICAgdmFsdWUsXG4gICAgICByZWdleFBhdHRlcm4sXG4gICAgICBzY29ybTEyX2Vycm9yX2NvZGVzLlRZUEVfTUlTTUFUQ0gsXG4gICAgICBTY29ybTEyVmFsaWRhdGlvbkVycm9yLFxuICAgICAgYWxsb3dFbXB0eVN0cmluZ1xuICApO1xufVxuXG4vKipcbiAqIEhlbHBlciBtZXRob2QsIG5vIHJlYXNvbiB0byBoYXZlIHRvIHBhc3MgdGhlIHNhbWUgZXJyb3IgY29kZXMgZXZlcnkgdGltZVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IHJhbmdlUGF0dGVyblxuICogQHBhcmFtIHtib29sZWFufSBhbGxvd0VtcHR5U3RyaW5nXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2sxMlZhbGlkUmFuZ2UoXG4gICAgdmFsdWU6IGFueSxcbiAgICByYW5nZVBhdHRlcm46IFN0cmluZyxcbiAgICBhbGxvd0VtcHR5U3RyaW5nPzogYm9vbGVhbikge1xuICByZXR1cm4gY2hlY2tWYWxpZFJhbmdlKFxuICAgICAgdmFsdWUsXG4gICAgICByYW5nZVBhdHRlcm4sXG4gICAgICBzY29ybTEyX2Vycm9yX2NvZGVzLlZBTFVFX09VVF9PRl9SQU5HRSxcbiAgICAgIFNjb3JtMTJWYWxpZGF0aW9uRXJyb3IsXG4gICAgICBhbGxvd0VtcHR5U3RyaW5nXG4gICk7XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIHRoZSBjbWkgb2JqZWN0IGZvciBTQ09STSAxLjJcbiAqL1xuZXhwb3J0IGNsYXNzIENNSSBleHRlbmRzIEJhc2VDTUkge1xuICAjX2NoaWxkcmVuID0gJyc7XG4gICNfdmVyc2lvbiA9ICczLjQnO1xuICAjbGF1bmNoX2RhdGEgPSAnJztcbiAgI2NvbW1lbnRzID0gJyc7XG4gICNjb21tZW50c19mcm9tX2xtcyA9ICcnO1xuXG4gIHN0dWRlbnRfZGF0YSA9IG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciB0aGUgU0NPUk0gMS4yIGNtaSBvYmplY3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNtaV9jaGlsZHJlblxuICAgKiBAcGFyYW0geyhDTUlTdHVkZW50RGF0YXxBSUNDQ01JU3R1ZGVudERhdGEpfSBzdHVkZW50X2RhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpbml0aWFsaXplZFxuICAgKi9cbiAgY29uc3RydWN0b3IoY21pX2NoaWxkcmVuLCBzdHVkZW50X2RhdGEsIGluaXRpYWxpemVkOiBib29sZWFuKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGlmIChpbml0aWFsaXplZCkgdGhpcy5pbml0aWFsaXplKCk7XG5cbiAgICB0aGlzLiNfY2hpbGRyZW4gPSBjbWlfY2hpbGRyZW4gP1xuICAgICAgICBjbWlfY2hpbGRyZW4gOlxuICAgICAgICBzY29ybTEyX2NvbnN0YW50cy5jbWlfY2hpbGRyZW47XG4gICAgdGhpcy5jb3JlID0gbmV3IENNSUNvcmUoKTtcbiAgICB0aGlzLm9iamVjdGl2ZXMgPSBuZXcgQ01JT2JqZWN0aXZlcygpO1xuICAgIHRoaXMuc3R1ZGVudF9kYXRhID0gc3R1ZGVudF9kYXRhID8gc3R1ZGVudF9kYXRhIDogbmV3IENNSVN0dWRlbnREYXRhKCk7XG4gICAgdGhpcy5zdHVkZW50X3ByZWZlcmVuY2UgPSBuZXcgQ01JU3R1ZGVudFByZWZlcmVuY2UoKTtcbiAgICB0aGlzLmludGVyYWN0aW9ucyA9IG5ldyBDTUlJbnRlcmFjdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5jb3JlPy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5vYmplY3RpdmVzPy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5zdHVkZW50X2RhdGE/LmluaXRpYWxpemUoKTtcbiAgICB0aGlzLnN0dWRlbnRfcHJlZmVyZW5jZT8uaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuaW50ZXJhY3Rpb25zPy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWlcbiAgICpcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBzdXNwZW5kX2RhdGE6IHN0cmluZyxcbiAgICogICAgICBsYXVuY2hfZGF0YTogc3RyaW5nLFxuICAgKiAgICAgIGNvbW1lbnRzOiBzdHJpbmcsXG4gICAqICAgICAgY29tbWVudHNfZnJvbV9sbXM6IHN0cmluZyxcbiAgICogICAgICBjb3JlOiBDTUlDb3JlLFxuICAgKiAgICAgIG9iamVjdGl2ZXM6IENNSU9iamVjdGl2ZXMsXG4gICAqICAgICAgc3R1ZGVudF9kYXRhOiBDTUlTdHVkZW50RGF0YSxcbiAgICogICAgICBzdHVkZW50X3ByZWZlcmVuY2U6IENNSVN0dWRlbnRQcmVmZXJlbmNlLFxuICAgKiAgICAgIGludGVyYWN0aW9uczogQ01JSW50ZXJhY3Rpb25zXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdzdXNwZW5kX2RhdGEnOiB0aGlzLnN1c3BlbmRfZGF0YSxcbiAgICAgICdsYXVuY2hfZGF0YSc6IHRoaXMubGF1bmNoX2RhdGEsXG4gICAgICAnY29tbWVudHMnOiB0aGlzLmNvbW1lbnRzLFxuICAgICAgJ2NvbW1lbnRzX2Zyb21fbG1zJzogdGhpcy5jb21tZW50c19mcm9tX2xtcyxcbiAgICAgICdjb3JlJzogdGhpcy5jb3JlLFxuICAgICAgJ29iamVjdGl2ZXMnOiB0aGlzLm9iamVjdGl2ZXMsXG4gICAgICAnc3R1ZGVudF9kYXRhJzogdGhpcy5zdHVkZW50X2RhdGEsXG4gICAgICAnc3R1ZGVudF9wcmVmZXJlbmNlJzogdGhpcy5zdHVkZW50X3ByZWZlcmVuY2UsXG4gICAgICAnaW50ZXJhY3Rpb25zJzogdGhpcy5pbnRlcmFjdGlvbnMsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjX3ZlcnNpb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IF92ZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNfdmVyc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNfdmVyc2lvbi4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfdmVyc2lvblxuICAgKi9cbiAgc2V0IF92ZXJzaW9uKF92ZXJzaW9uKSB7XG4gICAgdGhyb3dJbnZhbGlkVmFsdWVFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI19jaGlsZHJlblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgX2NoaWxkcmVuKCkge1xuICAgIHJldHVybiB0aGlzLiNfY2hpbGRyZW47XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjX3ZlcnNpb24uIEp1c3QgdGhyb3dzIGFuIGVycm9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gX2NoaWxkcmVuXG4gICAqL1xuICBzZXQgX2NoaWxkcmVuKF9jaGlsZHJlbikge1xuICAgIHRocm93SW52YWxpZFZhbHVlRXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzdXNwZW5kX2RhdGFcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHN1c3BlbmRfZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb3JlPy5zdXNwZW5kX2RhdGE7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc3VzcGVuZF9kYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdXNwZW5kX2RhdGFcbiAgICovXG4gIHNldCBzdXNwZW5kX2RhdGEoc3VzcGVuZF9kYXRhKSB7XG4gICAgaWYgKHRoaXMuY29yZSkge1xuICAgICAgdGhpcy5jb3JlLnN1c3BlbmRfZGF0YSA9IHN1c3BlbmRfZGF0YTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbGF1bmNoX2RhdGFcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxhdW5jaF9kYXRhKCkge1xuICAgIHJldHVybiB0aGlzLiNsYXVuY2hfZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsYXVuY2hfZGF0YS4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYXVuY2hfZGF0YVxuICAgKi9cbiAgc2V0IGxhdW5jaF9kYXRhKGxhdW5jaF9kYXRhKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgPyB0aGlzLiNsYXVuY2hfZGF0YSA9IGxhdW5jaF9kYXRhIDogdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjY29tbWVudHNcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGNvbW1lbnRzKCkge1xuICAgIHJldHVybiB0aGlzLiNjb21tZW50cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNjb21tZW50c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY29tbWVudHNcbiAgICovXG4gIHNldCBjb21tZW50cyhjb21tZW50cykge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoY29tbWVudHMsIHNjb3JtMTJfcmVnZXguQ01JU3RyaW5nNDA5NiwgdHJ1ZSkpIHtcbiAgICAgIHRoaXMuI2NvbW1lbnRzID0gY29tbWVudHM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2NvbW1lbnRzX2Zyb21fbG1zXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBjb21tZW50c19mcm9tX2xtcygpIHtcbiAgICByZXR1cm4gdGhpcy4jY29tbWVudHNfZnJvbV9sbXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjY29tbWVudHNfZnJvbV9sbXMuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29tbWVudHNfZnJvbV9sbXNcbiAgICovXG4gIHNldCBjb21tZW50c19mcm9tX2xtcyhjb21tZW50c19mcm9tX2xtcykge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgICAgdGhpcy4jY29tbWVudHNfZnJvbV9sbXMgPSBjb21tZW50c19mcm9tX2xtcyA6XG4gICAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiB0aW1lIHRvIHRoZSBleGlzdGluZyB0b3RhbCB0aW1lLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXRDdXJyZW50VG90YWxUaW1lKCkge1xuICAgIHJldHVybiB0aGlzLmNvcmUuZ2V0Q3VycmVudFRvdGFsVGltZSh0aGlzLnN0YXJ0X3RpbWUpO1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIHRoZSBjbWkuY29yZSBvYmplY3RcbiAqIEBleHRlbmRzIEJhc2VDTUlcbiAqL1xuY2xhc3MgQ01JQ29yZSBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5jb3JlXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5zY29yZSA9IG5ldyBDTUlTY29yZShcbiAgICAgICAge1xuICAgICAgICAgIHNjb3JlX2NoaWxkcmVuOiBzY29ybTEyX2NvbnN0YW50cy5zY29yZV9jaGlsZHJlbixcbiAgICAgICAgICBzY29yZV9yYW5nZTogc2Nvcm0xMl9yZWdleC5zY29yZV9yYW5nZSxcbiAgICAgICAgICBpbnZhbGlkRXJyb3JDb2RlOiBzY29ybTEyX2Vycm9yX2NvZGVzLklOVkFMSURfU0VUX1ZBTFVFLFxuICAgICAgICAgIGludmFsaWRUeXBlQ29kZTogc2Nvcm0xMl9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENILFxuICAgICAgICAgIGludmFsaWRSYW5nZUNvZGU6IHNjb3JtMTJfZXJyb3JfY29kZXMuVkFMVUVfT1VUX09GX1JBTkdFLFxuICAgICAgICAgIGVycm9yQ2xhc3M6IFNjb3JtMTJWYWxpZGF0aW9uRXJyb3IsXG4gICAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIENNSSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBpbml0aWFsaXplKCkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLnNjb3JlPy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAjX2NoaWxkcmVuID0gc2Nvcm0xMl9jb25zdGFudHMuY29yZV9jaGlsZHJlbjtcbiAgI3N0dWRlbnRfaWQgPSAnJztcbiAgI3N0dWRlbnRfbmFtZSA9ICcnO1xuICAjbGVzc29uX2xvY2F0aW9uID0gJyc7XG4gICNjcmVkaXQgPSAnJztcbiAgI2xlc3Nvbl9zdGF0dXMgPSAnbm90IGF0dGVtcHRlZCc7XG4gICNlbnRyeSA9ICcnO1xuICAjdG90YWxfdGltZSA9ICcnO1xuICAjbGVzc29uX21vZGUgPSAnbm9ybWFsJztcbiAgI2V4aXQgPSAnJztcbiAgI3Nlc3Npb25fdGltZSA9ICcwMDowMDowMCc7XG4gICNzdXNwZW5kX2RhdGEgPSAnJztcblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjX2NoaWxkcmVuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldCBfY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI19jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNfY2hpbGRyZW4uIEp1c3QgdGhyb3dzIGFuIGVycm9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gX2NoaWxkcmVuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZXQgX2NoaWxkcmVuKF9jaGlsZHJlbikge1xuICAgIHRocm93SW52YWxpZFZhbHVlRXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzdHVkZW50X2lkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzdHVkZW50X2lkKCkge1xuICAgIHJldHVybiB0aGlzLiNzdHVkZW50X2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3N0dWRlbnRfaWQuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3R1ZGVudF9pZFxuICAgKi9cbiAgc2V0IHN0dWRlbnRfaWQoc3R1ZGVudF9pZCkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID8gdGhpcy4jc3R1ZGVudF9pZCA9IHN0dWRlbnRfaWQgOiB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzdHVkZW50X25hbWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHN0dWRlbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jc3R1ZGVudF9uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3N0dWRlbnRfbmFtZS4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHVkZW50X25hbWVcbiAgICovXG4gIHNldCBzdHVkZW50X25hbWUoc3R1ZGVudF9uYW1lKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiNzdHVkZW50X25hbWUgPSBzdHVkZW50X25hbWUgOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsZXNzb25fbG9jYXRpb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxlc3Nvbl9sb2NhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy4jbGVzc29uX2xvY2F0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xlc3Nvbl9sb2NhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGVzc29uX2xvY2F0aW9uXG4gICAqL1xuICBzZXQgbGVzc29uX2xvY2F0aW9uKGxlc3Nvbl9sb2NhdGlvbikge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQobGVzc29uX2xvY2F0aW9uLCBzY29ybTEyX3JlZ2V4LkNNSVN0cmluZzI1NiwgdHJ1ZSkpIHtcbiAgICAgIHRoaXMuI2xlc3Nvbl9sb2NhdGlvbiA9IGxlc3Nvbl9sb2NhdGlvbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjY3JlZGl0XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBjcmVkaXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NyZWRpdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNjcmVkaXQuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY3JlZGl0XG4gICAqL1xuICBzZXQgY3JlZGl0KGNyZWRpdCkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID8gdGhpcy4jY3JlZGl0ID0gY3JlZGl0IDogdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbGVzc29uX3N0YXR1c1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbGVzc29uX3N0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy4jbGVzc29uX3N0YXR1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsZXNzb25fc3RhdHVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsZXNzb25fc3RhdHVzXG4gICAqL1xuICBzZXQgbGVzc29uX3N0YXR1cyhsZXNzb25fc3RhdHVzKSB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQobGVzc29uX3N0YXR1cywgc2Nvcm0xMl9yZWdleC5DTUlTdGF0dXMpKSB7XG4gICAgICAgIHRoaXMuI2xlc3Nvbl9zdGF0dXMgPSBsZXNzb25fc3RhdHVzO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KGxlc3Nvbl9zdGF0dXMsIHNjb3JtMTJfcmVnZXguQ01JU3RhdHVzMikpIHtcbiAgICAgICAgdGhpcy4jbGVzc29uX3N0YXR1cyA9IGxlc3Nvbl9zdGF0dXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2VudHJ5XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBlbnRyeSgpIHtcbiAgICByZXR1cm4gdGhpcy4jZW50cnk7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjZW50cnkuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW50cnlcbiAgICovXG4gIHNldCBlbnRyeShlbnRyeSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID8gdGhpcy4jZW50cnkgPSBlbnRyeSA6IHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3RvdGFsX3RpbWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHRvdGFsX3RpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RvdGFsX3RpbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdG90YWxfdGltZS4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b3RhbF90aW1lXG4gICAqL1xuICBzZXQgdG90YWxfdGltZSh0b3RhbF90aW1lKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgPyB0aGlzLiN0b3RhbF90aW1lID0gdG90YWxfdGltZSA6IHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xlc3Nvbl9tb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsZXNzb25fbW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jbGVzc29uX21vZGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbGVzc29uX21vZGUuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGVzc29uX21vZGVcbiAgICovXG4gIHNldCBsZXNzb25fbW9kZShsZXNzb25fbW9kZSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID8gdGhpcy4jbGVzc29uX21vZGUgPSBsZXNzb25fbW9kZSA6IHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2V4aXQuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgSlNPTiBleHBvcnQuXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBnZXQgZXhpdCgpIHtcbiAgICByZXR1cm4gKCF0aGlzLmpzb25TdHJpbmcpID8gdGhyb3dXcml0ZU9ubHlFcnJvcigpIDogdGhpcy4jZXhpdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNleGl0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleGl0XG4gICAqL1xuICBzZXQgZXhpdChleGl0KSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChleGl0LCBzY29ybTEyX3JlZ2V4LkNNSUV4aXQsIHRydWUpKSB7XG4gICAgICB0aGlzLiNleGl0ID0gZXhpdDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc2Vzc2lvbl90aW1lLiBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIEpTT04gZXhwb3J0LlxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0IHNlc3Npb25fdGltZSgpIHtcbiAgICByZXR1cm4gKCF0aGlzLmpzb25TdHJpbmcpID8gdGhyb3dXcml0ZU9ubHlFcnJvcigpIDogdGhpcy4jc2Vzc2lvbl90aW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3Nlc3Npb25fdGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvbl90aW1lXG4gICAqL1xuICBzZXQgc2Vzc2lvbl90aW1lKHNlc3Npb25fdGltZSkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoc2Vzc2lvbl90aW1lLCBzY29ybTEyX3JlZ2V4LkNNSVRpbWVzcGFuKSkge1xuICAgICAgdGhpcy4jc2Vzc2lvbl90aW1lID0gc2Vzc2lvbl90aW1lO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzdXNwZW5kX2RhdGFcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHN1c3BlbmRfZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy4jc3VzcGVuZF9kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3N1c3BlbmRfZGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VzcGVuZF9kYXRhXG4gICAqL1xuICBzZXQgc3VzcGVuZF9kYXRhKHN1c3BlbmRfZGF0YSkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoc3VzcGVuZF9kYXRhLCBzY29ybTEyX3JlZ2V4LkNNSVN0cmluZzQwOTYsIHRydWUpKSB7XG4gICAgICB0aGlzLiNzdXNwZW5kX2RhdGEgPSBzdXNwZW5kX2RhdGE7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiB0aW1lIHRvIHRoZSBleGlzdGluZyB0b3RhbCB0aW1lLlxuICAgKiBAcGFyYW0ge051bWJlcn0gc3RhcnRfdGltZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXRDdXJyZW50VG90YWxUaW1lKHN0YXJ0X3RpbWU6IE51bWJlcikge1xuICAgIGxldCBzZXNzaW9uVGltZSA9IHRoaXMuI3Nlc3Npb25fdGltZTtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBzdGFydF90aW1lO1xuXG4gICAgaWYgKHR5cGVvZiBzdGFydFRpbWUgIT09ICd1bmRlZmluZWQnICYmIHN0YXJ0VGltZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgc2Vjb25kcyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnRUaW1lO1xuICAgICAgc2Vzc2lvblRpbWUgPSBVdGlsLmdldFNlY29uZHNBc0hITU1TUyhzZWNvbmRzIC8gMTAwMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFV0aWxpdGllcy5hZGRISE1NU1NUaW1lU3RyaW5ncyhcbiAgICAgICAgdGhpcy4jdG90YWxfdGltZSxcbiAgICAgICAgc2Vzc2lvblRpbWUsXG4gICAgICAgIG5ldyBSZWdFeHAoc2Nvcm0xMl9yZWdleC5DTUlUaW1lc3BhbiksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5jb3JlXG4gICAqXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgc3R1ZGVudF9uYW1lOiBzdHJpbmcsXG4gICAqICAgICAgZW50cnk6IHN0cmluZyxcbiAgICogICAgICBleGl0OiBzdHJpbmcsXG4gICAqICAgICAgc2NvcmU6IENNSVNjb3JlLFxuICAgKiAgICAgIHN0dWRlbnRfaWQ6IHN0cmluZyxcbiAgICogICAgICBsZXNzb25fbW9kZTogc3RyaW5nLFxuICAgKiAgICAgIGxlc3Nvbl9sb2NhdGlvbjogc3RyaW5nLFxuICAgKiAgICAgIGxlc3Nvbl9zdGF0dXM6IHN0cmluZyxcbiAgICogICAgICBjcmVkaXQ6IHN0cmluZyxcbiAgICogICAgICBzZXNzaW9uX3RpbWU6ICpcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ3N0dWRlbnRfaWQnOiB0aGlzLnN0dWRlbnRfaWQsXG4gICAgICAnc3R1ZGVudF9uYW1lJzogdGhpcy5zdHVkZW50X25hbWUsXG4gICAgICAnbGVzc29uX2xvY2F0aW9uJzogdGhpcy5sZXNzb25fbG9jYXRpb24sXG4gICAgICAnY3JlZGl0JzogdGhpcy5jcmVkaXQsXG4gICAgICAnbGVzc29uX3N0YXR1cyc6IHRoaXMubGVzc29uX3N0YXR1cyxcbiAgICAgICdlbnRyeSc6IHRoaXMuZW50cnksXG4gICAgICAnbGVzc29uX21vZGUnOiB0aGlzLmxlc3Nvbl9tb2RlLFxuICAgICAgJ2V4aXQnOiB0aGlzLmV4aXQsXG4gICAgICAnc2Vzc2lvbl90aW1lJzogdGhpcy5zZXNzaW9uX3RpbWUsXG4gICAgICAnc2NvcmUnOiB0aGlzLnNjb3JlLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDEuMidzIGNtaS5vYmplY3RpdmVzIG9iamVjdFxuICogQGV4dGVuZHMgQ01JQXJyYXlcbiAqL1xuY2xhc3MgQ01JT2JqZWN0aXZlcyBleHRlbmRzIENNSUFycmF5IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkub2JqZWN0aXZlc1xuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoe1xuICAgICAgY2hpbGRyZW46IHNjb3JtMTJfY29uc3RhbnRzLm9iamVjdGl2ZXNfY2hpbGRyZW4sXG4gICAgICBlcnJvckNvZGU6IHNjb3JtMTJfZXJyb3JfY29kZXMuSU5WQUxJRF9TRVRfVkFMVUUsXG4gICAgICBlcnJvckNsYXNzOiBTY29ybTEyVmFsaWRhdGlvbkVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDEuMidzIGNtaS5zdHVkZW50X2RhdGEgb2JqZWN0XG4gKiBAZXh0ZW5kcyBCYXNlQ01JXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlTdHVkZW50RGF0YSBleHRlbmRzIEJhc2VDTUkge1xuICAjX2NoaWxkcmVuO1xuICAjbWFzdGVyeV9zY29yZSA9ICcnO1xuICAjbWF4X3RpbWVfYWxsb3dlZCA9ICcnO1xuICAjdGltZV9saW1pdF9hY3Rpb24gPSAnJztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5zdHVkZW50X2RhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0dWRlbnRfZGF0YV9jaGlsZHJlblxuICAgKi9cbiAgY29uc3RydWN0b3Ioc3R1ZGVudF9kYXRhX2NoaWxkcmVuKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuI19jaGlsZHJlbiA9IHN0dWRlbnRfZGF0YV9jaGlsZHJlbiA/XG4gICAgICAgIHN0dWRlbnRfZGF0YV9jaGlsZHJlbiA6XG4gICAgICAgIHNjb3JtMTJfY29uc3RhbnRzLnN0dWRlbnRfZGF0YV9jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNfY2hpbGRyZW5cbiAgICogQHJldHVybiB7Kn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldCBfY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI19jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNfY2hpbGRyZW4uIEp1c3QgdGhyb3dzIGFuIGVycm9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gX2NoaWxkcmVuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZXQgX2NoaWxkcmVuKF9jaGlsZHJlbikge1xuICAgIHRocm93SW52YWxpZFZhbHVlRXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNtYXN0ZXJfc2NvcmVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG1hc3Rlcnlfc2NvcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI21hc3Rlcnlfc2NvcmU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbWFzdGVyX3Njb3JlLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hc3Rlcnlfc2NvcmVcbiAgICovXG4gIHNldCBtYXN0ZXJ5X3Njb3JlKG1hc3Rlcnlfc2NvcmUpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICAgIHRoaXMuI21hc3Rlcnlfc2NvcmUgPSBtYXN0ZXJ5X3Njb3JlIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbWF4X3RpbWVfYWxsb3dlZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbWF4X3RpbWVfYWxsb3dlZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jbWF4X3RpbWVfYWxsb3dlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNtYXhfdGltZV9hbGxvd2VkLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1heF90aW1lX2FsbG93ZWRcbiAgICovXG4gIHNldCBtYXhfdGltZV9hbGxvd2VkKG1heF90aW1lX2FsbG93ZWQpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICAgIHRoaXMuI21heF90aW1lX2FsbG93ZWQgPSBtYXhfdGltZV9hbGxvd2VkIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjdGltZV9saW1pdF9hY3Rpb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHRpbWVfbGltaXRfYWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLiN0aW1lX2xpbWl0X2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICN0aW1lX2xpbWl0X2FjdGlvbi4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lX2xpbWl0X2FjdGlvblxuICAgKi9cbiAgc2V0IHRpbWVfbGltaXRfYWN0aW9uKHRpbWVfbGltaXRfYWN0aW9uKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiN0aW1lX2xpbWl0X2FjdGlvbiA9IHRpbWVfbGltaXRfYWN0aW9uIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuc3R1ZGVudF9kYXRhXG4gICAqXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgbWF4X3RpbWVfYWxsb3dlZDogc3RyaW5nLFxuICAgKiAgICAgIHRpbWVfbGltaXRfYWN0aW9uOiBzdHJpbmcsXG4gICAqICAgICAgbWFzdGVyeV9zY29yZTogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdtYXN0ZXJ5X3Njb3JlJzogdGhpcy5tYXN0ZXJ5X3Njb3JlLFxuICAgICAgJ21heF90aW1lX2FsbG93ZWQnOiB0aGlzLm1heF90aW1lX2FsbG93ZWQsXG4gICAgICAndGltZV9saW1pdF9hY3Rpb24nOiB0aGlzLnRpbWVfbGltaXRfYWN0aW9uLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDEuMidzIGNtaS5zdHVkZW50X3ByZWZlcmVuY2Ugb2JqZWN0XG4gKiBAZXh0ZW5kcyBCYXNlQ01JXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlTdHVkZW50UHJlZmVyZW5jZSBleHRlbmRzIEJhc2VDTUkge1xuICAjX2NoaWxkcmVuO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLnN0dWRlbnRfcHJlZmVyZW5jZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3R1ZGVudF9wcmVmZXJlbmNlX2NoaWxkcmVuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzdHVkZW50X3ByZWZlcmVuY2VfY2hpbGRyZW4pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy4jX2NoaWxkcmVuID0gc3R1ZGVudF9wcmVmZXJlbmNlX2NoaWxkcmVuID9cbiAgICAgICAgc3R1ZGVudF9wcmVmZXJlbmNlX2NoaWxkcmVuIDpcbiAgICAgICAgc2Nvcm0xMl9jb25zdGFudHMuc3R1ZGVudF9wcmVmZXJlbmNlX2NoaWxkcmVuO1xuICB9XG5cbiAgI2F1ZGlvID0gJyc7XG4gICNsYW5ndWFnZSA9ICcnO1xuICAjc3BlZWQgPSAnJztcbiAgI3RleHQgPSAnJztcblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjX2NoaWxkcmVuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldCBfY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI19jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNfY2hpbGRyZW4uIEp1c3QgdGhyb3dzIGFuIGVycm9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gX2NoaWxkcmVuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZXQgX2NoaWxkcmVuKF9jaGlsZHJlbikge1xuICAgIHRocm93SW52YWxpZFZhbHVlRXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNhdWRpb1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgYXVkaW8oKSB7XG4gICAgcmV0dXJuIHRoaXMuI2F1ZGlvO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2F1ZGlvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdWRpb1xuICAgKi9cbiAgc2V0IGF1ZGlvKGF1ZGlvKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChhdWRpbywgc2Nvcm0xMl9yZWdleC5DTUlTSW50ZWdlcikgJiZcbiAgICAgICAgY2hlY2sxMlZhbGlkUmFuZ2UoYXVkaW8sIHNjb3JtMTJfcmVnZXguYXVkaW9fcmFuZ2UpKSB7XG4gICAgICB0aGlzLiNhdWRpbyA9IGF1ZGlvO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsYW5ndWFnZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbGFuZ3VhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xhbmd1YWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xhbmd1YWdlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZVxuICAgKi9cbiAgc2V0IGxhbmd1YWdlKGxhbmd1YWdlKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChsYW5ndWFnZSwgc2Nvcm0xMl9yZWdleC5DTUlTdHJpbmcyNTYpKSB7XG4gICAgICB0aGlzLiNsYW5ndWFnZSA9IGxhbmd1YWdlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzcGVlZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgc3BlZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NwZWVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3NwZWVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzcGVlZFxuICAgKi9cbiAgc2V0IHNwZWVkKHNwZWVkKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChzcGVlZCwgc2Nvcm0xMl9yZWdleC5DTUlTSW50ZWdlcikgJiZcbiAgICAgICAgY2hlY2sxMlZhbGlkUmFuZ2Uoc3BlZWQsIHNjb3JtMTJfcmVnZXguc3BlZWRfcmFuZ2UpKSB7XG4gICAgICB0aGlzLiNzcGVlZCA9IHNwZWVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0ZXh0XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB0ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLiN0ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RleHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICovXG4gIHNldCB0ZXh0KHRleHQpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHRleHQsIHNjb3JtMTJfcmVnZXguQ01JU0ludGVnZXIpICYmXG4gICAgICAgIGNoZWNrMTJWYWxpZFJhbmdlKHRleHQsIHNjb3JtMTJfcmVnZXgudGV4dF9yYW5nZSkpIHtcbiAgICAgIHRoaXMuI3RleHQgPSB0ZXh0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5zdHVkZW50X3ByZWZlcmVuY2VcbiAgICpcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBhdWRpbzogc3RyaW5nLFxuICAgKiAgICAgIGxhbmd1YWdlOiBzdHJpbmcsXG4gICAqICAgICAgc3BlZWQ6IHN0cmluZyxcbiAgICogICAgICB0ZXh0OiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ2F1ZGlvJzogdGhpcy5hdWRpbyxcbiAgICAgICdsYW5ndWFnZSc6IHRoaXMubGFuZ3VhZ2UsXG4gICAgICAnc3BlZWQnOiB0aGlzLnNwZWVkLFxuICAgICAgJ3RleHQnOiB0aGlzLnRleHQsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMS4yJ3MgY21pLmludGVyYWN0aW9ucyBvYmplY3RcbiAqIEBleHRlbmRzIEJhc2VDTUlcbiAqL1xuY2xhc3MgQ01JSW50ZXJhY3Rpb25zIGV4dGVuZHMgQ01JQXJyYXkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5pbnRlcmFjdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHtcbiAgICAgIGNoaWxkcmVuOiBzY29ybTEyX2NvbnN0YW50cy5pbnRlcmFjdGlvbnNfY2hpbGRyZW4sXG4gICAgICBlcnJvckNvZGU6IHNjb3JtMTJfZXJyb3JfY29kZXMuSU5WQUxJRF9TRVRfVkFMVUUsXG4gICAgICBlcnJvckNsYXNzOiBTY29ybTEyVmFsaWRhdGlvbkVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDEuMidzIGNtaS5pbnRlcmFjdGlvbnMubiBvYmplY3RcbiAqIEBleHRlbmRzIEJhc2VDTUlcbiAqL1xuZXhwb3J0IGNsYXNzIENNSUludGVyYWN0aW9uc09iamVjdCBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5pbnRlcmFjdGlvbnMubiBvYmplY3RcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLm9iamVjdGl2ZXMgPSBuZXcgQ01JQXJyYXkoe1xuICAgICAgZXJyb3JDb2RlOiBzY29ybTEyX2Vycm9yX2NvZGVzLklOVkFMSURfU0VUX1ZBTFVFLFxuICAgICAgZXJyb3JDbGFzczogU2Nvcm0xMlZhbGlkYXRpb25FcnJvcixcbiAgICAgIGNoaWxkcmVuOiBzY29ybTEyX2NvbnN0YW50cy5vYmplY3RpdmVzX2NoaWxkcmVuLFxuICAgIH0pO1xuICAgIHRoaXMuY29ycmVjdF9yZXNwb25zZXMgPSBuZXcgQ01JQXJyYXkoe1xuICAgICAgZXJyb3JDb2RlOiBzY29ybTEyX2Vycm9yX2NvZGVzLklOVkFMSURfU0VUX1ZBTFVFLFxuICAgICAgZXJyb3JDbGFzczogU2Nvcm0xMlZhbGlkYXRpb25FcnJvcixcbiAgICAgIGNoaWxkcmVuOiBzY29ybTEyX2NvbnN0YW50cy5jb3JyZWN0X3Jlc3BvbnNlc19jaGlsZHJlbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5vYmplY3RpdmVzPy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5jb3JyZWN0X3Jlc3BvbnNlcz8uaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgI2lkID0gJyc7XG4gICN0aW1lID0gJyc7XG4gICN0eXBlID0gJyc7XG4gICN3ZWlnaHRpbmcgPSAnJztcbiAgI3N0dWRlbnRfcmVzcG9uc2UgPSAnJztcbiAgI3Jlc3VsdCA9ICcnO1xuICAjbGF0ZW5jeSA9ICcnO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNpZC4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyBKU09OIGV4cG9ydC5cbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldCBpZCgpIHtcbiAgICByZXR1cm4gKCF0aGlzLmpzb25TdHJpbmcpID8gdGhyb3dXcml0ZU9ubHlFcnJvcigpIDogdGhpcy4jaWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gICAqL1xuICBzZXQgaWQoaWQpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KGlkLCBzY29ybTEyX3JlZ2V4LkNNSUlkZW50aWZpZXIpKSB7XG4gICAgICB0aGlzLiNpZCA9IGlkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0aW1lLiBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIEpTT04gZXhwb3J0LlxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0IHRpbWUoKSB7XG4gICAgcmV0dXJuICghdGhpcy5qc29uU3RyaW5nKSA/IHRocm93V3JpdGVPbmx5RXJyb3IoKSA6IHRoaXMuI3RpbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdGltZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGltZVxuICAgKi9cbiAgc2V0IHRpbWUodGltZSkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQodGltZSwgc2Nvcm0xMl9yZWdleC5DTUlUaW1lKSkge1xuICAgICAgdGhpcy4jdGltZSA9IHRpbWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3R5cGUuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgSlNPTiBleHBvcnQuXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gKCF0aGlzLmpzb25TdHJpbmcpID8gdGhyb3dXcml0ZU9ubHlFcnJvcigpIDogdGhpcy4jdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICN0eXBlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAqL1xuICBzZXQgdHlwZSh0eXBlKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdCh0eXBlLCBzY29ybTEyX3JlZ2V4LkNNSVR5cGUpKSB7XG4gICAgICB0aGlzLiN0eXBlID0gdHlwZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjd2VpZ2h0aW5nLiBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIEpTT04gZXhwb3J0LlxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0IHdlaWdodGluZygpIHtcbiAgICByZXR1cm4gKCF0aGlzLmpzb25TdHJpbmcpID9cbiAgICAgICAgdGhyb3dXcml0ZU9ubHlFcnJvcigpIDpcbiAgICAgICAgdGhpcy4jd2VpZ2h0aW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3dlaWdodGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gd2VpZ2h0aW5nXG4gICAqL1xuICBzZXQgd2VpZ2h0aW5nKHdlaWdodGluZykge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQod2VpZ2h0aW5nLCBzY29ybTEyX3JlZ2V4LkNNSURlY2ltYWwpICYmXG4gICAgICAgIGNoZWNrMTJWYWxpZFJhbmdlKHdlaWdodGluZywgc2Nvcm0xMl9yZWdleC53ZWlnaHRpbmdfcmFuZ2UpKSB7XG4gICAgICB0aGlzLiN3ZWlnaHRpbmcgPSB3ZWlnaHRpbmc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3N0dWRlbnRfcmVzcG9uc2UuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgSlNPTiBleHBvcnQuXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBnZXQgc3R1ZGVudF9yZXNwb25zZSgpIHtcbiAgICByZXR1cm4gKCF0aGlzLmpzb25TdHJpbmcpID8gdGhyb3dXcml0ZU9ubHlFcnJvcigpIDogdGhpcy4jc3R1ZGVudF9yZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzdHVkZW50X3Jlc3BvbnNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHVkZW50X3Jlc3BvbnNlXG4gICAqL1xuICBzZXQgc3R1ZGVudF9yZXNwb25zZShzdHVkZW50X3Jlc3BvbnNlKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChzdHVkZW50X3Jlc3BvbnNlLCBzY29ybTEyX3JlZ2V4LkNNSUZlZWRiYWNrLCB0cnVlKSkge1xuICAgICAgdGhpcy4jc3R1ZGVudF9yZXNwb25zZSA9IHN0dWRlbnRfcmVzcG9uc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3Jlc3VsdC4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyBKU09OIGV4cG9ydC5cbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldCByZXN1bHQoKSB7XG4gICAgcmV0dXJuICghdGhpcy5qc29uU3RyaW5nKSA/IHRocm93V3JpdGVPbmx5RXJyb3IoKSA6IHRoaXMuI3Jlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNyZXN1bHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3VsdFxuICAgKi9cbiAgc2V0IHJlc3VsdChyZXN1bHQpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHJlc3VsdCwgc2Nvcm0xMl9yZWdleC5DTUlSZXN1bHQpKSB7XG4gICAgICB0aGlzLiNyZXN1bHQgPSByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xhdGVuY3kuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgSlNPTiBleHBvcnQuXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBnZXQgbGF0ZW5jeSgpIHtcbiAgICByZXR1cm4gKCF0aGlzLmpzb25TdHJpbmcpID8gdGhyb3dXcml0ZU9ubHlFcnJvcigpIDogdGhpcy4jbGF0ZW5jeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsYXRlbmN5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYXRlbmN5XG4gICAqL1xuICBzZXQgbGF0ZW5jeShsYXRlbmN5KSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChsYXRlbmN5LCBzY29ybTEyX3JlZ2V4LkNNSVRpbWVzcGFuKSkge1xuICAgICAgdGhpcy4jbGF0ZW5jeSA9IGxhdGVuY3k7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLmludGVyYWN0aW9ucy5uXG4gICAqXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgaWQ6IHN0cmluZyxcbiAgICogICAgICB0aW1lOiBzdHJpbmcsXG4gICAqICAgICAgdHlwZTogc3RyaW5nLFxuICAgKiAgICAgIHdlaWdodGluZzogc3RyaW5nLFxuICAgKiAgICAgIHN0dWRlbnRfcmVzcG9uc2U6IHN0cmluZyxcbiAgICogICAgICByZXN1bHQ6IHN0cmluZyxcbiAgICogICAgICBsYXRlbmN5OiBzdHJpbmcsXG4gICAqICAgICAgb2JqZWN0aXZlczogQ01JQXJyYXksXG4gICAqICAgICAgY29ycmVjdF9yZXNwb25zZXM6IENNSUFycmF5XG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdpZCc6IHRoaXMuaWQsXG4gICAgICAndGltZSc6IHRoaXMudGltZSxcbiAgICAgICd0eXBlJzogdGhpcy50eXBlLFxuICAgICAgJ3dlaWdodGluZyc6IHRoaXMud2VpZ2h0aW5nLFxuICAgICAgJ3N0dWRlbnRfcmVzcG9uc2UnOiB0aGlzLnN0dWRlbnRfcmVzcG9uc2UsXG4gICAgICAncmVzdWx0JzogdGhpcy5yZXN1bHQsXG4gICAgICAnbGF0ZW5jeSc6IHRoaXMubGF0ZW5jeSxcbiAgICAgICdvYmplY3RpdmVzJzogdGhpcy5vYmplY3RpdmVzLFxuICAgICAgJ2NvcnJlY3RfcmVzcG9uc2VzJzogdGhpcy5jb3JyZWN0X3Jlc3BvbnNlcyxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAxLjIncyBjbWkub2JqZWN0aXZlcy5uIG9iamVjdFxuICogQGV4dGVuZHMgQmFzZUNNSVxuICovXG5leHBvcnQgY2xhc3MgQ01JT2JqZWN0aXZlc09iamVjdCBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5vYmplY3RpdmVzLm5cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnNjb3JlID0gbmV3IENNSVNjb3JlKFxuICAgICAgICB7XG4gICAgICAgICAgc2NvcmVfY2hpbGRyZW46IHNjb3JtMTJfY29uc3RhbnRzLnNjb3JlX2NoaWxkcmVuLFxuICAgICAgICAgIHNjb3JlX3JhbmdlOiBzY29ybTEyX3JlZ2V4LnNjb3JlX3JhbmdlLFxuICAgICAgICAgIGludmFsaWRFcnJvckNvZGU6IHNjb3JtMTJfZXJyb3JfY29kZXMuSU5WQUxJRF9TRVRfVkFMVUUsXG4gICAgICAgICAgaW52YWxpZFR5cGVDb2RlOiBzY29ybTEyX2Vycm9yX2NvZGVzLlRZUEVfTUlTTUFUQ0gsXG4gICAgICAgICAgaW52YWxpZFJhbmdlQ29kZTogc2Nvcm0xMl9lcnJvcl9jb2Rlcy5WQUxVRV9PVVRfT0ZfUkFOR0UsXG4gICAgICAgICAgZXJyb3JDbGFzczogU2Nvcm0xMlZhbGlkYXRpb25FcnJvcixcbiAgICAgICAgfSk7XG4gIH1cblxuICAjaWQgPSAnJztcbiAgI3N0YXR1cyA9ICcnO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNpZFxuICAgKiBAcmV0dXJuIHtcIlwifVxuICAgKi9cbiAgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLiNpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAgICovXG4gIHNldCBpZChpZCkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoaWQsIHNjb3JtMTJfcmVnZXguQ01JSWRlbnRpZmllcikpIHtcbiAgICAgIHRoaXMuI2lkID0gaWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3N0YXR1c1xuICAgKiBAcmV0dXJuIHtcIlwifVxuICAgKi9cbiAgZ2V0IHN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy4jc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3N0YXR1c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RhdHVzXG4gICAqL1xuICBzZXQgc3RhdHVzKHN0YXR1cykge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoc3RhdHVzLCBzY29ybTEyX3JlZ2V4LkNNSVN0YXR1czIpKSB7XG4gICAgICB0aGlzLiNzdGF0dXMgPSBzdGF0dXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLm9iamVjdGl2ZXMublxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGlkOiBzdHJpbmcsXG4gICAqICAgICAgc3RhdHVzOiBzdHJpbmcsXG4gICAqICAgICAgc2NvcmU6IENNSVNjb3JlXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdpZCc6IHRoaXMuaWQsXG4gICAgICAnc3RhdHVzJzogdGhpcy5zdGF0dXMsXG4gICAgICAnc2NvcmUnOiB0aGlzLnNjb3JlLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDEuMidzIGNtaS5pbnRlcmFjdGlvbnMubi5vYmplY3RpdmVzLm4gb2JqZWN0XG4gKiBAZXh0ZW5kcyBCYXNlQ01JXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlJbnRlcmFjdGlvbnNPYmplY3RpdmVzT2JqZWN0IGV4dGVuZHMgQmFzZUNNSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLmludGVyYWN0aW9ucy5uLm9iamVjdGl2ZXMublxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gICNpZCA9ICcnO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNpZFxuICAgKiBAcmV0dXJuIHtcIlwifVxuICAgKi9cbiAgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLiNpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAgICovXG4gIHNldCBpZChpZCkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoaWQsIHNjb3JtMTJfcmVnZXguQ01JSWRlbnRpZmllcikpIHtcbiAgICAgIHRoaXMuI2lkID0gaWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLmludGVyYWN0aW9ucy5uLm9iamVjdGl2ZXMublxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGlkOiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ2lkJzogdGhpcy5pZCxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAxLjIncyBjbWkuaW50ZXJhY3Rpb25zLmNvcnJlY3RfcmVzcG9uc2VzLm4gb2JqZWN0XG4gKiBAZXh0ZW5kcyBCYXNlQ01JXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlJbnRlcmFjdGlvbnNDb3JyZWN0UmVzcG9uc2VzT2JqZWN0IGV4dGVuZHMgQmFzZUNNSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLmludGVyYWN0aW9ucy5jb3JyZWN0X3Jlc3BvbnNlcy5uXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgI3BhdHRlcm4gPSAnJztcblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjcGF0dGVyblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgcGF0dGVybigpIHtcbiAgICByZXR1cm4gKCF0aGlzLmpzb25TdHJpbmcpID8gdGhyb3dXcml0ZU9ubHlFcnJvcigpIDogdGhpcy4jcGF0dGVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNwYXR0ZXJuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuXG4gICAqL1xuICBzZXQgcGF0dGVybihwYXR0ZXJuKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChwYXR0ZXJuLCBzY29ybTEyX3JlZ2V4LkNNSUZlZWRiYWNrLCB0cnVlKSkge1xuICAgICAgdGhpcy4jcGF0dGVybiA9IHBhdHRlcm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLmludGVyYWN0aW9ucy5jb3JyZWN0X3Jlc3BvbnNlcy5uXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgcGF0dGVybjogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdwYXR0ZXJuJzogdGhpcy5wYXR0ZXJuLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgZm9yIEFJQ0MgTmF2aWdhdGlvbiBvYmplY3RcbiAqL1xuZXhwb3J0IGNsYXNzIE5BViBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIE5BViBvYmplY3RcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAjZXZlbnQgPSAnJztcblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjZXZlbnRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGV2ZW50KCkge1xuICAgIHJldHVybiB0aGlzLiNldmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNldmVudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAgICovXG4gIHNldCBldmVudChldmVudCkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoZXZlbnQsIHNjb3JtMTJfcmVnZXguTkFWRXZlbnQpKSB7XG4gICAgICB0aGlzLiNldmVudCA9IGV2ZW50O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIG5hdiBvYmplY3RcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBldmVudDogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdldmVudCc6IHRoaXMuZXZlbnQsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQge1xuICBCYXNlQ01JLFxuICBjaGVja1ZhbGlkRm9ybWF0LFxuICBjaGVja1ZhbGlkUmFuZ2UsXG4gIENNSUFycmF5LFxuICBDTUlTY29yZSxcbn0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IEFQSUNvbnN0YW50cyBmcm9tICcuLi9jb25zdGFudHMvYXBpX2NvbnN0YW50cyc7XG5pbXBvcnQgUmVnZXggZnJvbSAnLi4vY29uc3RhbnRzL3JlZ2V4JztcbmltcG9ydCBFcnJvckNvZGVzIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9jb2Rlcyc7XG5pbXBvcnQgUmVzcG9uc2VzIGZyb20gJy4uL2NvbnN0YW50cy9yZXNwb25zZV9jb25zdGFudHMnO1xuaW1wb3J0IHtTY29ybTIwMDRWYWxpZGF0aW9uRXJyb3J9IGZyb20gJy4uL2V4Y2VwdGlvbnMnO1xuaW1wb3J0ICogYXMgVXRpbCBmcm9tICcuLi91dGlsaXRpZXMnO1xuXG5jb25zdCBzY29ybTIwMDRfY29uc3RhbnRzID0gQVBJQ29uc3RhbnRzLnNjb3JtMjAwNDtcbmNvbnN0IHNjb3JtMjAwNF9lcnJvcl9jb2RlcyA9IEVycm9yQ29kZXMuc2Nvcm0yMDA0O1xuY29uc3QgbGVhcm5lcl9yZXNwb25zZXMgPSBSZXNwb25zZXMubGVhcm5lcjtcblxuY29uc3Qgc2Nvcm0yMDA0X3JlZ2V4ID0gUmVnZXguc2Nvcm0yMDA0O1xuXG4vKipcbiAqIEhlbHBlciBtZXRob2QgZm9yIHRocm93aW5nIFJlYWQgT25seSBlcnJvclxuICovXG5mdW5jdGlvbiB0aHJvd1JlYWRPbmx5RXJyb3IoKSB7XG4gIHRocm93IG5ldyBTY29ybTIwMDRWYWxpZGF0aW9uRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlJFQURfT05MWV9FTEVNRU5UKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kIGZvciB0aHJvd2luZyBXcml0ZSBPbmx5IGVycm9yXG4gKi9cbmZ1bmN0aW9uIHRocm93V3JpdGVPbmx5RXJyb3IoKSB7XG4gIHRocm93IG5ldyBTY29ybTIwMDRWYWxpZGF0aW9uRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLldSSVRFX09OTFlfRUxFTUVOVCk7XG59XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCBmb3IgdGhyb3dpbmcgVHlwZSBNaXNtYXRjaCBlcnJvclxuICovXG5mdW5jdGlvbiB0aHJvd1R5cGVNaXNtYXRjaEVycm9yKCkge1xuICB0aHJvdyBuZXcgU2Nvcm0yMDA0VmFsaWRhdGlvbkVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENIKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kIGZvciB0aHJvd2luZyBEZXBlbmRlbmN5IE5vdCBFc3RhYmxpc2hlZCBlcnJvclxuICovXG5mdW5jdGlvbiB0aHJvd0RlcGVuZGVuY3lOb3RFc3RhYmxpc2hlZEVycm9yKCkge1xuICB0aHJvdyBuZXcgU2Nvcm0yMDA0VmFsaWRhdGlvbkVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5ERVBFTkRFTkNZX05PVF9FU1RBQkxJU0hFRCk7XG59XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCBmb3IgdGhyb3dpbmcgRGVwZW5kZW5jeSBOb3QgRXN0YWJsaXNoZWQgZXJyb3JcbiAqL1xuZnVuY3Rpb24gdGhyb3dHZW5lcmFsU2V0RXJyb3IoKSB7XG4gIHRocm93IG5ldyBTY29ybTIwMDRWYWxpZGF0aW9uRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLkdFTkVSQUxfU0VUX0ZBSUxVUkUpO1xufVxuXG4vKipcbiAqIEhlbHBlciBtZXRob2QsIG5vIHJlYXNvbiB0byBoYXZlIHRvIHBhc3MgdGhlIHNhbWUgZXJyb3IgY29kZXMgZXZlcnkgdGltZVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ2V4UGF0dGVyblxuICogQHBhcmFtIHtib29sZWFufSBhbGxvd0VtcHR5U3RyaW5nXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBjaGVjazIwMDRWYWxpZEZvcm1hdChcbiAgICB2YWx1ZTogU3RyaW5nLFxuICAgIHJlZ2V4UGF0dGVybjogU3RyaW5nLFxuICAgIGFsbG93RW1wdHlTdHJpbmc/OiBib29sZWFuKSB7XG4gIHJldHVybiBjaGVja1ZhbGlkRm9ybWF0KFxuICAgICAgdmFsdWUsXG4gICAgICByZWdleFBhdHRlcm4sXG4gICAgICBzY29ybTIwMDRfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCxcbiAgICAgIFNjb3JtMjAwNFZhbGlkYXRpb25FcnJvcixcbiAgICAgIGFsbG93RW1wdHlTdHJpbmcsXG4gICk7XG59XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCwgbm8gcmVhc29uIHRvIGhhdmUgdG8gcGFzcyB0aGUgc2FtZSBlcnJvciBjb2RlcyBldmVyeSB0aW1lXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmFuZ2VQYXR0ZXJuXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBjaGVjazIwMDRWYWxpZFJhbmdlKHZhbHVlOiBhbnksIHJhbmdlUGF0dGVybjogU3RyaW5nKSB7XG4gIHJldHVybiBjaGVja1ZhbGlkUmFuZ2UoXG4gICAgICB2YWx1ZSxcbiAgICAgIHJhbmdlUGF0dGVybixcbiAgICAgIHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5WQUxVRV9PVVRfT0ZfUkFOR0UsXG4gICAgICBTY29ybTIwMDRWYWxpZGF0aW9uRXJyb3IsXG4gICk7XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIGNtaSBvYmplY3QgZm9yIFNDT1JNIDIwMDRcbiAqL1xuZXhwb3J0IGNsYXNzIENNSSBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBTQ09STSAyMDA0IGNtaSBvYmplY3RcbiAgICogQHBhcmFtIHtib29sZWFufSBpbml0aWFsaXplZFxuICAgKi9cbiAgY29uc3RydWN0b3IoaW5pdGlhbGl6ZWQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5sZWFybmVyX3ByZWZlcmVuY2UgPSBuZXcgQ01JTGVhcm5lclByZWZlcmVuY2UoKTtcbiAgICB0aGlzLnNjb3JlID0gbmV3IFNjb3JtMjAwNENNSVNjb3JlKCk7XG4gICAgdGhpcy5jb21tZW50c19mcm9tX2xlYXJuZXIgPSBuZXcgQ01JQ29tbWVudHNGcm9tTGVhcm5lcigpO1xuICAgIHRoaXMuY29tbWVudHNfZnJvbV9sbXMgPSBuZXcgQ01JQ29tbWVudHNGcm9tTE1TKCk7XG4gICAgdGhpcy5pbnRlcmFjdGlvbnMgPSBuZXcgQ01JSW50ZXJhY3Rpb25zKCk7XG4gICAgdGhpcy5vYmplY3RpdmVzID0gbmV3IENNSU9iamVjdGl2ZXMoKTtcblxuICAgIGlmIChpbml0aWFsaXplZCkgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAjX3ZlcnNpb24gPSAnMS4wJztcbiAgI19jaGlsZHJlbiA9IHNjb3JtMjAwNF9jb25zdGFudHMuY21pX2NoaWxkcmVuO1xuICAjY29tcGxldGlvbl9zdGF0dXMgPSAndW5rbm93bic7XG4gICNjb21wbGV0aW9uX3RocmVzaG9sZCA9ICcnO1xuICAjY3JlZGl0ID0gJ2NyZWRpdCc7XG4gICNlbnRyeSA9ICcnO1xuICAjZXhpdCA9ICcnO1xuICAjbGF1bmNoX2RhdGEgPSAnJztcbiAgI2xlYXJuZXJfaWQgPSAnJztcbiAgI2xlYXJuZXJfbmFtZSA9ICcnO1xuICAjbG9jYXRpb24gPSAnJztcbiAgI21heF90aW1lX2FsbG93ZWQgPSAnJztcbiAgI21vZGUgPSAnbm9ybWFsJztcbiAgI3Byb2dyZXNzX21lYXN1cmUgPSAnJztcbiAgI3NjYWxlZF9wYXNzaW5nX3Njb3JlID0gJyc7XG4gICNzZXNzaW9uX3RpbWUgPSAnUFQwSDBNMFMnO1xuICAjc3VjY2Vzc19zdGF0dXMgPSAndW5rbm93bic7XG4gICNzdXNwZW5kX2RhdGEgPSAnJztcbiAgI3RpbWVfbGltaXRfYWN0aW9uID0gJ2NvbnRpbnVlLG5vIG1lc3NhZ2UnO1xuICAjdG90YWxfdGltZSA9ICcnO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5sZWFybmVyX3ByZWZlcmVuY2U/LmluaXRpYWxpemUoKTtcbiAgICB0aGlzLnNjb3JlPy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5jb21tZW50c19mcm9tX2xlYXJuZXI/LmluaXRpYWxpemUoKTtcbiAgICB0aGlzLmNvbW1lbnRzX2Zyb21fbG1zPy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5pbnRlcmFjdGlvbnM/LmluaXRpYWxpemUoKTtcbiAgICB0aGlzLm9iamVjdGl2ZXM/LmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNfdmVyc2lvblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXQgX3ZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI192ZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI192ZXJzaW9uLiBKdXN0IHRocm93cyBhbiBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IF92ZXJzaW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZXQgX3ZlcnNpb24oX3ZlcnNpb24pIHtcbiAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNfY2hpbGRyZW5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0IF9jaGlsZHJlbigpIHtcbiAgICByZXR1cm4gdGhpcy4jX2NoaWxkcmVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI19jaGlsZHJlbi4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBfY2hpbGRyZW5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNldCBfY2hpbGRyZW4oX2NoaWxkcmVuKSB7XG4gICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjY29tcGxldGlvbl9zdGF0dXNcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGNvbXBsZXRpb25fc3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLiNjb21wbGV0aW9uX3N0YXR1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNjb21wbGV0aW9uX3N0YXR1c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY29tcGxldGlvbl9zdGF0dXNcbiAgICovXG4gIHNldCBjb21wbGV0aW9uX3N0YXR1cyhjb21wbGV0aW9uX3N0YXR1cykge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChjb21wbGV0aW9uX3N0YXR1cywgc2Nvcm0yMDA0X3JlZ2V4LkNNSUNTdGF0dXMpKSB7XG4gICAgICB0aGlzLiNjb21wbGV0aW9uX3N0YXR1cyA9IGNvbXBsZXRpb25fc3RhdHVzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNjb21wbGV0aW9uX3RocmVzaG9sZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgY29tcGxldGlvbl90aHJlc2hvbGQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbXBsZXRpb25fdGhyZXNob2xkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2NvbXBsZXRpb25fdGhyZXNob2xkLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbXBsZXRpb25fdGhyZXNob2xkXG4gICAqL1xuICBzZXQgY29tcGxldGlvbl90aHJlc2hvbGQoY29tcGxldGlvbl90aHJlc2hvbGQpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICB0aGlzLiNjb21wbGV0aW9uX3RocmVzaG9sZCA9IGNvbXBsZXRpb25fdGhyZXNob2xkIDpcbiAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2NyZWRpdFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgY3JlZGl0KCkge1xuICAgIHJldHVybiB0aGlzLiNjcmVkaXQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjY3JlZGl0LiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNyZWRpdFxuICAgKi9cbiAgc2V0IGNyZWRpdChjcmVkaXQpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/IHRoaXMuI2NyZWRpdCA9IGNyZWRpdCA6IHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2VudHJ5XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBlbnRyeSgpIHtcbiAgICByZXR1cm4gdGhpcy4jZW50cnk7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjZW50cnkuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZW50cnlcbiAgICovXG4gIHNldCBlbnRyeShlbnRyeSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID8gdGhpcy4jZW50cnkgPSBlbnRyeSA6IHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2V4aXQuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgSlNPTiBleHBvcnQuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBleGl0KCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgPyB0aHJvd1dyaXRlT25seUVycm9yKCkgOiB0aGlzLiNleGl0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2V4aXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4aXRcbiAgICovXG4gIHNldCBleGl0KGV4aXQpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoZXhpdCwgc2Nvcm0yMDA0X3JlZ2V4LkNNSUV4aXQsIHRydWUpKSB7XG4gICAgICB0aGlzLiNleGl0ID0gZXhpdDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbGF1bmNoX2RhdGFcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxhdW5jaF9kYXRhKCkge1xuICAgIHJldHVybiB0aGlzLiNsYXVuY2hfZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsYXVuY2hfZGF0YS4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYXVuY2hfZGF0YVxuICAgKi9cbiAgc2V0IGxhdW5jaF9kYXRhKGxhdW5jaF9kYXRhKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgPyB0aGlzLiNsYXVuY2hfZGF0YSA9IGxhdW5jaF9kYXRhIDogdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbGVhcm5lcl9pZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbGVhcm5lcl9pZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jbGVhcm5lcl9pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsZWFybmVyX2lkLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxlYXJuZXJfaWRcbiAgICovXG4gIHNldCBsZWFybmVyX2lkKGxlYXJuZXJfaWQpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/IHRoaXMuI2xlYXJuZXJfaWQgPSBsZWFybmVyX2lkIDogdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbGVhcm5lcl9uYW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsZWFybmVyX25hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xlYXJuZXJfbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsZWFybmVyX25hbWUuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGVhcm5lcl9uYW1lXG4gICAqL1xuICBzZXQgbGVhcm5lcl9uYW1lKGxlYXJuZXJfbmFtZSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgIHRoaXMuI2xlYXJuZXJfbmFtZSA9IGxlYXJuZXJfbmFtZSA6XG4gICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsb2NhdGlvblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbG9jYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xvY2F0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xvY2F0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvblxuICAgKi9cbiAgc2V0IGxvY2F0aW9uKGxvY2F0aW9uKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGxvY2F0aW9uLCBzY29ybTIwMDRfcmVnZXguQ01JU3RyaW5nMTAwMCkpIHtcbiAgICAgIHRoaXMuI2xvY2F0aW9uID0gbG9jYXRpb247XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI21heF90aW1lX2FsbG93ZWRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG1heF90aW1lX2FsbG93ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI21heF90aW1lX2FsbG93ZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbWF4X3RpbWVfYWxsb3dlZC4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXhfdGltZV9hbGxvd2VkXG4gICAqL1xuICBzZXQgbWF4X3RpbWVfYWxsb3dlZChtYXhfdGltZV9hbGxvd2VkKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgdGhpcy4jbWF4X3RpbWVfYWxsb3dlZCA9IG1heF90aW1lX2FsbG93ZWQgOlxuICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbW9kZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jbW9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNtb2RlLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGVcbiAgICovXG4gIHNldCBtb2RlKG1vZGUpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/IHRoaXMuI21vZGUgPSBtb2RlIDogdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjcHJvZ3Jlc3NfbWVhc3VyZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgcHJvZ3Jlc3NfbWVhc3VyZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jcHJvZ3Jlc3NfbWVhc3VyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNwcm9ncmVzc19tZWFzdXJlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9ncmVzc19tZWFzdXJlXG4gICAqL1xuICBzZXQgcHJvZ3Jlc3NfbWVhc3VyZShwcm9ncmVzc19tZWFzdXJlKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KHByb2dyZXNzX21lYXN1cmUsIHNjb3JtMjAwNF9yZWdleC5DTUlEZWNpbWFsKSAmJlxuICAgICAgY2hlY2syMDA0VmFsaWRSYW5nZShwcm9ncmVzc19tZWFzdXJlLCBzY29ybTIwMDRfcmVnZXgucHJvZ3Jlc3NfcmFuZ2UpKSB7XG4gICAgICB0aGlzLiNwcm9ncmVzc19tZWFzdXJlID0gcHJvZ3Jlc3NfbWVhc3VyZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc2NhbGVkX3Bhc3Npbmdfc2NvcmVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHNjYWxlZF9wYXNzaW5nX3Njb3JlKCkge1xuICAgIHJldHVybiB0aGlzLiNzY2FsZWRfcGFzc2luZ19zY29yZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzY2FsZWRfcGFzc2luZ19zY29yZS4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2FsZWRfcGFzc2luZ19zY29yZVxuICAgKi9cbiAgc2V0IHNjYWxlZF9wYXNzaW5nX3Njb3JlKHNjYWxlZF9wYXNzaW5nX3Njb3JlKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgdGhpcy4jc2NhbGVkX3Bhc3Npbmdfc2NvcmUgPSBzY2FsZWRfcGFzc2luZ19zY29yZSA6XG4gICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzZXNzaW9uX3RpbWUuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgSlNPTiBleHBvcnQuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzZXNzaW9uX3RpbWUoKSB7XG4gICAgcmV0dXJuICghdGhpcy5qc29uU3RyaW5nKSA/IHRocm93V3JpdGVPbmx5RXJyb3IoKSA6IHRoaXMuI3Nlc3Npb25fdGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzZXNzaW9uX3RpbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25fdGltZVxuICAgKi9cbiAgc2V0IHNlc3Npb25fdGltZShzZXNzaW9uX3RpbWUpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoc2Vzc2lvbl90aW1lLCBzY29ybTIwMDRfcmVnZXguQ01JVGltZXNwYW4pKSB7XG4gICAgICB0aGlzLiNzZXNzaW9uX3RpbWUgPSBzZXNzaW9uX3RpbWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3N1Y2Nlc3Nfc3RhdHVzXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzdWNjZXNzX3N0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy4jc3VjY2Vzc19zdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc3VjY2Vzc19zdGF0dXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1Y2Nlc3Nfc3RhdHVzXG4gICAqL1xuICBzZXQgc3VjY2Vzc19zdGF0dXMoc3VjY2Vzc19zdGF0dXMpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoc3VjY2Vzc19zdGF0dXMsIHNjb3JtMjAwNF9yZWdleC5DTUlTU3RhdHVzKSkge1xuICAgICAgdGhpcy4jc3VjY2Vzc19zdGF0dXMgPSBzdWNjZXNzX3N0YXR1cztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc3VzcGVuZF9kYXRhXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzdXNwZW5kX2RhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N1c3BlbmRfZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzdXNwZW5kX2RhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1c3BlbmRfZGF0YVxuICAgKi9cbiAgc2V0IHN1c3BlbmRfZGF0YShzdXNwZW5kX2RhdGEpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoc3VzcGVuZF9kYXRhLCBzY29ybTIwMDRfcmVnZXguQ01JU3RyaW5nNjQwMDAsXG4gICAgICAgIHRydWUpKSB7XG4gICAgICB0aGlzLiNzdXNwZW5kX2RhdGEgPSBzdXNwZW5kX2RhdGE7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3RpbWVfbGltaXRfYWN0aW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB0aW1lX2xpbWl0X2FjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy4jdGltZV9saW1pdF9hY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdGltZV9saW1pdF9hY3Rpb24uIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGltZV9saW1pdF9hY3Rpb25cbiAgICovXG4gIHNldCB0aW1lX2xpbWl0X2FjdGlvbih0aW1lX2xpbWl0X2FjdGlvbikge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgIHRoaXMuI3RpbWVfbGltaXRfYWN0aW9uID0gdGltZV9saW1pdF9hY3Rpb24gOlxuICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjdG90YWxfdGltZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdG90YWxfdGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jdG90YWxfdGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICN0b3RhbF90aW1lLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRvdGFsX3RpbWVcbiAgICovXG4gIHNldCB0b3RhbF90aW1lKHRvdGFsX3RpbWUpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/IHRoaXMuI3RvdGFsX3RpbWUgPSB0b3RhbF90aW1lIDogdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyB0aGUgY3VycmVudCBzZXNzaW9uIHRpbWUgdG8gdGhlIGV4aXN0aW5nIHRvdGFsIHRpbWUuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gSVNPODYwMSBEdXJhdGlvblxuICAgKi9cbiAgZ2V0Q3VycmVudFRvdGFsVGltZSgpIHtcbiAgICBsZXQgc2Vzc2lvblRpbWUgPSB0aGlzLiNzZXNzaW9uX3RpbWU7XG4gICAgY29uc3Qgc3RhcnRUaW1lID0gdGhpcy5zdGFydF90aW1lO1xuXG4gICAgaWYgKHR5cGVvZiBzdGFydFRpbWUgIT09ICd1bmRlZmluZWQnICYmIHN0YXJ0VGltZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgc2Vjb25kcyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnRUaW1lO1xuICAgICAgc2Vzc2lvblRpbWUgPSBVdGlsLmdldFNlY29uZHNBc0lTT0R1cmF0aW9uKHNlY29uZHMgLyAxMDAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gVXRpbC5hZGRUd29EdXJhdGlvbnMoXG4gICAgICAgIHRoaXMuI3RvdGFsX3RpbWUsXG4gICAgICAgIHNlc3Npb25UaW1lLFxuICAgICAgICBzY29ybTIwMDRfcmVnZXguQ01JVGltZXNwYW4sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaVxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGNvbW1lbnRzX2Zyb21fbGVhcm5lcjogQ01JQ29tbWVudHNGcm9tTGVhcm5lcixcbiAgICogICAgICBjb21tZW50c19mcm9tX2xtczogQ01JQ29tbWVudHNGcm9tTE1TLFxuICAgKiAgICAgIGNvbXBsZXRpb25fc3RhdHVzOiBzdHJpbmcsXG4gICAqICAgICAgY29tcGxldGlvbl90aHJlc2hvbGQ6IHN0cmluZyxcbiAgICogICAgICBjcmVkaXQ6IHN0cmluZyxcbiAgICogICAgICBlbnRyeTogc3RyaW5nLFxuICAgKiAgICAgIGV4aXQ6IHN0cmluZyxcbiAgICogICAgICBpbnRlcmFjdGlvbnM6IENNSUludGVyYWN0aW9ucyxcbiAgICogICAgICBsYXVuY2hfZGF0YTogc3RyaW5nLFxuICAgKiAgICAgIGxlYXJuZXJfaWQ6IHN0cmluZyxcbiAgICogICAgICBsZWFybmVyX25hbWU6IHN0cmluZyxcbiAgICogICAgICBsZWFybmVyX3ByZWZlcmVuY2U6IENNSUxlYXJuZXJQcmVmZXJlbmNlLFxuICAgKiAgICAgIGxvY2F0aW9uOiBzdHJpbmcsXG4gICAqICAgICAgbWF4X3RpbWVfYWxsb3dlZDogc3RyaW5nLFxuICAgKiAgICAgIG1vZGU6IHN0cmluZyxcbiAgICogICAgICBvYmplY3RpdmVzOiBDTUlPYmplY3RpdmVzLFxuICAgKiAgICAgIHByb2dyZXNzX21lYXN1cmU6IHN0cmluZyxcbiAgICogICAgICBzY2FsZWRfcGFzc2luZ19zY29yZTogc3RyaW5nLFxuICAgKiAgICAgIHNjb3JlOiBTY29ybTIwMDRDTUlTY29yZSxcbiAgICogICAgICBzZXNzaW9uX3RpbWU6IHN0cmluZyxcbiAgICogICAgICBzdWNjZXNzX3N0YXR1czogc3RyaW5nLFxuICAgKiAgICAgIHN1c3BlbmRfZGF0YTogc3RyaW5nLFxuICAgKiAgICAgIHRpbWVfbGltaXRfYWN0aW9uOiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ2NvbW1lbnRzX2Zyb21fbGVhcm5lcic6IHRoaXMuY29tbWVudHNfZnJvbV9sZWFybmVyLFxuICAgICAgJ2NvbW1lbnRzX2Zyb21fbG1zJzogdGhpcy5jb21tZW50c19mcm9tX2xtcyxcbiAgICAgICdjb21wbGV0aW9uX3N0YXR1cyc6IHRoaXMuY29tcGxldGlvbl9zdGF0dXMsXG4gICAgICAnY29tcGxldGlvbl90aHJlc2hvbGQnOiB0aGlzLmNvbXBsZXRpb25fdGhyZXNob2xkLFxuICAgICAgJ2NyZWRpdCc6IHRoaXMuY3JlZGl0LFxuICAgICAgJ2VudHJ5JzogdGhpcy5lbnRyeSxcbiAgICAgICdleGl0JzogdGhpcy5leGl0LFxuICAgICAgJ2ludGVyYWN0aW9ucyc6IHRoaXMuaW50ZXJhY3Rpb25zLFxuICAgICAgJ2xhdW5jaF9kYXRhJzogdGhpcy5sYXVuY2hfZGF0YSxcbiAgICAgICdsZWFybmVyX2lkJzogdGhpcy5sZWFybmVyX2lkLFxuICAgICAgJ2xlYXJuZXJfbmFtZSc6IHRoaXMubGVhcm5lcl9uYW1lLFxuICAgICAgJ2xlYXJuZXJfcHJlZmVyZW5jZSc6IHRoaXMubGVhcm5lcl9wcmVmZXJlbmNlLFxuICAgICAgJ2xvY2F0aW9uJzogdGhpcy5sb2NhdGlvbixcbiAgICAgICdtYXhfdGltZV9hbGxvd2VkJzogdGhpcy5tYXhfdGltZV9hbGxvd2VkLFxuICAgICAgJ21vZGUnOiB0aGlzLm1vZGUsXG4gICAgICAnb2JqZWN0aXZlcyc6IHRoaXMub2JqZWN0aXZlcyxcbiAgICAgICdwcm9ncmVzc19tZWFzdXJlJzogdGhpcy5wcm9ncmVzc19tZWFzdXJlLFxuICAgICAgJ3NjYWxlZF9wYXNzaW5nX3Njb3JlJzogdGhpcy5zY2FsZWRfcGFzc2luZ19zY29yZSxcbiAgICAgICdzY29yZSc6IHRoaXMuc2NvcmUsXG4gICAgICAnc2Vzc2lvbl90aW1lJzogdGhpcy5zZXNzaW9uX3RpbWUsXG4gICAgICAnc3VjY2Vzc19zdGF0dXMnOiB0aGlzLnN1Y2Nlc3Nfc3RhdHVzLFxuICAgICAgJ3N1c3BlbmRfZGF0YSc6IHRoaXMuc3VzcGVuZF9kYXRhLFxuICAgICAgJ3RpbWVfbGltaXRfYWN0aW9uJzogdGhpcy50aW1lX2xpbWl0X2FjdGlvbixcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIGZvciBTQ09STSAyMDA0J3MgY21pLmxlYXJuZXJfcHJlZmVyZW5jZSBvYmplY3RcbiAqL1xuY2xhc3MgQ01JTGVhcm5lclByZWZlcmVuY2UgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgI19jaGlsZHJlbiA9IHNjb3JtMjAwNF9jb25zdGFudHMuc3R1ZGVudF9wcmVmZXJlbmNlX2NoaWxkcmVuO1xuICAjYXVkaW9fbGV2ZWwgPSAnMSc7XG4gICNsYW5ndWFnZSA9ICcnO1xuICAjZGVsaXZlcnlfc3BlZWQgPSAnMSc7XG4gICNhdWRpb19jYXB0aW9uaW5nID0gJzAnO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLmxlYXJuZXJfcHJlZmVyZW5jZVxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNfY2hpbGRyZW5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0IF9jaGlsZHJlbigpIHtcbiAgICByZXR1cm4gdGhpcy4jX2NoaWxkcmVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI19jaGlsZHJlbi4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfY2hpbGRyZW5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNldCBfY2hpbGRyZW4oX2NoaWxkcmVuKSB7XG4gICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjYXVkaW9fbGV2ZWxcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGF1ZGlvX2xldmVsKCkge1xuICAgIHJldHVybiB0aGlzLiNhdWRpb19sZXZlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNhdWRpb19sZXZlbFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXVkaW9fbGV2ZWxcbiAgICovXG4gIHNldCBhdWRpb19sZXZlbChhdWRpb19sZXZlbCkge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChhdWRpb19sZXZlbCwgc2Nvcm0yMDA0X3JlZ2V4LkNNSURlY2ltYWwpICYmXG4gICAgICBjaGVjazIwMDRWYWxpZFJhbmdlKGF1ZGlvX2xldmVsLCBzY29ybTIwMDRfcmVnZXguYXVkaW9fcmFuZ2UpKSB7XG4gICAgICB0aGlzLiNhdWRpb19sZXZlbCA9IGF1ZGlvX2xldmVsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsYW5ndWFnZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbGFuZ3VhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xhbmd1YWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xhbmd1YWdlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZVxuICAgKi9cbiAgc2V0IGxhbmd1YWdlKGxhbmd1YWdlKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGxhbmd1YWdlLCBzY29ybTIwMDRfcmVnZXguQ01JTGFuZykpIHtcbiAgICAgIHRoaXMuI2xhbmd1YWdlID0gbGFuZ3VhZ2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2RlbGl2ZXJ5X3NwZWVkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBkZWxpdmVyeV9zcGVlZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jZGVsaXZlcnlfc3BlZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjZGVsaXZlcnlfc3BlZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlbGl2ZXJ5X3NwZWVkXG4gICAqL1xuICBzZXQgZGVsaXZlcnlfc3BlZWQoZGVsaXZlcnlfc3BlZWQpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoZGVsaXZlcnlfc3BlZWQsIHNjb3JtMjAwNF9yZWdleC5DTUlEZWNpbWFsKSAmJlxuICAgICAgY2hlY2syMDA0VmFsaWRSYW5nZShkZWxpdmVyeV9zcGVlZCwgc2Nvcm0yMDA0X3JlZ2V4LnNwZWVkX3JhbmdlKSkge1xuICAgICAgdGhpcy4jZGVsaXZlcnlfc3BlZWQgPSBkZWxpdmVyeV9zcGVlZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjYXVkaW9fY2FwdGlvbmluZ1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgYXVkaW9fY2FwdGlvbmluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jYXVkaW9fY2FwdGlvbmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNhdWRpb19jYXB0aW9uaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdWRpb19jYXB0aW9uaW5nXG4gICAqL1xuICBzZXQgYXVkaW9fY2FwdGlvbmluZyhhdWRpb19jYXB0aW9uaW5nKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGF1ZGlvX2NhcHRpb25pbmcsIHNjb3JtMjAwNF9yZWdleC5DTUlTSW50ZWdlcikgJiZcbiAgICAgIGNoZWNrMjAwNFZhbGlkUmFuZ2UoYXVkaW9fY2FwdGlvbmluZywgc2Nvcm0yMDA0X3JlZ2V4LnRleHRfcmFuZ2UpKSB7XG4gICAgICB0aGlzLiNhdWRpb19jYXB0aW9uaW5nID0gYXVkaW9fY2FwdGlvbmluZztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkubGVhcm5lcl9wcmVmZXJlbmNlXG4gICAqXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgYXVkaW9fbGV2ZWw6IHN0cmluZyxcbiAgICogICAgICBsYW5ndWFnZTogc3RyaW5nLFxuICAgKiAgICAgIGRlbGl2ZXJ5X3NwZWVkOiBzdHJpbmcsXG4gICAqICAgICAgYXVkaW9fY2FwdGlvbmluZzogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdhdWRpb19sZXZlbCc6IHRoaXMuYXVkaW9fbGV2ZWwsXG4gICAgICAnbGFuZ3VhZ2UnOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgJ2RlbGl2ZXJ5X3NwZWVkJzogdGhpcy5kZWxpdmVyeV9zcGVlZCxcbiAgICAgICdhdWRpb19jYXB0aW9uaW5nJzogdGhpcy5hdWRpb19jYXB0aW9uaW5nLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDIwMDQncyBjbWkuaW50ZXJhY3Rpb25zIG9iamVjdFxuICovXG5jbGFzcyBDTUlJbnRlcmFjdGlvbnMgZXh0ZW5kcyBDTUlBcnJheSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLm9iamVjdGl2ZXMgQXJyYXlcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHtcbiAgICAgIGNoaWxkcmVuOiBzY29ybTIwMDRfY29uc3RhbnRzLmludGVyYWN0aW9uc19jaGlsZHJlbixcbiAgICAgIGVycm9yQ29kZTogc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlJFQURfT05MWV9FTEVNRU5ULFxuICAgICAgZXJyb3JDbGFzczogU2Nvcm0yMDA0VmFsaWRhdGlvbkVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDIwMDQncyBjbWkub2JqZWN0aXZlcyBvYmplY3RcbiAqL1xuY2xhc3MgQ01JT2JqZWN0aXZlcyBleHRlbmRzIENNSUFycmF5IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkub2JqZWN0aXZlcyBBcnJheVxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoe1xuICAgICAgY2hpbGRyZW46IHNjb3JtMjAwNF9jb25zdGFudHMub2JqZWN0aXZlc19jaGlsZHJlbixcbiAgICAgIGVycm9yQ29kZTogc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlJFQURfT05MWV9FTEVNRU5ULFxuICAgICAgZXJyb3JDbGFzczogU2Nvcm0yMDA0VmFsaWRhdGlvbkVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDIwMDQncyBjbWkuY29tbWVudHNfZnJvbV9sbXMgb2JqZWN0XG4gKi9cbmNsYXNzIENNSUNvbW1lbnRzRnJvbUxNUyBleHRlbmRzIENNSUFycmF5IHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkuY29tbWVudHNfZnJvbV9sbXMgQXJyYXlcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHtcbiAgICAgIGNoaWxkcmVuOiBzY29ybTIwMDRfY29uc3RhbnRzLmNvbW1lbnRzX2NoaWxkcmVuLFxuICAgICAgZXJyb3JDb2RlOiBzY29ybTIwMDRfZXJyb3JfY29kZXMuUkVBRF9PTkxZX0VMRU1FTlQsXG4gICAgICBlcnJvckNsYXNzOiBTY29ybTIwMDRWYWxpZGF0aW9uRXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMjAwNCdzIGNtaS5jb21tZW50c19mcm9tX2xlYXJuZXIgb2JqZWN0XG4gKi9cbmNsYXNzIENNSUNvbW1lbnRzRnJvbUxlYXJuZXIgZXh0ZW5kcyBDTUlBcnJheSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLmNvbW1lbnRzX2Zyb21fbGVhcm5lciBBcnJheVxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoe1xuICAgICAgY2hpbGRyZW46IHNjb3JtMjAwNF9jb25zdGFudHMuY29tbWVudHNfY2hpbGRyZW4sXG4gICAgICBlcnJvckNvZGU6IHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5SRUFEX09OTFlfRUxFTUVOVCxcbiAgICAgIGVycm9yQ2xhc3M6IFNjb3JtMjAwNFZhbGlkYXRpb25FcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIGZvciBTQ09STSAyMDA0J3MgY21pLmludGVyYWN0aW9uLm4gb2JqZWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlJbnRlcmFjdGlvbnNPYmplY3QgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgI2lkID0gJyc7XG4gICN0eXBlID0gJyc7XG4gICN0aW1lc3RhbXAgPSAnJztcbiAgI3dlaWdodGluZyA9ICcnO1xuICAjbGVhcm5lcl9yZXNwb25zZSA9ICcnO1xuICAjcmVzdWx0ID0gJyc7XG4gICNsYXRlbmN5ID0gJyc7XG4gICNkZXNjcmlwdGlvbiA9ICcnO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLmludGVyYWN0aW9uLm5cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLm9iamVjdGl2ZXMgPSBuZXcgQ01JQXJyYXkoe1xuICAgICAgZXJyb3JDb2RlOiBzY29ybTIwMDRfZXJyb3JfY29kZXMuUkVBRF9PTkxZX0VMRU1FTlQsXG4gICAgICBlcnJvckNsYXNzOiBTY29ybTIwMDRWYWxpZGF0aW9uRXJyb3IsXG4gICAgICBjaGlsZHJlbjogc2Nvcm0yMDA0X2NvbnN0YW50cy5vYmplY3RpdmVzX2NoaWxkcmVuLFxuICAgIH0pO1xuICAgIHRoaXMuY29ycmVjdF9yZXNwb25zZXMgPSBuZXcgQ01JQXJyYXkoe1xuICAgICAgZXJyb3JDb2RlOiBzY29ybTIwMDRfZXJyb3JfY29kZXMuUkVBRF9PTkxZX0VMRU1FTlQsXG4gICAgICBlcnJvckNsYXNzOiBTY29ybTIwMDRWYWxpZGF0aW9uRXJyb3IsXG4gICAgICBjaGlsZHJlbjogc2Nvcm0yMDA0X2NvbnN0YW50cy5jb3JyZWN0X3Jlc3BvbnNlc19jaGlsZHJlbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5vYmplY3RpdmVzPy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5jb3JyZWN0X3Jlc3BvbnNlcz8uaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2lkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jaWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gICAqL1xuICBzZXQgaWQoaWQpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoaWQsIHNjb3JtMjAwNF9yZWdleC5DTUlMb25nSWRlbnRpZmllcikpIHtcbiAgICAgIHRoaXMuI2lkID0gaWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3R5cGVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3R5cGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKi9cbiAgc2V0IHR5cGUodHlwZSkge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkICYmIHRoaXMuI2lkID09PSAnJykge1xuICAgICAgdGhyb3dEZXBlbmRlbmN5Tm90RXN0YWJsaXNoZWRFcnJvcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQodHlwZSwgc2Nvcm0yMDA0X3JlZ2V4LkNNSVR5cGUpKSB7XG4gICAgICAgIHRoaXMuI3R5cGUgPSB0eXBlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0aW1lc3RhbXBcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHRpbWVzdGFtcCgpIHtcbiAgICByZXR1cm4gdGhpcy4jdGltZXN0YW1wO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RpbWVzdGFtcFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGltZXN0YW1wXG4gICAqL1xuICBzZXQgdGltZXN0YW1wKHRpbWVzdGFtcCkge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkICYmIHRoaXMuI2lkID09PSAnJykge1xuICAgICAgdGhyb3dEZXBlbmRlbmN5Tm90RXN0YWJsaXNoZWRFcnJvcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQodGltZXN0YW1wLCBzY29ybTIwMDRfcmVnZXguQ01JVGltZSkpIHtcbiAgICAgICAgdGhpcy4jdGltZXN0YW1wID0gdGltZXN0YW1wO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN3ZWlnaHRpbmdcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHdlaWdodGluZygpIHtcbiAgICByZXR1cm4gdGhpcy4jd2VpZ2h0aW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3dlaWdodGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gd2VpZ2h0aW5nXG4gICAqL1xuICBzZXQgd2VpZ2h0aW5nKHdlaWdodGluZykge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkICYmIHRoaXMuI2lkID09PSAnJykge1xuICAgICAgdGhyb3dEZXBlbmRlbmN5Tm90RXN0YWJsaXNoZWRFcnJvcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQod2VpZ2h0aW5nLCBzY29ybTIwMDRfcmVnZXguQ01JRGVjaW1hbCkpIHtcbiAgICAgICAgdGhpcy4jd2VpZ2h0aW5nID0gd2VpZ2h0aW5nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsZWFybmVyX3Jlc3BvbnNlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsZWFybmVyX3Jlc3BvbnNlKCkge1xuICAgIHJldHVybiB0aGlzLiNsZWFybmVyX3Jlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xlYXJuZXJfcmVzcG9uc2UuIERvZXMgdHlwZSB2YWxpZGF0aW9uIHRvIG1ha2Ugc3VyZSByZXNwb25zZVxuICAgKiBtYXRjaGVzIFNDT1JNIDIwMDQncyBzcGVjXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsZWFybmVyX3Jlc3BvbnNlXG4gICAqL1xuICBzZXQgbGVhcm5lcl9yZXNwb25zZShsZWFybmVyX3Jlc3BvbnNlKSB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQgJiYgKHRoaXMuI3R5cGUgPT09ICcnIHx8IHRoaXMuI2lkID09PSAnJykpIHtcbiAgICAgIHRocm93RGVwZW5kZW5jeU5vdEVzdGFibGlzaGVkRXJyb3IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG5vZGVzID0gW107XG4gICAgICBjb25zdCByZXNwb25zZV90eXBlID0gbGVhcm5lcl9yZXNwb25zZXNbdGhpcy50eXBlXTtcbiAgICAgIGlmIChyZXNwb25zZV90eXBlKSB7XG4gICAgICAgIGlmIChyZXNwb25zZV90eXBlPy5kZWxpbWl0ZXIpIHtcbiAgICAgICAgICBub2RlcyA9IGxlYXJuZXJfcmVzcG9uc2Uuc3BsaXQocmVzcG9uc2VfdHlwZS5kZWxpbWl0ZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vZGVzWzBdID0gbGVhcm5lcl9yZXNwb25zZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgobm9kZXMubGVuZ3RoID4gMCkgJiYgKG5vZGVzLmxlbmd0aCA8PSByZXNwb25zZV90eXBlLm1heCkpIHtcbiAgICAgICAgICBjb25zdCBmb3JtYXRSZWdleCA9IG5ldyBSZWdFeHAocmVzcG9uc2VfdHlwZS5mb3JtYXQpO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV90eXBlPy5kZWxpbWl0ZXIyKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG5vZGVzW2ldLnNwbGl0KHJlc3BvbnNlX3R5cGUuZGVsaW1pdGVyMik7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZXNbMF0ubWF0Y2goZm9ybWF0UmVnZXgpKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvd1R5cGVNaXNtYXRjaEVycm9yKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGlmICghdmFsdWVzWzFdLm1hdGNoKG5ldyBSZWdFeHAocmVzcG9uc2VfdHlwZS5mb3JtYXQyKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3dUeXBlTWlzbWF0Y2hFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvd1R5cGVNaXNtYXRjaEVycm9yKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICghbm9kZXNbaV0ubWF0Y2goZm9ybWF0UmVnZXgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3dUeXBlTWlzbWF0Y2hFcnJvcigpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChub2Rlc1tpXSAhPT0gJycgJiYgcmVzcG9uc2VfdHlwZS51bmlxdWUpIHtcbiAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaTsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2Rlc1tpXSA9PT0gbm9kZXNbal0pIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aHJvd1R5cGVNaXNtYXRjaEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3dHZW5lcmFsU2V0RXJyb3IoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuI2xlYXJuZXJfcmVzcG9uc2UgPSBsZWFybmVyX3Jlc3BvbnNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3dUeXBlTWlzbWF0Y2hFcnJvcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNyZXN1bHRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHJlc3VsdCgpIHtcbiAgICByZXR1cm4gdGhpcy4jcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3Jlc3VsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzdWx0XG4gICAqL1xuICBzZXQgcmVzdWx0KHJlc3VsdCkge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChyZXN1bHQsIHNjb3JtMjAwNF9yZWdleC5DTUlSZXN1bHQpKSB7XG4gICAgICB0aGlzLiNyZXN1bHQgPSByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xhdGVuY3lcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxhdGVuY3koKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xhdGVuY3k7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbGF0ZW5jeVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGF0ZW5jeVxuICAgKi9cbiAgc2V0IGxhdGVuY3kobGF0ZW5jeSkge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkICYmIHRoaXMuI2lkID09PSAnJykge1xuICAgICAgdGhyb3dEZXBlbmRlbmN5Tm90RXN0YWJsaXNoZWRFcnJvcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQobGF0ZW5jeSwgc2Nvcm0yMDA0X3JlZ2V4LkNNSVRpbWVzcGFuKSkge1xuICAgICAgICB0aGlzLiNsYXRlbmN5ID0gbGF0ZW5jeTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjZGVzY3JpcHRpb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNkZXNjcmlwdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNkZXNjcmlwdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cbiAgICovXG4gIHNldCBkZXNjcmlwdGlvbihkZXNjcmlwdGlvbikge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkICYmIHRoaXMuI2lkID09PSAnJykge1xuICAgICAgdGhyb3dEZXBlbmRlbmN5Tm90RXN0YWJsaXNoZWRFcnJvcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoZGVzY3JpcHRpb24sIHNjb3JtMjAwNF9yZWdleC5DTUlMYW5nU3RyaW5nMjUwLFxuICAgICAgICAgIHRydWUpKSB7XG4gICAgICAgIHRoaXMuI2Rlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLmludGVyYWN0aW9ucy5uXG4gICAqXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgaWQ6IHN0cmluZyxcbiAgICogICAgICB0eXBlOiBzdHJpbmcsXG4gICAqICAgICAgb2JqZWN0aXZlczogQ01JQXJyYXksXG4gICAqICAgICAgdGltZXN0YW1wOiBzdHJpbmcsXG4gICAqICAgICAgY29ycmVjdF9yZXNwb25zZXM6IENNSUFycmF5LFxuICAgKiAgICAgIHdlaWdodGluZzogc3RyaW5nLFxuICAgKiAgICAgIGxlYXJuZXJfcmVzcG9uc2U6IHN0cmluZyxcbiAgICogICAgICByZXN1bHQ6IHN0cmluZyxcbiAgICogICAgICBsYXRlbmN5OiBzdHJpbmcsXG4gICAqICAgICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnaWQnOiB0aGlzLmlkLFxuICAgICAgJ3R5cGUnOiB0aGlzLnR5cGUsXG4gICAgICAnb2JqZWN0aXZlcyc6IHRoaXMub2JqZWN0aXZlcyxcbiAgICAgICd0aW1lc3RhbXAnOiB0aGlzLnRpbWVzdGFtcCxcbiAgICAgICd3ZWlnaHRpbmcnOiB0aGlzLndlaWdodGluZyxcbiAgICAgICdsZWFybmVyX3Jlc3BvbnNlJzogdGhpcy5sZWFybmVyX3Jlc3BvbnNlLFxuICAgICAgJ3Jlc3VsdCc6IHRoaXMucmVzdWx0LFxuICAgICAgJ2xhdGVuY3knOiB0aGlzLmxhdGVuY3ksXG4gICAgICAnZGVzY3JpcHRpb24nOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgJ2NvcnJlY3RfcmVzcG9uc2VzJzogdGhpcy5jb3JyZWN0X3Jlc3BvbnNlcyxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIGZvciBTQ09STSAyMDA0J3MgY21pLm9iamVjdGl2ZXMubiBvYmplY3RcbiAqL1xuZXhwb3J0IGNsYXNzIENNSU9iamVjdGl2ZXNPYmplY3QgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgI2lkID0gJyc7XG4gICNzdWNjZXNzX3N0YXR1cyA9ICd1bmtub3duJztcbiAgI2NvbXBsZXRpb25fc3RhdHVzID0gJ3Vua25vd24nO1xuICAjcHJvZ3Jlc3NfbWVhc3VyZSA9ICcnO1xuICAjZGVzY3JpcHRpb24gPSAnJztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5vYmplY3RpdmVzLm5cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnNjb3JlID0gbmV3IFNjb3JtMjAwNENNSVNjb3JlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZCBhZnRlciB0aGUgQ01JIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIGluaXRpYWxpemUoKSB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuc2NvcmU/LmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNpZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2lkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuICAgKi9cbiAgc2V0IGlkKGlkKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGlkLCBzY29ybTIwMDRfcmVnZXguQ01JTG9uZ0lkZW50aWZpZXIpKSB7XG4gICAgICB0aGlzLiNpZCA9IGlkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzdWNjZXNzX3N0YXR1c1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgc3VjY2Vzc19zdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N1Y2Nlc3Nfc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3N1Y2Nlc3Nfc3RhdHVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWNjZXNzX3N0YXR1c1xuICAgKi9cbiAgc2V0IHN1Y2Nlc3Nfc3RhdHVzKHN1Y2Nlc3Nfc3RhdHVzKSB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQgJiYgdGhpcy4jaWQgPT09ICcnKSB7XG4gICAgICB0aHJvd0RlcGVuZGVuY3lOb3RFc3RhYmxpc2hlZEVycm9yKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChzdWNjZXNzX3N0YXR1cywgc2Nvcm0yMDA0X3JlZ2V4LkNNSVNTdGF0dXMpKSB7XG4gICAgICAgIHRoaXMuI3N1Y2Nlc3Nfc3RhdHVzID0gc3VjY2Vzc19zdGF0dXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2NvbXBsZXRpb25fc3RhdHVzXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBjb21wbGV0aW9uX3N0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy4jY29tcGxldGlvbl9zdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjY29tcGxldGlvbl9zdGF0dXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbXBsZXRpb25fc3RhdHVzXG4gICAqL1xuICBzZXQgY29tcGxldGlvbl9zdGF0dXMoY29tcGxldGlvbl9zdGF0dXMpIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCAmJiB0aGlzLiNpZCA9PT0gJycpIHtcbiAgICAgIHRocm93RGVwZW5kZW5jeU5vdEVzdGFibGlzaGVkRXJyb3IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGNvbXBsZXRpb25fc3RhdHVzLCBzY29ybTIwMDRfcmVnZXguQ01JQ1N0YXR1cykpIHtcbiAgICAgICAgdGhpcy4jY29tcGxldGlvbl9zdGF0dXMgPSBjb21wbGV0aW9uX3N0YXR1cztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjcHJvZ3Jlc3NfbWVhc3VyZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgcHJvZ3Jlc3NfbWVhc3VyZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jcHJvZ3Jlc3NfbWVhc3VyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNwcm9ncmVzc19tZWFzdXJlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9ncmVzc19tZWFzdXJlXG4gICAqL1xuICBzZXQgcHJvZ3Jlc3NfbWVhc3VyZShwcm9ncmVzc19tZWFzdXJlKSB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQgJiYgdGhpcy4jaWQgPT09ICcnKSB7XG4gICAgICB0aHJvd0RlcGVuZGVuY3lOb3RFc3RhYmxpc2hlZEVycm9yKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChwcm9ncmVzc19tZWFzdXJlLCBzY29ybTIwMDRfcmVnZXguQ01JRGVjaW1hbCkgJiZcbiAgICAgICAgY2hlY2syMDA0VmFsaWRSYW5nZShwcm9ncmVzc19tZWFzdXJlLFxuICAgICAgICAgICAgc2Nvcm0yMDA0X3JlZ2V4LnByb2dyZXNzX3JhbmdlKSkge1xuICAgICAgICB0aGlzLiNwcm9ncmVzc19tZWFzdXJlID0gcHJvZ3Jlc3NfbWVhc3VyZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjZGVzY3JpcHRpb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNkZXNjcmlwdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNkZXNjcmlwdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cbiAgICovXG4gIHNldCBkZXNjcmlwdGlvbihkZXNjcmlwdGlvbikge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkICYmIHRoaXMuI2lkID09PSAnJykge1xuICAgICAgdGhyb3dEZXBlbmRlbmN5Tm90RXN0YWJsaXNoZWRFcnJvcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoZGVzY3JpcHRpb24sIHNjb3JtMjAwNF9yZWdleC5DTUlMYW5nU3RyaW5nMjUwLFxuICAgICAgICAgIHRydWUpKSB7XG4gICAgICAgIHRoaXMuI2Rlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLm9iamVjdGl2ZXMublxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGlkOiBzdHJpbmcsXG4gICAqICAgICAgc3VjY2Vzc19zdGF0dXM6IHN0cmluZyxcbiAgICogICAgICBjb21wbGV0aW9uX3N0YXR1czogc3RyaW5nLFxuICAgKiAgICAgIHByb2dyZXNzX21lYXN1cmU6IHN0cmluZyxcbiAgICogICAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgKiAgICAgIHNjb3JlOiBTY29ybTIwMDRDTUlTY29yZVxuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnaWQnOiB0aGlzLmlkLFxuICAgICAgJ3N1Y2Nlc3Nfc3RhdHVzJzogdGhpcy5zdWNjZXNzX3N0YXR1cyxcbiAgICAgICdjb21wbGV0aW9uX3N0YXR1cyc6IHRoaXMuY29tcGxldGlvbl9zdGF0dXMsXG4gICAgICAncHJvZ3Jlc3NfbWVhc3VyZSc6IHRoaXMucHJvZ3Jlc3NfbWVhc3VyZSxcbiAgICAgICdkZXNjcmlwdGlvbic6IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICAnc2NvcmUnOiB0aGlzLnNjb3JlLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgZm9yIFNDT1JNIDIwMDQncyBjbWkgKi5zY29yZSBvYmplY3RcbiAqL1xuY2xhc3MgU2Nvcm0yMDA0Q01JU2NvcmUgZXh0ZW5kcyBDTUlTY29yZSB7XG4gICNzY2FsZWQgPSAnJztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaSAqLnNjb3JlXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcbiAgICAgICAge1xuICAgICAgICAgIHNjb3JlX2NoaWxkcmVuOiBzY29ybTIwMDRfY29uc3RhbnRzLnNjb3JlX2NoaWxkcmVuLFxuICAgICAgICAgIG1heDogJycsXG4gICAgICAgICAgaW52YWxpZEVycm9yQ29kZTogc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlJFQURfT05MWV9FTEVNRU5ULFxuICAgICAgICAgIGludmFsaWRUeXBlQ29kZTogc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlRZUEVfTUlTTUFUQ0gsXG4gICAgICAgICAgaW52YWxpZFJhbmdlQ29kZTogc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlZBTFVFX09VVF9PRl9SQU5HRSxcbiAgICAgICAgICBkZWNpbWFsUmVnZXg6IHNjb3JtMjAwNF9yZWdleC5DTUlEZWNpbWFsLFxuICAgICAgICAgIGVycm9yQ2xhc3M6IFNjb3JtMjAwNFZhbGlkYXRpb25FcnJvcixcbiAgICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc2NhbGVkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzY2FsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3NjYWxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzY2FsZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjYWxlZFxuICAgKi9cbiAgc2V0IHNjYWxlZChzY2FsZWQpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoc2NhbGVkLCBzY29ybTIwMDRfcmVnZXguQ01JRGVjaW1hbCkgJiZcbiAgICAgIGNoZWNrMjAwNFZhbGlkUmFuZ2Uoc2NhbGVkLCBzY29ybTIwMDRfcmVnZXguc2NhbGVkX3JhbmdlKSkge1xuICAgICAgdGhpcy4jc2NhbGVkID0gc2NhbGVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaSAqLnNjb3JlXG4gICAqXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgc2NhbGVkOiBzdHJpbmcsXG4gICAqICAgICAgcmF3OiBzdHJpbmcsXG4gICAqICAgICAgbWluOiBzdHJpbmcsXG4gICAqICAgICAgbWF4OiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ3NjYWxlZCc6IHRoaXMuc2NhbGVkLFxuICAgICAgJ3Jhdyc6IHN1cGVyLnJhdyxcbiAgICAgICdtaW4nOiBzdXBlci5taW4sXG4gICAgICAnbWF4Jzogc3VwZXIubWF4LFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDIwMDQncyBjbWkuY29tbWVudHNfZnJvbV9sZWFybmVyLm4gYW5kIGNtaS5jb21tZW50c19mcm9tX2xtcy5uIG9iamVjdFxuICovXG5leHBvcnQgY2xhc3MgQ01JQ29tbWVudHNPYmplY3QgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgI2NvbW1lbnQgPSAnJztcbiAgI2xvY2F0aW9uID0gJyc7XG4gICN0aW1lc3RhbXAgPSAnJztcbiAgI3JlYWRPbmx5QWZ0ZXJJbml0O1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLmNvbW1lbnRzX2Zyb21fbGVhcm5lci5uIGFuZCBjbWkuY29tbWVudHNfZnJvbV9sbXMublxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlYWRPbmx5QWZ0ZXJJbml0XG4gICAqL1xuICBjb25zdHJ1Y3RvcihyZWFkT25seUFmdGVySW5pdCA9IGZhbHNlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLiNjb21tZW50ID0gJyc7XG4gICAgdGhpcy4jbG9jYXRpb24gPSAnJztcbiAgICB0aGlzLiN0aW1lc3RhbXAgPSAnJztcbiAgICB0aGlzLiNyZWFkT25seUFmdGVySW5pdCA9IHJlYWRPbmx5QWZ0ZXJJbml0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2NvbW1lbnRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGNvbW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjY29tbWVudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29tbWVudFxuICAgKi9cbiAgc2V0IGNvbW1lbnQoY29tbWVudCkge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkICYmIHRoaXMuI3JlYWRPbmx5QWZ0ZXJJbml0KSB7XG4gICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGNvbW1lbnQsIHNjb3JtMjAwNF9yZWdleC5DTUlMYW5nU3RyaW5nNDAwMCxcbiAgICAgICAgICB0cnVlKSkge1xuICAgICAgICB0aGlzLiNjb21tZW50ID0gY29tbWVudDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbG9jYXRpb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxvY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNsb2NhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsb2NhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb25cbiAgICovXG4gIHNldCBsb2NhdGlvbihsb2NhdGlvbikge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkICYmIHRoaXMuI3JlYWRPbmx5QWZ0ZXJJbml0KSB7XG4gICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGxvY2F0aW9uLCBzY29ybTIwMDRfcmVnZXguQ01JU3RyaW5nMjUwKSkge1xuICAgICAgICB0aGlzLiNsb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0aW1lc3RhbXBcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHRpbWVzdGFtcCgpIHtcbiAgICByZXR1cm4gdGhpcy4jdGltZXN0YW1wO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RpbWVzdGFtcFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGltZXN0YW1wXG4gICAqL1xuICBzZXQgdGltZXN0YW1wKHRpbWVzdGFtcCkge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkICYmIHRoaXMuI3JlYWRPbmx5QWZ0ZXJJbml0KSB7XG4gICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KHRpbWVzdGFtcCwgc2Nvcm0yMDA0X3JlZ2V4LkNNSVRpbWUpKSB7XG4gICAgICAgIHRoaXMuI3RpbWVzdGFtcCA9IHRpbWVzdGFtcDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuY29tbWVudHNfZnJvbV9sZWFybmVyLm4gb2JqZWN0XG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgY29tbWVudDogc3RyaW5nLFxuICAgKiAgICAgIGxvY2F0aW9uOiBzdHJpbmcsXG4gICAqICAgICAgdGltZXN0YW1wOiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ2NvbW1lbnQnOiB0aGlzLmNvbW1lbnQsXG4gICAgICAnbG9jYXRpb24nOiB0aGlzLmxvY2F0aW9uLFxuICAgICAgJ3RpbWVzdGFtcCc6IHRoaXMudGltZXN0YW1wLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDIwMDQncyBjbWkuaW50ZXJhY3Rpb25zLm4ub2JqZWN0aXZlcy5uIG9iamVjdFxuICovXG5leHBvcnQgY2xhc3MgQ01JSW50ZXJhY3Rpb25zT2JqZWN0aXZlc09iamVjdCBleHRlbmRzIEJhc2VDTUkge1xuICAjaWQgPSAnJztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5pbnRlcmFjdGlvbnMubi5vYmplY3RpdmVzLm5cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjaWRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLiNpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAgICovXG4gIHNldCBpZChpZCkge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChpZCwgc2Nvcm0yMDA0X3JlZ2V4LkNNSUxvbmdJZGVudGlmaWVyKSkge1xuICAgICAgdGhpcy4jaWQgPSBpZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuaW50ZXJhY3Rpb25zLm4ub2JqZWN0aXZlcy5uXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgaWQ6IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnaWQnOiB0aGlzLmlkLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDIwMDQncyBjbWkuaW50ZXJhY3Rpb25zLm4uY29ycmVjdF9yZXNwb25zZXMubiBvYmplY3RcbiAqL1xuZXhwb3J0IGNsYXNzIENNSUludGVyYWN0aW9uc0NvcnJlY3RSZXNwb25zZXNPYmplY3QgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgI3BhdHRlcm4gPSAnJztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5pbnRlcmFjdGlvbnMubi5jb3JyZWN0X3Jlc3BvbnNlcy5uXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3BhdHRlcm5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHBhdHRlcm4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI3BhdHRlcm47XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjcGF0dGVyblxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVyblxuICAgKi9cbiAgc2V0IHBhdHRlcm4ocGF0dGVybikge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChwYXR0ZXJuLCBzY29ybTIwMDRfcmVnZXguQ01JRmVlZGJhY2spKSB7XG4gICAgICB0aGlzLiNwYXR0ZXJuID0gcGF0dGVybjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGNtaS5pbnRlcmFjdGlvbnMubi5jb3JyZWN0X3Jlc3BvbnNlcy5uIG9iamVjdFxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIHBhdHRlcm46IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAncGF0dGVybic6IHRoaXMucGF0dGVybixcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAyMDA0J3MgYWRsIG9iamVjdFxuICovXG5leHBvcnQgY2xhc3MgQURMIGV4dGVuZHMgQmFzZUNNSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgYWRsXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5uYXYgPSBuZXcgQURMTmF2KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZCBhZnRlciB0aGUgQ01JIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIGluaXRpYWxpemUoKSB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMubmF2Py5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBhZGxcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBuYXY6IHtcbiAgICogICAgICAgIHJlcXVlc3Q6IHN0cmluZ1xuICAgKiAgICAgIH1cbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ25hdic6IHRoaXMubmF2LFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDIwMDQncyBhZGwubmF2IG9iamVjdFxuICovXG5jbGFzcyBBRExOYXYgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgI3JlcXVlc3QgPSAnX25vbmVfJztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGFkbC5uYXZcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnJlcXVlc3RfdmFsaWQgPSBuZXcgQURMTmF2UmVxdWVzdFZhbGlkKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZCBhZnRlciB0aGUgQ01JIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIGluaXRpYWxpemUoKSB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMucmVxdWVzdF92YWxpZD8uaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3JlcXVlc3RcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHJlcXVlc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3JlcXVlc3Q7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjcmVxdWVzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVxdWVzdFxuICAgKi9cbiAgc2V0IHJlcXVlc3QocmVxdWVzdCkge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChyZXF1ZXN0LCBzY29ybTIwMDRfcmVnZXguTkFWRXZlbnQpKSB7XG4gICAgICB0aGlzLiNyZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBhZGwubmF2XG4gICAqXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgcmVxdWVzdDogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdyZXF1ZXN0JzogdGhpcy5yZXF1ZXN0LFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDIwMDQncyBhZGwubmF2LnJlcXVlc3RfdmFsaWQgb2JqZWN0XG4gKi9cbmNsYXNzIEFETE5hdlJlcXVlc3RWYWxpZCBleHRlbmRzIEJhc2VDTUkge1xuICAjY29udGludWUgPSAndW5rbm93bic7XG4gICNwcmV2aW91cyA9ICd1bmtub3duJztcbiAgY2hvaWNlID0gY2xhc3Mge1xuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRhcmdldCBpcyB2YWxpZFxuICAgICAqIEBwYXJhbSB7Kn0gX3RhcmdldFxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cbiAgICBfaXNUYXJnZXRWYWxpZCA9IChfdGFyZ2V0KSA9PiAndW5rbm93bic7XG4gIH07XG4gIGp1bXAgPSBjbGFzcyB7XG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGFyZ2V0IGlzIHZhbGlkXG4gICAgICogQHBhcmFtIHsqfSBfdGFyZ2V0XG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqL1xuICAgIF9pc1RhcmdldFZhbGlkID0gKF90YXJnZXQpID0+ICd1bmtub3duJztcbiAgfTtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGFkbC5uYXYucmVxdWVzdF92YWxpZFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNjb250aW51ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgY29udGludWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbnRpbnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2NvbnRpbnVlLiBKdXN0IHRocm93cyBhbiBlcnJvci5cbiAgICogQHBhcmFtIHsqfSBfXG4gICAqL1xuICBzZXQgY29udGludWUoXykge1xuICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3ByZXZpb3VzXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBwcmV2aW91cygpIHtcbiAgICByZXR1cm4gdGhpcy4jcHJldmlvdXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjcHJldmlvdXMuIEp1c3QgdGhyb3dzIGFuIGVycm9yLlxuICAgKiBAcGFyYW0geyp9IF9cbiAgICovXG4gIHNldCBwcmV2aW91cyhfKSB7XG4gICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBhZGwubmF2LnJlcXVlc3RfdmFsaWRcbiAgICpcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBwcmV2aW91czogc3RyaW5nLFxuICAgKiAgICAgIGNvbnRpbnVlOiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ3ByZXZpb3VzJzogdGhpcy5wcmV2aW91cyxcbiAgICAgICdjb250aW51ZSc6IHRoaXMuY29udGludWUsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiIsIi8vIEBmbG93XG5cbmNvbnN0IGdsb2JhbCA9IHtcbiAgU0NPUk1fVFJVRTogJ3RydWUnLFxuICBTQ09STV9GQUxTRTogJ2ZhbHNlJyxcbiAgU1RBVEVfTk9UX0lOSVRJQUxJWkVEOiAwLFxuICBTVEFURV9JTklUSUFMSVpFRDogMSxcbiAgU1RBVEVfVEVSTUlOQVRFRDogMixcbiAgTE9HX0xFVkVMX0RFQlVHOiAxLFxuICBMT0dfTEVWRUxfSU5GTzogMixcbiAgTE9HX0xFVkVMX1dBUk5JTkc6IDMsXG4gIExPR19MRVZFTF9FUlJPUjogNCxcbiAgTE9HX0xFVkVMX05PTkU6IDUsXG59O1xuXG5jb25zdCBzY29ybTEyID0ge1xuICAvLyBDaGlsZHJlbiBsaXN0c1xuICBjbWlfY2hpbGRyZW46ICdjb3JlLHN1c3BlbmRfZGF0YSxsYXVuY2hfZGF0YSxjb21tZW50cyxvYmplY3RpdmVzLHN0dWRlbnRfZGF0YSxzdHVkZW50X3ByZWZlcmVuY2UsaW50ZXJhY3Rpb25zJyxcbiAgY29yZV9jaGlsZHJlbjogJ3N0dWRlbnRfaWQsc3R1ZGVudF9uYW1lLGxlc3Nvbl9sb2NhdGlvbixjcmVkaXQsbGVzc29uX3N0YXR1cyxlbnRyeSxzY29yZSx0b3RhbF90aW1lLGxlc3Nvbl9tb2RlLGV4aXQsc2Vzc2lvbl90aW1lJyxcbiAgc2NvcmVfY2hpbGRyZW46ICdyYXcsbWluLG1heCcsXG4gIGNvbW1lbnRzX2NoaWxkcmVuOiAnY29udGVudCxsb2NhdGlvbix0aW1lJyxcbiAgb2JqZWN0aXZlc19jaGlsZHJlbjogJ2lkLHNjb3JlLHN0YXR1cycsXG4gIGNvcnJlY3RfcmVzcG9uc2VzX2NoaWxkcmVuOiAncGF0dGVybicsXG4gIHN0dWRlbnRfZGF0YV9jaGlsZHJlbjogJ21hc3Rlcnlfc2NvcmUsbWF4X3RpbWVfYWxsb3dlZCx0aW1lX2xpbWl0X2FjdGlvbicsXG4gIHN0dWRlbnRfcHJlZmVyZW5jZV9jaGlsZHJlbjogJ2F1ZGlvLGxhbmd1YWdlLHNwZWVkLHRleHQnLFxuICBpbnRlcmFjdGlvbnNfY2hpbGRyZW46ICdpZCxvYmplY3RpdmVzLHRpbWUsdHlwZSxjb3JyZWN0X3Jlc3BvbnNlcyx3ZWlnaHRpbmcsc3R1ZGVudF9yZXNwb25zZSxyZXN1bHQsbGF0ZW5jeScsXG5cbiAgZXJyb3JfZGVzY3JpcHRpb25zOiB7XG4gICAgJzEwMSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0dlbmVyYWwgRXhjZXB0aW9uJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdObyBzcGVjaWZpYyBlcnJvciBjb2RlIGV4aXN0cyB0byBkZXNjcmliZSB0aGUgZXJyb3IuIFVzZSBMTVNHZXREaWFnbm9zdGljIGZvciBtb3JlIGluZm9ybWF0aW9uJyxcbiAgICB9LFxuICAgICcyMDEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdJbnZhbGlkIGFyZ3VtZW50IGVycm9yJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdJbmRpY2F0ZXMgdGhhdCBhbiBhcmd1bWVudCByZXByZXNlbnRzIGFuIGludmFsaWQgZGF0YSBtb2RlbCBlbGVtZW50IG9yIGlzIG90aGVyd2lzZSBpbmNvcnJlY3QuJyxcbiAgICB9LFxuICAgICcyMDInOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdFbGVtZW50IGNhbm5vdCBoYXZlIGNoaWxkcmVuJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdJbmRpY2F0ZXMgdGhhdCBMTVNHZXRWYWx1ZSB3YXMgY2FsbGVkIHdpdGggYSBkYXRhIG1vZGVsIGVsZW1lbnQgbmFtZSB0aGF0IGVuZHMgaW4gXCJfY2hpbGRyZW5cIiBmb3IgYSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBcIl9jaGlsZHJlblwiIHN1ZmZpeC4nLFxuICAgIH0sXG4gICAgJzIwMyc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0VsZW1lbnQgbm90IGFuIGFycmF5IC0gY2Fubm90IGhhdmUgY291bnQnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0luZGljYXRlcyB0aGF0IExNU0dldFZhbHVlIHdhcyBjYWxsZWQgd2l0aCBhIGRhdGEgbW9kZWwgZWxlbWVudCBuYW1lIHRoYXQgZW5kcyBpbiBcIl9jb3VudFwiIGZvciBhIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhlIFwiX2NvdW50XCIgc3VmZml4LicsXG4gICAgfSxcbiAgICAnMzAxJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnTm90IGluaXRpYWxpemVkJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdJbmRpY2F0ZXMgdGhhdCBhbiBBUEkgY2FsbCB3YXMgbWFkZSBiZWZvcmUgdGhlIGNhbGwgdG8gbG1zSW5pdGlhbGl6ZS4nLFxuICAgIH0sXG4gICAgJzQwMSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ05vdCBpbXBsZW1lbnRlZCBlcnJvcicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnVGhlIGRhdGEgbW9kZWwgZWxlbWVudCBpbmRpY2F0ZWQgaW4gYSBjYWxsIHRvIExNU0dldFZhbHVlIG9yIExNU1NldFZhbHVlIGlzIHZhbGlkLCBidXQgd2FzIG5vdCBpbXBsZW1lbnRlZCBieSB0aGlzIExNUy4gU0NPUk0gMS4yIGRlZmluZXMgYSBzZXQgb2YgZGF0YSBtb2RlbCBlbGVtZW50cyBhcyBiZWluZyBvcHRpb25hbCBmb3IgYW4gTE1TIHRvIGltcGxlbWVudC4nLFxuICAgIH0sXG4gICAgJzQwMic6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0ludmFsaWQgc2V0IHZhbHVlLCBlbGVtZW50IGlzIGEga2V5d29yZCcsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnSW5kaWNhdGVzIHRoYXQgTE1TU2V0VmFsdWUgd2FzIGNhbGxlZCBvbiBhIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSBrZXl3b3JkIChlbGVtZW50cyB0aGF0IGVuZCBpbiBcIl9jaGlsZHJlblwiIGFuZCBcIl9jb3VudFwiKS4nLFxuICAgIH0sXG4gICAgJzQwMyc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0VsZW1lbnQgaXMgcmVhZCBvbmx5JyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdMTVNTZXRWYWx1ZSB3YXMgY2FsbGVkIHdpdGggYSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCBjYW4gb25seSBiZSByZWFkLicsXG4gICAgfSxcbiAgICAnNDA0Jzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRWxlbWVudCBpcyB3cml0ZSBvbmx5JyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdMTVNHZXRWYWx1ZSB3YXMgY2FsbGVkIG9uIGEgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgY2FuIG9ubHkgYmUgd3JpdHRlbiB0by4nLFxuICAgIH0sXG4gICAgJzQwNSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0luY29ycmVjdCBEYXRhIFR5cGUnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0xNU1NldFZhbHVlIHdhcyBjYWxsZWQgd2l0aCBhIHZhbHVlIHRoYXQgaXMgbm90IGNvbnNpc3RlbnQgd2l0aCB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIHN1cHBsaWVkIGRhdGEgbW9kZWwgZWxlbWVudC4nLFxuICAgIH0sXG4gICAgJzQwNyc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0VsZW1lbnQgVmFsdWUgT3V0IE9mIFJhbmdlJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdUaGUgbnVtZXJpYyB2YWx1ZSBzdXBwbGllZCB0byBhIExNU1NldFZhbHVlIGNhbGwgaXMgb3V0c2lkZSBvZiB0aGUgbnVtZXJpYyByYW5nZSBhbGxvd2VkIGZvciB0aGUgc3VwcGxpZWQgZGF0YSBtb2RlbCBlbGVtZW50LicsXG4gICAgfSxcbiAgICAnNDA4Jzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRGF0YSBNb2RlbCBEZXBlbmRlbmN5IE5vdCBFc3RhYmxpc2hlZCcsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnU29tZSBkYXRhIG1vZGVsIGVsZW1lbnRzIGNhbm5vdCBiZSBzZXQgdW50aWwgYW5vdGhlciBkYXRhIG1vZGVsIGVsZW1lbnQgd2FzIHNldC4gVGhpcyBlcnJvciBjb25kaXRpb24gaW5kaWNhdGVzIHRoYXQgdGhlIHByZXJlcXVpc2l0ZSBlbGVtZW50IHdhcyBub3Qgc2V0IGJlZm9yZSB0aGUgZGVwZW5kZW50IGVsZW1lbnQuJyxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3QgYWljYyA9IHtcbiAgLi4uc2Nvcm0xMiwgLi4ue1xuICAgIGNtaV9jaGlsZHJlbjogJ2NvcmUsc3VzcGVuZF9kYXRhLGxhdW5jaF9kYXRhLGNvbW1lbnRzLG9iamVjdGl2ZXMsc3R1ZGVudF9kYXRhLHN0dWRlbnRfcHJlZmVyZW5jZSxpbnRlcmFjdGlvbnMsZXZhbHVhdGlvbicsXG4gICAgc3R1ZGVudF9wcmVmZXJlbmNlX2NoaWxkcmVuOiAnYXVkaW8sbGFuZ3VhZ2UsbGVzc29uX3R5cGUsc3BlZWQsdGV4dCx0ZXh0X2NvbG9yLHRleHRfbG9jYXRpb24sdGV4dF9zaXplLHZpZGVvLHdpbmRvd3MnLFxuICAgIHN0dWRlbnRfZGF0YV9jaGlsZHJlbjogJ2F0dGVtcHRfbnVtYmVyLHRyaWVzLG1hc3Rlcnlfc2NvcmUsbWF4X3RpbWVfYWxsb3dlZCx0aW1lX2xpbWl0X2FjdGlvbicsXG4gICAgc3R1ZGVudF9kZW1vZ3JhcGhpY3NfY2hpbGRyZW46ICdjaXR5LGNsYXNzLGNvbXBhbnksY291bnRyeSxleHBlcmllbmNlLGZhbWlsaWFyX25hbWUsaW5zdHJ1Y3Rvcl9uYW1lLHRpdGxlLG5hdGl2ZV9sYW5ndWFnZSxzdGF0ZSxzdHJlZXRfYWRkcmVzcyx0ZWxlcGhvbmUseWVhcnNfZXhwZXJpZW5jZScsXG4gICAgdHJpZXNfY2hpbGRyZW46ICd0aW1lLHN0YXR1cyxzY29yZScsXG4gICAgYXR0ZW1wdF9yZWNvcmRzX2NoaWxkcmVuOiAnc2NvcmUsbGVzc29uX3N0YXR1cycsXG4gICAgcGF0aHNfY2hpbGRyZW46ICdsb2NhdGlvbl9pZCxkYXRlLHRpbWUsc3RhdHVzLHdoeV9sZWZ0LHRpbWVfaW5fZWxlbWVudCcsXG4gIH0sXG59O1xuXG5jb25zdCBzY29ybTIwMDQgPSB7XG4gIC8vIENoaWxkcmVuIGxpc3RzXG4gIGNtaV9jaGlsZHJlbjogJ192ZXJzaW9uLGNvbW1lbnRzX2Zyb21fbGVhcm5lcixjb21tZW50c19mcm9tX2xtcyxjb21wbGV0aW9uX3N0YXR1cyxjcmVkaXQsZW50cnksZXhpdCxpbnRlcmFjdGlvbnMsbGF1bmNoX2RhdGEsbGVhcm5lcl9pZCxsZWFybmVyX25hbWUsbGVhcm5lcl9wcmVmZXJlbmNlLGxvY2F0aW9uLG1heF90aW1lX2FsbG93ZWQsbW9kZSxvYmplY3RpdmVzLHByb2dyZXNzX21lYXN1cmUsc2NhbGVkX3Bhc3Npbmdfc2NvcmUsc2NvcmUsc2Vzc2lvbl90aW1lLHN1Y2Nlc3Nfc3RhdHVzLHN1c3BlbmRfZGF0YSx0aW1lX2xpbWl0X2FjdGlvbix0b3RhbF90aW1lJyxcbiAgY29tbWVudHNfY2hpbGRyZW46ICdjb21tZW50LHRpbWVzdGFtcCxsb2NhdGlvbicsXG4gIHNjb3JlX2NoaWxkcmVuOiAnbWF4LHJhdyxzY2FsZWQsbWluJyxcbiAgb2JqZWN0aXZlc19jaGlsZHJlbjogJ3Byb2dyZXNzX21lYXN1cmUsY29tcGxldGlvbl9zdGF0dXMsc3VjY2Vzc19zdGF0dXMsZGVzY3JpcHRpb24sc2NvcmUsaWQnLFxuICBjb3JyZWN0X3Jlc3BvbnNlc19jaGlsZHJlbjogJ3BhdHRlcm4nLFxuICBzdHVkZW50X2RhdGFfY2hpbGRyZW46ICdtYXN0ZXJ5X3Njb3JlLG1heF90aW1lX2FsbG93ZWQsdGltZV9saW1pdF9hY3Rpb24nLFxuICBzdHVkZW50X3ByZWZlcmVuY2VfY2hpbGRyZW46ICdhdWRpb19sZXZlbCxhdWRpb19jYXB0aW9uaW5nLGRlbGl2ZXJ5X3NwZWVkLGxhbmd1YWdlJyxcbiAgaW50ZXJhY3Rpb25zX2NoaWxkcmVuOiAnaWQsdHlwZSxvYmplY3RpdmVzLHRpbWVzdGFtcCxjb3JyZWN0X3Jlc3BvbnNlcyx3ZWlnaHRpbmcsbGVhcm5lcl9yZXNwb25zZSxyZXN1bHQsbGF0ZW5jeSxkZXNjcmlwdGlvbicsXG5cbiAgZXJyb3JfZGVzY3JpcHRpb25zOiB7XG4gICAgJzAnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdObyBFcnJvcicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnTm8gZXJyb3Igb2NjdXJyZWQsIHRoZSBwcmV2aW91cyBBUEkgY2FsbCB3YXMgc3VjY2Vzc2Z1bC4nLFxuICAgIH0sXG4gICAgJzEwMSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0dlbmVyYWwgRXhjZXB0aW9uJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdObyBzcGVjaWZpYyBlcnJvciBjb2RlIGV4aXN0cyB0byBkZXNjcmliZSB0aGUgZXJyb3IuIFVzZSBHZXREaWFnbm9zdGljIGZvciBtb3JlIGluZm9ybWF0aW9uLicsXG4gICAgfSxcbiAgICAnMTAyJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnR2VuZXJhbCBJbml0aWFsaXphdGlvbiBGYWlsdXJlJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIEluaXRpYWxpemUgZmFpbGVkIGZvciBhbiB1bmtub3duIHJlYXNvbi4nLFxuICAgIH0sXG4gICAgJzEwMyc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0FscmVhZHkgSW5pdGlhbGl6ZWQnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gSW5pdGlhbGl6ZSBmYWlsZWQgYmVjYXVzZSBJbml0aWFsaXplIHdhcyBhbHJlYWR5IGNhbGxlZC4nLFxuICAgIH0sXG4gICAgJzEwNCc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0NvbnRlbnQgSW5zdGFuY2UgVGVybWluYXRlZCcsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBJbml0aWFsaXplIGZhaWxlZCBiZWNhdXNlIFRlcm1pbmF0ZSB3YXMgYWxyZWFkeSBjYWxsZWQuJyxcbiAgICB9LFxuICAgICcxMTEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdHZW5lcmFsIFRlcm1pbmF0aW9uIEZhaWx1cmUnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gVGVybWluYXRlIGZhaWxlZCBmb3IgYW4gdW5rbm93biByZWFzb24uJyxcbiAgICB9LFxuICAgICcxMTInOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdUZXJtaW5hdGlvbiBCZWZvcmUgSW5pdGlhbGl6YXRpb24nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gVGVybWluYXRlIGZhaWxlZCBiZWNhdXNlIGl0IHdhcyBtYWRlIGJlZm9yZSB0aGUgY2FsbCB0byBJbml0aWFsaXplLicsXG4gICAgfSxcbiAgICAnMTEzJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnVGVybWluYXRpb24gQWZ0ZXIgVGVybWluYXRpb24nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gVGVybWluYXRlIGZhaWxlZCBiZWNhdXNlIFRlcm1pbmF0ZSB3YXMgYWxyZWFkeSBjYWxsZWQuJyxcbiAgICB9LFxuICAgICcxMjInOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdSZXRyaWV2ZSBEYXRhIEJlZm9yZSBJbml0aWFsaXphdGlvbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBHZXRWYWx1ZSBmYWlsZWQgYmVjYXVzZSBpdCB3YXMgbWFkZSBiZWZvcmUgdGhlIGNhbGwgdG8gSW5pdGlhbGl6ZS4nLFxuICAgIH0sXG4gICAgJzEyMyc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ1JldHJpZXZlIERhdGEgQWZ0ZXIgVGVybWluYXRpb24nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gR2V0VmFsdWUgZmFpbGVkIGJlY2F1c2UgaXQgd2FzIG1hZGUgYWZ0ZXIgdGhlIGNhbGwgdG8gVGVybWluYXRlLicsXG4gICAgfSxcbiAgICAnMTMyJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnU3RvcmUgRGF0YSBCZWZvcmUgSW5pdGlhbGl6YXRpb24nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gU2V0VmFsdWUgZmFpbGVkIGJlY2F1c2UgaXQgd2FzIG1hZGUgYmVmb3JlIHRoZSBjYWxsIHRvIEluaXRpYWxpemUuJyxcbiAgICB9LFxuICAgICcxMzMnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdTdG9yZSBEYXRhIEFmdGVyIFRlcm1pbmF0aW9uJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIFNldFZhbHVlIGZhaWxlZCBiZWNhdXNlIGl0IHdhcyBtYWRlIGFmdGVyIHRoZSBjYWxsIHRvIFRlcm1pbmF0ZS4nLFxuICAgIH0sXG4gICAgJzE0Mic6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0NvbW1pdCBCZWZvcmUgSW5pdGlhbGl6YXRpb24nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gQ29tbWl0IGZhaWxlZCBiZWNhdXNlIGl0IHdhcyBtYWRlIGJlZm9yZSB0aGUgY2FsbCB0byBJbml0aWFsaXplLicsXG4gICAgfSxcbiAgICAnMTQzJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnQ29tbWl0IEFmdGVyIFRlcm1pbmF0aW9uJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIENvbW1pdCBmYWlsZWQgYmVjYXVzZSBpdCB3YXMgbWFkZSBhZnRlciB0aGUgY2FsbCB0byBUZXJtaW5hdGUuJyxcbiAgICB9LFxuICAgICcyMDEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdHZW5lcmFsIEFyZ3VtZW50IEVycm9yJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdBbiBpbnZhbGlkIGFyZ3VtZW50IHdhcyBwYXNzZWQgdG8gYW4gQVBJIG1ldGhvZCAodXN1YWxseSBpbmRpY2F0ZXMgdGhhdCBJbml0aWFsaXplLCBDb21taXQgb3IgVGVybWluYXRlIGRpZCBub3QgcmVjZWl2ZSB0aGUgZXhwZWN0ZWQgZW1wdHkgc3RyaW5nIGFyZ3VtZW50LicsXG4gICAgfSxcbiAgICAnMzAxJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnR2VuZXJhbCBHZXQgRmFpbHVyZScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnSW5kaWNhdGVzIGEgZmFpbGVkIEdldFZhbHVlIGNhbGwgd2hlcmUgbm8gb3RoZXIgc3BlY2lmaWMgZXJyb3IgY29kZSBpcyBhcHBsaWNhYmxlLiBVc2UgR2V0RGlhZ25vc3RpYyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLFxuICAgIH0sXG4gICAgJzM1MSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0dlbmVyYWwgU2V0IEZhaWx1cmUnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0luZGljYXRlcyBhIGZhaWxlZCBTZXRWYWx1ZSBjYWxsIHdoZXJlIG5vIG90aGVyIHNwZWNpZmljIGVycm9yIGNvZGUgaXMgYXBwbGljYWJsZS4gVXNlIEdldERpYWdub3N0aWMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyxcbiAgICB9LFxuICAgICczOTEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdHZW5lcmFsIENvbW1pdCBGYWlsdXJlJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdJbmRpY2F0ZXMgYSBmYWlsZWQgQ29tbWl0IGNhbGwgd2hlcmUgbm8gb3RoZXIgc3BlY2lmaWMgZXJyb3IgY29kZSBpcyBhcHBsaWNhYmxlLiBVc2UgR2V0RGlhZ25vc3RpYyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLFxuICAgIH0sXG4gICAgJzQwMSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ1VuZGVmaW5lZCBEYXRhIE1vZGVsIEVsZW1lbnQnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ1RoZSBkYXRhIG1vZGVsIGVsZW1lbnQgbmFtZSBwYXNzZWQgdG8gR2V0VmFsdWUgb3IgU2V0VmFsdWUgaXMgbm90IGEgdmFsaWQgU0NPUk0gZGF0YSBtb2RlbCBlbGVtZW50LicsXG4gICAgfSxcbiAgICAnNDAyJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnVW5pbXBsZW1lbnRlZCBEYXRhIE1vZGVsIEVsZW1lbnQnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ1RoZSBkYXRhIG1vZGVsIGVsZW1lbnQgaW5kaWNhdGVkIGluIGEgY2FsbCB0byBHZXRWYWx1ZSBvciBTZXRWYWx1ZSBpcyB2YWxpZCwgYnV0IHdhcyBub3QgaW1wbGVtZW50ZWQgYnkgdGhpcyBMTVMuIEluIFNDT1JNIDIwMDQsIHRoaXMgZXJyb3Igd291bGQgaW5kaWNhdGUgYW4gTE1TIHRoYXQgaXMgbm90IGZ1bGx5IFNDT1JNIGNvbmZvcm1hbnQuJyxcbiAgICB9LFxuICAgICc0MDMnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdEYXRhIE1vZGVsIEVsZW1lbnQgVmFsdWUgTm90IEluaXRpYWxpemVkJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdBdHRlbXB0IHRvIHJlYWQgYSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgYnkgdGhlIExNUyBvciB0aHJvdWdoIGEgU2V0VmFsdWUgY2FsbC4gVGhpcyBlcnJvciBjb25kaXRpb24gaXMgb2Z0ZW4gcmVhY2hlZCBkdXJpbmcgbm9ybWFsIGV4ZWN1dGlvbiBvZiBhIFNDTy4nLFxuICAgIH0sXG4gICAgJzQwNCc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0RhdGEgTW9kZWwgRWxlbWVudCBJcyBSZWFkIE9ubHknLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ1NldFZhbHVlIHdhcyBjYWxsZWQgd2l0aCBhIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IGNhbiBvbmx5IGJlIHJlYWQuJyxcbiAgICB9LFxuICAgICc0MDUnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdEYXRhIE1vZGVsIEVsZW1lbnQgSXMgV3JpdGUgT25seScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnR2V0VmFsdWUgd2FzIGNhbGxlZCBvbiBhIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IGNhbiBvbmx5IGJlIHdyaXR0ZW4gdG8uJyxcbiAgICB9LFxuICAgICc0MDYnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdEYXRhIE1vZGVsIEVsZW1lbnQgVHlwZSBNaXNtYXRjaCcsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnU2V0VmFsdWUgd2FzIGNhbGxlZCB3aXRoIGEgdmFsdWUgdGhhdCBpcyBub3QgY29uc2lzdGVudCB3aXRoIHRoZSBkYXRhIGZvcm1hdCBvZiB0aGUgc3VwcGxpZWQgZGF0YSBtb2RlbCBlbGVtZW50LicsXG4gICAgfSxcbiAgICAnNDA3Jzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRGF0YSBNb2RlbCBFbGVtZW50IFZhbHVlIE91dCBPZiBSYW5nZScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnVGhlIG51bWVyaWMgdmFsdWUgc3VwcGxpZWQgdG8gYSBTZXRWYWx1ZSBjYWxsIGlzIG91dHNpZGUgb2YgdGhlIG51bWVyaWMgcmFuZ2UgYWxsb3dlZCBmb3IgdGhlIHN1cHBsaWVkIGRhdGEgbW9kZWwgZWxlbWVudC4nLFxuICAgIH0sXG4gICAgJzQwOCc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0RhdGEgTW9kZWwgRGVwZW5kZW5jeSBOb3QgRXN0YWJsaXNoZWQnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ1NvbWUgZGF0YSBtb2RlbCBlbGVtZW50cyBjYW5ub3QgYmUgc2V0IHVudGlsIGFub3RoZXIgZGF0YSBtb2RlbCBlbGVtZW50IHdhcyBzZXQuIFRoaXMgZXJyb3IgY29uZGl0aW9uIGluZGljYXRlcyB0aGF0IHRoZSBwcmVyZXF1aXNpdGUgZWxlbWVudCB3YXMgbm90IHNldCBiZWZvcmUgdGhlIGRlcGVuZGVudCBlbGVtZW50LicsXG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IEFQSUNvbnN0YW50cyA9IHtcbiAgZ2xvYmFsOiBnbG9iYWwsXG4gIHNjb3JtMTI6IHNjb3JtMTIsXG4gIGFpY2M6IGFpY2MsXG4gIHNjb3JtMjAwNDogc2Nvcm0yMDA0LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgQVBJQ29uc3RhbnRzO1xuIiwiLy8gQGZsb3dcbmNvbnN0IGdsb2JhbCA9IHtcbiAgR0VORVJBTDogMTAxLFxuICBJTklUSUFMSVpBVElPTl9GQUlMRUQ6IDEwMSxcbiAgSU5JVElBTElaRUQ6IDEwMSxcbiAgVEVSTUlOQVRFRDogMTAxLFxuICBURVJNSU5BVElPTl9GQUlMVVJFOiAxMDEsXG4gIFRFUk1JTkFUSU9OX0JFRk9SRV9JTklUOiAxMDEsXG4gIE1VTFRJUExFX1RFUk1JTkFUSU9OOiAxMDEsXG4gIFJFVFJJRVZFX0JFRk9SRV9JTklUOiAxMDEsXG4gIFJFVFJJRVZFX0FGVEVSX1RFUk06IDEwMSxcbiAgU1RPUkVfQkVGT1JFX0lOSVQ6IDEwMSxcbiAgU1RPUkVfQUZURVJfVEVSTTogMTAxLFxuICBDT01NSVRfQkVGT1JFX0lOSVQ6IDEwMSxcbiAgQ09NTUlUX0FGVEVSX1RFUk06IDEwMSxcbiAgQVJHVU1FTlRfRVJST1I6IDEwMSxcbiAgQ0hJTERSRU5fRVJST1I6IDEwMSxcbiAgQ09VTlRfRVJST1I6IDEwMSxcbiAgR0VORVJBTF9HRVRfRkFJTFVSRTogMTAxLFxuICBHRU5FUkFMX1NFVF9GQUlMVVJFOiAxMDEsXG4gIEdFTkVSQUxfQ09NTUlUX0ZBSUxVUkU6IDEwMSxcbiAgVU5ERUZJTkVEX0RBVEFfTU9ERUw6IDEwMSxcbiAgVU5JTVBMRU1FTlRFRF9FTEVNRU5UOiAxMDEsXG4gIFZBTFVFX05PVF9JTklUSUFMSVpFRDogMTAxLFxuICBJTlZBTElEX1NFVF9WQUxVRTogMTAxLFxuICBSRUFEX09OTFlfRUxFTUVOVDogMTAxLFxuICBXUklURV9PTkxZX0VMRU1FTlQ6IDEwMSxcbiAgVFlQRV9NSVNNQVRDSDogMTAxLFxuICBWQUxVRV9PVVRfT0ZfUkFOR0U6IDEwMSxcbiAgREVQRU5ERU5DWV9OT1RfRVNUQUJMSVNIRUQ6IDEwMSxcbn07XG5cbmNvbnN0IHNjb3JtMTIgPSB7XG4gIC4uLmdsb2JhbCwgLi4ue1xuICAgIFJFVFJJRVZFX0JFRk9SRV9JTklUOiAzMDEsXG4gICAgU1RPUkVfQkVGT1JFX0lOSVQ6IDMwMSxcbiAgICBDT01NSVRfQkVGT1JFX0lOSVQ6IDMwMSxcbiAgICBBUkdVTUVOVF9FUlJPUjogMjAxLFxuICAgIENISUxEUkVOX0VSUk9SOiAyMDIsXG4gICAgQ09VTlRfRVJST1I6IDIwMyxcbiAgICBVTkRFRklORURfREFUQV9NT0RFTDogNDAxLFxuICAgIFVOSU1QTEVNRU5URURfRUxFTUVOVDogNDAxLFxuICAgIFZBTFVFX05PVF9JTklUSUFMSVpFRDogMzAxLFxuICAgIElOVkFMSURfU0VUX1ZBTFVFOiA0MDIsXG4gICAgUkVBRF9PTkxZX0VMRU1FTlQ6IDQwMyxcbiAgICBXUklURV9PTkxZX0VMRU1FTlQ6IDQwNCxcbiAgICBUWVBFX01JU01BVENIOiA0MDUsXG4gICAgVkFMVUVfT1VUX09GX1JBTkdFOiA0MDcsXG4gICAgREVQRU5ERU5DWV9OT1RfRVNUQUJMSVNIRUQ6IDQwOCxcbiAgfSxcbn07XG5cbmNvbnN0IHNjb3JtMjAwNCA9IHtcbiAgLi4uZ2xvYmFsLCAuLi57XG4gICAgSU5JVElBTElaQVRJT05fRkFJTEVEOiAxMDIsXG4gICAgSU5JVElBTElaRUQ6IDEwMyxcbiAgICBURVJNSU5BVEVEOiAxMDQsXG4gICAgVEVSTUlOQVRJT05fRkFJTFVSRTogMTExLFxuICAgIFRFUk1JTkFUSU9OX0JFRk9SRV9JTklUOiAxMTIsXG4gICAgTVVMVElQTEVfVEVSTUlOQVRJT05TOiAxMTMsXG4gICAgUkVUUklFVkVfQkVGT1JFX0lOSVQ6IDEyMixcbiAgICBSRVRSSUVWRV9BRlRFUl9URVJNOiAxMjMsXG4gICAgU1RPUkVfQkVGT1JFX0lOSVQ6IDEzMixcbiAgICBTVE9SRV9BRlRFUl9URVJNOiAxMzMsXG4gICAgQ09NTUlUX0JFRk9SRV9JTklUOiAxNDIsXG4gICAgQ09NTUlUX0FGVEVSX1RFUk06IDE0MyxcbiAgICBBUkdVTUVOVF9FUlJPUjogMjAxLFxuICAgIEdFTkVSQUxfR0VUX0ZBSUxVUkU6IDMwMSxcbiAgICBHRU5FUkFMX1NFVF9GQUlMVVJFOiAzNTEsXG4gICAgR0VORVJBTF9DT01NSVRfRkFJTFVSRTogMzkxLFxuICAgIFVOREVGSU5FRF9EQVRBX01PREVMOiA0MDEsXG4gICAgVU5JTVBMRU1FTlRFRF9FTEVNRU5UOiA0MDIsXG4gICAgVkFMVUVfTk9UX0lOSVRJQUxJWkVEOiA0MDMsXG4gICAgUkVBRF9PTkxZX0VMRU1FTlQ6IDQwNCxcbiAgICBXUklURV9PTkxZX0VMRU1FTlQ6IDQwNSxcbiAgICBUWVBFX01JU01BVENIOiA0MDYsXG4gICAgVkFMVUVfT1VUX09GX1JBTkdFOiA0MDcsXG4gICAgREVQRU5ERU5DWV9OT1RfRVNUQUJMSVNIRUQ6IDQwOCxcbiAgfSxcbn07XG5cbmNvbnN0IEVycm9yQ29kZXMgPSB7XG4gIHNjb3JtMTI6IHNjb3JtMTIsXG4gIHNjb3JtMjAwNDogc2Nvcm0yMDA0LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgRXJyb3JDb2RlcztcbiIsImNvbnN0IFZhbGlkTGFuZ3VhZ2VzID0ge1xuICAnYWEnOiAnYWEnLCAnYWInOiAnYWInLCAnYWUnOiAnYWUnLCAnYWYnOiAnYWYnLCAnYWsnOiAnYWsnLCAnYW0nOiAnYW0nLFxuICAnYW4nOiAnYW4nLCAnYXInOiAnYXInLCAnYXMnOiAnYXMnLCAnYXYnOiAnYXYnLCAnYXknOiAnYXknLCAnYXonOiAnYXonLFxuICAnYmEnOiAnYmEnLCAnYmUnOiAnYmUnLCAnYmcnOiAnYmcnLCAnYmgnOiAnYmgnLCAnYmknOiAnYmknLCAnYm0nOiAnYm0nLFxuICAnYm4nOiAnYm4nLCAnYm8nOiAnYm8nLCAnYnInOiAnYnInLCAnYnMnOiAnYnMnLCAnY2EnOiAnY2EnLCAnY2UnOiAnY2UnLFxuICAnY2gnOiAnY2gnLCAnY28nOiAnY28nLCAnY3InOiAnY3InLCAnY3MnOiAnY3MnLCAnY3UnOiAnY3UnLCAnY3YnOiAnY3YnLFxuICAnY3knOiAnY3knLCAnZGEnOiAnZGEnLCAnZGUnOiAnZGUnLCAnZHYnOiAnZHYnLCAnZHonOiAnZHonLCAnZWUnOiAnZWUnLFxuICAnZWwnOiAnZWwnLCAnZW4nOiAnZW4nLCAnZW8nOiAnZW8nLCAnZXMnOiAnZXMnLCAnZXQnOiAnZXQnLCAnZXUnOiAnZXUnLFxuICAnZmEnOiAnZmEnLCAnZmYnOiAnZmYnLCAnZmknOiAnZmknLCAnZmonOiAnZmonLCAnZm8nOiAnZm8nLCAnZnInOiAnZnInLFxuICAnZnknOiAnZnknLCAnZ2EnOiAnZ2EnLCAnZ2QnOiAnZ2QnLCAnZ2wnOiAnZ2wnLCAnZ24nOiAnZ24nLCAnZ3UnOiAnZ3UnLFxuICAnZ3YnOiAnZ3YnLCAnaGEnOiAnaGEnLCAnaGUnOiAnaGUnLCAnaGknOiAnaGknLCAnaG8nOiAnaG8nLCAnaHInOiAnaHInLFxuICAnaHQnOiAnaHQnLCAnaHUnOiAnaHUnLCAnaHknOiAnaHknLCAnaHonOiAnaHonLCAnaWEnOiAnaWEnLCAnaWQnOiAnaWQnLFxuICAnaWUnOiAnaWUnLCAnaWcnOiAnaWcnLCAnaWknOiAnaWknLCAnaWsnOiAnaWsnLCAnaW8nOiAnaW8nLCAnaXMnOiAnaXMnLFxuICAnaXQnOiAnaXQnLCAnaXUnOiAnaXUnLCAnamEnOiAnamEnLCAnanYnOiAnanYnLCAna2EnOiAna2EnLCAna2cnOiAna2cnLFxuICAna2knOiAna2knLCAna2onOiAna2onLCAna2snOiAna2snLCAna2wnOiAna2wnLCAna20nOiAna20nLCAna24nOiAna24nLFxuICAna28nOiAna28nLCAna3InOiAna3InLCAna3MnOiAna3MnLCAna3UnOiAna3UnLCAna3YnOiAna3YnLCAna3cnOiAna3cnLFxuICAna3knOiAna3knLCAnbGEnOiAnbGEnLCAnbGInOiAnbGInLCAnbGcnOiAnbGcnLCAnbGknOiAnbGknLCAnbG4nOiAnbG4nLFxuICAnbG8nOiAnbG8nLCAnbHQnOiAnbHQnLCAnbHUnOiAnbHUnLCAnbHYnOiAnbHYnLCAnbWcnOiAnbWcnLCAnbWgnOiAnbWgnLFxuICAnbWknOiAnbWknLCAnbWsnOiAnbWsnLCAnbWwnOiAnbWwnLCAnbW4nOiAnbW4nLCAnbW8nOiAnbW8nLCAnbXInOiAnbXInLFxuICAnbXMnOiAnbXMnLCAnbXQnOiAnbXQnLCAnbXknOiAnbXknLCAnbmEnOiAnbmEnLCAnbmInOiAnbmInLCAnbmQnOiAnbmQnLFxuICAnbmUnOiAnbmUnLCAnbmcnOiAnbmcnLCAnbmwnOiAnbmwnLCAnbm4nOiAnbm4nLCAnbm8nOiAnbm8nLCAnbnInOiAnbnInLFxuICAnbnYnOiAnbnYnLCAnbnknOiAnbnknLCAnb2MnOiAnb2MnLCAnb2onOiAnb2onLCAnb20nOiAnb20nLCAnb3InOiAnb3InLFxuICAnb3MnOiAnb3MnLCAncGEnOiAncGEnLCAncGknOiAncGknLCAncGwnOiAncGwnLCAncHMnOiAncHMnLCAncHQnOiAncHQnLFxuICAncXUnOiAncXUnLCAncm0nOiAncm0nLCAncm4nOiAncm4nLCAncm8nOiAncm8nLCAncnUnOiAncnUnLCAncncnOiAncncnLFxuICAnc2EnOiAnc2EnLCAnc2MnOiAnc2MnLCAnc2QnOiAnc2QnLCAnc2UnOiAnc2UnLCAnc2cnOiAnc2cnLCAnc2gnOiAnc2gnLFxuICAnc2knOiAnc2knLCAnc2snOiAnc2snLCAnc2wnOiAnc2wnLCAnc20nOiAnc20nLCAnc24nOiAnc24nLCAnc28nOiAnc28nLFxuICAnc3EnOiAnc3EnLCAnc3InOiAnc3InLCAnc3MnOiAnc3MnLCAnc3QnOiAnc3QnLCAnc3UnOiAnc3UnLCAnc3YnOiAnc3YnLFxuICAnc3cnOiAnc3cnLCAndGEnOiAndGEnLCAndGUnOiAndGUnLCAndGcnOiAndGcnLCAndGgnOiAndGgnLCAndGknOiAndGknLFxuICAndGsnOiAndGsnLCAndGwnOiAndGwnLCAndG4nOiAndG4nLCAndG8nOiAndG8nLCAndHInOiAndHInLCAndHMnOiAndHMnLFxuICAndHQnOiAndHQnLCAndHcnOiAndHcnLCAndHknOiAndHknLCAndWcnOiAndWcnLCAndWsnOiAndWsnLCAndXInOiAndXInLFxuICAndXonOiAndXonLCAndmUnOiAndmUnLCAndmknOiAndmknLCAndm8nOiAndm8nLCAnd2EnOiAnd2EnLCAnd28nOiAnd28nLFxuICAneGgnOiAneGgnLCAneWknOiAneWknLCAneW8nOiAneW8nLCAnemEnOiAnemEnLCAnemgnOiAnemgnLCAnenUnOiAnenUnLFxuICAnYWFyJzogJ2FhcicsICdhYmsnOiAnYWJrJywgJ2F2ZSc6ICdhdmUnLCAnYWZyJzogJ2FmcicsICdha2EnOiAnYWthJyxcbiAgJ2FtaCc6ICdhbWgnLCAnYXJnJzogJ2FyZycsICdhcmEnOiAnYXJhJywgJ2FzbSc6ICdhc20nLCAnYXZhJzogJ2F2YScsXG4gICdheW0nOiAnYXltJywgJ2F6ZSc6ICdhemUnLCAnYmFrJzogJ2JhaycsICdiZWwnOiAnYmVsJywgJ2J1bCc6ICdidWwnLFxuICAnYmloJzogJ2JpaCcsICdiaXMnOiAnYmlzJywgJ2JhbSc6ICdiYW0nLCAnYmVuJzogJ2JlbicsICd0aWInOiAndGliJyxcbiAgJ2JvZCc6ICdib2QnLCAnYnJlJzogJ2JyZScsICdib3MnOiAnYm9zJywgJ2NhdCc6ICdjYXQnLCAnY2hlJzogJ2NoZScsXG4gICdjaGEnOiAnY2hhJywgJ2Nvcyc6ICdjb3MnLCAnY3JlJzogJ2NyZScsICdjemUnOiAnY3plJywgJ2Nlcyc6ICdjZXMnLFxuICAnY2h1JzogJ2NodScsICdjaHYnOiAnY2h2JywgJ3dlbCc6ICd3ZWwnLCAnY3ltJzogJ2N5bScsICdkYW4nOiAnZGFuJyxcbiAgJ2dlcic6ICdnZXInLCAnZGV1JzogJ2RldScsICdkaXYnOiAnZGl2JywgJ2R6byc6ICdkem8nLCAnZXdlJzogJ2V3ZScsXG4gICdncmUnOiAnZ3JlJywgJ2VsbCc6ICdlbGwnLCAnZW5nJzogJ2VuZycsICdlcG8nOiAnZXBvJywgJ3NwYSc6ICdzcGEnLFxuICAnZXN0JzogJ2VzdCcsICdiYXEnOiAnYmFxJywgJ2V1cyc6ICdldXMnLCAncGVyJzogJ3BlcicsICdmYXMnOiAnZmFzJyxcbiAgJ2Z1bCc6ICdmdWwnLCAnZmluJzogJ2ZpbicsICdmaWonOiAnZmlqJywgJ2Zhbyc6ICdmYW8nLCAnZnJlJzogJ2ZyZScsXG4gICdmcmEnOiAnZnJhJywgJ2ZyeSc6ICdmcnknLCAnZ2xlJzogJ2dsZScsICdnbGEnOiAnZ2xhJywgJ2dsZyc6ICdnbGcnLFxuICAnZ3JuJzogJ2dybicsICdndWonOiAnZ3VqJywgJ2dsdic6ICdnbHYnLCAnaGF1JzogJ2hhdScsICdoZWInOiAnaGViJyxcbiAgJ2hpbic6ICdoaW4nLCAnaG1vJzogJ2htbycsICdocnYnOiAnaHJ2JywgJ2hhdCc6ICdoYXQnLCAnaHVuJzogJ2h1bicsXG4gICdhcm0nOiAnYXJtJywgJ2h5ZSc6ICdoeWUnLCAnaGVyJzogJ2hlcicsICdpbmEnOiAnaW5hJywgJ2luZCc6ICdpbmQnLFxuICAnaWxlJzogJ2lsZScsICdpYm8nOiAnaWJvJywgJ2lpaSc6ICdpaWknLCAnaXBrJzogJ2lwaycsICdpZG8nOiAnaWRvJyxcbiAgJ2ljZSc6ICdpY2UnLCAnaXNsJzogJ2lzbCcsICdpdGEnOiAnaXRhJywgJ2lrdSc6ICdpa3UnLCAnanBuJzogJ2pwbicsXG4gICdqYXYnOiAnamF2JywgJ2dlbyc6ICdnZW8nLCAna2F0JzogJ2thdCcsICdrb24nOiAna29uJywgJ2tpayc6ICdraWsnLFxuICAna3VhJzogJ2t1YScsICdrYXonOiAna2F6JywgJ2thbCc6ICdrYWwnLCAna2htJzogJ2tobScsICdrYW4nOiAna2FuJyxcbiAgJ2tvcic6ICdrb3InLCAna2F1JzogJ2thdScsICdrYXMnOiAna2FzJywgJ2t1cic6ICdrdXInLCAna29tJzogJ2tvbScsXG4gICdjb3InOiAnY29yJywgJ2tpcic6ICdraXInLCAnbGF0JzogJ2xhdCcsICdsdHonOiAnbHR6JywgJ2x1Zyc6ICdsdWcnLFxuICAnbGltJzogJ2xpbScsICdsaW4nOiAnbGluJywgJ2xhbyc6ICdsYW8nLCAnbGl0JzogJ2xpdCcsICdsdWInOiAnbHViJyxcbiAgJ2xhdic6ICdsYXYnLCAnbWxnJzogJ21sZycsICdtYWgnOiAnbWFoJywgJ21hbyc6ICdtYW8nLCAnbXJpJzogJ21yaScsXG4gICdtYWMnOiAnbWFjJywgJ21rZCc6ICdta2QnLCAnbWFsJzogJ21hbCcsICdtb24nOiAnbW9uJywgJ21vbCc6ICdtb2wnLFxuICAnbWFyJzogJ21hcicsICdtYXknOiAnbWF5JywgJ21zYSc6ICdtc2EnLCAnbWx0JzogJ21sdCcsICdidXInOiAnYnVyJyxcbiAgJ215YSc6ICdteWEnLCAnbmF1JzogJ25hdScsICdub2InOiAnbm9iJywgJ25kZSc6ICduZGUnLCAnbmVwJzogJ25lcCcsXG4gICduZG8nOiAnbmRvJywgJ2R1dCc6ICdkdXQnLCAnbmxkJzogJ25sZCcsICdubm8nOiAnbm5vJywgJ25vcic6ICdub3InLFxuICAnbmJsJzogJ25ibCcsICduYXYnOiAnbmF2JywgJ255YSc6ICdueWEnLCAnb2NpJzogJ29jaScsICdvamknOiAnb2ppJyxcbiAgJ29ybSc6ICdvcm0nLCAnb3JpJzogJ29yaScsICdvc3MnOiAnb3NzJywgJ3Bhbic6ICdwYW4nLCAncGxpJzogJ3BsaScsXG4gICdwb2wnOiAncG9sJywgJ3B1cyc6ICdwdXMnLCAncG9yJzogJ3BvcicsICdxdWUnOiAncXVlJywgJ3JvaCc6ICdyb2gnLFxuICAncnVuJzogJ3J1bicsICdydW0nOiAncnVtJywgJ3Jvbic6ICdyb24nLCAncnVzJzogJ3J1cycsICdraW4nOiAna2luJyxcbiAgJ3Nhbic6ICdzYW4nLCAnc3JkJzogJ3NyZCcsICdzbmQnOiAnc25kJywgJ3NtZSc6ICdzbWUnLCAnc2FnJzogJ3NhZycsXG4gICdzbG8nOiAnc2xvJywgJ3Npbic6ICdzaW4nLCAnc2xrJzogJ3NsaycsICdzbHYnOiAnc2x2JywgJ3Ntbyc6ICdzbW8nLFxuICAnc25hJzogJ3NuYScsICdzb20nOiAnc29tJywgJ2FsYic6ICdhbGInLCAnc3FpJzogJ3NxaScsICdzcnAnOiAnc3JwJyxcbiAgJ3Nzdyc6ICdzc3cnLCAnc290JzogJ3NvdCcsICdzdW4nOiAnc3VuJywgJ3N3ZSc6ICdzd2UnLCAnc3dhJzogJ3N3YScsXG4gICd0YW0nOiAndGFtJywgJ3RlbCc6ICd0ZWwnLCAndGdrJzogJ3RnaycsICd0aGEnOiAndGhhJywgJ3Rpcic6ICd0aXInLFxuICAndHVrJzogJ3R1aycsICd0Z2wnOiAndGdsJywgJ3Rzbic6ICd0c24nLCAndG9uJzogJ3RvbicsICd0dXInOiAndHVyJyxcbiAgJ3Rzbyc6ICd0c28nLCAndGF0JzogJ3RhdCcsICd0d2knOiAndHdpJywgJ3RhaCc6ICd0YWgnLCAndWlnJzogJ3VpZycsXG4gICd1a3InOiAndWtyJywgJ3VyZCc6ICd1cmQnLCAndXpiJzogJ3V6YicsICd2ZW4nOiAndmVuJywgJ3ZpZSc6ICd2aWUnLFxuICAndm9sJzogJ3ZvbCcsICd3bG4nOiAnd2xuJywgJ3dvbCc6ICd3b2wnLCAneGhvJzogJ3hobycsICd5aWQnOiAneWlkJyxcbiAgJ3lvcic6ICd5b3InLCAnemhhJzogJ3poYScsICdjaGknOiAnY2hpJywgJ3pobyc6ICd6aG8nLCAnenVsJzogJ3p1bCcsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBWYWxpZExhbmd1YWdlcztcbiIsIi8vIEBmbG93XG5cbmNvbnN0IHNjb3JtMTIgPSB7XG4gIENNSVN0cmluZzI1NjogJ14uezAsMjU1fSQnLFxuICBDTUlTdHJpbmc0MDk2OiAnXi57MCw0MDk2fSQnLFxuICBDTUlUaW1lOiAnXig/OlswMV1cXFxcZHwyWzAxMjNdKTooPzpbMDEyMzQ1XVxcXFxkKTooPzpbMDEyMzQ1XVxcXFxkKSQnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIENNSVRpbWVzcGFuOiAnXihbMC05XXsyLH0pOihbMC05XXsyfSk6KFswLTldezJ9KShcXC5bMC05XXsxLDJ9KT8kJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBDTUlJbnRlZ2VyOiAnXlxcXFxkKyQnLFxuICBDTUlTSW50ZWdlcjogJ14tPyhbMC05XSspJCcsXG4gIENNSURlY2ltYWw6ICdeLT8oWzAtOV17MCwzfSkoXFwuWzAtOV0qKT8kJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBDTUlJZGVudGlmaWVyOiAnXltcXFxcdTAwMjEtXFxcXHUwMDdFXFxcXHNdezAsMjU1fSQnLFxuICBDTUlGZWVkYmFjazogJ14uezAsMjU1fSQnLCAvLyBUaGlzIG11c3QgYmUgcmVkZWZpbmVkXG4gIENNSUluZGV4OiAnWy5fXShcXFxcZCspLicsXG5cbiAgLy8gVm9jYWJ1bGFyeSBEYXRhIFR5cGUgRGVmaW5pdGlvblxuICBDTUlTdGF0dXM6ICdeKHBhc3NlZHxjb21wbGV0ZWR8ZmFpbGVkfGluY29tcGxldGV8YnJvd3NlZCkkJyxcbiAgQ01JU3RhdHVzMjogJ14ocGFzc2VkfGNvbXBsZXRlZHxmYWlsZWR8aW5jb21wbGV0ZXxicm93c2VkfG5vdCBhdHRlbXB0ZWQpJCcsXG4gIENNSUV4aXQ6ICdeKHRpbWUtb3V0fHN1c3BlbmR8bG9nb3V0fCkkJyxcbiAgQ01JVHlwZTogJ14odHJ1ZS1mYWxzZXxjaG9pY2V8ZmlsbC1pbnxtYXRjaGluZ3xwZXJmb3JtYW5jZXxzZXF1ZW5jaW5nfGxpa2VydHxudW1lcmljKSQnLFxuICBDTUlSZXN1bHQ6ICdeKGNvcnJlY3R8d3Jvbmd8dW5hbnRpY2lwYXRlZHxuZXV0cmFsfChbMC05XXswLDN9KT8oXFxcXC5bMC05XSopPykkJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBOQVZFdmVudDogJ14ocHJldmlvdXN8Y29udGludWUpJCcsXG5cbiAgLy8gRGF0YSByYW5nZXNcbiAgc2NvcmVfcmFuZ2U6ICcwIzEwMCcsXG4gIGF1ZGlvX3JhbmdlOiAnLTEjMTAwJyxcbiAgc3BlZWRfcmFuZ2U6ICctMTAwIzEwMCcsXG4gIHdlaWdodGluZ19yYW5nZTogJy0xMDAjMTAwJyxcbiAgdGV4dF9yYW5nZTogJy0xIzEnLFxufTtcblxuY29uc3QgYWljYyA9IHtcbiAgLi4uc2Nvcm0xMiwgLi4ue1xuICAgIENNSUlkZW50aWZpZXI6ICdeXFxcXHd7MSwyNTV9JCcsXG4gIH0sXG59O1xuXG5jb25zdCBzY29ybTIwMDQgPSB7XG4gIENNSVN0cmluZzIwMDogJ15bXFxcXHUwMDAwLVxcXFx1RkZGRl17MCwyMDB9JCcsXG4gIENNSVN0cmluZzI1MDogJ15bXFxcXHUwMDAwLVxcXFx1RkZGRl17MCwyNTB9JCcsXG4gIENNSVN0cmluZzEwMDA6ICdeW1xcXFx1MDAwMC1cXFxcdUZGRkZdezAsMTAwMH0kJyxcbiAgQ01JU3RyaW5nNDAwMDogJ15bXFxcXHUwMDAwLVxcXFx1RkZGRl17MCw0MDAwfSQnLFxuICBDTUlTdHJpbmc2NDAwMDogJ15bXFxcXHUwMDAwLVxcXFx1RkZGRl17MCw2NDAwMH0kJyxcbiAgQ01JTGFuZzogJ14oW2EtekEtWl17MiwzfXxpfHgpKFxcLVthLXpBLVowLTlcXC1dezIsOH0pPyR8XiQnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIENNSUxhbmdTdHJpbmcyNTA6ICdeKFxce2xhbmc9KFthLXpBLVpdezIsM318aXx4KShcXC1bYS16QS1aMC05XFwtXXsyLDh9KT9cXH0pPygoPyFcXHsuKiQpLnswLDI1MH0kKT8kJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBDTUlMYW5nY3I6ICdeKChcXHtsYW5nPShbYS16QS1aXXsyLDN9fGl8eCk/KFxcLVthLXpBLVowLTlcXC1dezIsOH0pP1xcfSkpKC4qPykkJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBDTUlMYW5nU3RyaW5nMjUwY3I6ICdeKChcXHtsYW5nPShbYS16QS1aXXsyLDN9fGl8eCk/KFxcLVthLXpBLVowLTlcXC1dezIsOH0pP1xcfSk/KC57MCwyNTB9KT8pPyQnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIENNSUxhbmdTdHJpbmc0MDAwOiAnXihcXHtsYW5nPShbYS16QS1aXXsyLDN9fGl8eCkoXFwtW2EtekEtWjAtOVxcLV17Miw4fSk/XFx9KT8oKD8hXFx7LiokKS57MCw0MDAwfSQpPyQnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIENNSVRpbWU6ICdeKDE5WzctOV17MX1bMC05XXsxfXwyMFswLTJdezF9WzAtOV17MX18MjAzWzAtOF17MX0pKCgtKDBbMS05XXsxfXwxWzAtMl17MX0pKSgoLSgwWzEtOV17MX18WzEtMl17MX1bMC05XXsxfXwzWzAtMV17MX0pKShUKFswLTFdezF9WzAtOV17MX18MlswLTNdezF9KSgoOlswLTVdezF9WzAtOV17MX0pKCg6WzAtNV17MX1bMC05XXsxfSkoKFxcXFwuWzAtOV17MSwyfSkoKFp8KFsrfC1dKFswLTFdezF9WzAtOV17MX18MlswLTNdezF9KSkpKDpbMC01XXsxfVswLTldezF9KT8pPyk/KT8pPyk/KT8pPyQnLFxuICBDTUlUaW1lc3BhbjogJ15QKD86KFsuLFxcXFxkXSspWSk/KD86KFsuLFxcXFxkXSspTSk/KD86KFsuLFxcXFxkXSspVyk/KD86KFsuLFxcXFxkXSspRCk/KD86VD8oPzooWy4sXFxcXGRdKylIKT8oPzooWy4sXFxcXGRdKylNKT8oPzooWy4sXFxcXGRdKylTKT8pPyQnLFxuICBDTUlJbnRlZ2VyOiAnXlxcXFxkKyQnLFxuICBDTUlTSW50ZWdlcjogJ14tPyhbMC05XSspJCcsXG4gIENNSURlY2ltYWw6ICdeLT8oWzAtOV17MSw1fSkoXFxcXC5bMC05XXsxLDE4fSk/JCcsXG4gIENNSUlkZW50aWZpZXI6ICdeXFxcXFN7MSwyNTB9W2EtekEtWjAtOV0kJyxcbiAgQ01JU2hvcnRJZGVudGlmaWVyOiAnXltcXFxcd1xcXFwuXFxcXC1cXFxcX117MSwyNTB9JCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgQ01JTG9uZ0lkZW50aWZpZXI6ICdeKD86KD8hdXJuOilcXFxcU3sxLDQwMDB9fHVybjpbQS1aYS16MC05LV17MSwzMX06XFxcXFN7MSw0MDAwfXwuezEsNDAwMH0pJCcsIC8vIG5lZWQgdG8gcmUtZXhhbWluZSB0aGlzXG4gIENNSUZlZWRiYWNrOiAnXi4qJCcsIC8vIFRoaXMgbXVzdCBiZSByZWRlZmluZWRcbiAgQ01JSW5kZXg6ICdbLl9dKFxcXFxkKykuJyxcbiAgQ01JSW5kZXhTdG9yZTogJy5OKFxcXFxkKykuJyxcblxuICAvLyBWb2NhYnVsYXJ5IERhdGEgVHlwZSBEZWZpbml0aW9uXG4gIENNSUNTdGF0dXM6ICdeKGNvbXBsZXRlZHxpbmNvbXBsZXRlfG5vdCBhdHRlbXB0ZWR8dW5rbm93bikkJyxcbiAgQ01JU1N0YXR1czogJ14ocGFzc2VkfGZhaWxlZHx1bmtub3duKSQnLFxuICBDTUlFeGl0OiAnXih0aW1lLW91dHxzdXNwZW5kfGxvZ291dHxub3JtYWwpJCcsXG4gIENNSVR5cGU6ICdeKHRydWUtZmFsc2V8Y2hvaWNlfGZpbGwtaW58bG9uZy1maWxsLWlufG1hdGNoaW5nfHBlcmZvcm1hbmNlfHNlcXVlbmNpbmd8bGlrZXJ0fG51bWVyaWN8b3RoZXIpJCcsXG4gIENNSVJlc3VsdDogJ14oY29ycmVjdHxpbmNvcnJlY3R8dW5hbnRpY2lwYXRlZHxuZXV0cmFsfC0/KFswLTldezEsNH0pKFxcXFwuWzAtOV17MSwxOH0pPykkJyxcbiAgTkFWRXZlbnQ6ICdeKHByZXZpb3VzfGNvbnRpbnVlfGV4aXR8ZXhpdEFsbHxhYmFuZG9ufGFiYW5kb25BbGx8c3VzcGVuZEFsbHxcXHt0YXJnZXQ9XFxcXFN7MCwyMDB9W2EtekEtWjAtOV1cXH1jaG9pY2V8anVtcCkkJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBOQVZCb29sZWFuOiAnXih1bmtub3dufHRydWV8ZmFsc2UkKScsXG4gIE5BVlRhcmdldDogJ14ocHJldmlvdXN8Y29udGludWV8Y2hvaWNlLnt0YXJnZXQ9XFxcXFN7MCwyMDB9W2EtekEtWjAtOV19KSQnLFxuXG4gIC8vIERhdGEgcmFuZ2VzXG4gIHNjYWxlZF9yYW5nZTogJy0xIzEnLFxuICBhdWRpb19yYW5nZTogJzAjKicsXG4gIHNwZWVkX3JhbmdlOiAnMCMqJyxcbiAgdGV4dF9yYW5nZTogJy0xIzEnLFxuICBwcm9ncmVzc19yYW5nZTogJzAjMScsXG59O1xuXG5jb25zdCBSZWdleCA9IHtcbiAgYWljYzogYWljYyxcbiAgc2Nvcm0xMjogc2Nvcm0xMixcbiAgc2Nvcm0yMDA0OiBzY29ybTIwMDQsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBSZWdleDtcbiIsIi8vIEBmbG93XG5pbXBvcnQgUmVnZXggZnJvbSAnLi9yZWdleCc7XG5cbmNvbnN0IHNjb3JtMjAwNF9yZWdleCA9IFJlZ2V4LnNjb3JtMjAwNDtcblxuY29uc3QgbGVhcm5lciA9IHtcbiAgJ3RydWUtZmFsc2UnOiB7XG4gICAgZm9ybWF0OiAnXnRydWUkfF5mYWxzZSQnLFxuICAgIG1heDogMSxcbiAgICBkZWxpbWl0ZXI6ICcnLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gIH0sXG4gICdjaG9pY2UnOiB7XG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JTG9uZ0lkZW50aWZpZXIsXG4gICAgbWF4OiAzNixcbiAgICBkZWxpbWl0ZXI6ICdbLF0nLFxuICAgIHVuaXF1ZTogdHJ1ZSxcbiAgfSxcbiAgJ2ZpbGwtaW4nOiB7XG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JTGFuZ1N0cmluZzI1MCxcbiAgICBtYXg6IDEwLFxuICAgIGRlbGltaXRlcjogJ1ssXScsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgfSxcbiAgJ2xvbmctZmlsbC1pbic6IHtcbiAgICBmb3JtYXQ6IHNjb3JtMjAwNF9yZWdleC5DTUlMYW5nU3RyaW5nNDAwMCxcbiAgICBtYXg6IDEsXG4gICAgZGVsaW1pdGVyOiAnJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICB9LFxuICAnbWF0Y2hpbmcnOiB7XG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICAgIGZvcm1hdDI6IHNjb3JtMjAwNF9yZWdleC5DTUlTaG9ydElkZW50aWZpZXIsXG4gICAgbWF4OiAzNixcbiAgICBkZWxpbWl0ZXI6ICdbLF0nLFxuICAgIGRlbGltaXRlcjI6ICdbLl0nLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gIH0sXG4gICdwZXJmb3JtYW5jZSc6IHtcbiAgICBmb3JtYXQ6ICdeJHwnICsgc2Nvcm0yMDA0X3JlZ2V4LkNNSVNob3J0SWRlbnRpZmllcixcbiAgICBmb3JtYXQyOiBzY29ybTIwMDRfcmVnZXguQ01JRGVjaW1hbCArICd8XiR8JyArXG4gICAgICAgIHNjb3JtMjAwNF9yZWdleC5DTUlTaG9ydElkZW50aWZpZXIsXG4gICAgbWF4OiAyNTAsXG4gICAgZGVsaW1pdGVyOiAnWyxdJyxcbiAgICBkZWxpbWl0ZXIyOiAnWy5dJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICB9LFxuICAnc2VxdWVuY2luZyc6IHtcbiAgICBmb3JtYXQ6IHNjb3JtMjAwNF9yZWdleC5DTUlTaG9ydElkZW50aWZpZXIsXG4gICAgbWF4OiAzNixcbiAgICBkZWxpbWl0ZXI6ICdbLF0nLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gIH0sXG4gICdsaWtlcnQnOiB7XG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICAgIG1heDogMSxcbiAgICBkZWxpbWl0ZXI6ICcnLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gIH0sXG4gICdudW1lcmljJzoge1xuICAgIGZvcm1hdDogc2Nvcm0yMDA0X3JlZ2V4LkNNSURlY2ltYWwsXG4gICAgbWF4OiAxLFxuICAgIGRlbGltaXRlcjogJycsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgfSxcbiAgJ290aGVyJzoge1xuICAgIGZvcm1hdDogc2Nvcm0yMDA0X3JlZ2V4LkNNSVN0cmluZzQwMDAsXG4gICAgbWF4OiAxLFxuICAgIGRlbGltaXRlcjogJycsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgfSxcbn07XG5cbmNvbnN0IGNvcnJlY3QgPSB7XG4gICd0cnVlLWZhbHNlJzoge1xuICAgIG1heDogMSxcbiAgICBkZWxpbWl0ZXI6ICcnLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gICAgZHVwbGljYXRlOiBmYWxzZSxcbiAgICBmb3JtYXQ6ICdedHJ1ZSR8XmZhbHNlJCcsXG4gICAgbGltaXQ6IDEsXG4gIH0sXG4gICdjaG9pY2UnOiB7XG4gICAgbWF4OiAzNixcbiAgICBkZWxpbWl0ZXI6ICdbLF0nLFxuICAgIHVuaXF1ZTogdHJ1ZSxcbiAgICBkdXBsaWNhdGU6IGZhbHNlLFxuICAgIGZvcm1hdDogc2Nvcm0yMDA0X3JlZ2V4LkNNSUxvbmdJZGVudGlmaWVyLFxuICB9LFxuICAnZmlsbC1pbic6IHtcbiAgICBtYXg6IDEwLFxuICAgIGRlbGltaXRlcjogJ1ssXScsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgICBkdXBsaWNhdGU6IGZhbHNlLFxuICAgIGZvcm1hdDogc2Nvcm0yMDA0X3JlZ2V4LkNNSUxhbmdTdHJpbmcyNTBjcixcbiAgfSxcbiAgJ2xvbmctZmlsbC1pbic6IHtcbiAgICBtYXg6IDEsXG4gICAgZGVsaW1pdGVyOiAnJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICAgIGR1cGxpY2F0ZTogdHJ1ZSxcbiAgICBmb3JtYXQ6IHNjb3JtMjAwNF9yZWdleC5DTUlMYW5nU3RyaW5nNDAwMCxcbiAgfSxcbiAgJ21hdGNoaW5nJzoge1xuICAgIG1heDogMzYsXG4gICAgZGVsaW1pdGVyOiAnWyxdJyxcbiAgICBkZWxpbWl0ZXIyOiAnWy5dJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICAgIGR1cGxpY2F0ZTogZmFsc2UsXG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICAgIGZvcm1hdDI6IHNjb3JtMjAwNF9yZWdleC5DTUlTaG9ydElkZW50aWZpZXIsXG4gIH0sXG4gICdwZXJmb3JtYW5jZSc6IHtcbiAgICBtYXg6IDI1MCxcbiAgICBkZWxpbWl0ZXI6ICdbLF0nLFxuICAgIGRlbGltaXRlcjI6ICdbLl0nLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gICAgZHVwbGljYXRlOiBmYWxzZSxcbiAgICBmb3JtYXQ6ICdeJHwnICsgc2Nvcm0yMDA0X3JlZ2V4LkNNSVNob3J0SWRlbnRpZmllcixcbiAgICBmb3JtYXQyOiBzY29ybTIwMDRfcmVnZXguQ01JRGVjaW1hbCArICd8XiR8JyArXG4gICAgICAgIHNjb3JtMjAwNF9yZWdleC5DTUlTaG9ydElkZW50aWZpZXIsXG4gIH0sXG4gICdzZXF1ZW5jaW5nJzoge1xuICAgIG1heDogMzYsXG4gICAgZGVsaW1pdGVyOiAnWyxdJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICAgIGR1cGxpY2F0ZTogZmFsc2UsXG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICB9LFxuICAnbGlrZXJ0Jzoge1xuICAgIG1heDogMSxcbiAgICBkZWxpbWl0ZXI6ICcnLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gICAgZHVwbGljYXRlOiBmYWxzZSxcbiAgICBmb3JtYXQ6IHNjb3JtMjAwNF9yZWdleC5DTUlTaG9ydElkZW50aWZpZXIsXG4gICAgbGltaXQ6IDEsXG4gIH0sXG4gICdudW1lcmljJzoge1xuICAgIG1heDogMixcbiAgICBkZWxpbWl0ZXI6ICdbOl0nLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gICAgZHVwbGljYXRlOiBmYWxzZSxcbiAgICBmb3JtYXQ6IHNjb3JtMjAwNF9yZWdleC5DTUlEZWNpbWFsLFxuICAgIGxpbWl0OiAxLFxuICB9LFxuICAnb3RoZXInOiB7XG4gICAgbWF4OiAxLFxuICAgIGRlbGltaXRlcjogJycsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgICBkdXBsaWNhdGU6IGZhbHNlLFxuICAgIGZvcm1hdDogc2Nvcm0yMDA0X3JlZ2V4LkNNSVN0cmluZzQwMDAsXG4gICAgbGltaXQ6IDEsXG4gIH0sXG59O1xuXG5jb25zdCBSZXNwb25zZXMgPSB7XG4gIGxlYXJuZXI6IGxlYXJuZXIsXG4gIGNvcnJlY3Q6IGNvcnJlY3QsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBSZXNwb25zZXM7XG4iLCIvLyBAZmxvd1xuXG5pbXBvcnQgQVBJQ29uc3RhbnRzIGZyb20gJy4vY29uc3RhbnRzL2FwaV9jb25zdGFudHMnO1xuXG5jb25zdCBzY29ybTEyX2Vycm9ycyA9IEFQSUNvbnN0YW50cy5zY29ybTEyLmVycm9yX2Rlc2NyaXB0aW9ucztcbmNvbnN0IGFpY2NfZXJyb3JzID0gQVBJQ29uc3RhbnRzLmFpY2MuZXJyb3JfZGVzY3JpcHRpb25zO1xuY29uc3Qgc2Nvcm0yMDA0X2Vycm9ycyA9IEFQSUNvbnN0YW50cy5zY29ybTIwMDQuZXJyb3JfZGVzY3JpcHRpb25zO1xuXG4vKipcbiAqIEJhc2UgVmFsaWRhdGlvbiBFeGNlcHRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIHRvIHRha2UgaW4gYW4gZXJyb3IgbWVzc2FnZSBhbmQgY29kZVxuICAgKiBAcGFyYW0ge251bWJlcn0gZXJyb3JDb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlcnJvck1lc3NhZ2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRldGFpbGVkTWVzc2FnZVxuICAgKi9cbiAgY29uc3RydWN0b3IoZXJyb3JDb2RlOiBudW1iZXIsIGVycm9yTWVzc2FnZTogU3RyaW5nLCBkZXRhaWxlZE1lc3NhZ2U6IFN0cmluZykge1xuICAgIHN1cGVyKGVycm9yTWVzc2FnZSk7XG4gICAgdGhpcy4jZXJyb3JDb2RlID0gZXJyb3JDb2RlO1xuICAgIHRoaXMuI2Vycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTtcbiAgICB0aGlzLiNkZXRhaWxlZE1lc3NhZ2UgPSBkZXRhaWxlZE1lc3NhZ2U7XG4gIH1cblxuICAjZXJyb3JDb2RlO1xuICAjZXJyb3JNZXNzYWdlO1xuICAjZGV0YWlsZWRNZXNzYWdlO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNlcnJvckNvZGVcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IGVycm9yQ29kZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jZXJyb3JDb2RlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2Vycm9yTWVzc2FnZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZXJyb3JNZXNzYWdlKCkge1xuICAgIHJldHVybiB0aGlzLiNlcnJvck1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjZGV0YWlsZWRNZXNzYWdlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBkZXRhaWxlZE1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2RldGFpbGVkTWVzc2FnZTtcbiAgfVxufVxuXG4vKipcbiAqIFNDT1JNIDEuMiBWYWxpZGF0aW9uIEVycm9yXG4gKi9cbmV4cG9ydCBjbGFzcyBTY29ybTEyVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgVmFsaWRhdGlvbkVycm9yIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIHRvIHRha2UgaW4gYW4gZXJyb3IgY29kZVxuICAgKiBAcGFyYW0ge251bWJlcn0gZXJyb3JDb2RlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlcnJvckNvZGU6IG51bWJlcikge1xuICAgIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNjb3JtMTJfZXJyb3JzLCBTdHJpbmcoZXJyb3JDb2RlKSkpIHtcbiAgICAgIHN1cGVyKGVycm9yQ29kZSwgc2Nvcm0xMl9lcnJvcnNbU3RyaW5nKGVycm9yQ29kZSldLmJhc2ljTWVzc2FnZSwgc2Nvcm0xMl9lcnJvcnNbU3RyaW5nKGVycm9yQ29kZSldLmRldGFpbE1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlcigxMDEsIHNjb3JtMTJfZXJyb3JzWycxMDEnXS5iYXNpY01lc3NhZ2UsIHNjb3JtMTJfZXJyb3JzWycxMDEnXS5kZXRhaWxNZXNzYWdlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBSUNDIFZhbGlkYXRpb24gRXJyb3JcbiAqL1xuZXhwb3J0IGNsYXNzIEFJQ0NWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBWYWxpZGF0aW9uRXJyb3Ige1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgdG8gdGFrZSBpbiBhbiBlcnJvciBjb2RlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBlcnJvckNvZGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGVycm9yQ29kZTogbnVtYmVyKSB7XG4gICAgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwoYWljY19lcnJvcnMsIFN0cmluZyhlcnJvckNvZGUpKSkge1xuICAgICAgc3VwZXIoZXJyb3JDb2RlLCBhaWNjX2Vycm9yc1tTdHJpbmcoZXJyb3JDb2RlKV0uYmFzaWNNZXNzYWdlLCBhaWNjX2Vycm9yc1tTdHJpbmcoZXJyb3JDb2RlKV0uZGV0YWlsTWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN1cGVyKDEwMSwgYWljY19lcnJvcnNbJzEwMSddLmJhc2ljTWVzc2FnZSwgYWljY19lcnJvcnNbJzEwMSddLmRldGFpbE1lc3NhZ2UpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNDT1JNIDIwMDQgVmFsaWRhdGlvbiBFcnJvclxuICovXG5leHBvcnQgY2xhc3MgU2Nvcm0yMDA0VmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgVmFsaWRhdGlvbkVycm9yIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIHRvIHRha2UgaW4gYW4gZXJyb3IgY29kZVxuICAgKiBAcGFyYW0ge251bWJlcn0gZXJyb3JDb2RlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlcnJvckNvZGU6IG51bWJlcikge1xuICAgIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNjb3JtMjAwNF9lcnJvcnMsIFN0cmluZyhlcnJvckNvZGUpKSkge1xuICAgICAgc3VwZXIoZXJyb3JDb2RlLCBzY29ybTIwMDRfZXJyb3JzW1N0cmluZyhlcnJvckNvZGUpXS5iYXNpY01lc3NhZ2UsIHNjb3JtMjAwNF9lcnJvcnNbU3RyaW5nKGVycm9yQ29kZSldLmRldGFpbE1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlcigxMDEsIHNjb3JtMjAwNF9lcnJvcnNbJzEwMSddLmJhc2ljTWVzc2FnZSwgc2Nvcm0yMDA0X2Vycm9yc1snMTAxJ10uZGV0YWlsTWVzc2FnZSk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgU2Nvcm0yMDA0QVBJIGZyb20gJy4uL1Njb3JtMjAwNEFQSSc7XG5pbXBvcnQgU2Nvcm0xMkFQSSBmcm9tICcuLi9TY29ybTEyQVBJJztcbmltcG9ydCBBSUNDIGZyb20gJy4uL0FJQ0MnO1xuXG53aW5kb3cuU2Nvcm0xMkFQSSA9IFNjb3JtMTJBUEk7XG53aW5kb3cuU2Nvcm0yMDA0QVBJID0gU2Nvcm0yMDA0QVBJO1xud2luZG93LkFJQ0MgPSBBSUNDO1xuIiwiLy8gQGZsb3dcbmV4cG9ydCBjb25zdCBTRUNPTkRTX1BFUl9TRUNPTkQgPSAxLjA7XG5leHBvcnQgY29uc3QgU0VDT05EU19QRVJfTUlOVVRFID0gNjA7XG5leHBvcnQgY29uc3QgU0VDT05EU19QRVJfSE9VUiA9IDYwICogU0VDT05EU19QRVJfTUlOVVRFO1xuZXhwb3J0IGNvbnN0IFNFQ09ORFNfUEVSX0RBWSA9IDI0ICogU0VDT05EU19QRVJfSE9VUjtcblxuY29uc3QgZGVzaWduYXRpb25zID0gW1xuICBbJ0QnLCBTRUNPTkRTX1BFUl9EQVldLFxuICBbJ0gnLCBTRUNPTkRTX1BFUl9IT1VSXSxcbiAgWydNJywgU0VDT05EU19QRVJfTUlOVVRFXSxcbiAgWydTJywgU0VDT05EU19QRVJfU0VDT05EXSxcbl07XG5cbi8qKlxuICogQ29udmVydHMgYSBOdW1iZXIgdG8gYSBTdHJpbmcgb2YgSEg6TU06U1NcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gdG90YWxTZWNvbmRzXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWNvbmRzQXNISE1NU1ModG90YWxTZWNvbmRzOiBOdW1iZXIpIHtcbiAgLy8gU0NPUk0gc3BlYyBkb2VzIG5vdCBkZWFsIHdpdGggbmVnYXRpdmUgZHVyYXRpb25zLCBnaXZlIHplcm8gYmFja1xuICBpZiAoIXRvdGFsU2Vjb25kcyB8fCB0b3RhbFNlY29uZHMgPD0gMCkge1xuICAgIHJldHVybiAnMDA6MDA6MDAnO1xuICB9XG5cbiAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHRvdGFsU2Vjb25kcyAvIFNFQ09ORFNfUEVSX0hPVVIpO1xuXG4gIGNvbnN0IGRhdGVPYmogPSBuZXcgRGF0ZSh0b3RhbFNlY29uZHMgKiAxMDAwKTtcbiAgY29uc3QgbWludXRlcyA9IGRhdGVPYmouZ2V0VVRDTWludXRlcygpO1xuICAvLyBtYWtlIHN1cmUgd2UgYWRkIGFueSBwb3NzaWJsZSBkZWNpbWFsIHZhbHVlXG4gIGNvbnN0IHNlY29uZHMgPSBkYXRlT2JqLmdldFNlY29uZHMoKTtcbiAgY29uc3QgbXMgPSB0b3RhbFNlY29uZHMgJSAxLjA7XG4gIGxldCBtc1N0ciA9ICcnO1xuICBpZiAoY291bnREZWNpbWFscyhtcykgPiAwKSB7XG4gICAgaWYgKGNvdW50RGVjaW1hbHMobXMpID4gMikge1xuICAgICAgbXNTdHIgPSBtcy50b0ZpeGVkKDIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtc1N0ciA9IFN0cmluZyhtcyk7XG4gICAgfVxuICAgIG1zU3RyID0gJy4nICsgbXNTdHIuc3BsaXQoJy4nKVsxXTtcbiAgfVxuXG4gIHJldHVybiAoaG91cnMgKyAnOicgKyBtaW51dGVzICsgJzonICsgc2Vjb25kcykucmVwbGFjZSgvXFxiXFxkXFxiL2csXG4gICAgICAnMCQmJykgKyBtc1N0cjtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzZWNvbmRzIGZyb20gSVNPIDg2MDEgRHVyYXRpb25cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gc2Vjb25kc1xuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2Vjb25kc0FzSVNPRHVyYXRpb24oc2Vjb25kczogTnVtYmVyKSB7XG4gIC8vIFNDT1JNIHNwZWMgZG9lcyBub3QgZGVhbCB3aXRoIG5lZ2F0aXZlIGR1cmF0aW9ucywgZ2l2ZSB6ZXJvIGJhY2tcbiAgaWYgKCFzZWNvbmRzIHx8IHNlY29uZHMgPD0gMCkge1xuICAgIHJldHVybiAnUFQwUyc7XG4gIH1cblxuICBsZXQgZHVyYXRpb24gPSAnUCc7XG4gIGxldCByZW1haW5kZXIgPSBzZWNvbmRzO1xuXG4gIGRlc2lnbmF0aW9ucy5mb3JFYWNoKChbc2lnbiwgY3VycmVudF9zZWNvbmRzXSkgPT4ge1xuICAgIGxldCB2YWx1ZSA9IE1hdGguZmxvb3IocmVtYWluZGVyIC8gY3VycmVudF9zZWNvbmRzKTtcblxuICAgIHJlbWFpbmRlciA9IHJlbWFpbmRlciAlIGN1cnJlbnRfc2Vjb25kcztcbiAgICBpZiAoY291bnREZWNpbWFscyhyZW1haW5kZXIpID4gMikge1xuICAgICAgcmVtYWluZGVyID0gTnVtYmVyKE51bWJlcihyZW1haW5kZXIpLnRvRml4ZWQoMikpO1xuICAgIH1cbiAgICAvLyBJZiB3ZSBoYXZlIGFueXRoaW5nIGxlZnQgaW4gdGhlIHJlbWFpbmRlciwgYW5kIHdlJ3JlIGN1cnJlbnRseSBhZGRpbmdcbiAgICAvLyBzZWNvbmRzIHRvIHRoZSBkdXJhdGlvbiwgZ28gYWhlYWQgYW5kIGFkZCB0aGUgZGVjaW1hbCB0byB0aGUgc2Vjb25kc1xuICAgIGlmIChzaWduID09PSAnUycgJiYgcmVtYWluZGVyID4gMCkge1xuICAgICAgdmFsdWUgKz0gcmVtYWluZGVyO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKChkdXJhdGlvbi5pbmRleE9mKCdEJykgPiAwIHx8XG4gICAgICAgICAgc2lnbiA9PT0gJ0gnIHx8IHNpZ24gPT09ICdNJyB8fCBzaWduID09PSAnUycpICYmXG4gICAgICAgICAgZHVyYXRpb24uaW5kZXhPZignVCcpID09PSAtMSkge1xuICAgICAgICBkdXJhdGlvbiArPSAnVCc7XG4gICAgICB9XG4gICAgICBkdXJhdGlvbiArPSBgJHt2YWx1ZX0ke3NpZ259YDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBkdXJhdGlvbjtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzZWNvbmRzIGZyb20gSEg6TU06U1MuREREREREXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRpbWVTdHJpbmdcbiAqIEBwYXJhbSB7UmVnRXhwfSB0aW1lUmVnZXhcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWVBc1NlY29uZHModGltZVN0cmluZzogU3RyaW5nLCB0aW1lUmVnZXg6IFJlZ0V4cCkge1xuICBpZiAoIXRpbWVTdHJpbmcgfHwgdHlwZW9mIHRpbWVTdHJpbmcgIT09ICdzdHJpbmcnIHx8XG4gICAgICAhdGltZVN0cmluZy5tYXRjaCh0aW1lUmVnZXgpKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29uc3QgcGFydHMgPSB0aW1lU3RyaW5nLnNwbGl0KCc6Jyk7XG4gIGNvbnN0IGhvdXJzID0gTnVtYmVyKHBhcnRzWzBdKTtcbiAgY29uc3QgbWludXRlcyA9IE51bWJlcihwYXJ0c1sxXSk7XG4gIGNvbnN0IHNlY29uZHMgPSBOdW1iZXIocGFydHNbMl0pO1xuICByZXR1cm4gKGhvdXJzICogMzYwMCkgKyAobWludXRlcyAqIDYwKSArIHNlY29uZHM7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBmcm9tIElTTyA4NjAxIER1cmF0aW9uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGR1cmF0aW9uXG4gKiBAcGFyYW0ge1JlZ0V4cH0gZHVyYXRpb25SZWdleFxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RHVyYXRpb25Bc1NlY29uZHMoZHVyYXRpb246IFN0cmluZywgZHVyYXRpb25SZWdleDogUmVnRXhwKSB7XG4gIGlmICghZHVyYXRpb24gfHwgIWR1cmF0aW9uLm1hdGNoKGR1cmF0aW9uUmVnZXgpKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCBbLCB5ZWFycywgbW9udGhzLCAsIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzXSA9IG5ldyBSZWdFeHAoXG4gICAgICBkdXJhdGlvblJlZ2V4KS5leGVjKGR1cmF0aW9uKSB8fCBbXTtcblxuICBsZXQgcmVzdWx0ID0gMC4wO1xuXG4gIHJlc3VsdCArPSAoTnVtYmVyKHNlY29uZHMpICogMS4wIHx8IDAuMCk7XG4gIHJlc3VsdCArPSAoTnVtYmVyKG1pbnV0ZXMpICogNjAuMCB8fCAwLjApO1xuICByZXN1bHQgKz0gKE51bWJlcihob3VycykgKiAzNjAwLjAgfHwgMC4wKTtcbiAgcmVzdWx0ICs9IChOdW1iZXIoZGF5cykgKiAoNjAgKiA2MCAqIDI0LjApIHx8IDAuMCk7XG4gIHJlc3VsdCArPSAoTnVtYmVyKHllYXJzKSAqICg2MCAqIDYwICogMjQgKiAzNjUuMCkgfHwgMC4wKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEFkZHMgdG9nZXRoZXIgdHdvIElTTzg2MDEgRHVyYXRpb24gc3RyaW5nc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaXJzdFxuICogQHBhcmFtIHtzdHJpbmd9IHNlY29uZFxuICogQHBhcmFtIHtSZWdFeHB9IGR1cmF0aW9uUmVnZXhcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFR3b0R1cmF0aW9ucyhcbiAgICBmaXJzdDogU3RyaW5nLFxuICAgIHNlY29uZDogU3RyaW5nLFxuICAgIGR1cmF0aW9uUmVnZXg6IFJlZ0V4cCkge1xuICByZXR1cm4gZ2V0U2Vjb25kc0FzSVNPRHVyYXRpb24oXG4gICAgICBnZXREdXJhdGlvbkFzU2Vjb25kcyhmaXJzdCwgZHVyYXRpb25SZWdleCkgK1xuICAgICAgZ2V0RHVyYXRpb25Bc1NlY29uZHMoc2Vjb25kLCBkdXJhdGlvblJlZ2V4KSxcbiAgKTtcbn1cblxuLyoqXG4gKiBBZGQgdG9nZXRoZXIgdHdvIEhIOk1NOlNTLkREIHN0cmluZ3NcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlyc3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWNvbmRcbiAqIEBwYXJhbSB7UmVnRXhwfSB0aW1lUmVnZXhcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEhITU1TU1RpbWVTdHJpbmdzKFxuICAgIGZpcnN0OiBTdHJpbmcsXG4gICAgc2Vjb25kOiBTdHJpbmcsXG4gICAgdGltZVJlZ2V4OiBSZWdFeHApIHtcbiAgcmV0dXJuIGdldFNlY29uZHNBc0hITU1TUyhcbiAgICAgIGdldFRpbWVBc1NlY29uZHMoZmlyc3QsIHRpbWVSZWdleCkgK1xuICAgICAgZ2V0VGltZUFzU2Vjb25kcyhcbiAgICAgICAgICBzZWNvbmQsIHRpbWVSZWdleCksXG4gICk7XG59XG5cbi8qKlxuICogRmxhdHRlbiBhIEpTT04gb2JqZWN0IGRvd24gdG8gc3RyaW5nIHBhdGhzIGZvciBlYWNoIHZhbHVlc1xuICogQHBhcmFtIHtvYmplY3R9IGRhdGFcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW4oZGF0YSkge1xuICBjb25zdCByZXN1bHQgPSB7fTtcblxuICAvKipcbiAgICogUmVjdXJzZSB0aHJvdWdoIHRoZSBvYmplY3RcbiAgICogQHBhcmFtIHsqfSBjdXJcbiAgICogQHBhcmFtIHsqfSBwcm9wXG4gICAqL1xuICBmdW5jdGlvbiByZWN1cnNlKGN1ciwgcHJvcCkge1xuICAgIGlmIChPYmplY3QoY3VyKSAhPT0gY3VyKSB7XG4gICAgICByZXN1bHRbcHJvcF0gPSBjdXI7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGN1cikpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY3VyLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICByZWN1cnNlKGN1cltpXSwgcHJvcCArICdbJyArIGkgKyAnXScpO1xuICAgICAgICBpZiAobCA9PT0gMCkgcmVzdWx0W3Byb3BdID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBpc0VtcHR5ID0gdHJ1ZTtcbiAgICAgIGZvciAoY29uc3QgcCBpbiBjdXIpIHtcbiAgICAgICAgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwoY3VyLCBwKSkge1xuICAgICAgICAgIGlzRW1wdHkgPSBmYWxzZTtcbiAgICAgICAgICByZWN1cnNlKGN1cltwXSwgcHJvcCA/IHByb3AgKyAnLicgKyBwIDogcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc0VtcHR5ICYmIHByb3ApIHJlc3VsdFtwcm9wXSA9IHt9O1xuICAgIH1cbiAgfVxuXG4gIHJlY3Vyc2UoZGF0YSwgJycpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFVuLWZsYXR0ZW4gYSBmbGF0IEpTT04gb2JqZWN0XG4gKiBAcGFyYW0ge29iamVjdH0gZGF0YVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5mbGF0dGVuKGRhdGEpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICBpZiAoT2JqZWN0KGRhdGEpICE9PSBkYXRhIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHJldHVybiBkYXRhO1xuICBjb25zdCByZWdleCA9IC9cXC4/KFteLltcXF1dKyl8XFxbKFxcZCspXS9nO1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgZm9yIChjb25zdCBwIGluIGRhdGEpIHtcbiAgICBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBwKSkge1xuICAgICAgbGV0IGN1ciA9IHJlc3VsdDtcbiAgICAgIGxldCBwcm9wID0gJyc7XG4gICAgICBsZXQgbSA9IHJlZ2V4LmV4ZWMocCk7XG4gICAgICB3aGlsZSAobSkge1xuICAgICAgICBjdXIgPSBjdXJbcHJvcF0gfHwgKGN1cltwcm9wXSA9IChtWzJdID8gW10gOiB7fSkpO1xuICAgICAgICBwcm9wID0gbVsyXSB8fCBtWzFdO1xuICAgICAgICBtID0gcmVnZXguZXhlYyhwKTtcbiAgICAgIH1cbiAgICAgIGN1cltwcm9wXSA9IGRhdGFbcF07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRbJyddIHx8IHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb3VudHMgdGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlc1xuICogQHBhcmFtIHtudW1iZXJ9IG51bVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY291bnREZWNpbWFscyhudW06IG51bWJlcikge1xuICBpZiAoTWF0aC5mbG9vcihudW0pID09PSBudW0gfHwgU3RyaW5nKG51bSkuaW5kZXhPZignLicpIDwgMCkgcmV0dXJuIDA7XG4gIGNvbnN0IHBhcnRzID0gbnVtLnRvU3RyaW5nKCkuc3BsaXQoJy4nKVsxXTtcbiAgcmV0dXJuIHBhcnRzLmxlbmd0aCB8fCAwO1xufVxuIl19
+/***/ })
+
+/******/ });
+/************************************************************************/
+/******/ // 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] = {
+/******/ // no module.id needed
+/******/ // no module.loaded needed
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/************************************************************************/
+/******/ /* webpack/runtime/compat get default export */
+/******/ !function() {
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function() { return module['default']; } :
+/******/ function() { return module; };
+/******/ __webpack_require__.d(getter, { a: getter });
+/******/ return getter;
+/******/ };
+/******/ }();
+/******/
+/******/ /* webpack/runtime/define property getters */
+/******/ !function() {
+/******/ // define getter functions for harmony exports
+/******/ __webpack_require__.d = function(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/global */
+/******/ !function() {
+/******/ __webpack_require__.g = (function() {
+/******/ if (typeof globalThis === 'object') return globalThis;
+/******/ try {
+/******/ return this || new Function('return this')();
+/******/ } catch (e) {
+/******/ if (typeof window === 'object') return window;
+/******/ }
+/******/ })();
+/******/ }();
+/******/
+/******/ /* webpack/runtime/hasOwnProperty shorthand */
+/******/ !function() {
+/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
+/******/ }();
+/******/
+/******/ /* webpack/runtime/make namespace object */
+/******/ !function() {
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/ }();
+/******/
+/************************************************************************/
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be in strict mode.
+!function() {
+"use strict";
+/*!************************************!*\
+ !*** ./src/exports/scorm-again.js ***!
+ \************************************/
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Scorm2004API__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Scorm2004API */ "./src/Scorm2004API.js");
+/* harmony import */ var _Scorm12API__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../Scorm12API */ "./src/Scorm12API.js");
+/* harmony import */ var _AICC__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../AICC */ "./src/AICC.js");
+
+
+
+window.Scorm12API = _Scorm12API__WEBPACK_IMPORTED_MODULE_1__["default"];
+window.Scorm2004API = _Scorm2004API__WEBPACK_IMPORTED_MODULE_0__["default"];
+window.AICC = _AICC__WEBPACK_IMPORTED_MODULE_2__["default"];
+}();
+/******/ })()
+;
+//# sourceMappingURL=scorm-again.js.map
\ No newline at end of file
diff --git a/dist/scorm-again.js.map b/dist/scorm-again.js.map
new file mode 100644
index 0000000..6a060f5
--- /dev/null
+++ b/dist/scorm-again.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"scorm-again.js","mappings":"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;AAAA,aALM;AAKN;;AAAA;AAEb;AAED;AACF;AACA;AACA;AACA;;;;;SACE,eAAgB;AACd,mCAAO,IAAP;AACD;AAED;AACF;AACA;AACA;AACA;;SACE,aAAc4D,SAAd,EAAyB;AACvBrF,MAAAA,kBAAkB;AACnB;AAED;AACF;AACA;AACA;;;;SACE,eAAkB;AAChB,mCAAO,IAAP;AACD;AAED;AACF;AACA;AACA;;SACE,aAAgB0J,WAAhB,EAA6B;AAC3B,UAAIjB,oBAAoB,CAACiB,WAAD,EAAcpO,eAAe,CAAC8J,UAA9B,CAApB,IACFsD,mBAAmB,CAACgB,WAAD,EAAcpO,eAAe,CAAC8L,WAA9B,CADrB,EACiE;AAC/D,kDAAoBsC,WAApB;AACD;AACF;AAED;AACF;AACA;AACA;;;;SACE,eAAe;AACb,mCAAO,IAAP;AACD;AAED;AACF;AACA;AACA;;SACE,aAAaxH,QAAb,EAAuB;AACrB,UAAIuG,oBAAoB,CAACvG,QAAD,EAAW5G,eAAe,CAACqO,OAA3B,CAAxB,EAA6D;AAC3D,+CAAiBzH,QAAjB;AACD;AACF;AAED;AACF;AACA;AACA;;;;SACE,eAAqB;AACnB,mCAAO,IAAP;AACD;AAED;AACF;AACA;AACA;;SACE,aAAmB0H,cAAnB,EAAmC;AACjC,UAAInB,oBAAoB,CAACmB,cAAD,EAAiBtO,eAAe,CAAC8J,UAAjC,CAApB,IACFsD,mBAAmB,CAACkB,cAAD,EAAiBtO,eAAe,CAAC+L,WAAjC,CADrB,EACoE;AAClE,qDAAuBuC,cAAvB;AACD;AACF;AAED;AACF;AACA;AACA;;;;SACE,eAAuB;AACrB,mCAAO,IAAP;AACD;AAED;AACF;AACA;AACA;;SACE,aAAqBC,gBAArB,EAAuC;AACrC,UAAIpB,oBAAoB,CAACoB,gBAAD,EAAmBvO,eAAe,CAAC6L,WAAnC,CAApB,IACFuB,mBAAmB,CAACmB,gBAAD,EAAmBvO,eAAe,CAACgM,UAAnC,CADrB,EACqE;AACnE,uDAAyBuC,gBAAzB;AACD;AACF;AAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA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","sources":["webpack://scorm-again/./node_modules/lodash.debounce/index.js","webpack://scorm-again/./src/AICC.js","webpack://scorm-again/./src/BaseAPI.js","webpack://scorm-again/./src/Scorm12API.js","webpack://scorm-again/./src/Scorm2004API.js","webpack://scorm-again/./src/cmi/aicc_cmi.js","webpack://scorm-again/./src/cmi/common.js","webpack://scorm-again/./src/cmi/scorm12_cmi.js","webpack://scorm-again/./src/cmi/scorm2004_cmi.js","webpack://scorm-again/./src/constants/api_constants.js","webpack://scorm-again/./src/constants/error_codes.js","webpack://scorm-again/./src/constants/language_constants.js","webpack://scorm-again/./src/constants/regex.js","webpack://scorm-again/./src/constants/response_constants.js","webpack://scorm-again/./src/exceptions.js","webpack://scorm-again/./src/utilities.js","webpack://scorm-again/webpack/bootstrap","webpack://scorm-again/webpack/runtime/compat get default export","webpack://scorm-again/webpack/runtime/define property getters","webpack://scorm-again/webpack/runtime/global","webpack://scorm-again/webpack/runtime/hasOwnProperty shorthand","webpack://scorm-again/webpack/runtime/make namespace object","webpack://scorm-again/./src/exports/scorm-again.js"],"sourcesContent":["/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n","// @flow\nimport Scorm12API from './Scorm12API';\nimport {\n CMI,\n CMIAttemptRecordsObject,\n CMIEvaluationCommentsObject,\n CMITriesObject,\n} from './cmi/aicc_cmi';\nimport {NAV} from './cmi/scorm12_cmi';\n\n/**\n * The AICC API class\n */\nexport default class AICC extends Scorm12API {\n /**\n * Constructor to create AICC API object\n * @param {object} settings\n */\n constructor(settings: {}) {\n const finalSettings = {\n ...{\n mastery_override: false,\n }, ...settings,\n };\n\n super(finalSettings);\n\n this.cmi = new CMI();\n this.nav = new NAV();\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n *\n * @param {string} CMIElement\n * @param {any} value\n * @param {boolean} foundFirstIndex\n * @return {object}\n */\n getChildElement(CMIElement, value, foundFirstIndex) {\n let newChild = super.getChildElement(CMIElement, value, foundFirstIndex);\n\n if (!newChild) {\n if (this.stringMatches(CMIElement, 'cmi\\\\.evaluation\\\\.comments\\\\.\\\\d+')) {\n newChild = new CMIEvaluationCommentsObject();\n } else if (this.stringMatches(CMIElement,\n 'cmi\\\\.student_data\\\\.tries\\\\.\\\\d+')) {\n newChild = new CMITriesObject();\n } else if (this.stringMatches(CMIElement,\n 'cmi\\\\.student_data\\\\.attempt_records\\\\.\\\\d+')) {\n newChild = new CMIAttemptRecordsObject();\n }\n }\n\n return newChild;\n }\n\n /**\n * Replace the whole API with another\n *\n * @param {AICC} newAPI\n */\n replaceWithAnotherScormAPI(newAPI) {\n // Data Model\n this.cmi = newAPI.cmi;\n this.nav = newAPI.nav;\n }\n}\n","// @flow\nimport {CMIArray} from './cmi/common';\nimport {ValidationError} from './exceptions';\nimport ErrorCodes from './constants/error_codes';\nimport APIConstants from './constants/api_constants';\nimport {unflatten} from './utilities';\nimport debounce from 'lodash.debounce';\n\nconst global_constants = APIConstants.global;\nconst scorm12_error_codes = ErrorCodes.scorm12;\n\n/**\n * Base API class for AICC, SCORM 1.2, and SCORM 2004. Should be considered\n * abstract, and never initialized on it's own.\n */\nexport default class BaseAPI {\n #timeout;\n #error_codes;\n #settings = {\n autocommit: false,\n autocommitSeconds: 10,\n asyncCommit: false,\n sendBeaconCommit: false,\n lmsCommitUrl: false,\n dataCommitFormat: 'json', // valid formats are 'json' or 'flattened', 'params'\n commitRequestDataType: 'application/json;charset=UTF-8',\n autoProgress: false,\n logLevel: global_constants.LOG_LEVEL_ERROR,\n selfReportSessionTime: false,\n alwaysSendTotalTime: false,\n strict_errors: true,\n xhrHeaders: {},\n xhrWithCredentials: false,\n responseHandler: function(xhr) {\n let result;\n if (typeof xhr !== 'undefined') {\n result = JSON.parse(xhr.responseText);\n if (result === null || !{}.hasOwnProperty.call(result, 'result')) {\n result = {};\n if (xhr.status === 200) {\n result.result = global_constants.SCORM_TRUE;\n result.errorCode = 0;\n } else {\n result.result = global_constants.SCORM_FALSE;\n result.errorCode = 101;\n }\n }\n }\n return result;\n },\n requestHandler: function(commitObject) {\n return commitObject;\n },\n onLogMessage: function(messageLevel, logMessage) {\n switch (messageLevel) {\n case global_constants.LOG_LEVEL_ERROR:\n console.error(logMessage);\n break;\n case global_constants.LOG_LEVEL_WARNING:\n console.warn(logMessage);\n break;\n case global_constants.LOG_LEVEL_INFO:\n console.info(logMessage);\n break;\n case global_constants.LOG_LEVEL_DEBUG:\n if (console.debug) {\n console.debug(logMessage);\n } else {\n console.log(logMessage);\n }\n break;\n }\n },\n };\n cmi;\n startingData: {};\n\n /**\n * Constructor for Base API class. Sets some shared API fields, as well as\n * sets up options for the API.\n * @param {object} error_codes\n * @param {object} settings\n */\n constructor(error_codes, settings) {\n if (new.target === BaseAPI) {\n throw new TypeError('Cannot construct BaseAPI instances directly');\n }\n this.currentState = global_constants.STATE_NOT_INITIALIZED;\n this.lastErrorCode = 0;\n this.listenerArray = [];\n\n this.#timeout = null;\n this.#error_codes = error_codes;\n\n this.settings = settings;\n this.apiLogLevel = this.settings.logLevel;\n this.selfReportSessionTime = this.settings.selfReportSessionTime;\n }\n\n /**\n * Initialize the API\n * @param {string} callbackName\n * @param {string} initializeMessage\n * @param {string} terminationMessage\n * @return {string}\n */\n initialize(\n callbackName: String,\n initializeMessage?: String,\n terminationMessage?: String) {\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.isInitialized()) {\n this.throwSCORMError(this.#error_codes.INITIALIZED, initializeMessage);\n } else if (this.isTerminated()) {\n this.throwSCORMError(this.#error_codes.TERMINATED, terminationMessage);\n } else {\n if (this.selfReportSessionTime) {\n this.cmi.setStartTime();\n }\n\n this.currentState = global_constants.STATE_INITIALIZED;\n this.lastErrorCode = 0;\n returnValue = global_constants.SCORM_TRUE;\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Getter for #error_codes\n * @return {object}\n */\n get error_codes() {\n return this.#error_codes;\n }\n\n /**\n * Getter for #settings\n * @return {object}\n */\n get settings() {\n return this.#settings;\n }\n\n /**\n * Setter for #settings\n * @param {object} settings\n */\n set settings(settings: Object) {\n this.#settings = {...this.#settings, ...settings};\n }\n\n /**\n * Terminates the current run of the API\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @return {string}\n */\n terminate(\n callbackName: String,\n checkTerminated: boolean) {\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.checkState(checkTerminated,\n this.#error_codes.TERMINATION_BEFORE_INIT,\n this.#error_codes.MULTIPLE_TERMINATION)) {\n this.currentState = global_constants.STATE_TERMINATED;\n\n const result = this.storeData(true);\n if (!this.settings.sendBeaconCommit && !this.settings.asyncCommit &&\n typeof result.errorCode !== 'undefined' && result.errorCode > 0) {\n this.throwSCORMError(result.errorCode);\n }\n returnValue = (typeof result !== 'undefined' && result.result) ?\n result.result : global_constants.SCORM_FALSE;\n\n if (checkTerminated) this.lastErrorCode = 0;\n\n returnValue = global_constants.SCORM_TRUE;\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Get the value of the CMIElement.\n *\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @param {string} CMIElement\n * @return {string}\n */\n getValue(\n callbackName: String,\n checkTerminated: boolean,\n CMIElement: String) {\n let returnValue;\n\n if (this.checkState(checkTerminated,\n this.#error_codes.RETRIEVE_BEFORE_INIT,\n this.#error_codes.RETRIEVE_AFTER_TERM)) {\n if (checkTerminated) this.lastErrorCode = 0;\n try {\n returnValue = this.getCMIValue(CMIElement);\n } catch (e) {\n if (e instanceof ValidationError) {\n this.lastErrorCode = e.errorCode;\n returnValue = global_constants.SCORM_FALSE;\n } else {\n if (e.message) {\n console.error(e.message);\n } else {\n console.error(e);\n }\n this.throwSCORMError(this.#error_codes.GENERAL);\n }\n }\n this.processListeners(callbackName, CMIElement);\n }\n\n this.apiLog(callbackName, CMIElement, ': returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Sets the value of the CMIElement.\n *\n * @param {string} callbackName\n * @param {string} commitCallback\n * @param {boolean} checkTerminated\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n setValue(\n callbackName: String,\n commitCallback: String,\n checkTerminated: boolean,\n CMIElement,\n value) {\n if (value !== undefined) {\n value = String(value);\n }\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.checkState(checkTerminated, this.#error_codes.STORE_BEFORE_INIT,\n this.#error_codes.STORE_AFTER_TERM)) {\n if (checkTerminated) this.lastErrorCode = 0;\n try {\n returnValue = this.setCMIValue(CMIElement, value);\n } catch (e) {\n if (e instanceof ValidationError) {\n this.lastErrorCode = e.errorCode;\n returnValue = global_constants.SCORM_FALSE;\n } else {\n if (e.message) {\n console.error(e.message);\n } else {\n console.error(e);\n }\n this.throwSCORMError(this.#error_codes.GENERAL);\n }\n }\n this.processListeners(callbackName, CMIElement, value);\n }\n\n if (returnValue === undefined) {\n returnValue = global_constants.SCORM_FALSE;\n }\n\n // If we didn't have any errors while setting the data, go ahead and\n // schedule a commit, if autocommit is turned on\n if (String(this.lastErrorCode) === '0') {\n if (this.settings.autocommit && !this.#timeout) {\n this.scheduleCommit(this.settings.autocommitSeconds * 1000, commitCallback);\n }\n }\n\n this.apiLog(callbackName, CMIElement,\n ': ' + value + ': result: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Orders LMS to store all content parameters\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @return {string}\n */\n commit(\n callbackName: String,\n checkTerminated: boolean) {\n this.clearScheduledCommit();\n\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.checkState(checkTerminated, this.#error_codes.COMMIT_BEFORE_INIT,\n this.#error_codes.COMMIT_AFTER_TERM)) {\n const result = this.storeData(false);\n if (!this.settings.sendBeaconCommit && !this.settings.asyncCommit &&\n result.errorCode && result.errorCode > 0) {\n this.throwSCORMError(result.errorCode);\n }\n returnValue = (typeof result !== 'undefined' && result.result) ?\n result.result : global_constants.SCORM_FALSE;\n\n this.apiLog(callbackName, 'HttpRequest', ' Result: ' + returnValue,\n global_constants.LOG_LEVEL_DEBUG);\n\n if (checkTerminated) this.lastErrorCode = 0;\n\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Returns last error code\n * @param {string} callbackName\n * @return {string}\n */\n getLastError(callbackName: String) {\n const returnValue = String(this.lastErrorCode);\n\n this.processListeners(callbackName);\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Returns the errorNumber error description\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getErrorString(callbackName: String, CMIErrorCode) {\n let returnValue = '';\n\n if (CMIErrorCode !== null && CMIErrorCode !== '') {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Returns a comprehensive description of the errorNumber error.\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getDiagnostic(callbackName: String, CMIErrorCode) {\n let returnValue = '';\n\n if (CMIErrorCode !== null && CMIErrorCode !== '') {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode, true);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Checks the LMS state and ensures it has been initialized.\n *\n * @param {boolean} checkTerminated\n * @param {number} beforeInitError\n * @param {number} afterTermError\n * @return {boolean}\n */\n checkState(\n checkTerminated: boolean,\n beforeInitError: number,\n afterTermError?: number) {\n if (this.isNotInitialized()) {\n this.throwSCORMError(beforeInitError);\n return false;\n } else if (checkTerminated && this.isTerminated()) {\n this.throwSCORMError(afterTermError);\n return false;\n }\n\n return true;\n }\n\n /**\n * Logging for all SCORM actions\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {string} logMessage\n * @param {number}messageLevel\n */\n apiLog(\n functionName: String,\n CMIElement: String,\n logMessage: String,\n messageLevel: number) {\n logMessage = this.formatMessage(functionName, CMIElement, logMessage);\n\n if (messageLevel >= this.apiLogLevel) {\n this.settings.onLogMessage(messageLevel, logMessage);\n }\n }\n\n /**\n * Formats the SCORM messages for easy reading\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {string} message\n * @return {string}\n */\n formatMessage(functionName: String, CMIElement: String, message: String) {\n const baseLength = 20;\n let messageString = '';\n\n messageString += functionName;\n\n let fillChars = baseLength - messageString.length;\n\n for (let i = 0; i < fillChars; i++) {\n messageString += ' ';\n }\n\n messageString += ': ';\n\n if (CMIElement) {\n const CMIElementBaseLength = 70;\n\n messageString += CMIElement;\n\n fillChars = CMIElementBaseLength - messageString.length;\n\n for (let j = 0; j < fillChars; j++) {\n messageString += ' ';\n }\n }\n\n if (message) {\n messageString += message;\n }\n\n return messageString;\n }\n\n /**\n * Checks to see if {str} contains {tester}\n *\n * @param {string} str String to check against\n * @param {string} tester String to check for\n * @return {boolean}\n */\n stringMatches(str: String, tester: String) {\n return str && tester && str.match(tester);\n }\n\n /**\n * Check to see if the specific object has the given property\n * @param {*} refObject\n * @param {string} attribute\n * @return {boolean}\n * @private\n */\n _checkObjectHasProperty(refObject, attribute: String) {\n return Object.hasOwnProperty.call(refObject, attribute) ||\n Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(refObject), attribute) ||\n (attribute in refObject);\n }\n\n /**\n * Returns the message that corresponds to errorNumber\n * APIs that inherit BaseAPI should override this function\n *\n * @param {(string|number)} _errorNumber\n * @param {boolean} _detail\n * @return {string}\n * @abstract\n */\n getLmsErrorMessageDetails(_errorNumber, _detail) {\n throw new Error(\n 'The getLmsErrorMessageDetails method has not been implemented');\n }\n\n /**\n * Gets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @return {string}\n * @abstract\n */\n getCMIValue(_CMIElement) {\n throw new Error('The getCMIValue method has not been implemented');\n }\n\n /**\n * Sets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @param {any} _value\n * @return {string}\n * @abstract\n */\n setCMIValue(_CMIElement, _value) {\n throw new Error('The setCMIValue method has not been implemented');\n }\n\n /**\n * Shared API method to set a valid for a given element.\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n _commonSetCMIValue(\n methodName: String, scorm2004: boolean, CMIElement, value) {\n if (!CMIElement || CMIElement === '') {\n return global_constants.SCORM_FALSE;\n }\n\n const structure = CMIElement.split('.');\n let refObject = this;\n let returnValue = global_constants.SCORM_FALSE;\n let foundFirstIndex = false;\n\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004 ?\n this.#error_codes.UNDEFINED_DATA_MODEL :\n this.#error_codes.GENERAL;\n\n for (let i = 0; i < structure.length; i++) {\n const attribute = structure[i];\n\n if (i === structure.length - 1) {\n if (scorm2004 && (attribute.substr(0, 8) === '{target=') &&\n (typeof refObject._isTargetValid == 'function')) {\n this.throwSCORMError(this.#error_codes.READ_ONLY_ELEMENT);\n } else if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n } else {\n if (this.isInitialized() &&\n this.stringMatches(CMIElement, '\\\\.correct_responses\\\\.\\\\d+')) {\n this.validateCorrectResponse(CMIElement, value);\n }\n\n if (!scorm2004 || this.lastErrorCode === 0) {\n refObject[attribute] = value;\n returnValue = global_constants.SCORM_TRUE;\n }\n }\n } else {\n refObject = refObject[attribute];\n if (!refObject) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[i + 1], 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n foundFirstIndex = true;\n } else {\n const newChild = this.getChildElement(CMIElement, value,\n foundFirstIndex);\n foundFirstIndex = true;\n\n if (!newChild) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n } else {\n if (refObject.initialized) newChild.initialize();\n\n refObject.childArray.push(newChild);\n refObject = newChild;\n }\n }\n\n // Have to update i value to skip the array position\n i++;\n }\n }\n }\n }\n\n if (returnValue === global_constants.SCORM_FALSE) {\n this.apiLog(methodName, null,\n `There was an error setting the value for: ${CMIElement}, value of: ${value}`,\n global_constants.LOG_LEVEL_WARNING);\n }\n\n return returnValue;\n }\n\n /**\n * Abstract method for validating that a response is correct.\n *\n * @param {string} _CMIElement\n * @param {*} _value\n */\n validateCorrectResponse(_CMIElement, _value) {\n // just a stub method\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n * APIs that inherit BaseAPI should override this method.\n *\n * @param {string} _CMIElement - unused\n * @param {*} _value - unused\n * @param {boolean} _foundFirstIndex - unused\n * @return {*}\n * @abstract\n */\n getChildElement(_CMIElement, _value, _foundFirstIndex) {\n throw new Error('The getChildElement method has not been implemented');\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @return {*}\n */\n _commonGetCMIValue(methodName: String, scorm2004: boolean, CMIElement) {\n if (!CMIElement || CMIElement === '') {\n return '';\n }\n\n const structure = CMIElement.split('.');\n let refObject = this;\n let attribute = null;\n\n const uninitializedErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) has not been initialized.`;\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004 ?\n this.#error_codes.UNDEFINED_DATA_MODEL :\n this.#error_codes.GENERAL;\n\n for (let i = 0; i < structure.length; i++) {\n attribute = structure[i];\n\n if (!scorm2004) {\n if (i === structure.length - 1) {\n if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n } else {\n if ((String(attribute).substr(0, 8) === '{target=') &&\n (typeof refObject._isTargetValid == 'function')) {\n const target = String(attribute).substr(8, String(attribute).length - 9);\n return refObject._isTargetValid(target);\n } else if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n\n refObject = refObject[attribute];\n if (refObject === undefined) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[i + 1], 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n } else {\n this.throwSCORMError(this.#error_codes.VALUE_NOT_INITIALIZED,\n uninitializedErrorMessage);\n break;\n }\n\n // Have to update i value to skip the array position\n i++;\n }\n }\n }\n\n if (refObject === null || refObject === undefined) {\n if (!scorm2004) {\n if (attribute === '_children') {\n this.throwSCORMError(scorm12_error_codes.CHILDREN_ERROR);\n } else if (attribute === '_count') {\n this.throwSCORMError(scorm12_error_codes.COUNT_ERROR);\n }\n }\n } else {\n return refObject;\n }\n }\n\n /**\n * Returns true if the API's current state is STATE_INITIALIZED\n *\n * @return {boolean}\n */\n isInitialized() {\n return this.currentState === global_constants.STATE_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_NOT_INITIALIZED\n *\n * @return {boolean}\n */\n isNotInitialized() {\n return this.currentState === global_constants.STATE_NOT_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_TERMINATED\n *\n * @return {boolean}\n */\n isTerminated() {\n return this.currentState === global_constants.STATE_TERMINATED;\n }\n\n /**\n * Provides a mechanism for attaching to a specific SCORM event\n *\n * @param {string} listenerName\n * @param {function} callback\n */\n on(listenerName: String, callback: function) {\n if (!callback) return;\n\n const listenerFunctions = listenerName.split(' ');\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split('.');\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + '.', '');\n }\n\n this.listenerArray.push({\n functionName: functionName,\n CMIElement: CMIElement,\n callback: callback,\n });\n\n this.apiLog('on', functionName, `Added event listener: ${this.listenerArray.length}`, global_constants.LOG_LEVEL_INFO);\n }\n }\n\n /**\n * Provides a mechanism for detaching a specific SCORM event listener\n *\n * @param {string} listenerName\n * @param {function} callback\n */\n off(listenerName: String, callback: function) {\n if (!callback) return;\n\n const listenerFunctions = listenerName.split(' ');\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split('.');\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + '.', '');\n }\n\n const removeIndex = this.listenerArray.findIndex((obj) =>\n obj.functionName === functionName &&\n obj.CMIElement === CMIElement &&\n obj.callback === callback,\n );\n if (removeIndex !== -1) {\n this.listenerArray.splice(removeIndex, 1);\n this.apiLog('off', functionName, `Removed event listener: ${this.listenerArray.length}`, global_constants.LOG_LEVEL_INFO);\n }\n }\n }\n\n /**\n * Provides a mechanism for clearing all listeners from a specific SCORM event\n *\n * @param {string} listenerName\n */\n clear(listenerName: String) {\n const listenerFunctions = listenerName.split(' ');\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split('.');\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + '.', '');\n }\n\n this.listenerArray = this.listenerArray.filter((obj) =>\n obj.functionName !== functionName &&\n obj.CMIElement !== CMIElement,\n );\n }\n }\n\n /**\n * Processes any 'on' listeners that have been created\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {*} value\n */\n processListeners(functionName: String, CMIElement: String, value: any) {\n this.apiLog(functionName, CMIElement, value);\n for (let i = 0; i < this.listenerArray.length; i++) {\n const listener = this.listenerArray[i];\n const functionsMatch = listener.functionName === functionName;\n const listenerHasCMIElement = !!listener.CMIElement;\n let CMIElementsMatch = false;\n if (CMIElement && listener.CMIElement &&\n listener.CMIElement.substring(listener.CMIElement.length - 1) ===\n '*') {\n CMIElementsMatch = CMIElement.indexOf(listener.CMIElement.substring(0,\n listener.CMIElement.length - 1)) === 0;\n } else {\n CMIElementsMatch = listener.CMIElement === CMIElement;\n }\n\n if (functionsMatch && (!listenerHasCMIElement || CMIElementsMatch)) {\n listener.callback(CMIElement, value);\n }\n }\n }\n\n /**\n * Throws a SCORM error\n *\n * @param {number} errorNumber\n * @param {string} message\n */\n throwSCORMError(errorNumber: number, message: String) {\n if (!message) {\n message = this.getLmsErrorMessageDetails(errorNumber);\n }\n\n this.apiLog('throwSCORMError', null, errorNumber + ': ' + message,\n global_constants.LOG_LEVEL_ERROR);\n\n this.lastErrorCode = String(errorNumber);\n }\n\n /**\n * Clears the last SCORM error code on success.\n *\n * @param {string} success\n */\n clearSCORMError(success: String) {\n if (success !== undefined && success !== global_constants.SCORM_FALSE) {\n this.lastErrorCode = 0;\n }\n }\n\n /**\n * Attempts to store the data to the LMS, logs data if no LMS configured\n * APIs that inherit BaseAPI should override this function\n *\n * @param {boolean} _calculateTotalTime\n * @return {string}\n * @abstract\n */\n storeData(_calculateTotalTime) {\n throw new Error(\n 'The storeData method has not been implemented');\n }\n\n /**\n * Load the CMI from a flattened JSON object\n * @param {object} json\n * @param {string} CMIElement\n */\n loadFromFlattenedJSON(json, CMIElement) {\n if (!this.isNotInitialized()) {\n console.error(\n 'loadFromFlattenedJSON can only be called before the call to lmsInitialize.');\n return;\n }\n\n /**\n * Test match pattern.\n *\n * @param {string} a\n * @param {string} c\n * @param {RegExp} a_pattern\n * @return {number}\n */\n function testPattern(a, c, a_pattern) {\n const a_match = a.match(a_pattern);\n\n let c_match;\n if (a_match !== null && (c_match = c.match(a_pattern)) !== null) {\n const a_num = Number(a_match[2]);\n const c_num = Number(c_match[2]);\n if (a_num === c_num) {\n if (a_match[3] === 'id') {\n return -1;\n } else if (a_match[3] === 'type') {\n if (c_match[3] === 'id') {\n return 1;\n } else {\n return -1;\n }\n } else {\n return 1;\n }\n }\n return a_num - c_num;\n }\n\n return null;\n }\n\n const int_pattern = /^(cmi\\.interactions\\.)(\\d+)\\.(.*)$/;\n const obj_pattern = /^(cmi\\.objectives\\.)(\\d+)\\.(.*)$/;\n\n const result = Object.keys(json).map(function(key) {\n return [String(key), json[key]];\n });\n\n // CMI interactions need to have id and type loaded before any other fields\n result.sort(function([a, b], [c, d]) {\n let test;\n if ((test = testPattern(a, c, int_pattern)) !== null) {\n return test;\n }\n if ((test = testPattern(a, c, obj_pattern)) !== null) {\n return test;\n }\n\n if (a < c) {\n return -1;\n }\n if (a > c) {\n return 1;\n }\n return 0;\n });\n\n let obj;\n result.forEach((element) => {\n obj = {};\n obj[element[0]] = element[1];\n this.loadFromJSON(unflatten(obj), CMIElement);\n });\n }\n\n /**\n * Loads CMI data from a JSON object.\n *\n * @param {object} json\n * @param {string} CMIElement\n */\n loadFromJSON(json, CMIElement) {\n if (!this.isNotInitialized()) {\n console.error(\n 'loadFromJSON can only be called before the call to lmsInitialize.');\n return;\n }\n\n CMIElement = CMIElement !== undefined ? CMIElement : 'cmi';\n\n this.startingData = json;\n\n // could this be refactored down to flatten(json) then setCMIValue on each?\n for (const key in json) {\n if ({}.hasOwnProperty.call(json, key) && json[key]) {\n const currentCMIElement = (CMIElement ? CMIElement + '.' : '') + key;\n const value = json[key];\n\n if (value['childArray']) {\n for (let i = 0; i < value['childArray'].length; i++) {\n this.loadFromJSON(value['childArray'][i],\n currentCMIElement + '.' + i);\n }\n } else if (value.constructor === Object) {\n this.loadFromJSON(value, currentCMIElement);\n } else {\n this.setCMIValue(currentCMIElement, value);\n }\n }\n }\n }\n\n /**\n * Render the CMI object to JSON for sending to an LMS.\n *\n * @return {string}\n */\n renderCMIToJSONString() {\n const cmi = this.cmi;\n // Do we want/need to return fields that have no set value?\n // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);\n return JSON.stringify({cmi});\n }\n\n /**\n * Returns a JS object representing the current cmi\n * @return {object}\n */\n renderCMIToJSONObject() {\n // Do we want/need to return fields that have no set value?\n // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);\n return JSON.parse(this.renderCMIToJSONString());\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n * APIs that inherit BaseAPI should override this function\n *\n * @param {boolean} _terminateCommit\n * @return {*}\n * @abstract\n */\n renderCommitCMI(_terminateCommit) {\n throw new Error(\n 'The storeData method has not been implemented');\n }\n\n /**\n * Send the request to the LMS\n * @param {string} url\n * @param {object|Array} params\n * @param {boolean} immediate\n * @return {object}\n */\n processHttpRequest(url: String, params, immediate = false) {\n const api = this;\n const process = function(url, params, settings, error_codes) {\n const genericError = {\n 'result': global_constants.SCORM_FALSE,\n 'errorCode': error_codes.GENERAL,\n };\n\n let result;\n if (!settings.sendBeaconCommit) {\n const httpReq = new XMLHttpRequest();\n httpReq.open('POST', url, settings.asyncCommit);\n\n if (Object.keys(settings.xhrHeaders).length) {\n Object.keys(settings.xhrHeaders).forEach((header) => {\n httpReq.setRequestHeader(header, settings.xhrHeaders[header]);\n });\n }\n\n httpReq.withCredentials = settings.xhrWithCredentials;\n\n if (settings.asyncCommit) {\n httpReq.onload = function(e) {\n if (typeof settings.responseHandler === 'function') {\n result = settings.responseHandler(httpReq);\n } else {\n result = JSON.parse(httpReq.responseText);\n }\n };\n }\n try {\n params = settings.requestHandler(params);\n if (params instanceof Array) {\n httpReq.setRequestHeader('Content-Type',\n 'application/x-www-form-urlencoded');\n httpReq.send(params.join('&'));\n } else {\n httpReq.setRequestHeader('Content-Type',\n settings.commitRequestDataType);\n httpReq.send(JSON.stringify(params));\n }\n\n if (!settings.asyncCommit) {\n if (typeof settings.responseHandler === 'function') {\n result = settings.responseHandler(httpReq);\n } else {\n result = JSON.parse(httpReq.responseText);\n }\n } else {\n result = {};\n result.result = global_constants.SCORM_TRUE;\n result.errorCode = 0;\n api.processListeners('CommitSuccess');\n return result;\n }\n } catch (e) {\n console.error(e);\n api.processListeners('CommitError');\n return genericError;\n }\n } else {\n try {\n const headers = {\n type: settings.commitRequestDataType,\n };\n let blob;\n if (params instanceof Array) {\n blob = new Blob([params.join('&')], headers);\n } else {\n blob = new Blob([JSON.stringify(params)], headers);\n }\n\n result = {};\n if (navigator.sendBeacon(url, blob)) {\n result.result = global_constants.SCORM_TRUE;\n result.errorCode = 0;\n } else {\n result.result = global_constants.SCORM_FALSE;\n result.errorCode = 101;\n }\n } catch (e) {\n console.error(e);\n api.processListeners('CommitError');\n return genericError;\n }\n }\n\n if (typeof result === 'undefined') {\n api.processListeners('CommitError');\n return genericError;\n }\n\n if (result.result === true ||\n result.result === global_constants.SCORM_TRUE) {\n api.processListeners('CommitSuccess');\n } else {\n api.processListeners('CommitError');\n }\n\n return result;\n };\n\n if (typeof debounce !== 'undefined') {\n const debounced = debounce(process, 500);\n debounced(url, params, this.settings, this.error_codes);\n\n // if we're terminating, go ahead and commit immediately\n if (immediate) {\n debounced.flush();\n }\n\n return {\n result: global_constants.SCORM_TRUE,\n errorCode: 0,\n };\n } else {\n return process(url, params, this.settings, this.error_codes);\n }\n }\n\n /**\n * Throws a SCORM error\n *\n * @param {number} when - the number of milliseconds to wait before committing\n * @param {string} callback - the name of the commit event callback\n */\n scheduleCommit(when: number, callback: string) {\n this.#timeout = new ScheduledCommit(this, when, callback);\n this.apiLog('scheduleCommit', '', 'scheduled',\n global_constants.LOG_LEVEL_DEBUG);\n }\n\n /**\n * Clears and cancels any currently scheduled commits\n */\n clearScheduledCommit() {\n if (this.#timeout) {\n this.#timeout.cancel();\n this.#timeout = null;\n this.apiLog('clearScheduledCommit', '', 'cleared',\n global_constants.LOG_LEVEL_DEBUG);\n }\n }\n}\n\n/**\n * Private class that wraps a timeout call to the commit() function\n */\nclass ScheduledCommit {\n #API;\n #cancelled = false;\n #timeout;\n #callback;\n\n /**\n * Constructor for ScheduledCommit\n * @param {BaseAPI} API\n * @param {number} when\n * @param {string} callback\n */\n constructor(API: any, when: number, callback: string) {\n this.#API = API;\n this.#timeout = setTimeout(this.wrapper.bind(this), when);\n this.#callback = callback;\n }\n\n /**\n * Cancel any currently scheduled commit\n */\n cancel() {\n this.#cancelled = true;\n if (this.#timeout) {\n clearTimeout(this.#timeout);\n }\n }\n\n /**\n * Wrap the API commit call to check if the call has already been cancelled\n */\n wrapper() {\n if (!this.#cancelled) {\n this.#API.commit(this.#callback);\n }\n }\n}\n","// @flow\nimport BaseAPI from './BaseAPI';\nimport {\n CMI,\n CMIInteractionsCorrectResponsesObject,\n CMIInteractionsObject,\n CMIInteractionsObjectivesObject,\n CMIObjectivesObject, NAV,\n} from './cmi/scorm12_cmi';\nimport * as Utilities from './utilities';\nimport APIConstants from './constants/api_constants';\nimport ErrorCodes from './constants/error_codes';\n\nconst scorm12_constants = APIConstants.scorm12;\nconst global_constants = APIConstants.global;\nconst scorm12_error_codes = ErrorCodes.scorm12;\n\n/**\n * API class for SCORM 1.2\n */\nexport default class Scorm12API extends BaseAPI {\n /**\n * Constructor for SCORM 1.2 API\n * @param {object} settings\n */\n constructor(settings: {}) {\n const finalSettings = {\n ...{\n mastery_override: false,\n }, ...settings,\n };\n\n super(scorm12_error_codes, finalSettings);\n\n this.cmi = new CMI();\n this.nav = new NAV();\n\n // Rename functions to match 1.2 Spec and expose to modules\n this.LMSInitialize = this.lmsInitialize;\n this.LMSFinish = this.lmsFinish;\n this.LMSGetValue = this.lmsGetValue;\n this.LMSSetValue = this.lmsSetValue;\n this.LMSCommit = this.lmsCommit;\n this.LMSGetLastError = this.lmsGetLastError;\n this.LMSGetErrorString = this.lmsGetErrorString;\n this.LMSGetDiagnostic = this.lmsGetDiagnostic;\n }\n\n /**\n * lmsInitialize function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsInitialize() {\n this.cmi.initialize();\n return this.initialize('LMSInitialize', 'LMS was already initialized!',\n 'LMS is already finished!');\n }\n\n /**\n * LMSFinish function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsFinish() {\n const result = this.terminate('LMSFinish', true);\n\n if (result === global_constants.SCORM_TRUE) {\n if (this.nav.event !== '') {\n if (this.nav.event === 'continue') {\n this.processListeners('SequenceNext');\n } else {\n this.processListeners('SequencePrevious');\n }\n } else if (this.settings.autoProgress) {\n this.processListeners('SequenceNext');\n }\n }\n\n return result;\n }\n\n /**\n * LMSGetValue function from SCORM 1.2 Spec\n *\n * @param {string} CMIElement\n * @return {string}\n */\n lmsGetValue(CMIElement) {\n return this.getValue('LMSGetValue', false, CMIElement);\n }\n\n /**\n * LMSSetValue function from SCORM 1.2 Spec\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n lmsSetValue(CMIElement, value) {\n return this.setValue('LMSSetValue', 'LMSCommit', false, CMIElement, value);\n }\n\n /**\n * LMSCommit function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsCommit() {\n return this.commit('LMSCommit', false);\n }\n\n /**\n * LMSGetLastError function from SCORM 1.2 Spec\n *\n * @return {string}\n */\n lmsGetLastError() {\n return this.getLastError('LMSGetLastError');\n }\n\n /**\n * LMSGetErrorString function from SCORM 1.2 Spec\n *\n * @param {string} CMIErrorCode\n * @return {string}\n */\n lmsGetErrorString(CMIErrorCode) {\n return this.getErrorString('LMSGetErrorString', CMIErrorCode);\n }\n\n /**\n * LMSGetDiagnostic function from SCORM 1.2 Spec\n *\n * @param {string} CMIErrorCode\n * @return {string}\n */\n lmsGetDiagnostic(CMIErrorCode) {\n return this.getDiagnostic('LMSGetDiagnostic', CMIErrorCode);\n }\n\n /**\n * Sets a value on the CMI Object\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n setCMIValue(CMIElement, value) {\n return this._commonSetCMIValue('LMSSetValue', false, CMIElement, value);\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} CMIElement\n * @return {*}\n */\n getCMIValue(CMIElement) {\n return this._commonGetCMIValue('getCMIValue', false, CMIElement);\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n *\n * @param {string} CMIElement\n * @param {*} value\n * @param {boolean} foundFirstIndex\n * @return {object}\n */\n getChildElement(CMIElement, value, foundFirstIndex) {\n let newChild;\n\n if (this.stringMatches(CMIElement, 'cmi\\\\.objectives\\\\.\\\\d+')) {\n newChild = new CMIObjectivesObject();\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d+\\\\.correct_responses\\\\.\\\\d+')) {\n newChild = new CMIInteractionsCorrectResponsesObject();\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d+\\\\.objectives\\\\.\\\\d+')) {\n newChild = new CMIInteractionsObjectivesObject();\n } else if (!foundFirstIndex &&\n this.stringMatches(CMIElement, 'cmi\\\\.interactions\\\\.\\\\d+')) {\n newChild = new CMIInteractionsObject();\n }\n\n return newChild;\n }\n\n /**\n * Validates Correct Response values\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {boolean}\n */\n validateCorrectResponse(CMIElement, value) {\n return true;\n }\n\n /**\n * Returns the message that corresponds to errorNumber.\n *\n * @param {*} errorNumber\n * @param {boolean} detail\n * @return {string}\n */\n getLmsErrorMessageDetails(errorNumber, detail) {\n let basicMessage = 'No Error';\n let detailMessage = 'No Error';\n\n // Set error number to string since inconsistent from modules if string or number\n errorNumber = String(errorNumber);\n if (scorm12_constants.error_descriptions[errorNumber]) {\n basicMessage = scorm12_constants.error_descriptions[errorNumber].basicMessage;\n detailMessage = scorm12_constants.error_descriptions[errorNumber].detailMessage;\n }\n\n return detail ? detailMessage : basicMessage;\n }\n\n /**\n * Replace the whole API with another\n *\n * @param {Scorm12API} newAPI\n */\n replaceWithAnotherScormAPI(newAPI) {\n // Data Model\n this.cmi = newAPI.cmi;\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n *\n * @param {boolean} terminateCommit\n * @return {object|Array}\n */\n renderCommitCMI(terminateCommit: boolean) {\n const cmiExport = this.renderCMIToJSONObject();\n\n if (terminateCommit) {\n cmiExport.cmi.core.total_time = this.cmi.getCurrentTotalTime();\n }\n\n const result = [];\n const flattened = Utilities.flatten(cmiExport);\n switch (this.settings.dataCommitFormat) {\n case 'flattened':\n return Utilities.flatten(cmiExport);\n case 'params':\n for (const item in flattened) {\n if ({}.hasOwnProperty.call(flattened, item)) {\n result.push(`${item}=${flattened[item]}`);\n }\n }\n return result;\n case 'json':\n default:\n return cmiExport;\n }\n }\n\n /**\n * Attempts to store the data to the LMS\n *\n * @param {boolean} terminateCommit\n * @return {string}\n */\n storeData(terminateCommit: boolean) {\n if (terminateCommit) {\n const originalStatus = this.cmi.core.lesson_status;\n if (originalStatus === 'not attempted') {\n this.cmi.core.lesson_status = 'completed';\n }\n\n if (this.cmi.core.lesson_mode === 'normal') {\n if (this.cmi.core.credit === 'credit') {\n if (this.settings.mastery_override &&\n this.cmi.student_data.mastery_score !== '' &&\n this.cmi.core.score.raw !== '') {\n if (parseFloat(this.cmi.core.score.raw) >= parseFloat(this.cmi.student_data.mastery_score)) {\n this.cmi.core.lesson_status = 'passed';\n } else {\n this.cmi.core.lesson_status = 'failed';\n }\n }\n }\n } else if (this.cmi.core.lesson_mode === 'browse') {\n if ((this.startingData?.cmi?.core?.lesson_status || '') === '' && originalStatus === 'not attempted') {\n this.cmi.core.lesson_status = 'browsed';\n }\n }\n }\n\n const commitObject = this.renderCommitCMI(terminateCommit ||\n this.settings.alwaysSendTotalTime);\n\n if (this.apiLogLevel === global_constants.LOG_LEVEL_DEBUG) {\n console.debug('Commit (terminated: ' + (terminateCommit ? 'yes' : 'no') + '): ');\n console.debug(commitObject);\n }\n if (this.settings.lmsCommitUrl) {\n return this.processHttpRequest(this.settings.lmsCommitUrl, commitObject, terminateCommit);\n } else {\n return global_constants.SCORM_TRUE;\n }\n }\n}\n","// @flow\nimport BaseAPI from './BaseAPI';\nimport {\n ADL,\n CMI,\n CMICommentsObject,\n CMIInteractionsCorrectResponsesObject,\n CMIInteractionsObject,\n CMIInteractionsObjectivesObject,\n CMIObjectivesObject,\n} from './cmi/scorm2004_cmi';\nimport * as Utilities from './utilities';\nimport APIConstants from './constants/api_constants';\nimport ErrorCodes from './constants/error_codes';\nimport Responses from './constants/response_constants';\nimport ValidLanguages from './constants/language_constants';\nimport Regex from './constants/regex';\n\nconst scorm2004_constants = APIConstants.scorm2004;\nconst global_constants = APIConstants.global;\nconst scorm2004_error_codes = ErrorCodes.scorm2004;\nconst correct_responses = Responses.correct;\nconst scorm2004_regex = Regex.scorm2004;\n\n/**\n * API class for SCORM 2004\n */\nexport default class Scorm2004API extends BaseAPI {\n #version: '1.0';\n\n /**\n * Constructor for SCORM 2004 API\n * @param {object} settings\n */\n constructor(settings: {}) {\n const finalSettings = {\n ...{\n mastery_override: false,\n }, ...settings,\n };\n\n super(scorm2004_error_codes, finalSettings);\n\n this.cmi = new CMI();\n this.adl = new ADL();\n\n // Rename functions to match 2004 Spec and expose to modules\n this.Initialize = this.lmsInitialize;\n this.Terminate = this.lmsTerminate;\n this.GetValue = this.lmsGetValue;\n this.SetValue = this.lmsSetValue;\n this.Commit = this.lmsCommit;\n this.GetLastError = this.lmsGetLastError;\n this.GetErrorString = this.lmsGetErrorString;\n this.GetDiagnostic = this.lmsGetDiagnostic;\n }\n\n /**\n * Getter for #version\n * @return {string}\n */\n get version() {\n return this.#version;\n }\n\n /**\n * @return {string} bool\n */\n lmsInitialize() {\n this.cmi.initialize();\n return this.initialize('Initialize');\n }\n\n /**\n * @return {string} bool\n */\n lmsTerminate() {\n const result = this.terminate('Terminate', true);\n\n if (result === global_constants.SCORM_TRUE) {\n if (this.adl.nav.request !== '_none_') {\n switch (this.adl.nav.request) {\n case 'continue':\n this.processListeners('SequenceNext');\n break;\n case 'previous':\n this.processListeners('SequencePrevious');\n break;\n case 'choice':\n this.processListeners('SequenceChoice');\n break;\n case 'exit':\n this.processListeners('SequenceExit');\n break;\n case 'exitAll':\n this.processListeners('SequenceExitAll');\n break;\n case 'abandon':\n this.processListeners('SequenceAbandon');\n break;\n case 'abandonAll':\n this.processListeners('SequenceAbandonAll');\n break;\n }\n } else if (this.settings.autoProgress) {\n this.processListeners('SequenceNext');\n }\n }\n\n return result;\n }\n\n /**\n * @param {string} CMIElement\n * @return {string}\n */\n lmsGetValue(CMIElement) {\n return this.getValue('GetValue', true, CMIElement);\n }\n\n /**\n * @param {string} CMIElement\n * @param {any} value\n * @return {string}\n */\n lmsSetValue(CMIElement, value) {\n return this.setValue('SetValue', 'Commit', true, CMIElement, value);\n }\n\n /**\n * Orders LMS to store all content parameters\n *\n * @return {string} bool\n */\n lmsCommit() {\n return this.commit('Commit');\n }\n\n /**\n * Returns last error code\n *\n * @return {string}\n */\n lmsGetLastError() {\n return this.getLastError('GetLastError');\n }\n\n /**\n * Returns the errorNumber error description\n *\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n lmsGetErrorString(CMIErrorCode) {\n return this.getErrorString('GetErrorString', CMIErrorCode);\n }\n\n /**\n * Returns a comprehensive description of the errorNumber error.\n *\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n lmsGetDiagnostic(CMIErrorCode) {\n return this.getDiagnostic('GetDiagnostic', CMIErrorCode);\n }\n\n /**\n * Sets a value on the CMI Object\n *\n * @param {string} CMIElement\n * @param {any} value\n * @return {string}\n */\n setCMIValue(CMIElement, value) {\n return this._commonSetCMIValue('SetValue', true, CMIElement, value);\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n *\n * @param {string} CMIElement\n * @param {any} value\n * @param {boolean} foundFirstIndex\n * @return {any}\n */\n getChildElement(CMIElement, value, foundFirstIndex) {\n let newChild;\n\n if (this.stringMatches(CMIElement, 'cmi\\\\.objectives\\\\.\\\\d+')) {\n newChild = new CMIObjectivesObject();\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d+\\\\.correct_responses\\\\.\\\\d+')) {\n const parts = CMIElement.split('.');\n const index = Number(parts[2]);\n const interaction = this.cmi.interactions.childArray[index];\n if (this.isInitialized()) {\n if (!interaction.type) {\n this.throwSCORMError(\n scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);\n } else {\n this.checkDuplicateChoiceResponse(interaction, value);\n\n const response_type = correct_responses[interaction.type];\n if (response_type) {\n this.checkValidResponseType(response_type, value, interaction.type);\n } else {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Incorrect Response Type: ' + interaction.type);\n }\n }\n }\n if (this.lastErrorCode === 0) {\n newChild = new CMIInteractionsCorrectResponsesObject();\n }\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d+\\\\.objectives\\\\.\\\\d+')) {\n newChild = new CMIInteractionsObjectivesObject();\n } else if (!foundFirstIndex &&\n this.stringMatches(CMIElement, 'cmi\\\\.interactions\\\\.\\\\d+')) {\n newChild = new CMIInteractionsObject();\n } else if (this.stringMatches(CMIElement,\n 'cmi\\\\.comments_from_learner\\\\.\\\\d+')) {\n newChild = new CMICommentsObject();\n } else if (this.stringMatches(CMIElement,\n 'cmi\\\\.comments_from_lms\\\\.\\\\d+')) {\n newChild = new CMICommentsObject(true);\n }\n\n return newChild;\n }\n\n /**\n * Checks for valid response types\n * @param {object} response_type\n * @param {any} value\n * @param {string} interaction_type\n */\n checkValidResponseType(response_type, value, interaction_type) {\n let nodes = [];\n if (response_type?.delimiter) {\n nodes = String(value).split(response_type.delimiter);\n } else {\n nodes[0] = value;\n }\n\n if (nodes.length > 0 && nodes.length <= response_type.max) {\n this.checkCorrectResponseValue(interaction_type, nodes, value);\n } else if (nodes.length > response_type.max) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Pattern Too Long');\n }\n }\n\n /**\n * Checks for duplicate 'choice' responses.\n * @param {CMIInteractionsObject} interaction\n * @param {any} value\n */\n checkDuplicateChoiceResponse(interaction, value) {\n const interaction_count = interaction.correct_responses._count;\n if (interaction.type === 'choice') {\n for (let i = 0; i < interaction_count && this.lastErrorCode ===\n 0; i++) {\n const response = interaction.correct_responses.childArray[i];\n if (response.pattern === value) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE);\n }\n }\n }\n }\n\n /**\n * Validate correct response.\n * @param {string} CMIElement\n * @param {*} value\n */\n validateCorrectResponse(CMIElement, value) {\n const parts = CMIElement.split('.');\n const index = Number(parts[2]);\n const pattern_index = Number(parts[4]);\n const interaction = this.cmi.interactions.childArray[index];\n\n const interaction_count = interaction.correct_responses._count;\n this.checkDuplicateChoiceResponse(interaction, value);\n\n const response_type = correct_responses[interaction.type];\n if (typeof response_type.limit === 'undefined' || interaction_count <=\n response_type.limit) {\n this.checkValidResponseType(response_type, value, interaction.type);\n\n if (this.lastErrorCode === 0 &&\n (!response_type.duplicate ||\n !this.checkDuplicatedPattern(interaction.correct_responses,\n pattern_index, value)) ||\n (this.lastErrorCode === 0 && value === '')) {\n // do nothing, we want the inverse\n } else {\n if (this.lastErrorCode === 0) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Pattern Already Exists');\n }\n }\n } else {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Collection Limit Reached');\n }\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} CMIElement\n * @return {*}\n */\n getCMIValue(CMIElement) {\n return this._commonGetCMIValue('GetValue', true, CMIElement);\n }\n\n /**\n * Returns the message that corresponds to errorNumber.\n *\n * @param {(string|number)} errorNumber\n * @param {boolean} detail\n * @return {string}\n */\n getLmsErrorMessageDetails(errorNumber, detail) {\n let basicMessage = '';\n let detailMessage = '';\n\n // Set error number to string since inconsistent from modules if string or number\n errorNumber = String(errorNumber);\n if (scorm2004_constants.error_descriptions[errorNumber]) {\n basicMessage = scorm2004_constants.error_descriptions[errorNumber].basicMessage;\n detailMessage = scorm2004_constants.error_descriptions[errorNumber].detailMessage;\n }\n\n return detail ? detailMessage : basicMessage;\n }\n\n /**\n * Check to see if a correct_response value has been duplicated\n * @param {CMIArray} correct_response\n * @param {number} current_index\n * @param {*} value\n * @return {boolean}\n */\n checkDuplicatedPattern = (correct_response, current_index, value) => {\n let found = false;\n const count = correct_response._count;\n for (let i = 0; i < count && !found; i++) {\n if (i !== current_index && correct_response.childArray[i] === value) {\n found = true;\n }\n }\n return found;\n };\n\n /**\n * Checks for a valid correct_response value\n * @param {string} interaction_type\n * @param {Array} nodes\n * @param {*} value\n */\n checkCorrectResponseValue(interaction_type, nodes, value) {\n const response = correct_responses[interaction_type];\n const formatRegex = new RegExp(response.format);\n for (let i = 0; i < nodes.length && this.lastErrorCode === 0; i++) {\n if (interaction_type.match(\n '^(fill-in|long-fill-in|matching|performance|sequencing)$')) {\n nodes[i] = this.removeCorrectResponsePrefixes(nodes[i]);\n }\n\n if (response?.delimiter2) {\n const values = nodes[i].split(response.delimiter2);\n if (values.length === 2) {\n const matches = values[0].match(formatRegex);\n if (!matches) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n } else {\n if (!values[1].match(new RegExp(response.format2))) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n } else {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n } else {\n const matches = nodes[i].match(formatRegex);\n if ((!matches && value !== '') ||\n (!matches && interaction_type === 'true-false')) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n } else {\n if (interaction_type === 'numeric' && nodes.length > 1) {\n if (Number(nodes[0]) > Number(nodes[1])) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n } else {\n if (nodes[i] !== '' && response.unique) {\n for (let j = 0; j < i && this.lastErrorCode === 0; j++) {\n if (nodes[i] === nodes[j]) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n }\n }\n }\n }\n }\n }\n\n /**\n * Remove prefixes from correct_response\n * @param {string} node\n * @return {*}\n */\n removeCorrectResponsePrefixes(node) {\n let seenOrder = false;\n let seenCase = false;\n let seenLang = false;\n\n const prefixRegex = new RegExp(\n '^({(lang|case_matters|order_matters)=([^}]+)})');\n let matches = node.match(prefixRegex);\n let langMatches = null;\n while (matches) {\n switch (matches[2]) {\n case 'lang':\n langMatches = node.match(scorm2004_regex.CMILangcr);\n if (langMatches) {\n const lang = langMatches[3];\n if (lang !== undefined && lang.length > 0) {\n if (ValidLanguages[lang.toLowerCase()] === undefined) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n }\n seenLang = true;\n break;\n case 'case_matters':\n if (!seenLang && !seenOrder && !seenCase) {\n if (matches[3] !== 'true' && matches[3] !== 'false') {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n\n seenCase = true;\n break;\n case 'order_matters':\n if (!seenCase && !seenLang && !seenOrder) {\n if (matches[3] !== 'true' && matches[3] !== 'false') {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n\n seenOrder = true;\n break;\n default:\n break;\n }\n node = node.substr(matches[1].length);\n matches = node.match(prefixRegex);\n }\n\n return node;\n }\n\n /**\n * Replace the whole API with another\n * @param {Scorm2004API} newAPI\n */\n replaceWithAnotherScormAPI(newAPI) {\n // Data Model\n this.cmi = newAPI.cmi;\n this.adl = newAPI.adl;\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n *\n * @param {boolean} terminateCommit\n * @return {object|Array}\n */\n renderCommitCMI(terminateCommit: boolean) {\n const cmiExport = this.renderCMIToJSONObject();\n\n if (terminateCommit) {\n cmiExport.cmi.total_time = this.cmi.getCurrentTotalTime();\n }\n\n const result = [];\n const flattened = Utilities.flatten(cmiExport);\n switch (this.settings.dataCommitFormat) {\n case 'flattened':\n return Utilities.flatten(cmiExport);\n case 'params':\n for (const item in flattened) {\n if ({}.hasOwnProperty.call(flattened, item)) {\n result.push(`${item}=${flattened[item]}`);\n }\n }\n return result;\n case 'json':\n default:\n return cmiExport;\n }\n }\n\n /**\n * Attempts to store the data to the LMS\n *\n * @param {boolean} terminateCommit\n * @return {string}\n */\n storeData(terminateCommit: boolean) {\n if (terminateCommit) {\n if (this.cmi.mode === 'normal') {\n if (this.cmi.credit === 'credit') {\n if (this.cmi.completion_threshold && this.cmi.progress_measure) {\n if (this.cmi.progress_measure >= this.cmi.completion_threshold) {\n console.debug('Setting Completion Status: Completed');\n this.cmi.completion_status = 'completed';\n } else {\n console.debug('Setting Completion Status: Incomplete');\n this.cmi.completion_status = 'incomplete';\n }\n }\n if (this.cmi.scaled_passing_score && this.cmi.score.scaled) {\n if (this.cmi.score.scaled >= this.cmi.scaled_passing_score) {\n console.debug('Setting Success Status: Passed');\n this.cmi.success_status = 'passed';\n } else {\n console.debug('Setting Success Status: Failed');\n this.cmi.success_status = 'failed';\n }\n }\n }\n }\n }\n\n let navRequest = false;\n if (this.adl.nav.request !== (this.startingData?.adl?.nav?.request) &&\n this.adl.nav.request !== '_none_') {\n this.adl.nav.request = encodeURIComponent(this.adl.nav.request);\n navRequest = true;\n }\n\n const commitObject = this.renderCommitCMI(terminateCommit ||\n this.settings.alwaysSendTotalTime);\n\n if (this.apiLogLevel === global_constants.LOG_LEVEL_DEBUG) {\n console.debug('Commit (terminated: ' +\n (terminateCommit ? 'yes' : 'no') + '): ');\n console.debug(commitObject);\n }\n if (this.settings.lmsCommitUrl) {\n const result = this.processHttpRequest(this.settings.lmsCommitUrl,\n commitObject, terminateCommit);\n\n // check if this is a sequencing call, and then call the necessary JS\n {\n if (navRequest && result.navRequest !== undefined &&\n result.navRequest !== '') {\n Function(`\"use strict\";(() => { ${result.navRequest} })()`)();\n }\n }\n return result;\n } else {\n return global_constants.SCORM_TRUE;\n }\n }\n}\n","import * as Scorm12CMI from './scorm12_cmi';\nimport {BaseCMI, checkValidFormat, CMIArray, CMIScore} from './common';\nimport APIConstants from '../constants/api_constants';\nimport Regex from '../constants/regex';\nimport ErrorCodes from '../constants/error_codes';\nimport {AICCValidationError} from '../exceptions';\n\nconst aicc_constants = APIConstants.aicc;\nconst aicc_regex = Regex.aicc;\nconst aicc_error_codes = ErrorCodes.scorm12;\n\n/**\n * Helper method for throwing Read Only error\n */\nfunction throwReadOnlyError() {\n throw new AICCValidationError(aicc_error_codes.READ_ONLY_ELEMENT);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} regexPattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nfunction checkAICCValidFormat(\n value: String,\n regexPattern: String,\n allowEmptyString?: boolean) {\n return checkValidFormat(\n value,\n regexPattern,\n aicc_error_codes.TYPE_MISMATCH,\n AICCValidationError,\n allowEmptyString\n );\n}\n\n/**\n * CMI Class for AICC\n */\nexport class CMI extends Scorm12CMI.CMI {\n /**\n * Constructor for AICC CMI object\n * @param {boolean} initialized\n */\n constructor(initialized: boolean) {\n super(aicc_constants.cmi_children);\n\n if (initialized) this.initialize();\n\n this.student_preference = new AICCStudentPreferences();\n this.student_data = new AICCCMIStudentData();\n this.student_demographics = new CMIStudentDemographics();\n this.evaluation = new CMIEvaluation();\n this.paths = new CMIPaths();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.student_preference?.initialize();\n this.student_data?.initialize();\n this.student_demographics?.initialize();\n this.evaluation?.initialize();\n this.paths?.initialize();\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * suspend_data: string,\n * launch_data: string,\n * comments: string,\n * comments_from_lms: string,\n * core: CMICore,\n * objectives: CMIObjectives,\n * student_data: CMIStudentData,\n * student_preference: CMIStudentPreference,\n * interactions: CMIInteractions,\n * paths: CMIPaths\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'suspend_data': this.suspend_data,\n 'launch_data': this.launch_data,\n 'comments': this.comments,\n 'comments_from_lms': this.comments_from_lms,\n 'core': this.core,\n 'objectives': this.objectives,\n 'student_data': this.student_data,\n 'student_preference': this.student_preference,\n 'student_demographics': this.student_demographics,\n 'interactions': this.interactions,\n 'evaluation': this.evaluation,\n 'paths': this.paths,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * AICC Evaluation object\n */\nclass CMIEvaluation extends BaseCMI {\n /**\n * Constructor for AICC Evaluation object\n */\n constructor() {\n super();\n\n this.comments = new CMIEvaluationComments();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.comments?.initialize();\n }\n\n /**\n * toJSON for cmi.evaluation object\n * @return {{comments: CMIEvaluationComments}}\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'comments': this.comments,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing AICC's cmi.evaluation.comments object\n */\nclass CMIEvaluationComments extends CMIArray {\n /**\n * Constructor for AICC Evaluation Comments object\n */\n constructor() {\n super({\n children: aicc_constants.comments_children,\n errorCode: aicc_error_codes.INVALID_SET_VALUE,\n errorClass: AICCValidationError,\n });\n }\n}\n\n/**\n * StudentPreferences class for AICC\n */\nclass AICCStudentPreferences extends Scorm12CMI.CMIStudentPreference {\n /**\n * Constructor for AICC Student Preferences object\n */\n constructor() {\n super(aicc_constants.student_preference_children);\n\n this.windows = new CMIArray({\n errorCode: aicc_error_codes.INVALID_SET_VALUE,\n errorClass: AICCValidationError,\n children: '',\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.windows?.initialize();\n }\n\n #lesson_type = '';\n #text_color = '';\n #text_location = '';\n #text_size = '';\n #video = '';\n\n /**\n * Getter for #lesson_type\n * @return {string}\n */\n get lesson_type(): string {\n return this.#lesson_type;\n }\n\n /**\n * Setter for #lesson_type\n * @param {string} lesson_type\n */\n set lesson_type(lesson_type: string) {\n if (checkAICCValidFormat(lesson_type, aicc_regex.CMIString256)) {\n this.#lesson_type = lesson_type;\n }\n }\n\n /**\n * Getter for #text_color\n * @return {string}\n */\n get text_color(): string {\n return this.#text_color;\n }\n\n /**\n * Setter for #text_color\n * @param {string} text_color\n */\n set text_color(text_color: string) {\n if (checkAICCValidFormat(text_color, aicc_regex.CMIString256)) {\n this.#text_color = text_color;\n }\n }\n\n /**\n * Getter for #text_location\n * @return {string}\n */\n get text_location(): string {\n return this.#text_location;\n }\n\n /**\n * Setter for #text_location\n * @param {string} text_location\n */\n set text_location(text_location: string) {\n if (checkAICCValidFormat(text_location, aicc_regex.CMIString256)) {\n this.#text_location = text_location;\n }\n }\n\n /**\n * Getter for #text_size\n * @return {string}\n */\n get text_size(): string {\n return this.#text_size;\n }\n\n /**\n * Setter for #text_size\n * @param {string} text_size\n */\n set text_size(text_size: string) {\n if (checkAICCValidFormat(text_size, aicc_regex.CMIString256)) {\n this.#text_size = text_size;\n }\n }\n\n /**\n * Getter for #video\n * @return {string}\n */\n get video(): string {\n return this.#video;\n }\n\n /**\n * Setter for #video\n * @param {string} video\n */\n set video(video: string) {\n if (checkAICCValidFormat(video, aicc_regex.CMIString256)) {\n this.#video = video;\n }\n }\n\n /**\n * toJSON for cmi.student_preference\n *\n * @return {\n * {\n * audio: string,\n * language: string,\n * speed: string,\n * text: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'audio': this.audio,\n 'language': this.language,\n 'lesson_type': this.lesson_type,\n 'speed': this.speed,\n 'text': this.text,\n 'text_color': this.text_color,\n 'text_location': this.text_location,\n 'text_size': this.text_size,\n 'video': this.video,\n 'windows': this.windows,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * StudentData class for AICC\n */\nclass AICCCMIStudentData extends Scorm12CMI.CMIStudentData {\n /**\n * Constructor for AICC StudentData object\n */\n constructor() {\n super(aicc_constants.student_data_children);\n\n this.tries = new CMITries();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.tries?.initialize();\n }\n\n #tries_during_lesson = '';\n\n /**\n * Getter for tries_during_lesson\n * @return {string}\n */\n get tries_during_lesson() {\n return this.#tries_during_lesson;\n }\n\n /**\n * Setter for #tries_during_lesson. Sets an error if trying to set after\n * initialization.\n * @param {string} tries_during_lesson\n */\n set tries_during_lesson(tries_during_lesson) {\n !this.initialized ?\n this.#tries_during_lesson = tries_during_lesson :\n throwReadOnlyError();\n }\n\n /**\n * toJSON for cmi.student_data object\n * @return {\n * {\n * mastery_score: string,\n * max_time_allowed: string,\n * time_limit_action: string,\n * tries: CMITries\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'mastery_score': this.mastery_score,\n 'max_time_allowed': this.max_time_allowed,\n 'time_limit_action': this.time_limit_action,\n 'tries': this.tries,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing the AICC cmi.student_demographics object\n */\nexport class CMIStudentDemographics extends BaseCMI {\n /**\n * Constructor for AICC StudentDemographics object\n */\n constructor() {\n super();\n }\n\n #_children = aicc_constants.student_demographics_children;\n #city = '';\n #class = '';\n #company = '';\n #country = '';\n #experience = '';\n #familiar_name = '';\n #instructor_name = '';\n #title = '';\n #native_language = '';\n #state = '';\n #street_address = '';\n #telephone = '';\n #years_experience = '';\n\n /**\n * Getter for _children\n * @return {string}\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Getter for city\n * @return {string}\n */\n get city() {\n return this.#city;\n }\n\n /**\n * Setter for #city. Sets an error if trying to set after\n * initialization.\n * @param {string} city\n */\n set city(city) {\n !this.initialized ?\n this.#city = city :\n throwReadOnlyError();\n }\n\n /**\n * Getter for class\n * @return {string}\n */\n get class() {\n return this.#class;\n }\n\n /**\n * Setter for #class. Sets an error if trying to set after\n * initialization.\n * @param {string} clazz\n */\n set class(clazz) {\n !this.initialized ?\n this.#class = clazz :\n throwReadOnlyError();\n }\n\n /**\n * Getter for company\n * @return {string}\n */\n get company() {\n return this.#company;\n }\n\n /**\n * Setter for #company. Sets an error if trying to set after\n * initialization.\n * @param {string} company\n */\n set company(company) {\n !this.initialized ?\n this.#company = company :\n throwReadOnlyError();\n }\n\n /**\n * Getter for country\n * @return {string}\n */\n get country() {\n return this.#country;\n }\n\n /**\n * Setter for #country. Sets an error if trying to set after\n * initialization.\n * @param {string} country\n */\n set country(country) {\n !this.initialized ?\n this.#country = country :\n throwReadOnlyError();\n }\n\n /**\n * Getter for experience\n * @return {string}\n */\n get experience() {\n return this.#experience;\n }\n\n /**\n * Setter for #experience. Sets an error if trying to set after\n * initialization.\n * @param {string} experience\n */\n set experience(experience) {\n !this.initialized ?\n this.#experience = experience :\n throwReadOnlyError();\n }\n\n /**\n * Getter for familiar_name\n * @return {string}\n */\n get familiar_name() {\n return this.#familiar_name;\n }\n\n /**\n * Setter for #familiar_name. Sets an error if trying to set after\n * initialization.\n * @param {string} familiar_name\n */\n set familiar_name(familiar_name) {\n !this.initialized ?\n this.#familiar_name = familiar_name :\n throwReadOnlyError();\n }\n\n /**\n * Getter for instructor_name\n * @return {string}\n */\n get instructor_name() {\n return this.#instructor_name;\n }\n\n /**\n * Setter for #instructor_name. Sets an error if trying to set after\n * initialization.\n * @param {string} instructor_name\n */\n set instructor_name(instructor_name) {\n !this.initialized ?\n this.#instructor_name = instructor_name :\n throwReadOnlyError();\n }\n\n /**\n * Getter for title\n * @return {string}\n */\n get title() {\n return this.#title;\n }\n\n /**\n * Setter for #title. Sets an error if trying to set after\n * initialization.\n * @param {string} title\n */\n set title(title) {\n !this.initialized ?\n this.#title = title :\n throwReadOnlyError();\n }\n\n /**\n * Getter for native_language\n * @return {string}\n */\n get native_language() {\n return this.#native_language;\n }\n\n /**\n * Setter for #native_language. Sets an error if trying to set after\n * initialization.\n * @param {string} native_language\n */\n set native_language(native_language) {\n !this.initialized ?\n this.#native_language = native_language :\n throwReadOnlyError();\n }\n\n /**\n * Getter for state\n * @return {string}\n */\n get state() {\n return this.#state;\n }\n\n /**\n * Setter for #state. Sets an error if trying to set after\n * initialization.\n * @param {string} state\n */\n set state(state) {\n !this.initialized ?\n this.#state = state :\n throwReadOnlyError();\n }\n\n /**\n * Getter for street_address\n * @return {string}\n */\n get street_address() {\n return this.#street_address;\n }\n\n /**\n * Setter for #street_address. Sets an error if trying to set after\n * initialization.\n * @param {string} street_address\n */\n set street_address(street_address) {\n !this.initialized ?\n this.#street_address = street_address :\n throwReadOnlyError();\n }\n\n /**\n * Getter for telephone\n * @return {string}\n */\n get telephone() {\n return this.#telephone;\n }\n\n /**\n * Setter for #telephone. Sets an error if trying to set after\n * initialization.\n * @param {string} telephone\n */\n set telephone(telephone) {\n !this.initialized ?\n this.#telephone = telephone :\n throwReadOnlyError();\n }\n\n /**\n * Getter for years_experience\n * @return {string}\n */\n get years_experience() {\n return this.#years_experience;\n }\n\n /**\n * Setter for #years_experience. Sets an error if trying to set after\n * initialization.\n * @param {string} years_experience\n */\n set years_experience(years_experience) {\n !this.initialized ?\n this.#years_experience = years_experience :\n throwReadOnlyError();\n }\n\n /**\n * toJSON for cmi.student_demographics object\n * @return {\n * {\n * city: string,\n * class: string,\n * company: string,\n * country: string,\n * experience: string,\n * familiar_name: string,\n * instructor_name: string,\n * title: string,\n * native_language: string,\n * state: string,\n * street_address: string,\n * telephone: string,\n * years_experience: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'city': this.city,\n 'class': this.class,\n 'company': this.company,\n 'country': this.country,\n 'experience': this.experience,\n 'familiar_name': this.familiar_name,\n 'instructor_name': this.instructor_name,\n 'title': this.title,\n 'native_language': this.native_language,\n 'state': this.state,\n 'street_address': this.street_address,\n 'telephone': this.telephone,\n 'years_experience': this.years_experience,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing the AICC cmi.paths object\n */\nexport class CMIPaths extends CMIArray {\n /**\n * Constructor for inline Paths Array class\n */\n constructor() {\n super({children: aicc_constants.paths_children});\n }\n}\n\n/**\n * Class for AICC Paths\n */\nexport class CMIPathsObject extends BaseCMI {\n /**\n * Constructor for AICC Paths objects\n */\n constructor() {\n super();\n }\n\n #location_id = '';\n #date = '';\n #time = '';\n #status = '';\n #why_left = '';\n #time_in_element = '';\n\n /**\n * Getter for #location_id\n * @return {string}\n */\n get location_id() {\n return this.#location_id;\n }\n\n /**\n * Setter for #location_id\n * @param {string} location_id\n */\n set location_id(location_id) {\n if (checkAICCValidFormat(location_id, aicc_regex.CMIString256)) {\n this.#location_id = location_id;\n }\n }\n\n /**\n * Getter for #date\n * @return {string}\n */\n get date() {\n return this.#date;\n }\n\n /**\n * Setter for #date\n * @param {string} date\n */\n set date(date) {\n if (checkAICCValidFormat(date, aicc_regex.CMIString256)) {\n this.#date = date;\n }\n }\n\n /**\n * Getter for #time\n * @return {string}\n */\n get time() {\n return this.#time;\n }\n\n /**\n * Setter for #time\n * @param {string} time\n */\n set time(time) {\n if (checkAICCValidFormat(time, aicc_regex.CMITime)) {\n this.#time = time;\n }\n }\n\n /**\n * Getter for #status\n * @return {string}\n */\n get status() {\n return this.#status;\n }\n\n /**\n * Setter for #status\n * @param {string} status\n */\n set status(status) {\n if (checkAICCValidFormat(status, aicc_regex.CMIStatus2)) {\n this.#status = status;\n }\n }\n\n /**\n * Getter for #why_left\n * @return {string}\n */\n get why_left() {\n return this.#why_left;\n }\n\n /**\n * Setter for #why_left\n * @param {string} why_left\n */\n set why_left(why_left) {\n if (checkAICCValidFormat(why_left, aicc_regex.CMIString256)) {\n this.#why_left = why_left;\n }\n }\n\n /**\n * Getter for #time_in_element\n * @return {string}\n */\n get time_in_element() {\n return this.#time_in_element;\n }\n\n /**\n * Setter for #time_in_element\n * @param {string} time_in_element\n */\n set time_in_element(time_in_element) {\n if (checkAICCValidFormat(time_in_element, aicc_regex.CMITime)) {\n this.#time_in_element = time_in_element;\n }\n }\n\n /**\n * toJSON for cmi.paths.n object\n * @return {\n * {\n * location_id: string,\n * date: string,\n * time: string,\n * status: string,\n * why_left: string,\n * time_in_element: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'location_id': this.location_id,\n 'date': this.date,\n 'time': this.time,\n 'status': this.status,\n 'why_left': this.why_left,\n 'time_in_element': this.time_in_element,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing the AICC cmi.student_data.tries object\n */\nexport class CMITries extends CMIArray {\n /**\n * Constructor for inline Tries Array class\n */\n constructor() {\n super({children: aicc_constants.tries_children});\n }\n}\n\n/**\n * Class for AICC Tries\n */\nexport class CMITriesObject extends BaseCMI {\n /**\n * Constructor for AICC Tries object\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: aicc_constants.score_children,\n score_range: aicc_regex.score_range,\n invalidErrorCode: aicc_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: aicc_error_codes.TYPE_MISMATCH,\n invalidRangeCode: aicc_error_codes.VALUE_OUT_OF_RANGE,\n errorClass: AICCValidationError,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n #status = '';\n #time = '';\n\n /**\n * Getter for #status\n * @return {string}\n */\n get status() {\n return this.#status;\n }\n\n /**\n * Setter for #status\n * @param {string} status\n */\n set status(status) {\n if (checkAICCValidFormat(status, aicc_regex.CMIStatus2)) {\n this.#status = status;\n }\n }\n\n /**\n * Getter for #time\n * @return {string}\n */\n get time() {\n return this.#time;\n }\n\n /**\n * Setter for #time\n * @param {string} time\n */\n set time(time) {\n if (checkAICCValidFormat(time, aicc_regex.CMITime)) {\n this.#time = time;\n }\n }\n\n /**\n * toJSON for cmi.student_data.tries.n object\n * @return {\n * {\n * status: string,\n * time: string,\n * score: CMIScore\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'status': this.status,\n 'time': this.time,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for cmi.student_data.attempt_records array\n */\nexport class CMIAttemptRecords extends CMIArray {\n /**\n * Constructor for inline Tries Array class\n */\n constructor() {\n super({children: aicc_constants.attempt_records_children});\n }\n}\n\n/**\n * Class for AICC Attempt Records\n */\nexport class CMIAttemptRecordsObject extends BaseCMI {\n /**\n * Constructor for AICC Attempt Records object\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: aicc_constants.score_children,\n score_range: aicc_regex.score_range,\n invalidErrorCode: aicc_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: aicc_error_codes.TYPE_MISMATCH,\n invalidRangeCode: aicc_error_codes.VALUE_OUT_OF_RANGE,\n errorClass: AICCValidationError,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n #lesson_status = '';\n\n /**\n * Getter for #lesson_status\n * @return {string}\n */\n get lesson_status() {\n return this.#lesson_status;\n }\n\n /**\n * Setter for #lesson_status\n * @param {string} lesson_status\n */\n set lesson_status(lesson_status) {\n if (checkAICCValidFormat(lesson_status, aicc_regex.CMIStatus2)) {\n this.#lesson_status = lesson_status;\n }\n }\n\n /**\n * toJSON for cmi.student_data.attempt_records.n object\n * @return {\n * {\n * status: string,\n * time: string,\n * score: CMIScore\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'lesson_status': this.lesson_status,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for AICC Evaluation Comments\n */\nexport class CMIEvaluationCommentsObject extends BaseCMI {\n /**\n * Constructor for Evaluation Comments\n */\n constructor() {\n super();\n }\n\n #content = '';\n #location = '';\n #time = '';\n\n /**\n * Getter for #content\n * @return {string}\n */\n get content() {\n return this.#content;\n }\n\n /**\n * Setter for #content\n * @param {string} content\n */\n set content(content) {\n if (checkAICCValidFormat(content, aicc_regex.CMIString256)) {\n this.#content = content;\n }\n }\n\n /**\n * Getter for #location\n * @return {string}\n */\n get location() {\n return this.#location;\n }\n\n /**\n * Setter for #location\n * @param {string} location\n */\n set location(location) {\n if (checkAICCValidFormat(location, aicc_regex.CMIString256)) {\n this.#location = location;\n }\n }\n\n /**\n * Getter for #time\n * @return {string}\n */\n get time() {\n return this.#time;\n }\n\n /**\n * Setting for #time\n * @param {string} time\n */\n set time(time) {\n if (checkAICCValidFormat(time, aicc_regex.CMITime)) {\n this.#time = time;\n }\n }\n\n /**\n * toJSON for cmi.evaulation.comments.n object\n * @return {\n * {\n * content: string,\n * location: string,\n * time: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'content': this.content,\n 'location': this.location,\n 'time': this.time,\n };\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\nimport APIConstants from '../constants/api_constants';\nimport ErrorCodes from '../constants/error_codes';\nimport Regex from '../constants/regex';\n\nconst scorm12_constants = APIConstants.scorm12;\nconst scorm12_regex = Regex.scorm12;\nconst scorm12_error_codes = ErrorCodes.scorm12;\n\n/**\n * Check if the value matches the proper format. If not, throw proper error code.\n *\n * @param {string} value\n * @param {string} regexPattern\n * @param {number} errorCode\n * @param {class} errorClass\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function checkValidFormat(\n value: String,\n regexPattern: String,\n errorCode: number,\n errorClass: function,\n allowEmptyString?: boolean) {\n const formatRegex = new RegExp(regexPattern);\n const matches = value.match(formatRegex);\n if (allowEmptyString && value === '') {\n return true;\n }\n if (value === undefined || !matches || matches[0] === '') {\n throw new errorClass.prototype.constructor(errorCode);\n }\n return true;\n}\n\n/**\n * Check if the value matches the proper range. If not, throw proper error code.\n *\n * @param {*} value\n * @param {string} rangePattern\n * @param {number} errorCode\n * @param {class} errorClass\n * @return {boolean}\n */\nexport function checkValidRange(\n value: any,\n rangePattern: String,\n errorCode: number,\n errorClass: function) {\n const ranges = rangePattern.split('#');\n value = value * 1.0;\n if (value >= ranges[0]) {\n if ((ranges[1] === '*') || (value <= ranges[1])) {\n return true;\n } else {\n throw new errorClass.prototype.constructor(errorCode);\n }\n } else {\n throw new errorClass.prototype.constructor(errorCode);\n }\n}\n\n/**\n * Base class for API cmi objects\n */\nexport class BaseCMI {\n jsonString = false;\n #initialized = false;\n #start_time;\n\n /**\n * Constructor for BaseCMI, just marks the class as abstract\n */\n constructor() {\n if (new.target === BaseCMI) {\n throw new TypeError('Cannot construct BaseCMI instances directly');\n }\n }\n\n /**\n * Getter for #initialized\n * @return {boolean}\n */\n get initialized() {\n return this.#initialized;\n }\n\n /**\n * Getter for #start_time\n * @return {Number}\n */\n get start_time() {\n return this.#start_time;\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n this.#initialized = true;\n }\n\n /**\n * Called when the player should override the 'session_time' provided by\n * the module\n */\n setStartTime() {\n this.#start_time = new Date().getTime();\n }\n}\n\n/**\n * Base class for cmi *.score objects\n */\nexport class CMIScore extends BaseCMI {\n /**\n * Constructor for *.score\n * @param {string} score_children\n * @param {string} score_range\n * @param {string} max\n * @param {number} invalidErrorCode\n * @param {number} invalidTypeCode\n * @param {number} invalidRangeCode\n * @param {string} decimalRegex\n * @param {class} errorClass\n */\n constructor(\n {\n score_children,\n score_range,\n max,\n invalidErrorCode,\n invalidTypeCode,\n invalidRangeCode,\n decimalRegex,\n errorClass,\n }) {\n super();\n\n this.#_children = score_children ||\n scorm12_constants.score_children;\n this.#_score_range = !score_range ? false : scorm12_regex.score_range;\n this.#max = (max || max === '') ? max : '100';\n this.#_invalid_error_code = invalidErrorCode ||\n scorm12_error_codes.INVALID_SET_VALUE;\n this.#_invalid_type_code = invalidTypeCode ||\n scorm12_error_codes.TYPE_MISMATCH;\n this.#_invalid_range_code = invalidRangeCode ||\n scorm12_error_codes.VALUE_OUT_OF_RANGE;\n this.#_decimal_regex = decimalRegex ||\n scorm12_regex.CMIDecimal;\n this.#_error_class = errorClass;\n }\n\n #_children;\n #_score_range;\n #_invalid_error_code;\n #_invalid_type_code;\n #_invalid_range_code;\n #_decimal_regex;\n #_error_class;\n #raw = '';\n #min = '';\n #max;\n\n /**\n * Getter for _children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throw new this.#_error_class.prototype.constructor(this.#_invalid_error_code);\n }\n\n /**\n * Getter for #raw\n * @return {string}\n */\n get raw() {\n return this.#raw;\n }\n\n /**\n * Setter for #raw\n * @param {string} raw\n */\n set raw(raw) {\n if (checkValidFormat(raw, this.#_decimal_regex, this.#_invalid_type_code, this.#_error_class) &&\n (!this.#_score_range ||\n checkValidRange(raw, this.#_score_range, this.#_invalid_range_code, this.#_error_class))) {\n this.#raw = raw;\n }\n }\n\n /**\n * Getter for #min\n * @return {string}\n */\n get min() {\n return this.#min;\n }\n\n /**\n * Setter for #min\n * @param {string} min\n */\n set min(min) {\n if (checkValidFormat(min, this.#_decimal_regex, this.#_invalid_type_code, this.#_error_class) &&\n (!this.#_score_range ||\n checkValidRange(min, this.#_score_range, this.#_invalid_range_code, this.#_error_class))) {\n this.#min = min;\n }\n }\n\n /**\n * Getter for #max\n * @return {string}\n */\n get max() {\n return this.#max;\n }\n\n /**\n * Setter for #max\n * @param {string} max\n */\n set max(max) {\n if (checkValidFormat(max, this.#_decimal_regex, this.#_invalid_type_code, this.#_error_class) &&\n (!this.#_score_range ||\n checkValidRange(max, this.#_score_range, this.#_invalid_range_code, this.#_error_class))) {\n this.#max = max;\n }\n }\n\n /**\n * toJSON for *.score\n * @return {{min: string, max: string, raw: string}}\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'raw': this.raw,\n 'min': this.min,\n 'max': this.max,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Base class for cmi *.n objects\n */\nexport class CMIArray extends BaseCMI {\n /**\n * Constructor cmi *.n arrays\n * @param {string} children\n * @param {number} errorCode\n * @param {class} errorClass\n */\n constructor({children, errorCode, errorClass}) {\n super();\n this.#_children = children;\n this.#errorCode = errorCode;\n this.#errorClass = errorClass;\n this.childArray = [];\n }\n\n #errorCode;\n #errorClass;\n #_children;\n\n /**\n * Getter for _children\n * @return {*}\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n */\n set _children(_children) {\n throw new this.#errorClass.prototype.constructor(this.#errorCode);\n }\n\n /**\n * Getter for _count\n * @return {number}\n */\n get _count() {\n return this.childArray.length;\n }\n\n /**\n * Setter for _count. Just throws an error.\n * @param {number} _count\n */\n set _count(_count) {\n throw new this.#errorClass.prototype.constructor(this.#errorCode);\n }\n\n /**\n * toJSON for *.n arrays\n * @return {object}\n */\n toJSON() {\n this.jsonString = true;\n const result = {};\n for (let i = 0; i < this.childArray.length; i++) {\n result[i + ''] = this.childArray[i];\n }\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\nimport {\n BaseCMI,\n checkValidFormat,\n checkValidRange,\n CMIArray,\n CMIScore,\n} from './common';\nimport APIConstants from '../constants/api_constants';\nimport ErrorCodes from '../constants/error_codes';\nimport Regex from '../constants/regex';\nimport {Scorm12ValidationError} from '../exceptions';\nimport * as Utilities from '../utilities';\nimport * as Util from '../utilities';\n\nconst scorm12_constants = APIConstants.scorm12;\nconst scorm12_regex = Regex.scorm12;\nconst scorm12_error_codes = ErrorCodes.scorm12;\n\n/**\n * Helper method for throwing Read Only error\n */\nexport function throwReadOnlyError() {\n throw new Scorm12ValidationError(scorm12_error_codes.READ_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Write Only error\n */\nexport function throwWriteOnlyError() {\n throw new Scorm12ValidationError(scorm12_error_codes.WRITE_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Invalid Set error\n */\nfunction throwInvalidValueError() {\n throw new Scorm12ValidationError(scorm12_error_codes.INVALID_SET_VALUE);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} regexPattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function check12ValidFormat(\n value: String,\n regexPattern: String,\n allowEmptyString?: boolean) {\n return checkValidFormat(\n value,\n regexPattern,\n scorm12_error_codes.TYPE_MISMATCH,\n Scorm12ValidationError,\n allowEmptyString\n );\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} rangePattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function check12ValidRange(\n value: any,\n rangePattern: String,\n allowEmptyString?: boolean) {\n return checkValidRange(\n value,\n rangePattern,\n scorm12_error_codes.VALUE_OUT_OF_RANGE,\n Scorm12ValidationError,\n allowEmptyString\n );\n}\n\n/**\n * Class representing the cmi object for SCORM 1.2\n */\nexport class CMI extends BaseCMI {\n #_children = '';\n #_version = '3.4';\n #launch_data = '';\n #comments = '';\n #comments_from_lms = '';\n\n student_data = null;\n\n /**\n * Constructor for the SCORM 1.2 cmi object\n * @param {string} cmi_children\n * @param {(CMIStudentData|AICCCMIStudentData)} student_data\n * @param {boolean} initialized\n */\n constructor(cmi_children, student_data, initialized: boolean) {\n super();\n\n if (initialized) this.initialize();\n\n this.#_children = cmi_children ?\n cmi_children :\n scorm12_constants.cmi_children;\n this.core = new CMICore();\n this.objectives = new CMIObjectives();\n this.student_data = student_data ? student_data : new CMIStudentData();\n this.student_preference = new CMIStudentPreference();\n this.interactions = new CMIInteractions();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.core?.initialize();\n this.objectives?.initialize();\n this.student_data?.initialize();\n this.student_preference?.initialize();\n this.interactions?.initialize();\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * suspend_data: string,\n * launch_data: string,\n * comments: string,\n * comments_from_lms: string,\n * core: CMICore,\n * objectives: CMIObjectives,\n * student_data: CMIStudentData,\n * student_preference: CMIStudentPreference,\n * interactions: CMIInteractions\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'suspend_data': this.suspend_data,\n 'launch_data': this.launch_data,\n 'comments': this.comments,\n 'comments_from_lms': this.comments_from_lms,\n 'core': this.core,\n 'objectives': this.objectives,\n 'student_data': this.student_data,\n 'student_preference': this.student_preference,\n 'interactions': this.interactions,\n };\n delete this.jsonString;\n return result;\n }\n\n /**\n * Getter for #_version\n * @return {string}\n */\n get _version() {\n return this.#_version;\n }\n\n /**\n * Setter for #_version. Just throws an error.\n * @param {string} _version\n */\n set _version(_version) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #_children\n * @return {string}\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_version. Just throws an error.\n * @param {string} _children\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #suspend_data\n * @return {string}\n */\n get suspend_data() {\n return this.core?.suspend_data;\n }\n\n /**\n * Setter for #suspend_data\n * @param {string} suspend_data\n */\n set suspend_data(suspend_data) {\n if (this.core) {\n this.core.suspend_data = suspend_data;\n }\n }\n\n /**\n * Getter for #launch_data\n * @return {string}\n */\n get launch_data() {\n return this.#launch_data;\n }\n\n /**\n * Setter for #launch_data. Can only be called before initialization.\n * @param {string} launch_data\n */\n set launch_data(launch_data) {\n !this.initialized ? this.#launch_data = launch_data : throwReadOnlyError();\n }\n\n /**\n * Getter for #comments\n * @return {string}\n */\n get comments() {\n return this.#comments;\n }\n\n /**\n * Setter for #comments\n * @param {string} comments\n */\n set comments(comments) {\n if (check12ValidFormat(comments, scorm12_regex.CMIString4096, true)) {\n this.#comments = comments;\n }\n }\n\n /**\n * Getter for #comments_from_lms\n * @return {string}\n */\n get comments_from_lms() {\n return this.#comments_from_lms;\n }\n\n /**\n * Setter for #comments_from_lms. Can only be called before initialization.\n * @param {string} comments_from_lms\n */\n set comments_from_lms(comments_from_lms) {\n !this.initialized ?\n this.#comments_from_lms = comments_from_lms :\n throwReadOnlyError();\n }\n\n /**\n * Adds the current session time to the existing total time.\n *\n * @return {string}\n */\n getCurrentTotalTime() {\n return this.core.getCurrentTotalTime(this.start_time);\n }\n}\n\n/**\n * Class representing the cmi.core object\n * @extends BaseCMI\n */\nclass CMICore extends BaseCMI {\n /**\n * Constructor for cmi.core\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: scorm12_constants.score_children,\n score_range: scorm12_regex.score_range,\n invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,\n errorClass: Scorm12ValidationError,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n #_children = scorm12_constants.core_children;\n #student_id = '';\n #student_name = '';\n #lesson_location = '';\n #credit = '';\n #lesson_status = 'not attempted';\n #entry = '';\n #total_time = '';\n #lesson_mode = 'normal';\n #exit = '';\n #session_time = '00:00:00';\n #suspend_data = '';\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #student_id\n * @return {string}\n */\n get student_id() {\n return this.#student_id;\n }\n\n /**\n * Setter for #student_id. Can only be called before initialization.\n * @param {string} student_id\n */\n set student_id(student_id) {\n !this.initialized ? this.#student_id = student_id : throwReadOnlyError();\n }\n\n /**\n * Getter for #student_name\n * @return {string}\n */\n get student_name() {\n return this.#student_name;\n }\n\n /**\n * Setter for #student_name. Can only be called before initialization.\n * @param {string} student_name\n */\n set student_name(student_name) {\n !this.initialized ?\n this.#student_name = student_name :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #lesson_location\n * @return {string}\n */\n get lesson_location() {\n return this.#lesson_location;\n }\n\n /**\n * Setter for #lesson_location\n * @param {string} lesson_location\n */\n set lesson_location(lesson_location) {\n if (check12ValidFormat(lesson_location, scorm12_regex.CMIString256, true)) {\n this.#lesson_location = lesson_location;\n }\n }\n\n /**\n * Getter for #credit\n * @return {string}\n */\n get credit() {\n return this.#credit;\n }\n\n /**\n * Setter for #credit. Can only be called before initialization.\n * @param {string} credit\n */\n set credit(credit) {\n !this.initialized ? this.#credit = credit : throwReadOnlyError();\n }\n\n /**\n * Getter for #lesson_status\n * @return {string}\n */\n get lesson_status() {\n return this.#lesson_status;\n }\n\n /**\n * Setter for #lesson_status\n * @param {string} lesson_status\n */\n set lesson_status(lesson_status) {\n if (this.initialized) {\n if (check12ValidFormat(lesson_status, scorm12_regex.CMIStatus)) {\n this.#lesson_status = lesson_status;\n }\n } else {\n if (check12ValidFormat(lesson_status, scorm12_regex.CMIStatus2)) {\n this.#lesson_status = lesson_status;\n }\n }\n }\n\n /**\n * Getter for #entry\n * @return {string}\n */\n get entry() {\n return this.#entry;\n }\n\n /**\n * Setter for #entry. Can only be called before initialization.\n * @param {string} entry\n */\n set entry(entry) {\n !this.initialized ? this.#entry = entry : throwReadOnlyError();\n }\n\n /**\n * Getter for #total_time\n * @return {string}\n */\n get total_time() {\n return this.#total_time;\n }\n\n /**\n * Setter for #total_time. Can only be called before initialization.\n * @param {string} total_time\n */\n set total_time(total_time) {\n !this.initialized ? this.#total_time = total_time : throwReadOnlyError();\n }\n\n /**\n * Getter for #lesson_mode\n * @return {string}\n */\n get lesson_mode() {\n return this.#lesson_mode;\n }\n\n /**\n * Setter for #lesson_mode. Can only be called before initialization.\n * @param {string} lesson_mode\n */\n set lesson_mode(lesson_mode) {\n !this.initialized ? this.#lesson_mode = lesson_mode : throwReadOnlyError();\n }\n\n /**\n * Getter for #exit. Should only be called during JSON export.\n * @return {*}\n */\n get exit() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#exit;\n }\n\n /**\n * Setter for #exit\n * @param {string} exit\n */\n set exit(exit) {\n if (check12ValidFormat(exit, scorm12_regex.CMIExit, true)) {\n this.#exit = exit;\n }\n }\n\n /**\n * Getter for #session_time. Should only be called during JSON export.\n * @return {*}\n */\n get session_time() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#session_time;\n }\n\n /**\n * Setter for #session_time\n * @param {string} session_time\n */\n set session_time(session_time) {\n if (check12ValidFormat(session_time, scorm12_regex.CMITimespan)) {\n this.#session_time = session_time;\n }\n }\n\n /**\n * Getter for #suspend_data\n * @return {string}\n */\n get suspend_data() {\n return this.#suspend_data;\n }\n\n /**\n * Setter for #suspend_data\n * @param {string} suspend_data\n */\n set suspend_data(suspend_data) {\n if (check12ValidFormat(suspend_data, scorm12_regex.CMIString4096, true)) {\n this.#suspend_data = suspend_data;\n }\n }\n\n /**\n * Adds the current session time to the existing total time.\n * @param {Number} start_time\n * @return {string}\n */\n getCurrentTotalTime(start_time: Number) {\n let sessionTime = this.#session_time;\n const startTime = start_time;\n\n if (typeof startTime !== 'undefined' && startTime !== null) {\n const seconds = new Date().getTime() - startTime;\n sessionTime = Util.getSecondsAsHHMMSS(seconds / 1000);\n }\n\n return Utilities.addHHMMSSTimeStrings(\n this.#total_time,\n sessionTime,\n new RegExp(scorm12_regex.CMITimespan),\n );\n }\n\n /**\n * toJSON for cmi.core\n *\n * @return {\n * {\n * student_name: string,\n * entry: string,\n * exit: string,\n * score: CMIScore,\n * student_id: string,\n * lesson_mode: string,\n * lesson_location: string,\n * lesson_status: string,\n * credit: string,\n * session_time: *\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'student_id': this.student_id,\n 'student_name': this.student_name,\n 'lesson_location': this.lesson_location,\n 'credit': this.credit,\n 'lesson_status': this.lesson_status,\n 'entry': this.entry,\n 'lesson_mode': this.lesson_mode,\n 'exit': this.exit,\n 'session_time': this.session_time,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.objectives object\n * @extends CMIArray\n */\nclass CMIObjectives extends CMIArray {\n /**\n * Constructor for cmi.objectives\n */\n constructor() {\n super({\n children: scorm12_constants.objectives_children,\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n errorClass: Scorm12ValidationError,\n });\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.student_data object\n * @extends BaseCMI\n */\nexport class CMIStudentData extends BaseCMI {\n #_children;\n #mastery_score = '';\n #max_time_allowed = '';\n #time_limit_action = '';\n\n /**\n * Constructor for cmi.student_data\n * @param {string} student_data_children\n */\n constructor(student_data_children) {\n super();\n\n this.#_children = student_data_children ?\n student_data_children :\n scorm12_constants.student_data_children;\n }\n\n /**\n * Getter for #_children\n * @return {*}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #master_score\n * @return {string}\n */\n get mastery_score() {\n return this.#mastery_score;\n }\n\n /**\n * Setter for #master_score. Can only be called before initialization.\n * @param {string} mastery_score\n */\n set mastery_score(mastery_score) {\n !this.initialized ?\n this.#mastery_score = mastery_score :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #max_time_allowed\n * @return {string}\n */\n get max_time_allowed() {\n return this.#max_time_allowed;\n }\n\n /**\n * Setter for #max_time_allowed. Can only be called before initialization.\n * @param {string} max_time_allowed\n */\n set max_time_allowed(max_time_allowed) {\n !this.initialized ?\n this.#max_time_allowed = max_time_allowed :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #time_limit_action\n * @return {string}\n */\n get time_limit_action() {\n return this.#time_limit_action;\n }\n\n /**\n * Setter for #time_limit_action. Can only be called before initialization.\n * @param {string} time_limit_action\n */\n set time_limit_action(time_limit_action) {\n !this.initialized ?\n this.#time_limit_action = time_limit_action :\n throwReadOnlyError();\n }\n\n /**\n * toJSON for cmi.student_data\n *\n * @return {\n * {\n * max_time_allowed: string,\n * time_limit_action: string,\n * mastery_score: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'mastery_score': this.mastery_score,\n 'max_time_allowed': this.max_time_allowed,\n 'time_limit_action': this.time_limit_action,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.student_preference object\n * @extends BaseCMI\n */\nexport class CMIStudentPreference extends BaseCMI {\n #_children;\n\n /**\n * Constructor for cmi.student_preference\n * @param {string} student_preference_children\n */\n constructor(student_preference_children) {\n super();\n\n this.#_children = student_preference_children ?\n student_preference_children :\n scorm12_constants.student_preference_children;\n }\n\n #audio = '';\n #language = '';\n #speed = '';\n #text = '';\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #audio\n * @return {string}\n */\n get audio() {\n return this.#audio;\n }\n\n /**\n * Setter for #audio\n * @param {string} audio\n */\n set audio(audio) {\n if (check12ValidFormat(audio, scorm12_regex.CMISInteger) &&\n check12ValidRange(audio, scorm12_regex.audio_range)) {\n this.#audio = audio;\n }\n }\n\n /**\n * Getter for #language\n * @return {string}\n */\n get language() {\n return this.#language;\n }\n\n /**\n * Setter for #language\n * @param {string} language\n */\n set language(language) {\n if (check12ValidFormat(language, scorm12_regex.CMIString256)) {\n this.#language = language;\n }\n }\n\n /**\n * Getter for #speed\n * @return {string}\n */\n get speed() {\n return this.#speed;\n }\n\n /**\n * Setter for #speed\n * @param {string} speed\n */\n set speed(speed) {\n if (check12ValidFormat(speed, scorm12_regex.CMISInteger) &&\n check12ValidRange(speed, scorm12_regex.speed_range)) {\n this.#speed = speed;\n }\n }\n\n /**\n * Getter for #text\n * @return {string}\n */\n get text() {\n return this.#text;\n }\n\n /**\n * Setter for #text\n * @param {string} text\n */\n set text(text) {\n if (check12ValidFormat(text, scorm12_regex.CMISInteger) &&\n check12ValidRange(text, scorm12_regex.text_range)) {\n this.#text = text;\n }\n }\n\n /**\n * toJSON for cmi.student_preference\n *\n * @return {\n * {\n * audio: string,\n * language: string,\n * speed: string,\n * text: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'audio': this.audio,\n 'language': this.language,\n 'speed': this.speed,\n 'text': this.text,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions object\n * @extends BaseCMI\n */\nclass CMIInteractions extends CMIArray {\n /**\n * Constructor for cmi.interactions\n */\n constructor() {\n super({\n children: scorm12_constants.interactions_children,\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n errorClass: Scorm12ValidationError,\n });\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.n object\n */\n constructor() {\n super();\n\n this.objectives = new CMIArray({\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n errorClass: Scorm12ValidationError,\n children: scorm12_constants.objectives_children,\n });\n this.correct_responses = new CMIArray({\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n errorClass: Scorm12ValidationError,\n children: scorm12_constants.correct_responses_children,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.objectives?.initialize();\n this.correct_responses?.initialize();\n }\n\n #id = '';\n #time = '';\n #type = '';\n #weighting = '';\n #student_response = '';\n #result = '';\n #latency = '';\n\n /**\n * Getter for #id. Should only be called during JSON export.\n * @return {*}\n */\n get id() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check12ValidFormat(id, scorm12_regex.CMIIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #time. Should only be called during JSON export.\n * @return {*}\n */\n get time() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#time;\n }\n\n /**\n * Setter for #time\n * @param {string} time\n */\n set time(time) {\n if (check12ValidFormat(time, scorm12_regex.CMITime)) {\n this.#time = time;\n }\n }\n\n /**\n * Getter for #type. Should only be called during JSON export.\n * @return {*}\n */\n get type() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#type;\n }\n\n /**\n * Setter for #type\n * @param {string} type\n */\n set type(type) {\n if (check12ValidFormat(type, scorm12_regex.CMIType)) {\n this.#type = type;\n }\n }\n\n /**\n * Getter for #weighting. Should only be called during JSON export.\n * @return {*}\n */\n get weighting() {\n return (!this.jsonString) ?\n throwWriteOnlyError() :\n this.#weighting;\n }\n\n /**\n * Setter for #weighting\n * @param {string} weighting\n */\n set weighting(weighting) {\n if (check12ValidFormat(weighting, scorm12_regex.CMIDecimal) &&\n check12ValidRange(weighting, scorm12_regex.weighting_range)) {\n this.#weighting = weighting;\n }\n }\n\n /**\n * Getter for #student_response. Should only be called during JSON export.\n * @return {*}\n */\n get student_response() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#student_response;\n }\n\n /**\n * Setter for #student_response\n * @param {string} student_response\n */\n set student_response(student_response) {\n if (check12ValidFormat(student_response, scorm12_regex.CMIFeedback, true)) {\n this.#student_response = student_response;\n }\n }\n\n /**\n * Getter for #result. Should only be called during JSON export.\n * @return {*}\n */\n get result() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#result;\n }\n\n /**\n * Setter for #result\n * @param {string} result\n */\n set result(result) {\n if (check12ValidFormat(result, scorm12_regex.CMIResult)) {\n this.#result = result;\n }\n }\n\n /**\n * Getter for #latency. Should only be called during JSON export.\n * @return {*}\n */\n get latency() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#latency;\n }\n\n /**\n * Setter for #latency\n * @param {string} latency\n */\n set latency(latency) {\n if (check12ValidFormat(latency, scorm12_regex.CMITimespan)) {\n this.#latency = latency;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n\n *\n * @return {\n * {\n * id: string,\n * time: string,\n * type: string,\n * weighting: string,\n * student_response: string,\n * result: string,\n * latency: string,\n * objectives: CMIArray,\n * correct_responses: CMIArray\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'time': this.time,\n 'type': this.type,\n 'weighting': this.weighting,\n 'student_response': this.student_response,\n 'result': this.result,\n 'latency': this.latency,\n 'objectives': this.objectives,\n 'correct_responses': this.correct_responses,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.objectives.n object\n * @extends BaseCMI\n */\nexport class CMIObjectivesObject extends BaseCMI {\n /**\n * Constructor for cmi.objectives.n\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: scorm12_constants.score_children,\n score_range: scorm12_regex.score_range,\n invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,\n errorClass: Scorm12ValidationError,\n });\n }\n\n #id = '';\n #status = '';\n\n /**\n * Getter for #id\n * @return {\"\"}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check12ValidFormat(id, scorm12_regex.CMIIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #status\n * @return {\"\"}\n */\n get status() {\n return this.#status;\n }\n\n /**\n * Setter for #status\n * @param {string} status\n */\n set status(status) {\n if (check12ValidFormat(status, scorm12_regex.CMIStatus2)) {\n this.#status = status;\n }\n }\n\n /**\n * toJSON for cmi.objectives.n\n * @return {\n * {\n * id: string,\n * status: string,\n * score: CMIScore\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'status': this.status,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.n.objectives.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsObjectivesObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.n.objectives.n\n */\n constructor() {\n super();\n }\n\n #id = '';\n\n /**\n * Getter for #id\n * @return {\"\"}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check12ValidFormat(id, scorm12_regex.CMIIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n.objectives.n\n * @return {\n * {\n * id: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.correct_responses.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsCorrectResponsesObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.correct_responses.n\n */\n constructor() {\n super();\n }\n\n #pattern = '';\n\n /**\n * Getter for #pattern\n * @return {string}\n */\n get pattern() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#pattern;\n }\n\n /**\n * Setter for #pattern\n * @param {string} pattern\n */\n set pattern(pattern) {\n if (check12ValidFormat(pattern, scorm12_regex.CMIFeedback, true)) {\n this.#pattern = pattern;\n }\n }\n\n /**\n * toJSON for cmi.interactions.correct_responses.n\n * @return {\n * {\n * pattern: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'pattern': this.pattern,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for AICC Navigation object\n */\nexport class NAV extends BaseCMI {\n /**\n * Constructor for NAV object\n */\n constructor() {\n super();\n }\n\n #event = '';\n\n /**\n * Getter for #event\n * @return {string}\n */\n get event() {\n return this.#event;\n }\n\n /**\n * Setter for #event\n * @param {string} event\n */\n set event(event) {\n if (check12ValidFormat(event, scorm12_regex.NAVEvent)) {\n this.#event = event;\n }\n }\n\n /**\n * toJSON for nav object\n * @return {\n * {\n * event: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'event': this.event,\n };\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\nimport {\n BaseCMI,\n checkValidFormat,\n checkValidRange,\n CMIArray,\n CMIScore,\n} from './common';\nimport APIConstants from '../constants/api_constants';\nimport Regex from '../constants/regex';\nimport ErrorCodes from '../constants/error_codes';\nimport Responses from '../constants/response_constants';\nimport {Scorm2004ValidationError} from '../exceptions';\nimport * as Util from '../utilities';\n\nconst scorm2004_constants = APIConstants.scorm2004;\nconst scorm2004_error_codes = ErrorCodes.scorm2004;\nconst learner_responses = Responses.learner;\n\nconst scorm2004_regex = Regex.scorm2004;\n\n/**\n * Helper method for throwing Read Only error\n */\nfunction throwReadOnlyError() {\n throw new Scorm2004ValidationError(scorm2004_error_codes.READ_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Write Only error\n */\nfunction throwWriteOnlyError() {\n throw new Scorm2004ValidationError(scorm2004_error_codes.WRITE_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Type Mismatch error\n */\nfunction throwTypeMismatchError() {\n throw new Scorm2004ValidationError(scorm2004_error_codes.TYPE_MISMATCH);\n}\n\n/**\n * Helper method for throwing Dependency Not Established error\n */\nfunction throwDependencyNotEstablishedError() {\n throw new Scorm2004ValidationError(scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);\n}\n\n/**\n * Helper method for throwing Dependency Not Established error\n */\nfunction throwGeneralSetError() {\n throw new Scorm2004ValidationError(scorm2004_error_codes.GENERAL_SET_FAILURE);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} regexPattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nfunction check2004ValidFormat(\n value: String,\n regexPattern: String,\n allowEmptyString?: boolean) {\n return checkValidFormat(\n value,\n regexPattern,\n scorm2004_error_codes.TYPE_MISMATCH,\n Scorm2004ValidationError,\n allowEmptyString,\n );\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} rangePattern\n * @return {boolean}\n */\nfunction check2004ValidRange(value: any, rangePattern: String) {\n return checkValidRange(\n value,\n rangePattern,\n scorm2004_error_codes.VALUE_OUT_OF_RANGE,\n Scorm2004ValidationError,\n );\n}\n\n/**\n * Class representing cmi object for SCORM 2004\n */\nexport class CMI extends BaseCMI {\n /**\n * Constructor for the SCORM 2004 cmi object\n * @param {boolean} initialized\n */\n constructor(initialized: boolean) {\n super();\n\n this.learner_preference = new CMILearnerPreference();\n this.score = new Scorm2004CMIScore();\n this.comments_from_learner = new CMICommentsFromLearner();\n this.comments_from_lms = new CMICommentsFromLMS();\n this.interactions = new CMIInteractions();\n this.objectives = new CMIObjectives();\n\n if (initialized) this.initialize();\n }\n\n #_version = '1.0';\n #_children = scorm2004_constants.cmi_children;\n #completion_status = 'unknown';\n #completion_threshold = '';\n #credit = 'credit';\n #entry = '';\n #exit = '';\n #launch_data = '';\n #learner_id = '';\n #learner_name = '';\n #location = '';\n #max_time_allowed = '';\n #mode = 'normal';\n #progress_measure = '';\n #scaled_passing_score = '';\n #session_time = 'PT0H0M0S';\n #success_status = 'unknown';\n #suspend_data = '';\n #time_limit_action = 'continue,no message';\n #total_time = '';\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.learner_preference?.initialize();\n this.score?.initialize();\n this.comments_from_learner?.initialize();\n this.comments_from_lms?.initialize();\n this.interactions?.initialize();\n this.objectives?.initialize();\n }\n\n /**\n * Getter for #_version\n * @return {string}\n * @private\n */\n get _version() {\n return this.#_version;\n }\n\n /**\n * Setter for #_version. Just throws an error.\n * @param {string} _version\n * @private\n */\n set _version(_version) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {number} _children\n * @private\n */\n set _children(_children) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #completion_status\n * @return {string}\n */\n get completion_status() {\n return this.#completion_status;\n }\n\n /**\n * Setter for #completion_status\n * @param {string} completion_status\n */\n set completion_status(completion_status) {\n if (check2004ValidFormat(completion_status, scorm2004_regex.CMICStatus)) {\n this.#completion_status = completion_status;\n }\n }\n\n /**\n * Getter for #completion_threshold\n * @return {string}\n */\n get completion_threshold() {\n return this.#completion_threshold;\n }\n\n /**\n * Setter for #completion_threshold. Can only be called before initialization.\n * @param {string} completion_threshold\n */\n set completion_threshold(completion_threshold) {\n !this.initialized ?\n this.#completion_threshold = completion_threshold :\n throwReadOnlyError();\n }\n\n /**\n * Setter for #credit\n * @return {string}\n */\n get credit() {\n return this.#credit;\n }\n\n /**\n * Setter for #credit. Can only be called before initialization.\n * @param {string} credit\n */\n set credit(credit) {\n !this.initialized ? this.#credit = credit : throwReadOnlyError();\n }\n\n /**\n * Getter for #entry\n * @return {string}\n */\n get entry() {\n return this.#entry;\n }\n\n /**\n * Setter for #entry. Can only be called before initialization.\n * @param {string} entry\n */\n set entry(entry) {\n !this.initialized ? this.#entry = entry : throwReadOnlyError();\n }\n\n /**\n * Getter for #exit. Should only be called during JSON export.\n * @return {string}\n */\n get exit() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#exit;\n }\n\n /**\n * Getter for #exit\n * @param {string} exit\n */\n set exit(exit) {\n if (check2004ValidFormat(exit, scorm2004_regex.CMIExit, true)) {\n this.#exit = exit;\n }\n }\n\n /**\n * Getter for #launch_data\n * @return {string}\n */\n get launch_data() {\n return this.#launch_data;\n }\n\n /**\n * Setter for #launch_data. Can only be called before initialization.\n * @param {string} launch_data\n */\n set launch_data(launch_data) {\n !this.initialized ? this.#launch_data = launch_data : throwReadOnlyError();\n }\n\n /**\n * Getter for #learner_id\n * @return {string}\n */\n get learner_id() {\n return this.#learner_id;\n }\n\n /**\n * Setter for #learner_id. Can only be called before initialization.\n * @param {string} learner_id\n */\n set learner_id(learner_id) {\n !this.initialized ? this.#learner_id = learner_id : throwReadOnlyError();\n }\n\n /**\n * Getter for #learner_name\n * @return {string}\n */\n get learner_name() {\n return this.#learner_name;\n }\n\n /**\n * Setter for #learner_name. Can only be called before initialization.\n * @param {string} learner_name\n */\n set learner_name(learner_name) {\n !this.initialized ?\n this.#learner_name = learner_name :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #location\n * @return {string}\n */\n get location() {\n return this.#location;\n }\n\n /**\n * Setter for #location\n * @param {string} location\n */\n set location(location) {\n if (check2004ValidFormat(location, scorm2004_regex.CMIString1000)) {\n this.#location = location;\n }\n }\n\n /**\n * Getter for #max_time_allowed\n * @return {string}\n */\n get max_time_allowed() {\n return this.#max_time_allowed;\n }\n\n /**\n * Setter for #max_time_allowed. Can only be called before initialization.\n * @param {string} max_time_allowed\n */\n set max_time_allowed(max_time_allowed) {\n !this.initialized ?\n this.#max_time_allowed = max_time_allowed :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #mode\n * @return {string}\n */\n get mode() {\n return this.#mode;\n }\n\n /**\n * Setter for #mode. Can only be called before initialization.\n * @param {string} mode\n */\n set mode(mode) {\n !this.initialized ? this.#mode = mode : throwReadOnlyError();\n }\n\n /**\n * Getter for #progress_measure\n * @return {string}\n */\n get progress_measure() {\n return this.#progress_measure;\n }\n\n /**\n * Setter for #progress_measure\n * @param {string} progress_measure\n */\n set progress_measure(progress_measure) {\n if (check2004ValidFormat(progress_measure, scorm2004_regex.CMIDecimal) &&\n check2004ValidRange(progress_measure, scorm2004_regex.progress_range)) {\n this.#progress_measure = progress_measure;\n }\n }\n\n /**\n * Getter for #scaled_passing_score\n * @return {string}\n */\n get scaled_passing_score() {\n return this.#scaled_passing_score;\n }\n\n /**\n * Setter for #scaled_passing_score. Can only be called before initialization.\n * @param {string} scaled_passing_score\n */\n set scaled_passing_score(scaled_passing_score) {\n !this.initialized ?\n this.#scaled_passing_score = scaled_passing_score :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #session_time. Should only be called during JSON export.\n * @return {string}\n */\n get session_time() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#session_time;\n }\n\n /**\n * Setter for #session_time\n * @param {string} session_time\n */\n set session_time(session_time) {\n if (check2004ValidFormat(session_time, scorm2004_regex.CMITimespan)) {\n this.#session_time = session_time;\n }\n }\n\n /**\n * Getter for #success_status\n * @return {string}\n */\n get success_status() {\n return this.#success_status;\n }\n\n /**\n * Setter for #success_status\n * @param {string} success_status\n */\n set success_status(success_status) {\n if (check2004ValidFormat(success_status, scorm2004_regex.CMISStatus)) {\n this.#success_status = success_status;\n }\n }\n\n /**\n * Getter for #suspend_data\n * @return {string}\n */\n get suspend_data() {\n return this.#suspend_data;\n }\n\n /**\n * Setter for #suspend_data\n * @param {string} suspend_data\n */\n set suspend_data(suspend_data) {\n if (check2004ValidFormat(suspend_data, scorm2004_regex.CMIString64000,\n true)) {\n this.#suspend_data = suspend_data;\n }\n }\n\n /**\n * Getter for #time_limit_action\n * @return {string}\n */\n get time_limit_action() {\n return this.#time_limit_action;\n }\n\n /**\n * Setter for #time_limit_action. Can only be called before initialization.\n * @param {string} time_limit_action\n */\n set time_limit_action(time_limit_action) {\n !this.initialized ?\n this.#time_limit_action = time_limit_action :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #total_time\n * @return {string}\n */\n get total_time() {\n return this.#total_time;\n }\n\n /**\n * Setter for #total_time. Can only be called before initialization.\n * @param {string} total_time\n */\n set total_time(total_time) {\n !this.initialized ? this.#total_time = total_time : throwReadOnlyError();\n }\n\n /**\n * Adds the current session time to the existing total time.\n *\n * @return {string} ISO8601 Duration\n */\n getCurrentTotalTime() {\n let sessionTime = this.#session_time;\n const startTime = this.start_time;\n\n if (typeof startTime !== 'undefined' && startTime !== null) {\n const seconds = new Date().getTime() - startTime;\n sessionTime = Util.getSecondsAsISODuration(seconds / 1000);\n }\n\n return Util.addTwoDurations(\n this.#total_time,\n sessionTime,\n scorm2004_regex.CMITimespan,\n );\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * comments_from_learner: CMICommentsFromLearner,\n * comments_from_lms: CMICommentsFromLMS,\n * completion_status: string,\n * completion_threshold: string,\n * credit: string,\n * entry: string,\n * exit: string,\n * interactions: CMIInteractions,\n * launch_data: string,\n * learner_id: string,\n * learner_name: string,\n * learner_preference: CMILearnerPreference,\n * location: string,\n * max_time_allowed: string,\n * mode: string,\n * objectives: CMIObjectives,\n * progress_measure: string,\n * scaled_passing_score: string,\n * score: Scorm2004CMIScore,\n * session_time: string,\n * success_status: string,\n * suspend_data: string,\n * time_limit_action: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'comments_from_learner': this.comments_from_learner,\n 'comments_from_lms': this.comments_from_lms,\n 'completion_status': this.completion_status,\n 'completion_threshold': this.completion_threshold,\n 'credit': this.credit,\n 'entry': this.entry,\n 'exit': this.exit,\n 'interactions': this.interactions,\n 'launch_data': this.launch_data,\n 'learner_id': this.learner_id,\n 'learner_name': this.learner_name,\n 'learner_preference': this.learner_preference,\n 'location': this.location,\n 'max_time_allowed': this.max_time_allowed,\n 'mode': this.mode,\n 'objectives': this.objectives,\n 'progress_measure': this.progress_measure,\n 'scaled_passing_score': this.scaled_passing_score,\n 'score': this.score,\n 'session_time': this.session_time,\n 'success_status': this.success_status,\n 'suspend_data': this.suspend_data,\n 'time_limit_action': this.time_limit_action,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.learner_preference object\n */\nclass CMILearnerPreference extends BaseCMI {\n #_children = scorm2004_constants.student_preference_children;\n #audio_level = '1';\n #language = '';\n #delivery_speed = '1';\n #audio_captioning = '0';\n\n /**\n * Constructor for cmi.learner_preference\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #audio_level\n * @return {string}\n */\n get audio_level() {\n return this.#audio_level;\n }\n\n /**\n * Setter for #audio_level\n * @param {string} audio_level\n */\n set audio_level(audio_level) {\n if (check2004ValidFormat(audio_level, scorm2004_regex.CMIDecimal) &&\n check2004ValidRange(audio_level, scorm2004_regex.audio_range)) {\n this.#audio_level = audio_level;\n }\n }\n\n /**\n * Getter for #language\n * @return {string}\n */\n get language() {\n return this.#language;\n }\n\n /**\n * Setter for #language\n * @param {string} language\n */\n set language(language) {\n if (check2004ValidFormat(language, scorm2004_regex.CMILang)) {\n this.#language = language;\n }\n }\n\n /**\n * Getter for #delivery_speed\n * @return {string}\n */\n get delivery_speed() {\n return this.#delivery_speed;\n }\n\n /**\n * Setter for #delivery_speed\n * @param {string} delivery_speed\n */\n set delivery_speed(delivery_speed) {\n if (check2004ValidFormat(delivery_speed, scorm2004_regex.CMIDecimal) &&\n check2004ValidRange(delivery_speed, scorm2004_regex.speed_range)) {\n this.#delivery_speed = delivery_speed;\n }\n }\n\n /**\n * Getter for #audio_captioning\n * @return {string}\n */\n get audio_captioning() {\n return this.#audio_captioning;\n }\n\n /**\n * Setter for #audio_captioning\n * @param {string} audio_captioning\n */\n set audio_captioning(audio_captioning) {\n if (check2004ValidFormat(audio_captioning, scorm2004_regex.CMISInteger) &&\n check2004ValidRange(audio_captioning, scorm2004_regex.text_range)) {\n this.#audio_captioning = audio_captioning;\n }\n }\n\n /**\n * toJSON for cmi.learner_preference\n *\n * @return {\n * {\n * audio_level: string,\n * language: string,\n * delivery_speed: string,\n * audio_captioning: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'audio_level': this.audio_level,\n 'language': this.language,\n 'delivery_speed': this.delivery_speed,\n 'audio_captioning': this.audio_captioning,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions object\n */\nclass CMIInteractions extends CMIArray {\n /**\n * Constructor for cmi.objectives Array\n */\n constructor() {\n super({\n children: scorm2004_constants.interactions_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.objectives object\n */\nclass CMIObjectives extends CMIArray {\n /**\n * Constructor for cmi.objectives Array\n */\n constructor() {\n super({\n children: scorm2004_constants.objectives_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_lms object\n */\nclass CMICommentsFromLMS extends CMIArray {\n /**\n * Constructor for cmi.comments_from_lms Array\n */\n constructor() {\n super({\n children: scorm2004_constants.comments_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_learner object\n */\nclass CMICommentsFromLearner extends CMIArray {\n /**\n * Constructor for cmi.comments_from_learner Array\n */\n constructor() {\n super({\n children: scorm2004_constants.comments_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n });\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.interaction.n object\n */\nexport class CMIInteractionsObject extends BaseCMI {\n #id = '';\n #type = '';\n #timestamp = '';\n #weighting = '';\n #learner_response = '';\n #result = '';\n #latency = '';\n #description = '';\n\n /**\n * Constructor for cmi.interaction.n\n */\n constructor() {\n super();\n\n this.objectives = new CMIArray({\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n children: scorm2004_constants.objectives_children,\n });\n this.correct_responses = new CMIArray({\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n children: scorm2004_constants.correct_responses_children,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.objectives?.initialize();\n this.correct_responses?.initialize();\n }\n\n /**\n * Getter for #id\n * @return {string}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #type\n * @return {string}\n */\n get type() {\n return this.#type;\n }\n\n /**\n * Setter for #type\n * @param {string} type\n */\n set type(type) {\n if (this.initialized && this.#id === '') {\n throwDependencyNotEstablishedError();\n } else {\n if (check2004ValidFormat(type, scorm2004_regex.CMIType)) {\n this.#type = type;\n }\n }\n }\n\n /**\n * Getter for #timestamp\n * @return {string}\n */\n get timestamp() {\n return this.#timestamp;\n }\n\n /**\n * Setter for #timestamp\n * @param {string} timestamp\n */\n set timestamp(timestamp) {\n if (this.initialized && this.#id === '') {\n throwDependencyNotEstablishedError();\n } else {\n if (check2004ValidFormat(timestamp, scorm2004_regex.CMITime)) {\n this.#timestamp = timestamp;\n }\n }\n }\n\n /**\n * Getter for #weighting\n * @return {string}\n */\n get weighting() {\n return this.#weighting;\n }\n\n /**\n * Setter for #weighting\n * @param {string} weighting\n */\n set weighting(weighting) {\n if (this.initialized && this.#id === '') {\n throwDependencyNotEstablishedError();\n } else {\n if (check2004ValidFormat(weighting, scorm2004_regex.CMIDecimal)) {\n this.#weighting = weighting;\n }\n }\n }\n\n /**\n * Getter for #learner_response\n * @return {string}\n */\n get learner_response() {\n return this.#learner_response;\n }\n\n /**\n * Setter for #learner_response. Does type validation to make sure response\n * matches SCORM 2004's spec\n * @param {string} learner_response\n */\n set learner_response(learner_response) {\n if (this.initialized && (this.#type === '' || this.#id === '')) {\n throwDependencyNotEstablishedError();\n } else {\n let nodes = [];\n const response_type = learner_responses[this.type];\n if (response_type) {\n if (response_type?.delimiter) {\n nodes = learner_response.split(response_type.delimiter);\n } else {\n nodes[0] = learner_response;\n }\n\n if ((nodes.length > 0) && (nodes.length <= response_type.max)) {\n const formatRegex = new RegExp(response_type.format);\n for (let i = 0; i < nodes.length; i++) {\n if (response_type?.delimiter2) {\n const values = nodes[i].split(response_type.delimiter2);\n if (values.length === 2) {\n if (!values[0].match(formatRegex)) {\n throwTypeMismatchError();\n } else {\n if (!values[1].match(new RegExp(response_type.format2))) {\n throwTypeMismatchError();\n }\n }\n } else {\n throwTypeMismatchError();\n }\n } else {\n if (!nodes[i].match(formatRegex)) {\n throwTypeMismatchError();\n } else {\n if (nodes[i] !== '' && response_type.unique) {\n for (let j = 0; j < i; j++) {\n if (nodes[i] === nodes[j]) {\n throwTypeMismatchError();\n }\n }\n }\n }\n }\n }\n } else {\n throwGeneralSetError();\n }\n\n this.#learner_response = learner_response;\n } else {\n throwTypeMismatchError();\n }\n }\n }\n\n /**\n * Getter for #result\n * @return {string}\n */\n get result() {\n return this.#result;\n }\n\n /**\n * Setter for #result\n * @param {string} result\n */\n set result(result) {\n if (check2004ValidFormat(result, scorm2004_regex.CMIResult)) {\n this.#result = result;\n }\n }\n\n /**\n * Getter for #latency\n * @return {string}\n */\n get latency() {\n return this.#latency;\n }\n\n /**\n * Setter for #latency\n * @param {string} latency\n */\n set latency(latency) {\n if (this.initialized && this.#id === '') {\n throwDependencyNotEstablishedError();\n } else {\n if (check2004ValidFormat(latency, scorm2004_regex.CMITimespan)) {\n this.#latency = latency;\n }\n }\n }\n\n /**\n * Getter for #description\n * @return {string}\n */\n get description() {\n return this.#description;\n }\n\n /**\n * Setter for #description\n * @param {string} description\n */\n set description(description) {\n if (this.initialized && this.#id === '') {\n throwDependencyNotEstablishedError();\n } else {\n if (check2004ValidFormat(description, scorm2004_regex.CMILangString250,\n true)) {\n this.#description = description;\n }\n }\n }\n\n /**\n * toJSON for cmi.interactions.n\n *\n * @return {\n * {\n * id: string,\n * type: string,\n * objectives: CMIArray,\n * timestamp: string,\n * correct_responses: CMIArray,\n * weighting: string,\n * learner_response: string,\n * result: string,\n * latency: string,\n * description: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'type': this.type,\n 'objectives': this.objectives,\n 'timestamp': this.timestamp,\n 'weighting': this.weighting,\n 'learner_response': this.learner_response,\n 'result': this.result,\n 'latency': this.latency,\n 'description': this.description,\n 'correct_responses': this.correct_responses,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.objectives.n object\n */\nexport class CMIObjectivesObject extends BaseCMI {\n #id = '';\n #success_status = 'unknown';\n #completion_status = 'unknown';\n #progress_measure = '';\n #description = '';\n\n /**\n * Constructor for cmi.objectives.n\n */\n constructor() {\n super();\n\n this.score = new Scorm2004CMIScore();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n /**\n * Getter for #id\n * @return {string}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #success_status\n * @return {string}\n */\n get success_status() {\n return this.#success_status;\n }\n\n /**\n * Setter for #success_status\n * @param {string} success_status\n */\n set success_status(success_status) {\n if (this.initialized && this.#id === '') {\n throwDependencyNotEstablishedError();\n } else {\n if (check2004ValidFormat(success_status, scorm2004_regex.CMISStatus)) {\n this.#success_status = success_status;\n }\n }\n }\n\n /**\n * Getter for #completion_status\n * @return {string}\n */\n get completion_status() {\n return this.#completion_status;\n }\n\n /**\n * Setter for #completion_status\n * @param {string} completion_status\n */\n set completion_status(completion_status) {\n if (this.initialized && this.#id === '') {\n throwDependencyNotEstablishedError();\n } else {\n if (check2004ValidFormat(completion_status, scorm2004_regex.CMICStatus)) {\n this.#completion_status = completion_status;\n }\n }\n }\n\n /**\n * Getter for #progress_measure\n * @return {string}\n */\n get progress_measure() {\n return this.#progress_measure;\n }\n\n /**\n * Setter for #progress_measure\n * @param {string} progress_measure\n */\n set progress_measure(progress_measure) {\n if (this.initialized && this.#id === '') {\n throwDependencyNotEstablishedError();\n } else {\n if (check2004ValidFormat(progress_measure, scorm2004_regex.CMIDecimal) &&\n check2004ValidRange(progress_measure,\n scorm2004_regex.progress_range)) {\n this.#progress_measure = progress_measure;\n }\n }\n }\n\n /**\n * Getter for #description\n * @return {string}\n */\n get description() {\n return this.#description;\n }\n\n /**\n * Setter for #description\n * @param {string} description\n */\n set description(description) {\n if (this.initialized && this.#id === '') {\n throwDependencyNotEstablishedError();\n } else {\n if (check2004ValidFormat(description, scorm2004_regex.CMILangString250,\n true)) {\n this.#description = description;\n }\n }\n }\n\n /**\n * toJSON for cmi.objectives.n\n *\n * @return {\n * {\n * id: string,\n * success_status: string,\n * completion_status: string,\n * progress_measure: string,\n * description: string,\n * score: Scorm2004CMIScore\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'success_status': this.success_status,\n 'completion_status': this.completion_status,\n 'progress_measure': this.progress_measure,\n 'description': this.description,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for SCORM 2004's cmi *.score object\n */\nclass Scorm2004CMIScore extends CMIScore {\n #scaled = '';\n\n /**\n * Constructor for cmi *.score\n */\n constructor() {\n super(\n {\n score_children: scorm2004_constants.score_children,\n max: '',\n invalidErrorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n invalidTypeCode: scorm2004_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm2004_error_codes.VALUE_OUT_OF_RANGE,\n decimalRegex: scorm2004_regex.CMIDecimal,\n errorClass: Scorm2004ValidationError,\n });\n }\n\n /**\n * Getter for #scaled\n * @return {string}\n */\n get scaled() {\n return this.#scaled;\n }\n\n /**\n * Setter for #scaled\n * @param {string} scaled\n */\n set scaled(scaled) {\n if (check2004ValidFormat(scaled, scorm2004_regex.CMIDecimal) &&\n check2004ValidRange(scaled, scorm2004_regex.scaled_range)) {\n this.#scaled = scaled;\n }\n }\n\n /**\n * toJSON for cmi *.score\n *\n * @return {\n * {\n * scaled: string,\n * raw: string,\n * min: string,\n * max: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'scaled': this.scaled,\n 'raw': super.raw,\n 'min': super.min,\n 'max': super.max,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_learner.n and cmi.comments_from_lms.n object\n */\nexport class CMICommentsObject extends BaseCMI {\n #comment = '';\n #location = '';\n #timestamp = '';\n #readOnlyAfterInit;\n\n /**\n * Constructor for cmi.comments_from_learner.n and cmi.comments_from_lms.n\n * @param {boolean} readOnlyAfterInit\n */\n constructor(readOnlyAfterInit = false) {\n super();\n this.#comment = '';\n this.#location = '';\n this.#timestamp = '';\n this.#readOnlyAfterInit = readOnlyAfterInit;\n }\n\n /**\n * Getter for #comment\n * @return {string}\n */\n get comment() {\n return this.#comment;\n }\n\n /**\n * Setter for #comment\n * @param {string} comment\n */\n set comment(comment) {\n if (this.initialized && this.#readOnlyAfterInit) {\n throwReadOnlyError();\n } else {\n if (check2004ValidFormat(comment, scorm2004_regex.CMILangString4000,\n true)) {\n this.#comment = comment;\n }\n }\n }\n\n /**\n * Getter for #location\n * @return {string}\n */\n get location() {\n return this.#location;\n }\n\n /**\n * Setter for #location\n * @param {string} location\n */\n set location(location) {\n if (this.initialized && this.#readOnlyAfterInit) {\n throwReadOnlyError();\n } else {\n if (check2004ValidFormat(location, scorm2004_regex.CMIString250)) {\n this.#location = location;\n }\n }\n }\n\n /**\n * Getter for #timestamp\n * @return {string}\n */\n get timestamp() {\n return this.#timestamp;\n }\n\n /**\n * Setter for #timestamp\n * @param {string} timestamp\n */\n set timestamp(timestamp) {\n if (this.initialized && this.#readOnlyAfterInit) {\n throwReadOnlyError();\n } else {\n if (check2004ValidFormat(timestamp, scorm2004_regex.CMITime)) {\n this.#timestamp = timestamp;\n }\n }\n }\n\n /**\n * toJSON for cmi.comments_from_learner.n object\n * @return {\n * {\n * comment: string,\n * location: string,\n * timestamp: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'comment': this.comment,\n 'location': this.location,\n 'timestamp': this.timestamp,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions.n.objectives.n object\n */\nexport class CMIInteractionsObjectivesObject extends BaseCMI {\n #id = '';\n\n /**\n * Constructor for cmi.interactions.n.objectives.n\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #id\n * @return {string}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n.objectives.n\n * @return {\n * {\n * id: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions.n.correct_responses.n object\n */\nexport class CMIInteractionsCorrectResponsesObject extends BaseCMI {\n #pattern = '';\n\n /**\n * Constructor for cmi.interactions.n.correct_responses.n\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #pattern\n * @return {string}\n */\n get pattern() {\n return this.#pattern;\n }\n\n /**\n * Setter for #pattern\n * @param {string} pattern\n */\n set pattern(pattern) {\n if (check2004ValidFormat(pattern, scorm2004_regex.CMIFeedback)) {\n this.#pattern = pattern;\n }\n }\n\n /**\n * toJSON cmi.interactions.n.correct_responses.n object\n * @return {\n * {\n * pattern: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'pattern': this.pattern,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's adl object\n */\nexport class ADL extends BaseCMI {\n /**\n * Constructor for adl\n */\n constructor() {\n super();\n\n this.nav = new ADLNav();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.nav?.initialize();\n }\n\n /**\n * toJSON for adl\n * @return {\n * {\n * nav: {\n * request: string\n * }\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'nav': this.nav,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's adl.nav object\n */\nclass ADLNav extends BaseCMI {\n #request = '_none_';\n\n /**\n * Constructor for adl.nav\n */\n constructor() {\n super();\n\n this.request_valid = new ADLNavRequestValid();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.request_valid?.initialize();\n }\n\n /**\n * Getter for #request\n * @return {string}\n */\n get request() {\n return this.#request;\n }\n\n /**\n * Setter for #request\n * @param {string} request\n */\n set request(request) {\n if (check2004ValidFormat(request, scorm2004_regex.NAVEvent)) {\n this.#request = request;\n }\n }\n\n /**\n * toJSON for adl.nav\n *\n * @return {\n * {\n * request: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'request': this.request,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's adl.nav.request_valid object\n */\nclass ADLNavRequestValid extends BaseCMI {\n #continue = 'unknown';\n #previous = 'unknown';\n choice = class {\n /**\n * Check if target is valid\n * @param {*} _target\n * @return {string}\n */\n _isTargetValid = (_target) => 'unknown';\n };\n jump = class {\n /**\n * Check if target is valid\n * @param {*} _target\n * @return {string}\n */\n _isTargetValid = (_target) => 'unknown';\n };\n\n /**\n * Constructor for adl.nav.request_valid\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #continue\n * @return {string}\n */\n get continue() {\n return this.#continue;\n }\n\n /**\n * Setter for #continue. Just throws an error.\n * @param {*} _\n */\n set continue(_) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #previous\n * @return {string}\n */\n get previous() {\n return this.#previous;\n }\n\n /**\n * Setter for #previous. Just throws an error.\n * @param {*} _\n */\n set previous(_) {\n throwReadOnlyError();\n }\n\n /**\n * toJSON for adl.nav.request_valid\n *\n * @return {\n * {\n * previous: string,\n * continue: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'previous': this.previous,\n 'continue': this.continue,\n };\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\n\nconst global = {\n SCORM_TRUE: 'true',\n SCORM_FALSE: 'false',\n STATE_NOT_INITIALIZED: 0,\n STATE_INITIALIZED: 1,\n STATE_TERMINATED: 2,\n LOG_LEVEL_DEBUG: 1,\n LOG_LEVEL_INFO: 2,\n LOG_LEVEL_WARNING: 3,\n LOG_LEVEL_ERROR: 4,\n LOG_LEVEL_NONE: 5,\n};\n\nconst scorm12 = {\n // Children lists\n cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions',\n core_children: 'student_id,student_name,lesson_location,credit,lesson_status,entry,score,total_time,lesson_mode,exit,session_time',\n score_children: 'raw,min,max',\n comments_children: 'content,location,time',\n objectives_children: 'id,score,status',\n correct_responses_children: 'pattern',\n student_data_children: 'mastery_score,max_time_allowed,time_limit_action',\n student_preference_children: 'audio,language,speed,text',\n interactions_children: 'id,objectives,time,type,correct_responses,weighting,student_response,result,latency',\n\n error_descriptions: {\n '101': {\n basicMessage: 'General Exception',\n detailMessage: 'No specific error code exists to describe the error. Use LMSGetDiagnostic for more information',\n },\n '201': {\n basicMessage: 'Invalid argument error',\n detailMessage: 'Indicates that an argument represents an invalid data model element or is otherwise incorrect.',\n },\n '202': {\n basicMessage: 'Element cannot have children',\n detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in \"_children\" for a data model element that does not support the \"_children\" suffix.',\n },\n '203': {\n basicMessage: 'Element not an array - cannot have count',\n detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in \"_count\" for a data model element that does not support the \"_count\" suffix.',\n },\n '301': {\n basicMessage: 'Not initialized',\n detailMessage: 'Indicates that an API call was made before the call to lmsInitialize.',\n },\n '401': {\n basicMessage: 'Not implemented error',\n detailMessage: 'The data model element indicated in a call to LMSGetValue or LMSSetValue is valid, but was not implemented by this LMS. SCORM 1.2 defines a set of data model elements as being optional for an LMS to implement.',\n },\n '402': {\n basicMessage: 'Invalid set value, element is a keyword',\n detailMessage: 'Indicates that LMSSetValue was called on a data model element that represents a keyword (elements that end in \"_children\" and \"_count\").',\n },\n '403': {\n basicMessage: 'Element is read only',\n detailMessage: 'LMSSetValue was called with a data model element that can only be read.',\n },\n '404': {\n basicMessage: 'Element is write only',\n detailMessage: 'LMSGetValue was called on a data model element that can only be written to.',\n },\n '405': {\n basicMessage: 'Incorrect Data Type',\n detailMessage: 'LMSSetValue was called with a value that is not consistent with the data format of the supplied data model element.',\n },\n '407': {\n basicMessage: 'Element Value Out Of Range',\n detailMessage: 'The numeric value supplied to a LMSSetValue call is outside of the numeric range allowed for the supplied data model element.',\n },\n '408': {\n basicMessage: 'Data Model Dependency Not Established',\n detailMessage: 'Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.',\n },\n },\n};\n\nconst aicc = {\n ...scorm12, ...{\n cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions,evaluation',\n student_preference_children: 'audio,language,lesson_type,speed,text,text_color,text_location,text_size,video,windows',\n student_data_children: 'attempt_number,tries,mastery_score,max_time_allowed,time_limit_action',\n student_demographics_children: 'city,class,company,country,experience,familiar_name,instructor_name,title,native_language,state,street_address,telephone,years_experience',\n tries_children: 'time,status,score',\n attempt_records_children: 'score,lesson_status',\n paths_children: 'location_id,date,time,status,why_left,time_in_element',\n },\n};\n\nconst scorm2004 = {\n // Children lists\n cmi_children: '_version,comments_from_learner,comments_from_lms,completion_status,credit,entry,exit,interactions,launch_data,learner_id,learner_name,learner_preference,location,max_time_allowed,mode,objectives,progress_measure,scaled_passing_score,score,session_time,success_status,suspend_data,time_limit_action,total_time',\n comments_children: 'comment,timestamp,location',\n score_children: 'max,raw,scaled,min',\n objectives_children: 'progress_measure,completion_status,success_status,description,score,id',\n correct_responses_children: 'pattern',\n student_data_children: 'mastery_score,max_time_allowed,time_limit_action',\n student_preference_children: 'audio_level,audio_captioning,delivery_speed,language',\n interactions_children: 'id,type,objectives,timestamp,correct_responses,weighting,learner_response,result,latency,description',\n\n error_descriptions: {\n '0': {\n basicMessage: 'No Error',\n detailMessage: 'No error occurred, the previous API call was successful.',\n },\n '101': {\n basicMessage: 'General Exception',\n detailMessage: 'No specific error code exists to describe the error. Use GetDiagnostic for more information.',\n },\n '102': {\n basicMessage: 'General Initialization Failure',\n detailMessage: 'Call to Initialize failed for an unknown reason.',\n },\n '103': {\n basicMessage: 'Already Initialized',\n detailMessage: 'Call to Initialize failed because Initialize was already called.',\n },\n '104': {\n basicMessage: 'Content Instance Terminated',\n detailMessage: 'Call to Initialize failed because Terminate was already called.',\n },\n '111': {\n basicMessage: 'General Termination Failure',\n detailMessage: 'Call to Terminate failed for an unknown reason.',\n },\n '112': {\n basicMessage: 'Termination Before Initialization',\n detailMessage: 'Call to Terminate failed because it was made before the call to Initialize.',\n },\n '113': {\n basicMessage: 'Termination After Termination',\n detailMessage: 'Call to Terminate failed because Terminate was already called.',\n },\n '122': {\n basicMessage: 'Retrieve Data Before Initialization',\n detailMessage: 'Call to GetValue failed because it was made before the call to Initialize.',\n },\n '123': {\n basicMessage: 'Retrieve Data After Termination',\n detailMessage: 'Call to GetValue failed because it was made after the call to Terminate.',\n },\n '132': {\n basicMessage: 'Store Data Before Initialization',\n detailMessage: 'Call to SetValue failed because it was made before the call to Initialize.',\n },\n '133': {\n basicMessage: 'Store Data After Termination',\n detailMessage: 'Call to SetValue failed because it was made after the call to Terminate.',\n },\n '142': {\n basicMessage: 'Commit Before Initialization',\n detailMessage: 'Call to Commit failed because it was made before the call to Initialize.',\n },\n '143': {\n basicMessage: 'Commit After Termination',\n detailMessage: 'Call to Commit failed because it was made after the call to Terminate.',\n },\n '201': {\n basicMessage: 'General Argument Error',\n detailMessage: 'An invalid argument was passed to an API method (usually indicates that Initialize, Commit or Terminate did not receive the expected empty string argument.',\n },\n '301': {\n basicMessage: 'General Get Failure',\n detailMessage: 'Indicates a failed GetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '351': {\n basicMessage: 'General Set Failure',\n detailMessage: 'Indicates a failed SetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '391': {\n basicMessage: 'General Commit Failure',\n detailMessage: 'Indicates a failed Commit call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '401': {\n basicMessage: 'Undefined Data Model Element',\n detailMessage: 'The data model element name passed to GetValue or SetValue is not a valid SCORM data model element.',\n },\n '402': {\n basicMessage: 'Unimplemented Data Model Element',\n detailMessage: 'The data model element indicated in a call to GetValue or SetValue is valid, but was not implemented by this LMS. In SCORM 2004, this error would indicate an LMS that is not fully SCORM conformant.',\n },\n '403': {\n basicMessage: 'Data Model Element Value Not Initialized',\n detailMessage: 'Attempt to read a data model element that has not been initialized by the LMS or through a SetValue call. This error condition is often reached during normal execution of a SCO.',\n },\n '404': {\n basicMessage: 'Data Model Element Is Read Only',\n detailMessage: 'SetValue was called with a data model element that can only be read.',\n },\n '405': {\n basicMessage: 'Data Model Element Is Write Only',\n detailMessage: 'GetValue was called on a data model element that can only be written to.',\n },\n '406': {\n basicMessage: 'Data Model Element Type Mismatch',\n detailMessage: 'SetValue was called with a value that is not consistent with the data format of the supplied data model element.',\n },\n '407': {\n basicMessage: 'Data Model Element Value Out Of Range',\n detailMessage: 'The numeric value supplied to a SetValue call is outside of the numeric range allowed for the supplied data model element.',\n },\n '408': {\n basicMessage: 'Data Model Dependency Not Established',\n detailMessage: 'Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.',\n },\n },\n};\n\nconst APIConstants = {\n global: global,\n scorm12: scorm12,\n aicc: aicc,\n scorm2004: scorm2004,\n};\n\nexport default APIConstants;\n","// @flow\nconst global = {\n GENERAL: 101,\n INITIALIZATION_FAILED: 101,\n INITIALIZED: 101,\n TERMINATED: 101,\n TERMINATION_FAILURE: 101,\n TERMINATION_BEFORE_INIT: 101,\n MULTIPLE_TERMINATION: 101,\n RETRIEVE_BEFORE_INIT: 101,\n RETRIEVE_AFTER_TERM: 101,\n STORE_BEFORE_INIT: 101,\n STORE_AFTER_TERM: 101,\n COMMIT_BEFORE_INIT: 101,\n COMMIT_AFTER_TERM: 101,\n ARGUMENT_ERROR: 101,\n CHILDREN_ERROR: 101,\n COUNT_ERROR: 101,\n GENERAL_GET_FAILURE: 101,\n GENERAL_SET_FAILURE: 101,\n GENERAL_COMMIT_FAILURE: 101,\n UNDEFINED_DATA_MODEL: 101,\n UNIMPLEMENTED_ELEMENT: 101,\n VALUE_NOT_INITIALIZED: 101,\n INVALID_SET_VALUE: 101,\n READ_ONLY_ELEMENT: 101,\n WRITE_ONLY_ELEMENT: 101,\n TYPE_MISMATCH: 101,\n VALUE_OUT_OF_RANGE: 101,\n DEPENDENCY_NOT_ESTABLISHED: 101,\n};\n\nconst scorm12 = {\n ...global, ...{\n RETRIEVE_BEFORE_INIT: 301,\n STORE_BEFORE_INIT: 301,\n COMMIT_BEFORE_INIT: 301,\n ARGUMENT_ERROR: 201,\n CHILDREN_ERROR: 202,\n COUNT_ERROR: 203,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 401,\n VALUE_NOT_INITIALIZED: 301,\n INVALID_SET_VALUE: 402,\n READ_ONLY_ELEMENT: 403,\n WRITE_ONLY_ELEMENT: 404,\n TYPE_MISMATCH: 405,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n },\n};\n\nconst scorm2004 = {\n ...global, ...{\n INITIALIZATION_FAILED: 102,\n INITIALIZED: 103,\n TERMINATED: 104,\n TERMINATION_FAILURE: 111,\n TERMINATION_BEFORE_INIT: 112,\n MULTIPLE_TERMINATIONS: 113,\n RETRIEVE_BEFORE_INIT: 122,\n RETRIEVE_AFTER_TERM: 123,\n STORE_BEFORE_INIT: 132,\n STORE_AFTER_TERM: 133,\n COMMIT_BEFORE_INIT: 142,\n COMMIT_AFTER_TERM: 143,\n ARGUMENT_ERROR: 201,\n GENERAL_GET_FAILURE: 301,\n GENERAL_SET_FAILURE: 351,\n GENERAL_COMMIT_FAILURE: 391,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 402,\n VALUE_NOT_INITIALIZED: 403,\n READ_ONLY_ELEMENT: 404,\n WRITE_ONLY_ELEMENT: 405,\n TYPE_MISMATCH: 406,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n },\n};\n\nconst ErrorCodes = {\n scorm12: scorm12,\n scorm2004: scorm2004,\n};\n\nexport default ErrorCodes;\n","const ValidLanguages = {\n 'aa': 'aa', 'ab': 'ab', 'ae': 'ae', 'af': 'af', 'ak': 'ak', 'am': 'am',\n 'an': 'an', 'ar': 'ar', 'as': 'as', 'av': 'av', 'ay': 'ay', 'az': 'az',\n 'ba': 'ba', 'be': 'be', 'bg': 'bg', 'bh': 'bh', 'bi': 'bi', 'bm': 'bm',\n 'bn': 'bn', 'bo': 'bo', 'br': 'br', 'bs': 'bs', 'ca': 'ca', 'ce': 'ce',\n 'ch': 'ch', 'co': 'co', 'cr': 'cr', 'cs': 'cs', 'cu': 'cu', 'cv': 'cv',\n 'cy': 'cy', 'da': 'da', 'de': 'de', 'dv': 'dv', 'dz': 'dz', 'ee': 'ee',\n 'el': 'el', 'en': 'en', 'eo': 'eo', 'es': 'es', 'et': 'et', 'eu': 'eu',\n 'fa': 'fa', 'ff': 'ff', 'fi': 'fi', 'fj': 'fj', 'fo': 'fo', 'fr': 'fr',\n 'fy': 'fy', 'ga': 'ga', 'gd': 'gd', 'gl': 'gl', 'gn': 'gn', 'gu': 'gu',\n 'gv': 'gv', 'ha': 'ha', 'he': 'he', 'hi': 'hi', 'ho': 'ho', 'hr': 'hr',\n 'ht': 'ht', 'hu': 'hu', 'hy': 'hy', 'hz': 'hz', 'ia': 'ia', 'id': 'id',\n 'ie': 'ie', 'ig': 'ig', 'ii': 'ii', 'ik': 'ik', 'io': 'io', 'is': 'is',\n 'it': 'it', 'iu': 'iu', 'ja': 'ja', 'jv': 'jv', 'ka': 'ka', 'kg': 'kg',\n 'ki': 'ki', 'kj': 'kj', 'kk': 'kk', 'kl': 'kl', 'km': 'km', 'kn': 'kn',\n 'ko': 'ko', 'kr': 'kr', 'ks': 'ks', 'ku': 'ku', 'kv': 'kv', 'kw': 'kw',\n 'ky': 'ky', 'la': 'la', 'lb': 'lb', 'lg': 'lg', 'li': 'li', 'ln': 'ln',\n 'lo': 'lo', 'lt': 'lt', 'lu': 'lu', 'lv': 'lv', 'mg': 'mg', 'mh': 'mh',\n 'mi': 'mi', 'mk': 'mk', 'ml': 'ml', 'mn': 'mn', 'mo': 'mo', 'mr': 'mr',\n 'ms': 'ms', 'mt': 'mt', 'my': 'my', 'na': 'na', 'nb': 'nb', 'nd': 'nd',\n 'ne': 'ne', 'ng': 'ng', 'nl': 'nl', 'nn': 'nn', 'no': 'no', 'nr': 'nr',\n 'nv': 'nv', 'ny': 'ny', 'oc': 'oc', 'oj': 'oj', 'om': 'om', 'or': 'or',\n 'os': 'os', 'pa': 'pa', 'pi': 'pi', 'pl': 'pl', 'ps': 'ps', 'pt': 'pt',\n 'qu': 'qu', 'rm': 'rm', 'rn': 'rn', 'ro': 'ro', 'ru': 'ru', 'rw': 'rw',\n 'sa': 'sa', 'sc': 'sc', 'sd': 'sd', 'se': 'se', 'sg': 'sg', 'sh': 'sh',\n 'si': 'si', 'sk': 'sk', 'sl': 'sl', 'sm': 'sm', 'sn': 'sn', 'so': 'so',\n 'sq': 'sq', 'sr': 'sr', 'ss': 'ss', 'st': 'st', 'su': 'su', 'sv': 'sv',\n 'sw': 'sw', 'ta': 'ta', 'te': 'te', 'tg': 'tg', 'th': 'th', 'ti': 'ti',\n 'tk': 'tk', 'tl': 'tl', 'tn': 'tn', 'to': 'to', 'tr': 'tr', 'ts': 'ts',\n 'tt': 'tt', 'tw': 'tw', 'ty': 'ty', 'ug': 'ug', 'uk': 'uk', 'ur': 'ur',\n 'uz': 'uz', 've': 've', 'vi': 'vi', 'vo': 'vo', 'wa': 'wa', 'wo': 'wo',\n 'xh': 'xh', 'yi': 'yi', 'yo': 'yo', 'za': 'za', 'zh': 'zh', 'zu': 'zu',\n 'aar': 'aar', 'abk': 'abk', 'ave': 'ave', 'afr': 'afr', 'aka': 'aka',\n 'amh': 'amh', 'arg': 'arg', 'ara': 'ara', 'asm': 'asm', 'ava': 'ava',\n 'aym': 'aym', 'aze': 'aze', 'bak': 'bak', 'bel': 'bel', 'bul': 'bul',\n 'bih': 'bih', 'bis': 'bis', 'bam': 'bam', 'ben': 'ben', 'tib': 'tib',\n 'bod': 'bod', 'bre': 'bre', 'bos': 'bos', 'cat': 'cat', 'che': 'che',\n 'cha': 'cha', 'cos': 'cos', 'cre': 'cre', 'cze': 'cze', 'ces': 'ces',\n 'chu': 'chu', 'chv': 'chv', 'wel': 'wel', 'cym': 'cym', 'dan': 'dan',\n 'ger': 'ger', 'deu': 'deu', 'div': 'div', 'dzo': 'dzo', 'ewe': 'ewe',\n 'gre': 'gre', 'ell': 'ell', 'eng': 'eng', 'epo': 'epo', 'spa': 'spa',\n 'est': 'est', 'baq': 'baq', 'eus': 'eus', 'per': 'per', 'fas': 'fas',\n 'ful': 'ful', 'fin': 'fin', 'fij': 'fij', 'fao': 'fao', 'fre': 'fre',\n 'fra': 'fra', 'fry': 'fry', 'gle': 'gle', 'gla': 'gla', 'glg': 'glg',\n 'grn': 'grn', 'guj': 'guj', 'glv': 'glv', 'hau': 'hau', 'heb': 'heb',\n 'hin': 'hin', 'hmo': 'hmo', 'hrv': 'hrv', 'hat': 'hat', 'hun': 'hun',\n 'arm': 'arm', 'hye': 'hye', 'her': 'her', 'ina': 'ina', 'ind': 'ind',\n 'ile': 'ile', 'ibo': 'ibo', 'iii': 'iii', 'ipk': 'ipk', 'ido': 'ido',\n 'ice': 'ice', 'isl': 'isl', 'ita': 'ita', 'iku': 'iku', 'jpn': 'jpn',\n 'jav': 'jav', 'geo': 'geo', 'kat': 'kat', 'kon': 'kon', 'kik': 'kik',\n 'kua': 'kua', 'kaz': 'kaz', 'kal': 'kal', 'khm': 'khm', 'kan': 'kan',\n 'kor': 'kor', 'kau': 'kau', 'kas': 'kas', 'kur': 'kur', 'kom': 'kom',\n 'cor': 'cor', 'kir': 'kir', 'lat': 'lat', 'ltz': 'ltz', 'lug': 'lug',\n 'lim': 'lim', 'lin': 'lin', 'lao': 'lao', 'lit': 'lit', 'lub': 'lub',\n 'lav': 'lav', 'mlg': 'mlg', 'mah': 'mah', 'mao': 'mao', 'mri': 'mri',\n 'mac': 'mac', 'mkd': 'mkd', 'mal': 'mal', 'mon': 'mon', 'mol': 'mol',\n 'mar': 'mar', 'may': 'may', 'msa': 'msa', 'mlt': 'mlt', 'bur': 'bur',\n 'mya': 'mya', 'nau': 'nau', 'nob': 'nob', 'nde': 'nde', 'nep': 'nep',\n 'ndo': 'ndo', 'dut': 'dut', 'nld': 'nld', 'nno': 'nno', 'nor': 'nor',\n 'nbl': 'nbl', 'nav': 'nav', 'nya': 'nya', 'oci': 'oci', 'oji': 'oji',\n 'orm': 'orm', 'ori': 'ori', 'oss': 'oss', 'pan': 'pan', 'pli': 'pli',\n 'pol': 'pol', 'pus': 'pus', 'por': 'por', 'que': 'que', 'roh': 'roh',\n 'run': 'run', 'rum': 'rum', 'ron': 'ron', 'rus': 'rus', 'kin': 'kin',\n 'san': 'san', 'srd': 'srd', 'snd': 'snd', 'sme': 'sme', 'sag': 'sag',\n 'slo': 'slo', 'sin': 'sin', 'slk': 'slk', 'slv': 'slv', 'smo': 'smo',\n 'sna': 'sna', 'som': 'som', 'alb': 'alb', 'sqi': 'sqi', 'srp': 'srp',\n 'ssw': 'ssw', 'sot': 'sot', 'sun': 'sun', 'swe': 'swe', 'swa': 'swa',\n 'tam': 'tam', 'tel': 'tel', 'tgk': 'tgk', 'tha': 'tha', 'tir': 'tir',\n 'tuk': 'tuk', 'tgl': 'tgl', 'tsn': 'tsn', 'ton': 'ton', 'tur': 'tur',\n 'tso': 'tso', 'tat': 'tat', 'twi': 'twi', 'tah': 'tah', 'uig': 'uig',\n 'ukr': 'ukr', 'urd': 'urd', 'uzb': 'uzb', 'ven': 'ven', 'vie': 'vie',\n 'vol': 'vol', 'wln': 'wln', 'wol': 'wol', 'xho': 'xho', 'yid': 'yid',\n 'yor': 'yor', 'zha': 'zha', 'chi': 'chi', 'zho': 'zho', 'zul': 'zul',\n};\n\nexport default ValidLanguages;\n","// @flow\n\nconst scorm12 = {\n CMIString256: '^.{0,255}$',\n CMIString4096: '^.{0,4096}$',\n CMITime: '^(?:[01]\\\\d|2[0123]):(?:[012345]\\\\d):(?:[012345]\\\\d)$', // eslint-disable-line\n CMITimespan: '^([0-9]{2,}):([0-9]{2}):([0-9]{2})(\\.[0-9]{1,2})?$', // eslint-disable-line\n CMIInteger: '^\\\\d+$',\n CMISInteger: '^-?([0-9]+)$',\n CMIDecimal: '^-?([0-9]{0,3})(\\.[0-9]*)?$', // eslint-disable-line\n CMIIdentifier: '^[\\\\u0021-\\\\u007E\\\\s]{0,255}$',\n CMIFeedback: '^.{0,255}$', // This must be redefined\n CMIIndex: '[._](\\\\d+).',\n\n // Vocabulary Data Type Definition\n CMIStatus: '^(passed|completed|failed|incomplete|browsed)$',\n CMIStatus2: '^(passed|completed|failed|incomplete|browsed|not attempted)$',\n CMIExit: '^(time-out|suspend|logout|)$',\n CMIType: '^(true-false|choice|fill-in|matching|performance|sequencing|likert|numeric)$',\n CMIResult: '^(correct|wrong|unanticipated|neutral|([0-9]{0,3})?(\\\\.[0-9]*)?)$', // eslint-disable-line\n NAVEvent: '^(previous|continue)$',\n\n // Data ranges\n score_range: '0#100',\n audio_range: '-1#100',\n speed_range: '-100#100',\n weighting_range: '-100#100',\n text_range: '-1#1',\n};\n\nconst aicc = {\n ...scorm12, ...{\n CMIIdentifier: '^\\\\w{1,255}$',\n },\n};\n\nconst scorm2004 = {\n CMIString200: '^[\\\\u0000-\\\\uFFFF]{0,200}$',\n CMIString250: '^[\\\\u0000-\\\\uFFFF]{0,250}$',\n CMIString1000: '^[\\\\u0000-\\\\uFFFF]{0,1000}$',\n CMIString4000: '^[\\\\u0000-\\\\uFFFF]{0,4000}$',\n CMIString64000: '^[\\\\u0000-\\\\uFFFF]{0,64000}$',\n CMILang: '^([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?$|^$', // eslint-disable-line\n CMILangString250: '^(\\{lang=([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?\\})?((?!\\{.*$).{0,250}$)?$', // eslint-disable-line\n CMILangcr: '^((\\{lang=([a-zA-Z]{2,3}|i|x)?(\\-[a-zA-Z0-9\\-]{2,8})?\\}))(.*?)$', // eslint-disable-line\n CMILangString250cr: '^((\\{lang=([a-zA-Z]{2,3}|i|x)?(\\-[a-zA-Z0-9\\-]{2,8})?\\})?(.{0,250})?)?$', // eslint-disable-line\n CMILangString4000: '^(\\{lang=([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?\\})?((?!\\{.*$).{0,4000}$)?$', // eslint-disable-line\n CMITime: '^(19[7-9]{1}[0-9]{1}|20[0-2]{1}[0-9]{1}|203[0-8]{1})((-(0[1-9]{1}|1[0-2]{1}))((-(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1}))(T([0-1]{1}[0-9]{1}|2[0-3]{1})((:[0-5]{1}[0-9]{1})((:[0-5]{1}[0-9]{1})((\\\\.[0-9]{1,2})((Z|([+|-]([0-1]{1}[0-9]{1}|2[0-3]{1})))(:[0-5]{1}[0-9]{1})?)?)?)?)?)?)?)?$',\n CMITimespan: '^P(?:([.,\\\\d]+)Y)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)W)?(?:([.,\\\\d]+)D)?(?:T?(?:([.,\\\\d]+)H)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)S)?)?$',\n CMIInteger: '^\\\\d+$',\n CMISInteger: '^-?([0-9]+)$',\n CMIDecimal: '^-?([0-9]{1,5})(\\\\.[0-9]{1,18})?$',\n CMIIdentifier: '^\\\\S{1,250}[a-zA-Z0-9]$',\n CMIShortIdentifier: '^[\\\\w\\\\.\\\\-\\\\_]{1,250}$', // eslint-disable-line\n CMILongIdentifier: '^(?:(?!urn:)\\\\S{1,4000}|urn:[A-Za-z0-9-]{1,31}:\\\\S{1,4000}|.{1,4000})$', // need to re-examine this\n CMIFeedback: '^.*$', // This must be redefined\n CMIIndex: '[._](\\\\d+).',\n CMIIndexStore: '.N(\\\\d+).',\n\n // Vocabulary Data Type Definition\n CMICStatus: '^(completed|incomplete|not attempted|unknown)$',\n CMISStatus: '^(passed|failed|unknown)$',\n CMIExit: '^(time-out|suspend|logout|normal)$',\n CMIType: '^(true-false|choice|fill-in|long-fill-in|matching|performance|sequencing|likert|numeric|other)$',\n CMIResult: '^(correct|incorrect|unanticipated|neutral|-?([0-9]{1,4})(\\\\.[0-9]{1,18})?)$',\n NAVEvent: '^(previous|continue|exit|exitAll|abandon|abandonAll|suspendAll|\\{target=\\\\S{0,200}[a-zA-Z0-9]\\}choice|jump)$', // eslint-disable-line\n NAVBoolean: '^(unknown|true|false$)',\n NAVTarget: '^(previous|continue|choice.{target=\\\\S{0,200}[a-zA-Z0-9]})$',\n\n // Data ranges\n scaled_range: '-1#1',\n audio_range: '0#*',\n speed_range: '0#*',\n text_range: '-1#1',\n progress_range: '0#1',\n};\n\nconst Regex = {\n aicc: aicc,\n scorm12: scorm12,\n scorm2004: scorm2004,\n};\n\nexport default Regex;\n","// @flow\nimport Regex from './regex';\n\nconst scorm2004_regex = Regex.scorm2004;\n\nconst learner = {\n 'true-false': {\n format: '^true$|^false$',\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'choice': {\n format: scorm2004_regex.CMILongIdentifier,\n max: 36,\n delimiter: '[,]',\n unique: true,\n },\n 'fill-in': {\n format: scorm2004_regex.CMILangString250,\n max: 10,\n delimiter: '[,]',\n unique: false,\n },\n 'long-fill-in': {\n format: scorm2004_regex.CMILangString4000,\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'matching': {\n format: scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIShortIdentifier,\n max: 36,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n },\n 'performance': {\n format: '^$|' + scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIDecimal + '|^$|' +\n scorm2004_regex.CMIShortIdentifier,\n max: 250,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n },\n 'sequencing': {\n format: scorm2004_regex.CMIShortIdentifier,\n max: 36,\n delimiter: '[,]',\n unique: false,\n },\n 'likert': {\n format: scorm2004_regex.CMIShortIdentifier,\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'numeric': {\n format: scorm2004_regex.CMIDecimal,\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'other': {\n format: scorm2004_regex.CMIString4000,\n max: 1,\n delimiter: '',\n unique: false,\n },\n};\n\nconst correct = {\n 'true-false': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: false,\n format: '^true$|^false$',\n limit: 1,\n },\n 'choice': {\n max: 36,\n delimiter: '[,]',\n unique: true,\n duplicate: false,\n format: scorm2004_regex.CMILongIdentifier,\n },\n 'fill-in': {\n max: 10,\n delimiter: '[,]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMILangString250cr,\n },\n 'long-fill-in': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: true,\n format: scorm2004_regex.CMILangString4000,\n },\n 'matching': {\n max: 36,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIShortIdentifier,\n },\n 'performance': {\n max: 250,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n duplicate: false,\n format: '^$|' + scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIDecimal + '|^$|' +\n scorm2004_regex.CMIShortIdentifier,\n },\n 'sequencing': {\n max: 36,\n delimiter: '[,]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n },\n 'likert': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n limit: 1,\n },\n 'numeric': {\n max: 2,\n delimiter: '[:]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIDecimal,\n limit: 1,\n },\n 'other': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIString4000,\n limit: 1,\n },\n};\n\nconst Responses = {\n learner: learner,\n correct: correct,\n};\n\nexport default Responses;\n","// @flow\n\nimport APIConstants from './constants/api_constants';\n\nconst scorm12_errors = APIConstants.scorm12.error_descriptions;\nconst aicc_errors = APIConstants.aicc.error_descriptions;\nconst scorm2004_errors = APIConstants.scorm2004.error_descriptions;\n\n/**\n * Base Validation Exception\n */\nexport class ValidationError extends Error {\n /**\n * Constructor to take in an error message and code\n * @param {number} errorCode\n * @param {string} errorMessage\n * @param {string} detailedMessage\n */\n constructor(errorCode: number, errorMessage: String, detailedMessage: String) {\n super(errorMessage);\n this.#errorCode = errorCode;\n this.#errorMessage = errorMessage;\n this.#detailedMessage = detailedMessage;\n }\n\n #errorCode;\n #errorMessage;\n #detailedMessage;\n\n /**\n * Getter for #errorCode\n * @return {number}\n */\n get errorCode() {\n return this.#errorCode;\n }\n\n /**\n * Getter for #errorMessage\n * @return {string}\n */\n get errorMessage() {\n return this.#errorMessage;\n }\n\n /**\n * Getter for #detailedMessage\n * @return {string}\n */\n get detailedMessage() {\n return this.#detailedMessage;\n }\n}\n\n/**\n * SCORM 1.2 Validation Error\n */\nexport class Scorm12ValidationError extends ValidationError {\n /**\n * Constructor to take in an error code\n * @param {number} errorCode\n */\n constructor(errorCode: number) {\n if ({}.hasOwnProperty.call(scorm12_errors, String(errorCode))) {\n super(errorCode, scorm12_errors[String(errorCode)].basicMessage, scorm12_errors[String(errorCode)].detailMessage);\n } else {\n super(101, scorm12_errors['101'].basicMessage, scorm12_errors['101'].detailMessage);\n }\n }\n}\n\n/**\n * AICC Validation Error\n */\nexport class AICCValidationError extends ValidationError {\n /**\n * Constructor to take in an error code\n * @param {number} errorCode\n */\n constructor(errorCode: number) {\n if ({}.hasOwnProperty.call(aicc_errors, String(errorCode))) {\n super(errorCode, aicc_errors[String(errorCode)].basicMessage, aicc_errors[String(errorCode)].detailMessage);\n } else {\n super(101, aicc_errors['101'].basicMessage, aicc_errors['101'].detailMessage);\n }\n }\n}\n\n/**\n * SCORM 2004 Validation Error\n */\nexport class Scorm2004ValidationError extends ValidationError {\n /**\n * Constructor to take in an error code\n * @param {number} errorCode\n */\n constructor(errorCode: number) {\n if ({}.hasOwnProperty.call(scorm2004_errors, String(errorCode))) {\n super(errorCode, scorm2004_errors[String(errorCode)].basicMessage, scorm2004_errors[String(errorCode)].detailMessage);\n } else {\n super(101, scorm2004_errors['101'].basicMessage, scorm2004_errors['101'].detailMessage);\n }\n }\n}\n","// @flow\nexport const SECONDS_PER_SECOND = 1.0;\nexport const SECONDS_PER_MINUTE = 60;\nexport const SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE;\nexport const SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;\n\nconst designations = [\n ['D', SECONDS_PER_DAY],\n ['H', SECONDS_PER_HOUR],\n ['M', SECONDS_PER_MINUTE],\n ['S', SECONDS_PER_SECOND],\n];\n\n/**\n * Converts a Number to a String of HH:MM:SS\n *\n * @param {Number} totalSeconds\n * @return {string}\n */\nexport function getSecondsAsHHMMSS(totalSeconds: Number) {\n // SCORM spec does not deal with negative durations, give zero back\n if (!totalSeconds || totalSeconds <= 0) {\n return '00:00:00';\n }\n\n const hours = Math.floor(totalSeconds / SECONDS_PER_HOUR);\n\n const dateObj = new Date(totalSeconds * 1000);\n const minutes = dateObj.getUTCMinutes();\n // make sure we add any possible decimal value\n const seconds = dateObj.getSeconds();\n const ms = totalSeconds % 1.0;\n let msStr = '';\n if (countDecimals(ms) > 0) {\n if (countDecimals(ms) > 2) {\n msStr = ms.toFixed(2);\n } else {\n msStr = String(ms);\n }\n msStr = '.' + msStr.split('.')[1];\n }\n\n return (hours + ':' + minutes + ':' + seconds).replace(/\\b\\d\\b/g,\n '0$&') + msStr;\n}\n\n/**\n * Calculate the number of seconds from ISO 8601 Duration\n *\n * @param {Number} seconds\n * @return {String}\n */\nexport function getSecondsAsISODuration(seconds: Number) {\n // SCORM spec does not deal with negative durations, give zero back\n if (!seconds || seconds <= 0) {\n return 'PT0S';\n }\n\n let duration = 'P';\n let remainder = seconds;\n\n designations.forEach(([sign, current_seconds]) => {\n let value = Math.floor(remainder / current_seconds);\n\n remainder = remainder % current_seconds;\n if (countDecimals(remainder) > 2) {\n remainder = Number(Number(remainder).toFixed(2));\n }\n // If we have anything left in the remainder, and we're currently adding\n // seconds to the duration, go ahead and add the decimal to the seconds\n if (sign === 'S' && remainder > 0) {\n value += remainder;\n }\n\n if (value) {\n if ((duration.indexOf('D') > 0 ||\n sign === 'H' || sign === 'M' || sign === 'S') &&\n duration.indexOf('T') === -1) {\n duration += 'T';\n }\n duration += `${value}${sign}`;\n }\n });\n\n return duration;\n}\n\n/**\n * Calculate the number of seconds from HH:MM:SS.DDDDDD\n *\n * @param {string} timeString\n * @param {RegExp} timeRegex\n * @return {number}\n */\nexport function getTimeAsSeconds(timeString: String, timeRegex: RegExp) {\n if (!timeString || typeof timeString !== 'string' ||\n !timeString.match(timeRegex)) {\n return 0;\n }\n const parts = timeString.split(':');\n const hours = Number(parts[0]);\n const minutes = Number(parts[1]);\n const seconds = Number(parts[2]);\n return (hours * 3600) + (minutes * 60) + seconds;\n}\n\n/**\n * Calculate the number of seconds from ISO 8601 Duration\n *\n * @param {string} duration\n * @param {RegExp} durationRegex\n * @return {number}\n */\nexport function getDurationAsSeconds(duration: String, durationRegex: RegExp) {\n if (!duration || !duration.match(durationRegex)) {\n return 0;\n }\n\n const [, years, months, , days, hours, minutes, seconds] = new RegExp(\n durationRegex).exec(duration) || [];\n\n let result = 0.0;\n\n result += (Number(seconds) * 1.0 || 0.0);\n result += (Number(minutes) * 60.0 || 0.0);\n result += (Number(hours) * 3600.0 || 0.0);\n result += (Number(days) * (60 * 60 * 24.0) || 0.0);\n result += (Number(years) * (60 * 60 * 24 * 365.0) || 0.0);\n\n return result;\n}\n\n/**\n * Adds together two ISO8601 Duration strings\n *\n * @param {string} first\n * @param {string} second\n * @param {RegExp} durationRegex\n * @return {string}\n */\nexport function addTwoDurations(\n first: String,\n second: String,\n durationRegex: RegExp) {\n return getSecondsAsISODuration(\n getDurationAsSeconds(first, durationRegex) +\n getDurationAsSeconds(second, durationRegex),\n );\n}\n\n/**\n * Add together two HH:MM:SS.DD strings\n *\n * @param {string} first\n * @param {string} second\n * @param {RegExp} timeRegex\n * @return {string}\n */\nexport function addHHMMSSTimeStrings(\n first: String,\n second: String,\n timeRegex: RegExp) {\n return getSecondsAsHHMMSS(\n getTimeAsSeconds(first, timeRegex) +\n getTimeAsSeconds(\n second, timeRegex),\n );\n}\n\n/**\n * Flatten a JSON object down to string paths for each values\n * @param {object} data\n * @return {object}\n */\nexport function flatten(data) {\n const result = {};\n\n /**\n * Recurse through the object\n * @param {*} cur\n * @param {*} prop\n */\n function recurse(cur, prop) {\n if (Object(cur) !== cur) {\n result[prop] = cur;\n } else if (Array.isArray(cur)) {\n for (let i = 0, l = cur.length; i < l; i++) {\n recurse(cur[i], prop + '[' + i + ']');\n if (l === 0) result[prop] = [];\n }\n } else {\n let isEmpty = true;\n for (const p in cur) {\n if ({}.hasOwnProperty.call(cur, p)) {\n isEmpty = false;\n recurse(cur[p], prop ? prop + '.' + p : p);\n }\n }\n if (isEmpty && prop) result[prop] = {};\n }\n }\n\n recurse(data, '');\n return result;\n}\n\n/**\n * Un-flatten a flat JSON object\n * @param {object} data\n * @return {object}\n */\nexport function unflatten(data) {\n 'use strict';\n if (Object(data) !== data || Array.isArray(data)) return data;\n const regex = /\\.?([^.[\\]]+)|\\[(\\d+)]/g;\n const result = {};\n for (const p in data) {\n if ({}.hasOwnProperty.call(data, p)) {\n let cur = result;\n let prop = '';\n let m = regex.exec(p);\n while (m) {\n cur = cur[prop] || (cur[prop] = (m[2] ? [] : {}));\n prop = m[2] || m[1];\n m = regex.exec(p);\n }\n cur[prop] = data[p];\n }\n }\n return result[''] || result;\n}\n\n/**\n * Counts the number of decimal places\n * @param {number} num\n * @return {number}\n */\nexport function countDecimals(num: number) {\n if (Math.floor(num) === num || String(num).indexOf('.') < 0) return 0;\n const parts = num.toString().split('.')[1];\n return parts.length || 0;\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import Scorm2004API from '../Scorm2004API';\nimport Scorm12API from '../Scorm12API';\nimport AICC from '../AICC';\n\nwindow.Scorm12API = Scorm12API;\nwindow.Scorm2004API = Scorm2004API;\nwindow.AICC = AICC;\n"],"names":["FUNC_ERROR_TEXT","NAN","symbolTag","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","parseInt","freeGlobal","global","Object","freeSelf","self","root","Function","objectProto","prototype","objectToString","toString","nativeMax","Math","max","nativeMin","min","now","Date","debounce","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","TypeError","toNumber","isObject","invokeFunc","time","args","thisArg","undefined","apply","leadingEdge","setTimeout","timerExpired","remainingWait","timeSinceLastCall","timeSinceLastInvoke","shouldInvoke","trailingEdge","cancel","clearTimeout","flush","debounced","isInvoking","arguments","value","type","isObjectLike","isSymbol","call","other","valueOf","replace","isBinary","test","slice","module","exports","Scorm12API","CMI","CMIAttemptRecordsObject","CMIEvaluationCommentsObject","CMITriesObject","NAV","AICC","settings","finalSettings","mastery_override","cmi","nav","CMIElement","foundFirstIndex","newChild","stringMatches","newAPI","CMIArray","ValidationError","ErrorCodes","APIConstants","unflatten","global_constants","scorm12_error_codes","scorm12","BaseAPI","error_codes","autocommit","autocommitSeconds","asyncCommit","sendBeaconCommit","lmsCommitUrl","dataCommitFormat","commitRequestDataType","autoProgress","logLevel","LOG_LEVEL_ERROR","selfReportSessionTime","alwaysSendTotalTime","strict_errors","xhrHeaders","xhrWithCredentials","responseHandler","xhr","JSON","parse","responseText","hasOwnProperty","status","SCORM_TRUE","errorCode","SCORM_FALSE","requestHandler","commitObject","onLogMessage","messageLevel","logMessage","console","error","LOG_LEVEL_WARNING","warn","LOG_LEVEL_INFO","info","LOG_LEVEL_DEBUG","debug","log","currentState","STATE_NOT_INITIALIZED","lastErrorCode","listenerArray","apiLogLevel","callbackName","initializeMessage","terminationMessage","returnValue","isInitialized","throwSCORMError","INITIALIZED","isTerminated","TERMINATED","setStartTime","STATE_INITIALIZED","processListeners","apiLog","clearSCORMError","checkTerminated","checkState","TERMINATION_BEFORE_INIT","MULTIPLE_TERMINATION","STATE_TERMINATED","storeData","RETRIEVE_BEFORE_INIT","RETRIEVE_AFTER_TERM","getCMIValue","e","message","GENERAL","commitCallback","String","STORE_BEFORE_INIT","STORE_AFTER_TERM","setCMIValue","scheduleCommit","clearScheduledCommit","COMMIT_BEFORE_INIT","COMMIT_AFTER_TERM","CMIErrorCode","getLmsErrorMessageDetails","beforeInitError","afterTermError","isNotInitialized","functionName","formatMessage","baseLength","messageString","fillChars","length","i","CMIElementBaseLength","j","str","tester","match","refObject","attribute","getOwnPropertyDescriptor","getPrototypeOf","_errorNumber","_detail","Error","_CMIElement","_value","methodName","scorm2004","structure","split","invalidErrorMessage","invalidErrorCode","UNDEFINED_DATA_MODEL","substr","_isTargetValid","READ_ONLY_ELEMENT","_checkObjectHasProperty","validateCorrectResponse","index","isNaN","item","childArray","getChildElement","initialized","initialize","push","_foundFirstIndex","uninitializedErrorMessage","target","VALUE_NOT_INITIALIZED","CHILDREN_ERROR","COUNT_ERROR","listenerName","callback","listenerFunctions","listenerSplit","removeIndex","findIndex","obj","splice","filter","listener","functionsMatch","listenerHasCMIElement","CMIElementsMatch","substring","indexOf","errorNumber","success","_calculateTotalTime","json","testPattern","a","c","a_pattern","a_match","c_match","a_num","Number","c_num","int_pattern","obj_pattern","keys","map","key","sort","b","d","forEach","element","loadFromJSON","startingData","currentCMIElement","constructor","stringify","renderCMIToJSONString","_terminateCommit","url","params","immediate","api","process","genericError","httpReq","XMLHttpRequest","open","header","setRequestHeader","withCredentials","onload","Array","send","join","headers","blob","Blob","navigator","sendBeacon","when","ScheduledCommit","API","wrapper","bind","commit","CMIInteractionsCorrectResponsesObject","CMIInteractionsObject","CMIInteractionsObjectivesObject","CMIObjectivesObject","Utilities","scorm12_constants","LMSInitialize","lmsInitialize","LMSFinish","lmsFinish","LMSGetValue","lmsGetValue","LMSSetValue","lmsSetValue","LMSCommit","lmsCommit","LMSGetLastError","lmsGetLastError","LMSGetErrorString","lmsGetErrorString","LMSGetDiagnostic","lmsGetDiagnostic","terminate","event","getValue","setValue","getLastError","getErrorString","getDiagnostic","_commonSetCMIValue","_commonGetCMIValue","detail","basicMessage","detailMessage","error_descriptions","terminateCommit","cmiExport","renderCMIToJSONObject","core","total_time","getCurrentTotalTime","flattened","flatten","originalStatus","lesson_status","lesson_mode","credit","student_data","mastery_score","score","raw","parseFloat","renderCommitCMI","processHttpRequest","ADL","CMICommentsObject","Responses","ValidLanguages","Regex","scorm2004_constants","scorm2004_error_codes","correct_responses","correct","scorm2004_regex","Scorm2004API","correct_response","current_index","found","count","_count","adl","Initialize","Terminate","lmsTerminate","GetValue","SetValue","Commit","GetLastError","GetErrorString","GetDiagnostic","request","parts","interaction","interactions","DEPENDENCY_NOT_ESTABLISHED","checkDuplicateChoiceResponse","response_type","checkValidResponseType","GENERAL_SET_FAILURE","interaction_type","nodes","delimiter","checkCorrectResponseValue","interaction_count","response","pattern","pattern_index","limit","duplicate","checkDuplicatedPattern","formatRegex","RegExp","format","removeCorrectResponsePrefixes","delimiter2","values","matches","TYPE_MISMATCH","format2","unique","node","seenOrder","seenCase","seenLang","prefixRegex","langMatches","CMILangcr","lang","toLowerCase","mode","completion_threshold","progress_measure","completion_status","scaled_passing_score","scaled","success_status","navRequest","encodeURIComponent","Scorm12CMI","BaseCMI","checkValidFormat","CMIScore","AICCValidationError","aicc_constants","aicc","aicc_regex","aicc_error_codes","throwReadOnlyError","checkAICCValidFormat","regexPattern","allowEmptyString","cmi_children","student_preference","AICCStudentPreferences","AICCCMIStudentData","student_demographics","CMIStudentDemographics","evaluation","CMIEvaluation","paths","CMIPaths","jsonString","suspend_data","launch_data","comments","comments_from_lms","objectives","CMIEvaluationComments","children","comments_children","INVALID_SET_VALUE","errorClass","student_preference_children","windows","lesson_type","CMIString256","text_color","text_location","text_size","video","audio","language","speed","text","CMIStudentPreference","student_data_children","tries","CMITries","tries_during_lesson","max_time_allowed","time_limit_action","CMIStudentData","student_demographics_children","city","clazz","company","country","experience","familiar_name","instructor_name","title","native_language","state","street_address","telephone","years_experience","class","paths_children","CMIPathsObject","location_id","date","CMITime","CMIStatus2","why_left","time_in_element","tries_children","score_children","score_range","invalidTypeCode","invalidRangeCode","VALUE_OUT_OF_RANGE","CMIAttemptRecords","attempt_records_children","content","location","scorm12_regex","checkValidRange","rangePattern","ranges","getTime","decimalRegex","CMIDecimal","_children","Scorm12ValidationError","Util","throwWriteOnlyError","WRITE_ONLY_ELEMENT","throwInvalidValueError","check12ValidFormat","check12ValidRange","CMICore","CMIObjectives","CMIInteractions","_version","CMIString4096","start_time","core_children","student_id","student_name","lesson_location","CMIStatus","entry","exit","CMIExit","session_time","CMITimespan","sessionTime","startTime","seconds","getSecondsAsHHMMSS","addHHMMSSTimeStrings","objectives_children","CMISInteger","audio_range","speed_range","text_range","interactions_children","correct_responses_children","id","CMIIdentifier","CMIType","weighting","weighting_range","student_response","CMIFeedback","CMIResult","latency","NAVEvent","Scorm2004ValidationError","learner_responses","learner","throwTypeMismatchError","throwDependencyNotEstablishedError","throwGeneralSetError","check2004ValidFormat","check2004ValidRange","learner_preference","CMILearnerPreference","Scorm2004CMIScore","comments_from_learner","CMICommentsFromLearner","CMICommentsFromLMS","CMICStatus","learner_id","learner_name","CMIString1000","progress_range","CMISStatus","CMIString64000","getSecondsAsISODuration","addTwoDurations","audio_level","CMILang","delivery_speed","audio_captioning","CMILongIdentifier","timestamp","learner_response","description","CMILangString250","scaled_range","readOnlyAfterInit","comment","CMILangString4000","CMIString250","ADLNav","request_valid","ADLNavRequestValid","_target","_","previous","continue","LOG_LEVEL_NONE","INITIALIZATION_FAILED","TERMINATION_FAILURE","ARGUMENT_ERROR","GENERAL_GET_FAILURE","GENERAL_COMMIT_FAILURE","UNIMPLEMENTED_ELEMENT","MULTIPLE_TERMINATIONS","CMIInteger","CMIIndex","CMIString200","CMIString4000","CMILangString250cr","CMIShortIdentifier","CMIIndexStore","NAVBoolean","NAVTarget","scorm12_errors","aicc_errors","scorm2004_errors","errorMessage","detailedMessage","SECONDS_PER_SECOND","SECONDS_PER_MINUTE","SECONDS_PER_HOUR","SECONDS_PER_DAY","designations","totalSeconds","hours","floor","dateObj","minutes","getUTCMinutes","getSeconds","ms","msStr","countDecimals","toFixed","duration","remainder","sign","current_seconds","getTimeAsSeconds","timeString","timeRegex","getDurationAsSeconds","durationRegex","exec","years","months","days","first","second","data","recurse","cur","prop","isArray","l","isEmpty","p","regex","m","num","window"],"sourceRoot":""}
\ No newline at end of file
diff --git a/dist/scorm-again.min.js b/dist/scorm-again.min.js
index 63636c7..c0684b4 100644
--- a/dist/scorm-again.min.js
+++ b/dist/scorm-again.min.js
@@ -1,10920 +1,52 @@
-(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i
- * Build: `lodash modularize exports="npm" -o ./`
- * Copyright jQuery Foundation and other contributors
- * Released under MIT license
- * Based on Underscore.js 1.8.3
- * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- */
-
-/** Used as the `TypeError` message for "Functions" methods. */
-var FUNC_ERROR_TEXT = 'Expected a function';
-
-/** Used as references for various `Number` constants. */
-var NAN = 0 / 0;
-
-/** `Object#toString` result references. */
-var symbolTag = '[object Symbol]';
-
-/** Used to match leading and trailing whitespace. */
-var reTrim = /^\s+|\s+$/g;
-
-/** Used to detect bad signed hexadecimal string values. */
-var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
-
-/** Used to detect binary string values. */
-var reIsBinary = /^0b[01]+$/i;
-
-/** Used to detect octal string values. */
-var reIsOctal = /^0o[0-7]+$/i;
-
-/** Built-in method references without a dependency on `root`. */
-var freeParseInt = parseInt;
-
-/** Detect free variable `global` from Node.js. */
-var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
-
-/** Detect free variable `self`. */
-var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
-
-/** Used as a reference to the global object. */
-var root = freeGlobal || freeSelf || Function('return this')();
-
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objectToString = objectProto.toString;
-
-/* Built-in method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max,
- nativeMin = Math.min;
-
-/**
- * Gets the timestamp of the number of milliseconds that have elapsed since
- * the Unix epoch (1 January 1970 00:00:00 UTC).
- *
- * @static
- * @memberOf _
- * @since 2.4.0
- * @category Date
- * @returns {number} Returns the timestamp.
- * @example
- *
- * _.defer(function(stamp) {
- * console.log(_.now() - stamp);
- * }, _.now());
- * // => Logs the number of milliseconds it took for the deferred invocation.
- */
-var now = function() {
- return root.Date.now();
-};
-
-/**
- * Creates a debounced function that delays invoking `func` until after `wait`
- * milliseconds have elapsed since the last time the debounced function was
- * invoked. The debounced function comes with a `cancel` method to cancel
- * delayed `func` invocations and a `flush` method to immediately invoke them.
- * Provide `options` to indicate whether `func` should be invoked on the
- * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
- * with the last arguments provided to the debounced function. Subsequent
- * calls to the debounced function return the result of the last `func`
- * invocation.
- *
- * **Note:** If `leading` and `trailing` options are `true`, `func` is
- * invoked on the trailing edge of the timeout only if the debounced function
- * is invoked more than once during the `wait` timeout.
- *
- * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
- * until to the next tick, similar to `setTimeout` with a timeout of `0`.
- *
- * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
- * for details over the differences between `_.debounce` and `_.throttle`.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Function
- * @param {Function} func The function to debounce.
- * @param {number} [wait=0] The number of milliseconds to delay.
- * @param {Object} [options={}] The options object.
- * @param {boolean} [options.leading=false]
- * Specify invoking on the leading edge of the timeout.
- * @param {number} [options.maxWait]
- * The maximum time `func` is allowed to be delayed before it's invoked.
- * @param {boolean} [options.trailing=true]
- * Specify invoking on the trailing edge of the timeout.
- * @returns {Function} Returns the new debounced function.
- * @example
- *
- * // Avoid costly calculations while the window size is in flux.
- * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
- *
- * // Invoke `sendMail` when clicked, debouncing subsequent calls.
- * jQuery(element).on('click', _.debounce(sendMail, 300, {
- * 'leading': true,
- * 'trailing': false
- * }));
- *
- * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
- * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
- * var source = new EventSource('/stream');
- * jQuery(source).on('message', debounced);
- *
- * // Cancel the trailing debounced invocation.
- * jQuery(window).on('popstate', debounced.cancel);
- */
-function debounce(func, wait, options) {
- var lastArgs,
- lastThis,
- maxWait,
- result,
- timerId,
- lastCallTime,
- lastInvokeTime = 0,
- leading = false,
- maxing = false,
- trailing = true;
-
- if (typeof func != 'function') {
- throw new TypeError(FUNC_ERROR_TEXT);
- }
- wait = toNumber(wait) || 0;
- if (isObject(options)) {
- leading = !!options.leading;
- maxing = 'maxWait' in options;
- maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
- trailing = 'trailing' in options ? !!options.trailing : trailing;
- }
-
- function invokeFunc(time) {
- var args = lastArgs,
- thisArg = lastThis;
-
- lastArgs = lastThis = undefined;
- lastInvokeTime = time;
- result = func.apply(thisArg, args);
- return result;
- }
-
- function leadingEdge(time) {
- // Reset any `maxWait` timer.
- lastInvokeTime = time;
- // Start the timer for the trailing edge.
- timerId = setTimeout(timerExpired, wait);
- // Invoke the leading edge.
- return leading ? invokeFunc(time) : result;
- }
-
- function remainingWait(time) {
- var timeSinceLastCall = time - lastCallTime,
- timeSinceLastInvoke = time - lastInvokeTime,
- result = wait - timeSinceLastCall;
-
- return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
- }
-
- function shouldInvoke(time) {
- var timeSinceLastCall = time - lastCallTime,
- timeSinceLastInvoke = time - lastInvokeTime;
-
- // Either this is the first call, activity has stopped and we're at the
- // trailing edge, the system time has gone backwards and we're treating
- // it as the trailing edge, or we've hit the `maxWait` limit.
- return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
- (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
- }
-
- function timerExpired() {
- var time = now();
- if (shouldInvoke(time)) {
- return trailingEdge(time);
- }
- // Restart the timer.
- timerId = setTimeout(timerExpired, remainingWait(time));
- }
-
- function trailingEdge(time) {
- timerId = undefined;
-
- // Only invoke if we have `lastArgs` which means `func` has been
- // debounced at least once.
- if (trailing && lastArgs) {
- return invokeFunc(time);
- }
- lastArgs = lastThis = undefined;
- return result;
- }
-
- function cancel() {
- if (timerId !== undefined) {
- clearTimeout(timerId);
- }
- lastInvokeTime = 0;
- lastArgs = lastCallTime = lastThis = timerId = undefined;
- }
-
- function flush() {
- return timerId === undefined ? result : trailingEdge(now());
- }
-
- function debounced() {
- var time = now(),
- isInvoking = shouldInvoke(time);
-
- lastArgs = arguments;
- lastThis = this;
- lastCallTime = time;
-
- if (isInvoking) {
- if (timerId === undefined) {
- return leadingEdge(lastCallTime);
- }
- if (maxing) {
- // Handle invocations in a tight loop.
- timerId = setTimeout(timerExpired, wait);
- return invokeFunc(lastCallTime);
- }
- }
- if (timerId === undefined) {
- timerId = setTimeout(timerExpired, wait);
- }
- return result;
- }
- debounced.cancel = cancel;
- debounced.flush = flush;
- return debounced;
-}
-
-/**
- * Checks if `value` is the
- * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
- * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(_.noop);
- * // => true
- *
- * _.isObject(null);
- * // => false
- */
-function isObject(value) {
- var type = typeof value;
- return !!value && (type == 'object' || type == 'function');
-}
-
-/**
- * Checks if `value` is object-like. A value is object-like if it's not `null`
- * and has a `typeof` result of "object".
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- * @example
- *
- * _.isObjectLike({});
- * // => true
- *
- * _.isObjectLike([1, 2, 3]);
- * // => true
- *
- * _.isObjectLike(_.noop);
- * // => false
- *
- * _.isObjectLike(null);
- * // => false
- */
-function isObjectLike(value) {
- return !!value && typeof value == 'object';
-}
-
-/**
- * Checks if `value` is classified as a `Symbol` primitive or object.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
- * @example
- *
- * _.isSymbol(Symbol.iterator);
- * // => true
- *
- * _.isSymbol('abc');
- * // => false
- */
-function isSymbol(value) {
- return typeof value == 'symbol' ||
- (isObjectLike(value) && objectToString.call(value) == symbolTag);
-}
-
-/**
- * Converts `value` to a number.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to process.
- * @returns {number} Returns the number.
- * @example
- *
- * _.toNumber(3.2);
- * // => 3.2
- *
- * _.toNumber(Number.MIN_VALUE);
- * // => 5e-324
- *
- * _.toNumber(Infinity);
- * // => Infinity
- *
- * _.toNumber('3.2');
- * // => 3.2
- */
-function toNumber(value) {
- if (typeof value == 'number') {
- return value;
- }
- if (isSymbol(value)) {
- return NAN;
- }
- if (isObject(value)) {
- var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
- value = isObject(other) ? (other + '') : other;
- }
- if (typeof value != 'string') {
- return value === 0 ? value : +value;
- }
- value = value.replace(reTrim, '');
- var isBinary = reIsBinary.test(value);
- return (isBinary || reIsOctal.test(value))
- ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
- : (reIsBadHex.test(value) ? NAN : +value);
-}
-
-module.exports = debounce;
-
-}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{}],2:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _Scorm12API2 = _interopRequireDefault(require("./Scorm12API"));
-
-var _aicc_cmi = require("./cmi/aicc_cmi");
-
-var _scorm12_cmi = require("./cmi/scorm12_cmi");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); }
-
-function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-/**
- * The AICC API class
- */
-var AICC = /*#__PURE__*/function (_Scorm12API) {
- _inherits(AICC, _Scorm12API);
-
- var _super = _createSuper(AICC);
-
- /**
- * Constructor to create AICC API object
- * @param {object} settings
- */
- function AICC(settings) {
- var _this;
-
- _classCallCheck(this, AICC);
-
- var finalSettings = _objectSpread(_objectSpread({}, {
- mastery_override: false
- }), settings);
-
- _this = _super.call(this, finalSettings);
- _this.cmi = new _aicc_cmi.CMI();
- _this.nav = new _scorm12_cmi.NAV();
- return _this;
- }
- /**
- * Gets or builds a new child element to add to the array.
- *
- * @param {string} CMIElement
- * @param {any} value
- * @param {boolean} foundFirstIndex
- * @return {object}
- */
-
-
- _createClass(AICC, [{
- key: "getChildElement",
- value: function getChildElement(CMIElement, value, foundFirstIndex) {
- var newChild = _get(_getPrototypeOf(AICC.prototype), "getChildElement", this).call(this, CMIElement, value, foundFirstIndex);
-
- if (!newChild) {
- if (this.stringMatches(CMIElement, 'cmi\\.evaluation\\.comments\\.\\d+')) {
- newChild = new _aicc_cmi.CMIEvaluationCommentsObject();
- } else if (this.stringMatches(CMIElement, 'cmi\\.student_data\\.tries\\.\\d+')) {
- newChild = new _aicc_cmi.CMITriesObject();
- } else if (this.stringMatches(CMIElement, 'cmi\\.student_data\\.attempt_records\\.\\d+')) {
- newChild = new _aicc_cmi.CMIAttemptRecordsObject();
- }
- }
-
- return newChild;
- }
- /**
- * Replace the whole API with another
- *
- * @param {AICC} newAPI
- */
-
- }, {
- key: "replaceWithAnotherScormAPI",
- value: function replaceWithAnotherScormAPI(newAPI) {
- // Data Model
- this.cmi = newAPI.cmi;
- this.nav = newAPI.nav;
- }
- }]);
-
- return AICC;
-}(_Scorm12API2["default"]);
-
-exports["default"] = AICC;
-
-},{"./Scorm12API":4,"./cmi/aicc_cmi":6,"./cmi/scorm12_cmi":8}],3:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _common = require("./cmi/common");
-
-var _exceptions = require("./exceptions");
-
-var _error_codes2 = _interopRequireDefault(require("./constants/error_codes"));
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-var _utilities = require("./utilities");
-
-var _lodash = _interopRequireDefault(require("lodash.debounce"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
-
-function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
-
-function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
-
-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; }
-
-function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
-
-function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
-
-function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
-
-function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
-
-function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-
-function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
-
-function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
-
-function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-
-var global_constants = _api_constants["default"].global;
-var scorm12_error_codes = _error_codes2["default"].scorm12;
-/**
- * Base API class for AICC, SCORM 1.2, and SCORM 2004. Should be considered
- * abstract, and never initialized on it's own.
- */
-
-var _timeout = /*#__PURE__*/new WeakMap();
-
-var _error_codes = /*#__PURE__*/new WeakMap();
-
-var _settings = /*#__PURE__*/new WeakMap();
-
-var BaseAPI = /*#__PURE__*/function () {
- /**
- * Constructor for Base API class. Sets some shared API fields, as well as
- * sets up options for the API.
- * @param {object} error_codes
- * @param {object} settings
- */
- function BaseAPI(error_codes, settings) {
- _classCallCheck(this, BaseAPI);
-
- _classPrivateFieldInitSpec(this, _timeout, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(this, _error_codes, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(this, _settings, {
- writable: true,
- value: {
- autocommit: false,
- autocommitSeconds: 10,
- asyncCommit: false,
- sendBeaconCommit: false,
- lmsCommitUrl: false,
- dataCommitFormat: 'json',
- // valid formats are 'json' or 'flattened', 'params'
- commitRequestDataType: 'application/json;charset=UTF-8',
- autoProgress: false,
- logLevel: global_constants.LOG_LEVEL_ERROR,
- selfReportSessionTime: false,
- alwaysSendTotalTime: false,
- strict_errors: true,
- xhrHeaders: {},
- xhrWithCredentials: false,
- responseHandler: function responseHandler(xhr) {
- var result;
-
- if (typeof xhr !== 'undefined') {
- result = JSON.parse(xhr.responseText);
-
- if (result === null || !{}.hasOwnProperty.call(result, 'result')) {
- result = {};
-
- if (xhr.status === 200) {
- result.result = global_constants.SCORM_TRUE;
- result.errorCode = 0;
- } else {
- result.result = global_constants.SCORM_FALSE;
- result.errorCode = 101;
- }
- }
- }
-
- return result;
- },
- onLogMessage: function onLogMessage(messageLevel, logMessage) {
- switch (messageLevel) {
- case global_constants.LOG_LEVEL_ERROR:
- console.error(logMessage);
- break;
-
- case global_constants.LOG_LEVEL_WARNING:
- console.warn(logMessage);
- break;
-
- case global_constants.LOG_LEVEL_INFO:
- console.info(logMessage);
- break;
-
- case global_constants.LOG_LEVEL_DEBUG:
- if (console.debug) {
- console.debug(logMessage);
- } else {
- console.log(logMessage);
- }
-
- break;
- }
- }
- }
- });
-
- _defineProperty(this, "cmi", void 0);
-
- _defineProperty(this, "startingData", void 0);
-
- if ((this instanceof BaseAPI ? this.constructor : void 0) === BaseAPI) {
- throw new TypeError('Cannot construct BaseAPI instances directly');
- }
-
- this.currentState = global_constants.STATE_NOT_INITIALIZED;
- this.lastErrorCode = 0;
- this.listenerArray = [];
-
- _classPrivateFieldSet(this, _timeout, null);
-
- _classPrivateFieldSet(this, _error_codes, error_codes);
-
- this.settings = settings;
- this.apiLogLevel = this.settings.logLevel;
- this.selfReportSessionTime = this.settings.selfReportSessionTime;
- }
- /**
- * Initialize the API
- * @param {string} callbackName
- * @param {string} initializeMessage
- * @param {string} terminationMessage
- * @return {string}
- */
-
-
- _createClass(BaseAPI, [{
- key: "initialize",
- value: function initialize(callbackName, initializeMessage, terminationMessage) {
- var returnValue = global_constants.SCORM_FALSE;
-
- if (this.isInitialized()) {
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).INITIALIZED, initializeMessage);
- } else if (this.isTerminated()) {
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).TERMINATED, terminationMessage);
- } else {
- if (this.selfReportSessionTime) {
- this.cmi.setStartTime();
- }
-
- this.currentState = global_constants.STATE_INITIALIZED;
- this.lastErrorCode = 0;
- returnValue = global_constants.SCORM_TRUE;
- this.processListeners(callbackName);
- }
-
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- this.clearSCORMError(returnValue);
- return returnValue;
- }
- /**
- * Getter for #error_codes
- * @return {object}
- */
-
- }, {
- key: "error_codes",
- get: function get() {
- return _classPrivateFieldGet(this, _error_codes);
- }
- /**
- * Getter for #settings
- * @return {object}
- */
-
- }, {
- key: "settings",
- get: function get() {
- return _classPrivateFieldGet(this, _settings);
- }
- /**
- * Setter for #settings
- * @param {object} settings
- */
- ,
- set: function set(settings) {
- _classPrivateFieldSet(this, _settings, _objectSpread(_objectSpread({}, _classPrivateFieldGet(this, _settings)), settings));
- }
- /**
- * Terminates the current run of the API
- * @param {string} callbackName
- * @param {boolean} checkTerminated
- * @return {string}
- */
-
- }, {
- key: "terminate",
- value: function terminate(callbackName, checkTerminated) {
- var returnValue = global_constants.SCORM_FALSE;
-
- if (this.checkState(checkTerminated, _classPrivateFieldGet(this, _error_codes).TERMINATION_BEFORE_INIT, _classPrivateFieldGet(this, _error_codes).MULTIPLE_TERMINATION)) {
- this.currentState = global_constants.STATE_TERMINATED;
- var result = this.storeData(true);
-
- if (!this.settings.sendBeaconCommit && !this.settings.asyncCommit && typeof result.errorCode !== 'undefined' && result.errorCode > 0) {
- this.throwSCORMError(result.errorCode);
- }
-
- returnValue = typeof result !== 'undefined' && result.result ? result.result : global_constants.SCORM_FALSE;
- if (checkTerminated) this.lastErrorCode = 0;
- returnValue = global_constants.SCORM_TRUE;
- this.processListeners(callbackName);
- }
-
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- this.clearSCORMError(returnValue);
- return returnValue;
- }
- /**
- * Get the value of the CMIElement.
- *
- * @param {string} callbackName
- * @param {boolean} checkTerminated
- * @param {string} CMIElement
- * @return {string}
- */
-
- }, {
- key: "getValue",
- value: function getValue(callbackName, checkTerminated, CMIElement) {
- var returnValue;
-
- if (this.checkState(checkTerminated, _classPrivateFieldGet(this, _error_codes).RETRIEVE_BEFORE_INIT, _classPrivateFieldGet(this, _error_codes).RETRIEVE_AFTER_TERM)) {
- if (checkTerminated) this.lastErrorCode = 0;
-
- try {
- returnValue = this.getCMIValue(CMIElement);
- } catch (e) {
- if (e instanceof _exceptions.ValidationError) {
- this.lastErrorCode = e.errorCode;
- returnValue = global_constants.SCORM_FALSE;
- } else {
- if (e.message) {
- console.error(e.message);
- } else {
- console.error(e);
- }
-
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).GENERAL);
- }
- }
-
- this.processListeners(callbackName, CMIElement);
- }
-
- this.apiLog(callbackName, CMIElement, ': returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- this.clearSCORMError(returnValue);
- return returnValue;
- }
- /**
- * Sets the value of the CMIElement.
- *
- * @param {string} callbackName
- * @param {string} commitCallback
- * @param {boolean} checkTerminated
- * @param {string} CMIElement
- * @param {*} value
- * @return {string}
- */
-
- }, {
- key: "setValue",
- value: function setValue(callbackName, commitCallback, checkTerminated, CMIElement, value) {
- if (value !== undefined) {
- value = String(value);
- }
-
- var returnValue = global_constants.SCORM_FALSE;
-
- if (this.checkState(checkTerminated, _classPrivateFieldGet(this, _error_codes).STORE_BEFORE_INIT, _classPrivateFieldGet(this, _error_codes).STORE_AFTER_TERM)) {
- if (checkTerminated) this.lastErrorCode = 0;
-
- try {
- returnValue = this.setCMIValue(CMIElement, value);
- } catch (e) {
- if (e instanceof _exceptions.ValidationError) {
- this.lastErrorCode = e.errorCode;
- returnValue = global_constants.SCORM_FALSE;
- } else {
- if (e.message) {
- console.error(e.message);
- } else {
- console.error(e);
- }
-
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).GENERAL);
- }
- }
-
- this.processListeners(callbackName, CMIElement, value);
- }
-
- if (returnValue === undefined) {
- returnValue = global_constants.SCORM_FALSE;
- } // If we didn't have any errors while setting the data, go ahead and
- // schedule a commit, if autocommit is turned on
-
-
- if (String(this.lastErrorCode) === '0') {
- if (this.settings.autocommit && !_classPrivateFieldGet(this, _timeout)) {
- this.scheduleCommit(this.settings.autocommitSeconds * 1000, commitCallback);
- }
- }
-
- this.apiLog(callbackName, CMIElement, ': ' + value + ': result: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- this.clearSCORMError(returnValue);
- return returnValue;
- }
- /**
- * Orders LMS to store all content parameters
- * @param {string} callbackName
- * @param {boolean} checkTerminated
- * @return {string}
- */
-
- }, {
- key: "commit",
- value: function commit(callbackName, checkTerminated) {
- this.clearScheduledCommit();
- var returnValue = global_constants.SCORM_FALSE;
-
- if (this.checkState(checkTerminated, _classPrivateFieldGet(this, _error_codes).COMMIT_BEFORE_INIT, _classPrivateFieldGet(this, _error_codes).COMMIT_AFTER_TERM)) {
- var result = this.storeData(false);
-
- if (!this.settings.sendBeaconCommit && !this.settings.asyncCommit && result.errorCode && result.errorCode > 0) {
- this.throwSCORMError(result.errorCode);
- }
-
- returnValue = typeof result !== 'undefined' && result.result ? result.result : global_constants.SCORM_FALSE;
- this.apiLog(callbackName, 'HttpRequest', ' Result: ' + returnValue, global_constants.LOG_LEVEL_DEBUG);
- if (checkTerminated) this.lastErrorCode = 0;
- this.processListeners(callbackName);
- }
-
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- this.clearSCORMError(returnValue);
- return returnValue;
- }
- /**
- * Returns last error code
- * @param {string} callbackName
- * @return {string}
- */
-
- }, {
- key: "getLastError",
- value: function getLastError(callbackName) {
- var returnValue = String(this.lastErrorCode);
- this.processListeners(callbackName);
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- return returnValue;
- }
- /**
- * Returns the errorNumber error description
- *
- * @param {string} callbackName
- * @param {(string|number)} CMIErrorCode
- * @return {string}
- */
-
- }, {
- key: "getErrorString",
- value: function getErrorString(callbackName, CMIErrorCode) {
- var returnValue = '';
-
- if (CMIErrorCode !== null && CMIErrorCode !== '') {
- returnValue = this.getLmsErrorMessageDetails(CMIErrorCode);
- this.processListeners(callbackName);
- }
-
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- return returnValue;
- }
- /**
- * Returns a comprehensive description of the errorNumber error.
- *
- * @param {string} callbackName
- * @param {(string|number)} CMIErrorCode
- * @return {string}
- */
-
- }, {
- key: "getDiagnostic",
- value: function getDiagnostic(callbackName, CMIErrorCode) {
- var returnValue = '';
-
- if (CMIErrorCode !== null && CMIErrorCode !== '') {
- returnValue = this.getLmsErrorMessageDetails(CMIErrorCode, true);
- this.processListeners(callbackName);
- }
-
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- return returnValue;
- }
- /**
- * Checks the LMS state and ensures it has been initialized.
- *
- * @param {boolean} checkTerminated
- * @param {number} beforeInitError
- * @param {number} afterTermError
- * @return {boolean}
- */
-
- }, {
- key: "checkState",
- value: function checkState(checkTerminated, beforeInitError, afterTermError) {
- if (this.isNotInitialized()) {
- this.throwSCORMError(beforeInitError);
- return false;
- } else if (checkTerminated && this.isTerminated()) {
- this.throwSCORMError(afterTermError);
- return false;
- }
-
- return true;
- }
- /**
- * Logging for all SCORM actions
- *
- * @param {string} functionName
- * @param {string} CMIElement
- * @param {string} logMessage
- * @param {number}messageLevel
- */
-
- }, {
- key: "apiLog",
- value: function apiLog(functionName, CMIElement, logMessage, messageLevel) {
- logMessage = this.formatMessage(functionName, CMIElement, logMessage);
-
- if (messageLevel >= this.apiLogLevel) {
- this.settings.onLogMessage(messageLevel, logMessage);
- }
- }
- /**
- * Formats the SCORM messages for easy reading
- *
- * @param {string} functionName
- * @param {string} CMIElement
- * @param {string} message
- * @return {string}
- */
-
- }, {
- key: "formatMessage",
- value: function formatMessage(functionName, CMIElement, message) {
- var baseLength = 20;
- var messageString = '';
- messageString += functionName;
- var fillChars = baseLength - messageString.length;
-
- for (var i = 0; i < fillChars; i++) {
- messageString += ' ';
- }
-
- messageString += ': ';
-
- if (CMIElement) {
- var CMIElementBaseLength = 70;
- messageString += CMIElement;
- fillChars = CMIElementBaseLength - messageString.length;
-
- for (var j = 0; j < fillChars; j++) {
- messageString += ' ';
- }
- }
-
- if (message) {
- messageString += message;
- }
-
- return messageString;
- }
- /**
- * Checks to see if {str} contains {tester}
- *
- * @param {string} str String to check against
- * @param {string} tester String to check for
- * @return {boolean}
- */
-
- }, {
- key: "stringMatches",
- value: function stringMatches(str, tester) {
- return str && tester && str.match(tester);
- }
- /**
- * Check to see if the specific object has the given property
- * @param {*} refObject
- * @param {string} attribute
- * @return {boolean}
- * @private
- */
-
- }, {
- key: "_checkObjectHasProperty",
- value: function _checkObjectHasProperty(refObject, attribute) {
- return Object.hasOwnProperty.call(refObject, attribute) || Object.getOwnPropertyDescriptor(Object.getPrototypeOf(refObject), attribute) || attribute in refObject;
- }
- /**
- * Returns the message that corresponds to errorNumber
- * APIs that inherit BaseAPI should override this function
- *
- * @param {(string|number)} _errorNumber
- * @param {boolean} _detail
- * @return {string}
- * @abstract
- */
-
- }, {
- key: "getLmsErrorMessageDetails",
- value: function getLmsErrorMessageDetails(_errorNumber, _detail) {
- throw new Error('The getLmsErrorMessageDetails method has not been implemented');
- }
- /**
- * Gets the value for the specific element.
- * APIs that inherit BaseAPI should override this function
- *
- * @param {string} _CMIElement
- * @return {string}
- * @abstract
- */
-
- }, {
- key: "getCMIValue",
- value: function getCMIValue(_CMIElement) {
- throw new Error('The getCMIValue method has not been implemented');
- }
- /**
- * Sets the value for the specific element.
- * APIs that inherit BaseAPI should override this function
- *
- * @param {string} _CMIElement
- * @param {any} _value
- * @return {string}
- * @abstract
- */
-
- }, {
- key: "setCMIValue",
- value: function setCMIValue(_CMIElement, _value) {
- throw new Error('The setCMIValue method has not been implemented');
- }
- /**
- * Shared API method to set a valid for a given element.
- *
- * @param {string} methodName
- * @param {boolean} scorm2004
- * @param {string} CMIElement
- * @param {*} value
- * @return {string}
- */
-
- }, {
- key: "_commonSetCMIValue",
- value: function _commonSetCMIValue(methodName, scorm2004, CMIElement, value) {
- if (!CMIElement || CMIElement === '') {
- return global_constants.SCORM_FALSE;
- }
-
- var structure = CMIElement.split('.');
- var refObject = this;
- var returnValue = global_constants.SCORM_FALSE;
- var foundFirstIndex = false;
- var invalidErrorMessage = "The data model element passed to ".concat(methodName, " (").concat(CMIElement, ") is not a valid SCORM data model element.");
- var invalidErrorCode = scorm2004 ? _classPrivateFieldGet(this, _error_codes).UNDEFINED_DATA_MODEL : _classPrivateFieldGet(this, _error_codes).GENERAL;
-
- for (var i = 0; i < structure.length; i++) {
- var attribute = structure[i];
-
- if (i === structure.length - 1) {
- if (scorm2004 && attribute.substr(0, 8) === '{target=' && typeof refObject._isTargetValid == 'function') {
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).READ_ONLY_ELEMENT);
- } else if (!this._checkObjectHasProperty(refObject, attribute)) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- } else {
- if (this.isInitialized() && this.stringMatches(CMIElement, '\\.correct_responses\\.\\d+')) {
- this.validateCorrectResponse(CMIElement, value);
- }
-
- if (!scorm2004 || this.lastErrorCode === 0) {
- refObject[attribute] = value;
- returnValue = global_constants.SCORM_TRUE;
- }
- }
- } else {
- refObject = refObject[attribute];
-
- if (!refObject) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- break;
- }
-
- if (refObject instanceof _common.CMIArray) {
- var index = parseInt(structure[i + 1], 10); // SCO is trying to set an item on an array
-
- if (!isNaN(index)) {
- var item = refObject.childArray[index];
-
- if (item) {
- refObject = item;
- foundFirstIndex = true;
- } else {
- var newChild = this.getChildElement(CMIElement, value, foundFirstIndex);
- foundFirstIndex = true;
-
- if (!newChild) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- } else {
- if (refObject.initialized) newChild.initialize();
- refObject.childArray.push(newChild);
- refObject = newChild;
- }
- } // Have to update i value to skip the array position
-
-
- i++;
- }
- }
- }
- }
-
- if (returnValue === global_constants.SCORM_FALSE) {
- this.apiLog(methodName, null, "There was an error setting the value for: ".concat(CMIElement, ", value of: ").concat(value), global_constants.LOG_LEVEL_WARNING);
- }
-
- return returnValue;
- }
- /**
- * Abstract method for validating that a response is correct.
- *
- * @param {string} _CMIElement
- * @param {*} _value
- */
-
- }, {
- key: "validateCorrectResponse",
- value: function validateCorrectResponse(_CMIElement, _value) {// just a stub method
- }
- /**
- * Gets or builds a new child element to add to the array.
- * APIs that inherit BaseAPI should override this method.
- *
- * @param {string} _CMIElement - unused
- * @param {*} _value - unused
- * @param {boolean} _foundFirstIndex - unused
- * @return {*}
- * @abstract
- */
-
- }, {
- key: "getChildElement",
- value: function getChildElement(_CMIElement, _value, _foundFirstIndex) {
- throw new Error('The getChildElement method has not been implemented');
- }
- /**
- * Gets a value from the CMI Object
- *
- * @param {string} methodName
- * @param {boolean} scorm2004
- * @param {string} CMIElement
- * @return {*}
- */
-
- }, {
- key: "_commonGetCMIValue",
- value: function _commonGetCMIValue(methodName, scorm2004, CMIElement) {
- if (!CMIElement || CMIElement === '') {
- return '';
- }
-
- var structure = CMIElement.split('.');
- var refObject = this;
- var attribute = null;
- var uninitializedErrorMessage = "The data model element passed to ".concat(methodName, " (").concat(CMIElement, ") has not been initialized.");
- var invalidErrorMessage = "The data model element passed to ".concat(methodName, " (").concat(CMIElement, ") is not a valid SCORM data model element.");
- var invalidErrorCode = scorm2004 ? _classPrivateFieldGet(this, _error_codes).UNDEFINED_DATA_MODEL : _classPrivateFieldGet(this, _error_codes).GENERAL;
-
- for (var i = 0; i < structure.length; i++) {
- attribute = structure[i];
-
- if (!scorm2004) {
- if (i === structure.length - 1) {
- if (!this._checkObjectHasProperty(refObject, attribute)) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- return;
- }
- }
- } else {
- if (String(attribute).substr(0, 8) === '{target=' && typeof refObject._isTargetValid == 'function') {
- var target = String(attribute).substr(8, String(attribute).length - 9);
- return refObject._isTargetValid(target);
- } else if (!this._checkObjectHasProperty(refObject, attribute)) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- return;
- }
- }
-
- refObject = refObject[attribute];
-
- if (refObject === undefined) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- break;
- }
-
- if (refObject instanceof _common.CMIArray) {
- var index = parseInt(structure[i + 1], 10); // SCO is trying to set an item on an array
-
- if (!isNaN(index)) {
- var item = refObject.childArray[index];
-
- if (item) {
- refObject = item;
- } else {
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).VALUE_NOT_INITIALIZED, uninitializedErrorMessage);
- break;
- } // Have to update i value to skip the array position
-
-
- i++;
- }
- }
- }
-
- if (refObject === null || refObject === undefined) {
- if (!scorm2004) {
- if (attribute === '_children') {
- this.throwSCORMError(scorm12_error_codes.CHILDREN_ERROR);
- } else if (attribute === '_count') {
- this.throwSCORMError(scorm12_error_codes.COUNT_ERROR);
- }
- }
- } else {
- return refObject;
- }
- }
- /**
- * Returns true if the API's current state is STATE_INITIALIZED
- *
- * @return {boolean}
- */
-
- }, {
- key: "isInitialized",
- value: function isInitialized() {
- return this.currentState === global_constants.STATE_INITIALIZED;
- }
- /**
- * Returns true if the API's current state is STATE_NOT_INITIALIZED
- *
- * @return {boolean}
- */
-
- }, {
- key: "isNotInitialized",
- value: function isNotInitialized() {
- return this.currentState === global_constants.STATE_NOT_INITIALIZED;
- }
- /**
- * Returns true if the API's current state is STATE_TERMINATED
- *
- * @return {boolean}
- */
-
- }, {
- key: "isTerminated",
- value: function isTerminated() {
- return this.currentState === global_constants.STATE_TERMINATED;
- }
- /**
- * Provides a mechanism for attaching to a specific SCORM event
- *
- * @param {string} listenerName
- * @param {function} callback
- */
-
- }, {
- key: "on",
- value: function on(listenerName, callback) {
- if (!callback) return;
- var listenerFunctions = listenerName.split(' ');
-
- for (var i = 0; i < listenerFunctions.length; i++) {
- var listenerSplit = listenerFunctions[i].split('.');
- if (listenerSplit.length === 0) return;
- var functionName = listenerSplit[0];
- var CMIElement = null;
-
- if (listenerSplit.length > 1) {
- CMIElement = listenerName.replace(functionName + '.', '');
- }
-
- this.listenerArray.push({
- functionName: functionName,
- CMIElement: CMIElement,
- callback: callback
- });
- this.apiLog('on', functionName, "Added event listener: ".concat(this.listenerArray.length), global_constants.LOG_LEVEL_INFO);
- }
- }
- /**
- * Provides a mechanism for detaching a specific SCORM event listener
- *
- * @param {string} listenerName
- * @param {function} callback
- */
-
- }, {
- key: "off",
- value: function off(listenerName, callback) {
- var _this = this;
-
- if (!callback) return;
- var listenerFunctions = listenerName.split(' ');
-
- var _loop = function _loop(i) {
- var listenerSplit = listenerFunctions[i].split('.');
- if (listenerSplit.length === 0) return {
- v: void 0
- };
- var functionName = listenerSplit[0];
- var CMIElement = null;
-
- if (listenerSplit.length > 1) {
- CMIElement = listenerName.replace(functionName + '.', '');
- }
-
- var removeIndex = _this.listenerArray.findIndex(function (obj) {
- return obj.functionName === functionName && obj.CMIElement === CMIElement && obj.callback === callback;
- });
-
- if (removeIndex !== -1) {
- _this.listenerArray.splice(removeIndex, 1);
-
- _this.apiLog('off', functionName, "Removed event listener: ".concat(_this.listenerArray.length), global_constants.LOG_LEVEL_INFO);
- }
- };
-
- for (var i = 0; i < listenerFunctions.length; i++) {
- var _ret = _loop(i);
-
- if (_typeof(_ret) === "object") return _ret.v;
- }
- }
- /**
- * Provides a mechanism for clearing all listeners from a specific SCORM event
- *
- * @param {string} listenerName
- */
-
- }, {
- key: "clear",
- value: function clear(listenerName) {
- var _this2 = this;
-
- var listenerFunctions = listenerName.split(' ');
-
- var _loop2 = function _loop2(i) {
- var listenerSplit = listenerFunctions[i].split('.');
- if (listenerSplit.length === 0) return {
- v: void 0
- };
- var functionName = listenerSplit[0];
- var CMIElement = null;
-
- if (listenerSplit.length > 1) {
- CMIElement = listenerName.replace(functionName + '.', '');
- }
-
- _this2.listenerArray = _this2.listenerArray.filter(function (obj) {
- return obj.functionName !== functionName && obj.CMIElement !== CMIElement;
- });
- };
-
- for (var i = 0; i < listenerFunctions.length; i++) {
- var _ret2 = _loop2(i);
-
- if (_typeof(_ret2) === "object") return _ret2.v;
- }
- }
- /**
- * Processes any 'on' listeners that have been created
- *
- * @param {string} functionName
- * @param {string} CMIElement
- * @param {*} value
- */
-
- }, {
- key: "processListeners",
- value: function processListeners(functionName, CMIElement, value) {
- this.apiLog(functionName, CMIElement, value);
-
- for (var i = 0; i < this.listenerArray.length; i++) {
- var listener = this.listenerArray[i];
- var functionsMatch = listener.functionName === functionName;
- var listenerHasCMIElement = !!listener.CMIElement;
- var CMIElementsMatch = false;
-
- if (CMIElement && listener.CMIElement && listener.CMIElement.substring(listener.CMIElement.length - 1) === '*') {
- CMIElementsMatch = CMIElement.indexOf(listener.CMIElement.substring(0, listener.CMIElement.length - 1)) === 0;
- } else {
- CMIElementsMatch = listener.CMIElement === CMIElement;
- }
-
- if (functionsMatch && (!listenerHasCMIElement || CMIElementsMatch)) {
- listener.callback(CMIElement, value);
- }
- }
- }
- /**
- * Throws a SCORM error
- *
- * @param {number} errorNumber
- * @param {string} message
- */
-
- }, {
- key: "throwSCORMError",
- value: function throwSCORMError(errorNumber, message) {
- if (!message) {
- message = this.getLmsErrorMessageDetails(errorNumber);
- }
-
- this.apiLog('throwSCORMError', null, errorNumber + ': ' + message, global_constants.LOG_LEVEL_ERROR);
- this.lastErrorCode = String(errorNumber);
- }
- /**
- * Clears the last SCORM error code on success.
- *
- * @param {string} success
- */
-
- }, {
- key: "clearSCORMError",
- value: function clearSCORMError(success) {
- if (success !== undefined && success !== global_constants.SCORM_FALSE) {
- this.lastErrorCode = 0;
- }
- }
- /**
- * Attempts to store the data to the LMS, logs data if no LMS configured
- * APIs that inherit BaseAPI should override this function
- *
- * @param {boolean} _calculateTotalTime
- * @return {string}
- * @abstract
- */
-
- }, {
- key: "storeData",
- value: function storeData(_calculateTotalTime) {
- throw new Error('The storeData method has not been implemented');
- }
- /**
- * Load the CMI from a flattened JSON object
- * @param {object} json
- * @param {string} CMIElement
- */
-
- }, {
- key: "loadFromFlattenedJSON",
- value: function loadFromFlattenedJSON(json, CMIElement) {
- var _this3 = this;
-
- if (!this.isNotInitialized()) {
- console.error('loadFromFlattenedJSON can only be called before the call to lmsInitialize.');
- return;
- }
- /**
- * Test match pattern.
- *
- * @param {string} a
- * @param {string} c
- * @param {RegExp} a_pattern
- * @return {number}
- */
-
-
- function testPattern(a, c, a_pattern) {
- var a_match = a.match(a_pattern);
- var c_match;
-
- if (a_match !== null && (c_match = c.match(a_pattern)) !== null) {
- var a_num = Number(a_match[2]);
- var c_num = Number(c_match[2]);
-
- if (a_num === c_num) {
- if (a_match[3] === 'id') {
- return -1;
- } else if (a_match[3] === 'type') {
- if (c_match[3] === 'id') {
- return 1;
- } else {
- return -1;
- }
- } else {
- return 1;
- }
- }
-
- return a_num - c_num;
- }
-
- return null;
- }
-
- var int_pattern = /^(cmi\.interactions\.)(\d+)\.(.*)$/;
- var obj_pattern = /^(cmi\.objectives\.)(\d+)\.(.*)$/;
- var result = Object.keys(json).map(function (key) {
- return [String(key), json[key]];
- }); // CMI interactions need to have id and type loaded before any other fields
-
- result.sort(function (_ref, _ref2) {
- var _ref3 = _slicedToArray(_ref, 2),
- a = _ref3[0],
- b = _ref3[1];
-
- var _ref4 = _slicedToArray(_ref2, 2),
- c = _ref4[0],
- d = _ref4[1];
-
- var test;
-
- if ((test = testPattern(a, c, int_pattern)) !== null) {
- return test;
- }
-
- if ((test = testPattern(a, c, obj_pattern)) !== null) {
- return test;
- }
-
- if (a < c) {
- return -1;
- }
-
- if (a > c) {
- return 1;
- }
-
- return 0;
- });
- var obj;
- result.forEach(function (element) {
- obj = {};
- obj[element[0]] = element[1];
-
- _this3.loadFromJSON((0, _utilities.unflatten)(obj), CMIElement);
- });
- }
- /**
- * Loads CMI data from a JSON object.
- *
- * @param {object} json
- * @param {string} CMIElement
- */
-
- }, {
- key: "loadFromJSON",
- value: function loadFromJSON(json, CMIElement) {
- if (!this.isNotInitialized()) {
- console.error('loadFromJSON can only be called before the call to lmsInitialize.');
- return;
- }
-
- CMIElement = CMIElement !== undefined ? CMIElement : 'cmi';
- this.startingData = json; // could this be refactored down to flatten(json) then setCMIValue on each?
-
- for (var key in json) {
- if ({}.hasOwnProperty.call(json, key) && json[key]) {
- var currentCMIElement = (CMIElement ? CMIElement + '.' : '') + key;
- var value = json[key];
-
- if (value['childArray']) {
- for (var i = 0; i < value['childArray'].length; i++) {
- this.loadFromJSON(value['childArray'][i], currentCMIElement + '.' + i);
- }
- } else if (value.constructor === Object) {
- this.loadFromJSON(value, currentCMIElement);
- } else {
- this.setCMIValue(currentCMIElement, value);
- }
- }
- }
- }
- /**
- * Render the CMI object to JSON for sending to an LMS.
- *
- * @return {string}
- */
-
- }, {
- key: "renderCMIToJSONString",
- value: function renderCMIToJSONString() {
- var cmi = this.cmi; // Do we want/need to return fields that have no set value?
- // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);
-
- return JSON.stringify({
- cmi: cmi
- });
- }
- /**
- * Returns a JS object representing the current cmi
- * @return {object}
- */
-
- }, {
- key: "renderCMIToJSONObject",
- value: function renderCMIToJSONObject() {
- // Do we want/need to return fields that have no set value?
- // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);
- return JSON.parse(this.renderCMIToJSONString());
- }
- /**
- * Render the cmi object to the proper format for LMS commit
- * APIs that inherit BaseAPI should override this function
- *
- * @param {boolean} _terminateCommit
- * @return {*}
- * @abstract
- */
-
- }, {
- key: "renderCommitCMI",
- value: function renderCommitCMI(_terminateCommit) {
- throw new Error('The storeData method has not been implemented');
- }
- /**
- * Send the request to the LMS
- * @param {string} url
- * @param {object|Array} params
- * @param {boolean} immediate
- * @return {object}
- */
-
- }, {
- key: "processHttpRequest",
- value: function processHttpRequest(url, params) {
- var immediate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
- var api = this;
-
- var process = function process(url, params, settings, error_codes) {
- var genericError = {
- 'result': global_constants.SCORM_FALSE,
- 'errorCode': error_codes.GENERAL
- };
- var result;
-
- if (!settings.sendBeaconCommit) {
- var httpReq = new XMLHttpRequest();
- httpReq.open('POST', url, settings.asyncCommit);
-
- if (Object.keys(settings.xhrHeaders).length) {
- Object.keys(settings.xhrHeaders).forEach(function (header) {
- httpReq.setRequestHeader(header, settings.xhrHeaders[header]);
- });
- }
-
- httpReq.withCredentials = settings.xhrWithCredentials;
-
- if (settings.asyncCommit) {
- httpReq.onload = function (e) {
- if (typeof settings.responseHandler === 'function') {
- result = settings.responseHandler(httpReq);
- } else {
- result = JSON.parse(httpReq.responseText);
- }
- };
- }
-
- try {
- if (params instanceof Array) {
- httpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
- httpReq.send(params.join('&'));
- } else {
- httpReq.setRequestHeader('Content-Type', settings.commitRequestDataType);
- httpReq.send(JSON.stringify(params));
- }
-
- if (!settings.asyncCommit) {
- if (typeof settings.responseHandler === 'function') {
- result = settings.responseHandler(httpReq);
- } else {
- result = JSON.parse(httpReq.responseText);
- }
- } else {
- result = {};
- result.result = global_constants.SCORM_TRUE;
- result.errorCode = 0;
- api.processListeners('CommitSuccess');
- return result;
- }
- } catch (e) {
- console.error(e);
- api.processListeners('CommitError');
- return genericError;
- }
- } else {
- try {
- var headers = {
- type: settings.commitRequestDataType
- };
- var blob;
-
- if (params instanceof Array) {
- blob = new Blob([params.join('&')], headers);
- } else {
- blob = new Blob([JSON.stringify(params)], headers);
- }
-
- result = {};
-
- if (navigator.sendBeacon(url, blob)) {
- result.result = global_constants.SCORM_TRUE;
- result.errorCode = 0;
- } else {
- result.result = global_constants.SCORM_FALSE;
- result.errorCode = 101;
- }
- } catch (e) {
- console.error(e);
- api.processListeners('CommitError');
- return genericError;
- }
- }
-
- if (typeof result === 'undefined') {
- api.processListeners('CommitError');
- return genericError;
- }
-
- if (result.result === true || result.result === global_constants.SCORM_TRUE) {
- api.processListeners('CommitSuccess');
- } else {
- api.processListeners('CommitError');
- }
-
- return result;
- };
-
- if (typeof _lodash["default"] !== 'undefined') {
- var debounced = (0, _lodash["default"])(process, 500);
- debounced(url, params, this.settings, this.error_codes); // if we're terminating, go ahead and commit immediately
-
- if (immediate) {
- debounced.flush();
- }
-
- return {
- result: global_constants.SCORM_TRUE,
- errorCode: 0
- };
- } else {
- return process(url, params, this.settings, this.error_codes);
- }
- }
- /**
- * Throws a SCORM error
- *
- * @param {number} when - the number of milliseconds to wait before committing
- * @param {string} callback - the name of the commit event callback
- */
-
- }, {
- key: "scheduleCommit",
- value: function scheduleCommit(when, callback) {
- _classPrivateFieldSet(this, _timeout, new ScheduledCommit(this, when, callback));
-
- this.apiLog('scheduleCommit', '', 'scheduled', global_constants.LOG_LEVEL_DEBUG);
- }
- /**
- * Clears and cancels any currently scheduled commits
- */
-
- }, {
- key: "clearScheduledCommit",
- value: function clearScheduledCommit() {
- if (_classPrivateFieldGet(this, _timeout)) {
- _classPrivateFieldGet(this, _timeout).cancel();
-
- _classPrivateFieldSet(this, _timeout, null);
-
- this.apiLog('clearScheduledCommit', '', 'cleared', global_constants.LOG_LEVEL_DEBUG);
- }
- }
- }]);
-
- return BaseAPI;
-}();
-/**
- * Private class that wraps a timeout call to the commit() function
- */
-
-
-exports["default"] = BaseAPI;
-
-var _API = /*#__PURE__*/new WeakMap();
-
-var _cancelled = /*#__PURE__*/new WeakMap();
-
-var _timeout2 = /*#__PURE__*/new WeakMap();
-
-var _callback = /*#__PURE__*/new WeakMap();
-
-var ScheduledCommit = /*#__PURE__*/function () {
- /**
- * Constructor for ScheduledCommit
- * @param {BaseAPI} API
- * @param {number} when
- * @param {string} callback
- */
- function ScheduledCommit(API, when, callback) {
- _classCallCheck(this, ScheduledCommit);
-
- _classPrivateFieldInitSpec(this, _API, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(this, _cancelled, {
- writable: true,
- value: false
- });
-
- _classPrivateFieldInitSpec(this, _timeout2, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(this, _callback, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldSet(this, _API, API);
-
- _classPrivateFieldSet(this, _timeout2, setTimeout(this.wrapper.bind(this), when));
-
- _classPrivateFieldSet(this, _callback, callback);
- }
- /**
- * Cancel any currently scheduled commit
- */
-
-
- _createClass(ScheduledCommit, [{
- key: "cancel",
- value: function cancel() {
- _classPrivateFieldSet(this, _cancelled, true);
-
- if (_classPrivateFieldGet(this, _timeout2)) {
- clearTimeout(_classPrivateFieldGet(this, _timeout2));
- }
- }
- /**
- * Wrap the API commit call to check if the call has already been cancelled
- */
-
- }, {
- key: "wrapper",
- value: function wrapper() {
- if (!_classPrivateFieldGet(this, _cancelled)) {
- _classPrivateFieldGet(this, _API).commit(_classPrivateFieldGet(this, _callback));
- }
- }
- }]);
-
- return ScheduledCommit;
-}();
-
-},{"./cmi/common":7,"./constants/api_constants":10,"./constants/error_codes":11,"./exceptions":15,"./utilities":17,"lodash.debounce":1}],4:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _BaseAPI2 = _interopRequireDefault(require("./BaseAPI"));
-
-var _scorm12_cmi = require("./cmi/scorm12_cmi");
-
-var Utilities = _interopRequireWildcard(require("./utilities"));
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("./constants/error_codes"));
-
-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; }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-var scorm12_constants = _api_constants["default"].scorm12;
-var global_constants = _api_constants["default"].global;
-var scorm12_error_codes = _error_codes["default"].scorm12;
-/**
- * API class for SCORM 1.2
- */
-
-var Scorm12API = /*#__PURE__*/function (_BaseAPI) {
- _inherits(Scorm12API, _BaseAPI);
-
- var _super = _createSuper(Scorm12API);
-
- /**
- * Constructor for SCORM 1.2 API
- * @param {object} settings
- */
- function Scorm12API(settings) {
- var _this;
-
- _classCallCheck(this, Scorm12API);
-
- var finalSettings = _objectSpread(_objectSpread({}, {
- mastery_override: false
- }), settings);
-
- _this = _super.call(this, scorm12_error_codes, finalSettings);
- _this.cmi = new _scorm12_cmi.CMI();
- _this.nav = new _scorm12_cmi.NAV(); // Rename functions to match 1.2 Spec and expose to modules
-
- _this.LMSInitialize = _this.lmsInitialize;
- _this.LMSFinish = _this.lmsFinish;
- _this.LMSGetValue = _this.lmsGetValue;
- _this.LMSSetValue = _this.lmsSetValue;
- _this.LMSCommit = _this.lmsCommit;
- _this.LMSGetLastError = _this.lmsGetLastError;
- _this.LMSGetErrorString = _this.lmsGetErrorString;
- _this.LMSGetDiagnostic = _this.lmsGetDiagnostic;
- return _this;
- }
- /**
- * lmsInitialize function from SCORM 1.2 Spec
- *
- * @return {string} bool
- */
-
-
- _createClass(Scorm12API, [{
- key: "lmsInitialize",
- value: function lmsInitialize() {
- this.cmi.initialize();
- return this.initialize('LMSInitialize', 'LMS was already initialized!', 'LMS is already finished!');
- }
- /**
- * LMSFinish function from SCORM 1.2 Spec
- *
- * @return {string} bool
- */
-
- }, {
- key: "lmsFinish",
- value: function lmsFinish() {
- var result = this.terminate('LMSFinish', true);
-
- if (result === global_constants.SCORM_TRUE) {
- if (this.nav.event !== '') {
- if (this.nav.event === 'continue') {
- this.processListeners('SequenceNext');
- } else {
- this.processListeners('SequencePrevious');
- }
- } else if (this.settings.autoProgress) {
- this.processListeners('SequenceNext');
- }
- }
-
- return result;
- }
- /**
- * LMSGetValue function from SCORM 1.2 Spec
- *
- * @param {string} CMIElement
- * @return {string}
- */
-
- }, {
- key: "lmsGetValue",
- value: function lmsGetValue(CMIElement) {
- return this.getValue('LMSGetValue', false, CMIElement);
- }
- /**
- * LMSSetValue function from SCORM 1.2 Spec
- *
- * @param {string} CMIElement
- * @param {*} value
- * @return {string}
- */
-
- }, {
- key: "lmsSetValue",
- value: function lmsSetValue(CMIElement, value) {
- return this.setValue('LMSSetValue', 'LMSCommit', false, CMIElement, value);
- }
- /**
- * LMSCommit function from SCORM 1.2 Spec
- *
- * @return {string} bool
- */
-
- }, {
- key: "lmsCommit",
- value: function lmsCommit() {
- return this.commit('LMSCommit', false);
- }
- /**
- * LMSGetLastError function from SCORM 1.2 Spec
- *
- * @return {string}
- */
-
- }, {
- key: "lmsGetLastError",
- value: function lmsGetLastError() {
- return this.getLastError('LMSGetLastError');
- }
- /**
- * LMSGetErrorString function from SCORM 1.2 Spec
- *
- * @param {string} CMIErrorCode
- * @return {string}
- */
-
- }, {
- key: "lmsGetErrorString",
- value: function lmsGetErrorString(CMIErrorCode) {
- return this.getErrorString('LMSGetErrorString', CMIErrorCode);
- }
- /**
- * LMSGetDiagnostic function from SCORM 1.2 Spec
- *
- * @param {string} CMIErrorCode
- * @return {string}
- */
-
- }, {
- key: "lmsGetDiagnostic",
- value: function lmsGetDiagnostic(CMIErrorCode) {
- return this.getDiagnostic('LMSGetDiagnostic', CMIErrorCode);
- }
- /**
- * Sets a value on the CMI Object
- *
- * @param {string} CMIElement
- * @param {*} value
- * @return {string}
- */
-
- }, {
- key: "setCMIValue",
- value: function setCMIValue(CMIElement, value) {
- return this._commonSetCMIValue('LMSSetValue', false, CMIElement, value);
- }
- /**
- * Gets a value from the CMI Object
- *
- * @param {string} CMIElement
- * @return {*}
- */
-
- }, {
- key: "getCMIValue",
- value: function getCMIValue(CMIElement) {
- return this._commonGetCMIValue('getCMIValue', false, CMIElement);
- }
- /**
- * Gets or builds a new child element to add to the array.
- *
- * @param {string} CMIElement
- * @param {*} value
- * @param {boolean} foundFirstIndex
- * @return {object}
- */
-
- }, {
- key: "getChildElement",
- value: function getChildElement(CMIElement, value, foundFirstIndex) {
- var newChild;
-
- if (this.stringMatches(CMIElement, 'cmi\\.objectives\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIObjectivesObject();
- } else if (foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+\\.correct_responses\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIInteractionsCorrectResponsesObject();
- } else if (foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+\\.objectives\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIInteractionsObjectivesObject();
- } else if (!foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIInteractionsObject();
- }
-
- return newChild;
- }
- /**
- * Validates Correct Response values
- *
- * @param {string} CMIElement
- * @param {*} value
- * @return {boolean}
- */
-
- }, {
- key: "validateCorrectResponse",
- value: function validateCorrectResponse(CMIElement, value) {
- return true;
- }
- /**
- * Returns the message that corresponds to errorNumber.
- *
- * @param {*} errorNumber
- * @param {boolean} detail
- * @return {string}
- */
-
- }, {
- key: "getLmsErrorMessageDetails",
- value: function getLmsErrorMessageDetails(errorNumber, detail) {
- var basicMessage = 'No Error';
- var detailMessage = 'No Error'; // Set error number to string since inconsistent from modules if string or number
-
- errorNumber = String(errorNumber);
-
- if (scorm12_constants.error_descriptions[errorNumber]) {
- basicMessage = scorm12_constants.error_descriptions[errorNumber].basicMessage;
- detailMessage = scorm12_constants.error_descriptions[errorNumber].detailMessage;
- }
-
- return detail ? detailMessage : basicMessage;
- }
- /**
- * Replace the whole API with another
- *
- * @param {Scorm12API} newAPI
- */
-
- }, {
- key: "replaceWithAnotherScormAPI",
- value: function replaceWithAnotherScormAPI(newAPI) {
- // Data Model
- this.cmi = newAPI.cmi;
- }
- /**
- * Render the cmi object to the proper format for LMS commit
- *
- * @param {boolean} terminateCommit
- * @return {object|Array}
- */
-
- }, {
- key: "renderCommitCMI",
- value: function renderCommitCMI(terminateCommit) {
- var cmiExport = this.renderCMIToJSONObject();
-
- if (terminateCommit) {
- cmiExport.cmi.core.total_time = this.cmi.getCurrentTotalTime();
- }
-
- var result = [];
- var flattened = Utilities.flatten(cmiExport);
-
- switch (this.settings.dataCommitFormat) {
- case 'flattened':
- return Utilities.flatten(cmiExport);
-
- case 'params':
- for (var item in flattened) {
- if ({}.hasOwnProperty.call(flattened, item)) {
- result.push("".concat(item, "=").concat(flattened[item]));
- }
- }
-
- return result;
-
- case 'json':
- default:
- return cmiExport;
- }
- }
- /**
- * Attempts to store the data to the LMS
- *
- * @param {boolean} terminateCommit
- * @return {string}
- */
-
- }, {
- key: "storeData",
- value: function storeData(terminateCommit) {
- if (terminateCommit) {
- var originalStatus = this.cmi.core.lesson_status;
-
- if (originalStatus === 'not attempted') {
- this.cmi.core.lesson_status = 'completed';
- }
-
- if (this.cmi.core.lesson_mode === 'normal') {
- if (this.cmi.core.credit === 'credit') {
- if (this.settings.mastery_override && this.cmi.student_data.mastery_score !== '' && this.cmi.core.score.raw !== '') {
- if (parseFloat(this.cmi.core.score.raw) >= parseFloat(this.cmi.student_data.mastery_score)) {
- this.cmi.core.lesson_status = 'passed';
- } else {
- this.cmi.core.lesson_status = 'failed';
- }
- }
- }
- } else if (this.cmi.core.lesson_mode === 'browse') {
- var _this$startingData, _this$startingData$cm, _this$startingData$cm2;
-
- if ((((_this$startingData = this.startingData) === null || _this$startingData === void 0 ? void 0 : (_this$startingData$cm = _this$startingData.cmi) === null || _this$startingData$cm === void 0 ? void 0 : (_this$startingData$cm2 = _this$startingData$cm.core) === null || _this$startingData$cm2 === void 0 ? void 0 : _this$startingData$cm2.lesson_status) || '') === '' && originalStatus === 'not attempted') {
- this.cmi.core.lesson_status = 'browsed';
- }
- }
- }
-
- var commitObject = this.renderCommitCMI(terminateCommit || this.settings.alwaysSendTotalTime);
-
- if (this.apiLogLevel === global_constants.LOG_LEVEL_DEBUG) {
- console.debug('Commit (terminated: ' + (terminateCommit ? 'yes' : 'no') + '): ');
- console.debug(commitObject);
- }
-
- if (this.settings.lmsCommitUrl) {
- return this.processHttpRequest(this.settings.lmsCommitUrl, commitObject, terminateCommit);
- } else {
- return global_constants.SCORM_TRUE;
- }
- }
- }]);
-
- return Scorm12API;
-}(_BaseAPI2["default"]);
-
-exports["default"] = Scorm12API;
-
-},{"./BaseAPI":3,"./cmi/scorm12_cmi":8,"./constants/api_constants":10,"./constants/error_codes":11,"./utilities":17}],5:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _BaseAPI2 = _interopRequireDefault(require("./BaseAPI"));
-
-var _scorm2004_cmi = require("./cmi/scorm2004_cmi");
-
-var Utilities = _interopRequireWildcard(require("./utilities"));
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("./constants/error_codes"));
-
-var _response_constants = _interopRequireDefault(require("./constants/response_constants"));
-
-var _language_constants = _interopRequireDefault(require("./constants/language_constants"));
-
-var _regex = _interopRequireDefault(require("./constants/regex"));
-
-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; }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
-
-function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
-
-function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
-
-function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
-
-function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-
-var scorm2004_constants = _api_constants["default"].scorm2004;
-var global_constants = _api_constants["default"].global;
-var scorm2004_error_codes = _error_codes["default"].scorm2004;
-var correct_responses = _response_constants["default"].correct;
-var scorm2004_regex = _regex["default"].scorm2004;
-/**
- * API class for SCORM 2004
- */
-
-var _version = /*#__PURE__*/new WeakMap();
-
-var Scorm2004API = /*#__PURE__*/function (_BaseAPI) {
- _inherits(Scorm2004API, _BaseAPI);
-
- var _super = _createSuper(Scorm2004API);
-
- /**
- * Constructor for SCORM 2004 API
- * @param {object} settings
- */
- function Scorm2004API(settings) {
- var _this;
-
- _classCallCheck(this, Scorm2004API);
-
- var finalSettings = _objectSpread(_objectSpread({}, {
- mastery_override: false
- }), settings);
-
- _this = _super.call(this, scorm2004_error_codes, finalSettings);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _version, {
- writable: true,
- value: void 0
- });
-
- _defineProperty(_assertThisInitialized(_this), "checkDuplicatedPattern", function (correct_response, current_index, value) {
- var found = false;
- var count = correct_response._count;
-
- for (var i = 0; i < count && !found; i++) {
- if (i !== current_index && correct_response.childArray[i] === value) {
- found = true;
- }
- }
-
- return found;
- });
-
- _this.cmi = new _scorm2004_cmi.CMI();
- _this.adl = new _scorm2004_cmi.ADL(); // Rename functions to match 2004 Spec and expose to modules
-
- _this.Initialize = _this.lmsInitialize;
- _this.Terminate = _this.lmsTerminate;
- _this.GetValue = _this.lmsGetValue;
- _this.SetValue = _this.lmsSetValue;
- _this.Commit = _this.lmsCommit;
- _this.GetLastError = _this.lmsGetLastError;
- _this.GetErrorString = _this.lmsGetErrorString;
- _this.GetDiagnostic = _this.lmsGetDiagnostic;
- return _this;
- }
- /**
- * Getter for #version
- * @return {string}
- */
-
-
- _createClass(Scorm2004API, [{
- key: "version",
- get: function get() {
- return _classPrivateFieldGet(this, _version);
- }
- /**
- * @return {string} bool
- */
-
- }, {
- key: "lmsInitialize",
- value: function lmsInitialize() {
- this.cmi.initialize();
- return this.initialize('Initialize');
- }
- /**
- * @return {string} bool
- */
-
- }, {
- key: "lmsTerminate",
- value: function lmsTerminate() {
- var result = this.terminate('Terminate', true);
-
- if (result === global_constants.SCORM_TRUE) {
- if (this.adl.nav.request !== '_none_') {
- switch (this.adl.nav.request) {
- case 'continue':
- this.processListeners('SequenceNext');
- break;
-
- case 'previous':
- this.processListeners('SequencePrevious');
- break;
-
- case 'choice':
- this.processListeners('SequenceChoice');
- break;
-
- case 'exit':
- this.processListeners('SequenceExit');
- break;
-
- case 'exitAll':
- this.processListeners('SequenceExitAll');
- break;
-
- case 'abandon':
- this.processListeners('SequenceAbandon');
- break;
-
- case 'abandonAll':
- this.processListeners('SequenceAbandonAll');
- break;
- }
- } else if (this.settings.autoProgress) {
- this.processListeners('SequenceNext');
- }
- }
-
- return result;
- }
- /**
- * @param {string} CMIElement
- * @return {string}
- */
-
- }, {
- key: "lmsGetValue",
- value: function lmsGetValue(CMIElement) {
- return this.getValue('GetValue', true, CMIElement);
- }
- /**
- * @param {string} CMIElement
- * @param {any} value
- * @return {string}
- */
-
- }, {
- key: "lmsSetValue",
- value: function lmsSetValue(CMIElement, value) {
- return this.setValue('SetValue', 'Commit', true, CMIElement, value);
- }
- /**
- * Orders LMS to store all content parameters
- *
- * @return {string} bool
- */
-
- }, {
- key: "lmsCommit",
- value: function lmsCommit() {
- return this.commit('Commit');
- }
- /**
- * Returns last error code
- *
- * @return {string}
- */
-
- }, {
- key: "lmsGetLastError",
- value: function lmsGetLastError() {
- return this.getLastError('GetLastError');
- }
- /**
- * Returns the errorNumber error description
- *
- * @param {(string|number)} CMIErrorCode
- * @return {string}
- */
-
- }, {
- key: "lmsGetErrorString",
- value: function lmsGetErrorString(CMIErrorCode) {
- return this.getErrorString('GetErrorString', CMIErrorCode);
- }
- /**
- * Returns a comprehensive description of the errorNumber error.
- *
- * @param {(string|number)} CMIErrorCode
- * @return {string}
- */
-
- }, {
- key: "lmsGetDiagnostic",
- value: function lmsGetDiagnostic(CMIErrorCode) {
- return this.getDiagnostic('GetDiagnostic', CMIErrorCode);
- }
- /**
- * Sets a value on the CMI Object
- *
- * @param {string} CMIElement
- * @param {any} value
- * @return {string}
- */
-
- }, {
- key: "setCMIValue",
- value: function setCMIValue(CMIElement, value) {
- return this._commonSetCMIValue('SetValue', true, CMIElement, value);
- }
- /**
- * Gets or builds a new child element to add to the array.
- *
- * @param {string} CMIElement
- * @param {any} value
- * @param {boolean} foundFirstIndex
- * @return {any}
- */
-
- }, {
- key: "getChildElement",
- value: function getChildElement(CMIElement, value, foundFirstIndex) {
- var newChild;
-
- if (this.stringMatches(CMIElement, 'cmi\\.objectives\\.\\d+')) {
- newChild = new _scorm2004_cmi.CMIObjectivesObject();
- } else if (foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+\\.correct_responses\\.\\d+')) {
- var parts = CMIElement.split('.');
- var index = Number(parts[2]);
- var interaction = this.cmi.interactions.childArray[index];
-
- if (this.isInitialized()) {
- if (!interaction.type) {
- this.throwSCORMError(scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);
- } else {
- this.checkDuplicateChoiceResponse(interaction, value);
- var response_type = correct_responses[interaction.type];
-
- if (response_type) {
- this.checkValidResponseType(response_type, value, interaction.type);
- } else {
- this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE, 'Incorrect Response Type: ' + interaction.type);
- }
- }
- }
-
- if (this.lastErrorCode === 0) {
- newChild = new _scorm2004_cmi.CMIInteractionsCorrectResponsesObject();
- }
- } else if (foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+\\.objectives\\.\\d+')) {
- newChild = new _scorm2004_cmi.CMIInteractionsObjectivesObject();
- } else if (!foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+')) {
- newChild = new _scorm2004_cmi.CMIInteractionsObject();
- } else if (this.stringMatches(CMIElement, 'cmi\\.comments_from_learner\\.\\d+')) {
- newChild = new _scorm2004_cmi.CMICommentsObject();
- } else if (this.stringMatches(CMIElement, 'cmi\\.comments_from_lms\\.\\d+')) {
- newChild = new _scorm2004_cmi.CMICommentsObject(true);
- }
-
- return newChild;
- }
- /**
- * Checks for valid response types
- * @param {object} response_type
- * @param {any} value
- * @param {string} interaction_type
- */
-
- }, {
- key: "checkValidResponseType",
- value: function checkValidResponseType(response_type, value, interaction_type) {
- var nodes = [];
-
- if (response_type !== null && response_type !== void 0 && response_type.delimiter) {
- nodes = String(value).split(response_type.delimiter);
- } else {
- nodes[0] = value;
- }
-
- if (nodes.length > 0 && nodes.length <= response_type.max) {
- this.checkCorrectResponseValue(interaction_type, nodes, value);
- } else if (nodes.length > response_type.max) {
- this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE, 'Data Model Element Pattern Too Long');
- }
- }
- /**
- * Checks for duplicate 'choice' responses.
- * @param {CMIInteractionsObject} interaction
- * @param {any} value
- */
-
- }, {
- key: "checkDuplicateChoiceResponse",
- value: function checkDuplicateChoiceResponse(interaction, value) {
- var interaction_count = interaction.correct_responses._count;
-
- if (interaction.type === 'choice') {
- for (var i = 0; i < interaction_count && this.lastErrorCode === 0; i++) {
- var response = interaction.correct_responses.childArray[i];
-
- if (response.pattern === value) {
- this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE);
- }
- }
- }
- }
- /**
- * Validate correct response.
- * @param {string} CMIElement
- * @param {*} value
- */
-
- }, {
- key: "validateCorrectResponse",
- value: function validateCorrectResponse(CMIElement, value) {
- var parts = CMIElement.split('.');
- var index = Number(parts[2]);
- var pattern_index = Number(parts[4]);
- var interaction = this.cmi.interactions.childArray[index];
- var interaction_count = interaction.correct_responses._count;
- this.checkDuplicateChoiceResponse(interaction, value);
- var response_type = correct_responses[interaction.type];
-
- if (typeof response_type.limit === 'undefined' || interaction_count <= response_type.limit) {
- this.checkValidResponseType(response_type, value, interaction.type);
-
- if (this.lastErrorCode === 0 && (!response_type.duplicate || !this.checkDuplicatedPattern(interaction.correct_responses, pattern_index, value)) || this.lastErrorCode === 0 && value === '') {// do nothing, we want the inverse
- } else {
- if (this.lastErrorCode === 0) {
- this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE, 'Data Model Element Pattern Already Exists');
- }
- }
- } else {
- this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE, 'Data Model Element Collection Limit Reached');
- }
- }
- /**
- * Gets a value from the CMI Object
- *
- * @param {string} CMIElement
- * @return {*}
- */
-
- }, {
- key: "getCMIValue",
- value: function getCMIValue(CMIElement) {
- return this._commonGetCMIValue('GetValue', true, CMIElement);
- }
- /**
- * Returns the message that corresponds to errorNumber.
- *
- * @param {(string|number)} errorNumber
- * @param {boolean} detail
- * @return {string}
- */
-
- }, {
- key: "getLmsErrorMessageDetails",
- value: function getLmsErrorMessageDetails(errorNumber, detail) {
- var basicMessage = '';
- var detailMessage = ''; // Set error number to string since inconsistent from modules if string or number
-
- errorNumber = String(errorNumber);
-
- if (scorm2004_constants.error_descriptions[errorNumber]) {
- basicMessage = scorm2004_constants.error_descriptions[errorNumber].basicMessage;
- detailMessage = scorm2004_constants.error_descriptions[errorNumber].detailMessage;
- }
-
- return detail ? detailMessage : basicMessage;
- }
- /**
- * Check to see if a correct_response value has been duplicated
- * @param {CMIArray} correct_response
- * @param {number} current_index
- * @param {*} value
- * @return {boolean}
- */
-
- }, {
- key: "checkCorrectResponseValue",
- value:
- /**
- * Checks for a valid correct_response value
- * @param {string} interaction_type
- * @param {Array} nodes
- * @param {*} value
- */
- function checkCorrectResponseValue(interaction_type, nodes, value) {
- var response = correct_responses[interaction_type];
- var formatRegex = new RegExp(response.format);
-
- for (var i = 0; i < nodes.length && this.lastErrorCode === 0; i++) {
- if (interaction_type.match('^(fill-in|long-fill-in|matching|performance|sequencing)$')) {
- nodes[i] = this.removeCorrectResponsePrefixes(nodes[i]);
- }
-
- if (response !== null && response !== void 0 && response.delimiter2) {
- var values = nodes[i].split(response.delimiter2);
-
- if (values.length === 2) {
- var matches = values[0].match(formatRegex);
-
- if (!matches) {
- this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);
- } else {
- if (!values[1].match(new RegExp(response.format2))) {
- this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);
- }
- }
- } else {
- this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);
- }
- } else {
- var _matches = nodes[i].match(formatRegex);
-
- if (!_matches && value !== '' || !_matches && interaction_type === 'true-false') {
- this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);
- } else {
- if (interaction_type === 'numeric' && nodes.length > 1) {
- if (Number(nodes[0]) > Number(nodes[1])) {
- this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);
- }
- } else {
- if (nodes[i] !== '' && response.unique) {
- for (var j = 0; j < i && this.lastErrorCode === 0; j++) {
- if (nodes[i] === nodes[j]) {
- this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);
- }
- }
- }
- }
- }
- }
- }
- }
- /**
- * Remove prefixes from correct_response
- * @param {string} node
- * @return {*}
- */
-
- }, {
- key: "removeCorrectResponsePrefixes",
- value: function removeCorrectResponsePrefixes(node) {
- var seenOrder = false;
- var seenCase = false;
- var seenLang = false;
- var prefixRegex = new RegExp('^({(lang|case_matters|order_matters)=([^}]+)})');
- var matches = node.match(prefixRegex);
- var langMatches = null;
-
- while (matches) {
- switch (matches[2]) {
- case 'lang':
- langMatches = node.match(scorm2004_regex.CMILangcr);
-
- if (langMatches) {
- var lang = langMatches[3];
-
- if (lang !== undefined && lang.length > 0) {
- if (_language_constants["default"][lang.toLowerCase()] === undefined) {
- this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);
- }
- }
- }
-
- seenLang = true;
- break;
-
- case 'case_matters':
- if (!seenLang && !seenOrder && !seenCase) {
- if (matches[3] !== 'true' && matches[3] !== 'false') {
- this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);
- }
- }
-
- seenCase = true;
- break;
-
- case 'order_matters':
- if (!seenCase && !seenLang && !seenOrder) {
- if (matches[3] !== 'true' && matches[3] !== 'false') {
- this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);
- }
- }
-
- seenOrder = true;
- break;
-
- default:
- break;
- }
-
- node = node.substr(matches[1].length);
- matches = node.match(prefixRegex);
- }
-
- return node;
- }
- /**
- * Replace the whole API with another
- * @param {Scorm2004API} newAPI
- */
-
- }, {
- key: "replaceWithAnotherScormAPI",
- value: function replaceWithAnotherScormAPI(newAPI) {
- // Data Model
- this.cmi = newAPI.cmi;
- this.adl = newAPI.adl;
- }
- /**
- * Render the cmi object to the proper format for LMS commit
- *
- * @param {boolean} terminateCommit
- * @return {object|Array}
- */
-
- }, {
- key: "renderCommitCMI",
- value: function renderCommitCMI(terminateCommit) {
- var cmiExport = this.renderCMIToJSONObject();
-
- if (terminateCommit) {
- cmiExport.cmi.total_time = this.cmi.getCurrentTotalTime();
- }
-
- var result = [];
- var flattened = Utilities.flatten(cmiExport);
-
- switch (this.settings.dataCommitFormat) {
- case 'flattened':
- return Utilities.flatten(cmiExport);
-
- case 'params':
- for (var item in flattened) {
- if ({}.hasOwnProperty.call(flattened, item)) {
- result.push("".concat(item, "=").concat(flattened[item]));
- }
- }
-
- return result;
-
- case 'json':
- default:
- return cmiExport;
- }
- }
- /**
- * Attempts to store the data to the LMS
- *
- * @param {boolean} terminateCommit
- * @return {string}
- */
-
- }, {
- key: "storeData",
- value: function storeData(terminateCommit) {
- var _this$startingData, _this$startingData$ad, _this$startingData$ad2;
-
- if (terminateCommit) {
- if (this.cmi.mode === 'normal') {
- if (this.cmi.credit === 'credit') {
- if (this.cmi.completion_threshold && this.cmi.progress_measure) {
- if (this.cmi.progress_measure >= this.cmi.completion_threshold) {
- console.debug('Setting Completion Status: Completed');
- this.cmi.completion_status = 'completed';
- } else {
- console.debug('Setting Completion Status: Incomplete');
- this.cmi.completion_status = 'incomplete';
- }
- }
-
- if (this.cmi.scaled_passing_score && this.cmi.score.scaled) {
- if (this.cmi.score.scaled >= this.cmi.scaled_passing_score) {
- console.debug('Setting Success Status: Passed');
- this.cmi.success_status = 'passed';
- } else {
- console.debug('Setting Success Status: Failed');
- this.cmi.success_status = 'failed';
- }
- }
- }
- }
- }
-
- var navRequest = false;
-
- if (this.adl.nav.request !== ((_this$startingData = this.startingData) === null || _this$startingData === void 0 ? void 0 : (_this$startingData$ad = _this$startingData.adl) === null || _this$startingData$ad === void 0 ? void 0 : (_this$startingData$ad2 = _this$startingData$ad.nav) === null || _this$startingData$ad2 === void 0 ? void 0 : _this$startingData$ad2.request) && this.adl.nav.request !== '_none_') {
- this.adl.nav.request = encodeURIComponent(this.adl.nav.request);
- navRequest = true;
- }
-
- var commitObject = this.renderCommitCMI(terminateCommit || this.settings.alwaysSendTotalTime);
-
- if (this.apiLogLevel === global_constants.LOG_LEVEL_DEBUG) {
- console.debug('Commit (terminated: ' + (terminateCommit ? 'yes' : 'no') + '): ');
- console.debug(commitObject);
- }
-
- if (this.settings.lmsCommitUrl) {
- var result = this.processHttpRequest(this.settings.lmsCommitUrl, commitObject, terminateCommit); // check if this is a sequencing call, and then call the necessary JS
-
- {
- if (navRequest && result.navRequest !== undefined && result.navRequest !== '') {
- Function("\"use strict\";(() => { ".concat(result.navRequest, " })()"))();
- }
- }
- return result;
- } else {
- return global_constants.SCORM_TRUE;
- }
- }
- }]);
-
- return Scorm2004API;
-}(_BaseAPI2["default"]);
-
-exports["default"] = Scorm2004API;
-
-},{"./BaseAPI":3,"./cmi/scorm2004_cmi":9,"./constants/api_constants":10,"./constants/error_codes":11,"./constants/language_constants":12,"./constants/regex":13,"./constants/response_constants":14,"./utilities":17}],6:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.CMITriesObject = exports.CMITries = exports.CMIStudentDemographics = exports.CMIPathsObject = exports.CMIPaths = exports.CMIEvaluationCommentsObject = exports.CMIAttemptRecordsObject = exports.CMIAttemptRecords = exports.CMI = void 0;
-
-var Scorm12CMI = _interopRequireWildcard(require("./scorm12_cmi"));
-
-var _common = require("./common");
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _exceptions = require("../exceptions");
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-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; }
-
-function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
-
-function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
-
-function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
-
-function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-
-function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
-
-function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
-
-function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); }
-
-function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-var aicc_constants = _api_constants["default"].aicc;
-var aicc_regex = _regex["default"].aicc;
-var aicc_error_codes = _error_codes["default"].scorm12;
-/**
- * Helper method for throwing Read Only error
- */
-
-function throwReadOnlyError() {
- throw new _exceptions.AICCValidationError(aicc_error_codes.READ_ONLY_ELEMENT);
-}
-/**
- * Helper method, no reason to have to pass the same error codes every time
- * @param {*} value
- * @param {string} regexPattern
- * @param {boolean} allowEmptyString
- * @return {boolean}
- */
-
-
-function checkAICCValidFormat(value, regexPattern, allowEmptyString) {
- return (0, _common.checkValidFormat)(value, regexPattern, aicc_error_codes.TYPE_MISMATCH, _exceptions.AICCValidationError, allowEmptyString);
-}
-/**
- * CMI Class for AICC
- */
-
-
-var CMI = /*#__PURE__*/function (_Scorm12CMI$CMI) {
- _inherits(CMI, _Scorm12CMI$CMI);
-
- var _super = _createSuper(CMI);
-
- /**
- * Constructor for AICC CMI object
- * @param {boolean} initialized
- */
- function CMI(initialized) {
- var _this;
-
- _classCallCheck(this, CMI);
-
- _this = _super.call(this, aicc_constants.cmi_children);
- if (initialized) _this.initialize();
- _this.student_preference = new AICCStudentPreferences();
- _this.student_data = new AICCCMIStudentData();
- _this.student_demographics = new CMIStudentDemographics();
- _this.evaluation = new CMIEvaluation();
- _this.paths = new CMIPaths();
- return _this;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(CMI, [{
- key: "initialize",
- value: function initialize() {
- var _this$student_prefere, _this$student_data, _this$student_demogra, _this$evaluation, _this$paths;
-
- _get(_getPrototypeOf(CMI.prototype), "initialize", this).call(this);
-
- (_this$student_prefere = this.student_preference) === null || _this$student_prefere === void 0 ? void 0 : _this$student_prefere.initialize();
- (_this$student_data = this.student_data) === null || _this$student_data === void 0 ? void 0 : _this$student_data.initialize();
- (_this$student_demogra = this.student_demographics) === null || _this$student_demogra === void 0 ? void 0 : _this$student_demogra.initialize();
- (_this$evaluation = this.evaluation) === null || _this$evaluation === void 0 ? void 0 : _this$evaluation.initialize();
- (_this$paths = this.paths) === null || _this$paths === void 0 ? void 0 : _this$paths.initialize();
- }
- /**
- * toJSON for cmi
- *
- * @return {
- * {
- * suspend_data: string,
- * launch_data: string,
- * comments: string,
- * comments_from_lms: string,
- * core: CMICore,
- * objectives: CMIObjectives,
- * student_data: CMIStudentData,
- * student_preference: CMIStudentPreference,
- * interactions: CMIInteractions,
- * paths: CMIPaths
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'suspend_data': this.suspend_data,
- 'launch_data': this.launch_data,
- 'comments': this.comments,
- 'comments_from_lms': this.comments_from_lms,
- 'core': this.core,
- 'objectives': this.objectives,
- 'student_data': this.student_data,
- 'student_preference': this.student_preference,
- 'student_demographics': this.student_demographics,
- 'interactions': this.interactions,
- 'evaluation': this.evaluation,
- 'paths': this.paths
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMI;
-}(Scorm12CMI.CMI);
-/**
- * AICC Evaluation object
- */
-
-
-exports.CMI = CMI;
-
-var CMIEvaluation = /*#__PURE__*/function (_BaseCMI) {
- _inherits(CMIEvaluation, _BaseCMI);
-
- var _super2 = _createSuper(CMIEvaluation);
-
- /**
- * Constructor for AICC Evaluation object
- */
- function CMIEvaluation() {
- var _this2;
-
- _classCallCheck(this, CMIEvaluation);
-
- _this2 = _super2.call(this);
- _this2.comments = new CMIEvaluationComments();
- return _this2;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(CMIEvaluation, [{
- key: "initialize",
- value: function initialize() {
- var _this$comments;
-
- _get(_getPrototypeOf(CMIEvaluation.prototype), "initialize", this).call(this);
-
- (_this$comments = this.comments) === null || _this$comments === void 0 ? void 0 : _this$comments.initialize();
- }
- /**
- * toJSON for cmi.evaluation object
- * @return {{comments: CMIEvaluationComments}}
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'comments': this.comments
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIEvaluation;
-}(_common.BaseCMI);
-/**
- * Class representing AICC's cmi.evaluation.comments object
- */
-
-
-var CMIEvaluationComments = /*#__PURE__*/function (_CMIArray) {
- _inherits(CMIEvaluationComments, _CMIArray);
-
- var _super3 = _createSuper(CMIEvaluationComments);
-
- /**
- * Constructor for AICC Evaluation Comments object
- */
- function CMIEvaluationComments() {
- _classCallCheck(this, CMIEvaluationComments);
-
- return _super3.call(this, {
- children: aicc_constants.comments_children,
- errorCode: aicc_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.AICCValidationError
- });
- }
-
- return _createClass(CMIEvaluationComments);
-}(_common.CMIArray);
-/**
- * StudentPreferences class for AICC
- */
-
-
-var _lesson_type = /*#__PURE__*/new WeakMap();
-
-var _text_color = /*#__PURE__*/new WeakMap();
-
-var _text_location = /*#__PURE__*/new WeakMap();
-
-var _text_size = /*#__PURE__*/new WeakMap();
-
-var _video = /*#__PURE__*/new WeakMap();
-
-var AICCStudentPreferences = /*#__PURE__*/function (_Scorm12CMI$CMIStuden) {
- _inherits(AICCStudentPreferences, _Scorm12CMI$CMIStuden);
-
- var _super4 = _createSuper(AICCStudentPreferences);
-
- /**
- * Constructor for AICC Student Preferences object
- */
- function AICCStudentPreferences() {
- var _this3;
-
- _classCallCheck(this, AICCStudentPreferences);
-
- _this3 = _super4.call(this, aicc_constants.student_preference_children);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _lesson_type, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _text_color, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _text_location, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _text_size, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _video, {
- writable: true,
- value: ''
- });
-
- _this3.windows = new _common.CMIArray({
- errorCode: aicc_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.AICCValidationError,
- children: ''
- });
- return _this3;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(AICCStudentPreferences, [{
- key: "initialize",
- value: function initialize() {
- var _this$windows;
-
- _get(_getPrototypeOf(AICCStudentPreferences.prototype), "initialize", this).call(this);
-
- (_this$windows = this.windows) === null || _this$windows === void 0 ? void 0 : _this$windows.initialize();
- }
- }, {
- key: "lesson_type",
- get:
- /**
- * Getter for #lesson_type
- * @return {string}
- */
- function get() {
- return _classPrivateFieldGet(this, _lesson_type);
- }
- /**
- * Setter for #lesson_type
- * @param {string} lesson_type
- */
- ,
- set: function set(lesson_type) {
- if (checkAICCValidFormat(lesson_type, aicc_regex.CMIString256)) {
- _classPrivateFieldSet(this, _lesson_type, lesson_type);
- }
- }
- /**
- * Getter for #text_color
- * @return {string}
- */
-
- }, {
- key: "text_color",
- get: function get() {
- return _classPrivateFieldGet(this, _text_color);
- }
- /**
- * Setter for #text_color
- * @param {string} text_color
- */
- ,
- set: function set(text_color) {
- if (checkAICCValidFormat(text_color, aicc_regex.CMIString256)) {
- _classPrivateFieldSet(this, _text_color, text_color);
- }
- }
- /**
- * Getter for #text_location
- * @return {string}
- */
-
- }, {
- key: "text_location",
- get: function get() {
- return _classPrivateFieldGet(this, _text_location);
- }
- /**
- * Setter for #text_location
- * @param {string} text_location
- */
- ,
- set: function set(text_location) {
- if (checkAICCValidFormat(text_location, aicc_regex.CMIString256)) {
- _classPrivateFieldSet(this, _text_location, text_location);
- }
- }
- /**
- * Getter for #text_size
- * @return {string}
- */
-
- }, {
- key: "text_size",
- get: function get() {
- return _classPrivateFieldGet(this, _text_size);
- }
- /**
- * Setter for #text_size
- * @param {string} text_size
- */
- ,
- set: function set(text_size) {
- if (checkAICCValidFormat(text_size, aicc_regex.CMIString256)) {
- _classPrivateFieldSet(this, _text_size, text_size);
- }
- }
- /**
- * Getter for #video
- * @return {string}
- */
-
- }, {
- key: "video",
- get: function get() {
- return _classPrivateFieldGet(this, _video);
- }
- /**
- * Setter for #video
- * @param {string} video
- */
- ,
- set: function set(video) {
- if (checkAICCValidFormat(video, aicc_regex.CMIString256)) {
- _classPrivateFieldSet(this, _video, video);
- }
- }
- /**
- * toJSON for cmi.student_preference
- *
- * @return {
- * {
- * audio: string,
- * language: string,
- * speed: string,
- * text: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'audio': this.audio,
- 'language': this.language,
- 'lesson_type': this.lesson_type,
- 'speed': this.speed,
- 'text': this.text,
- 'text_color': this.text_color,
- 'text_location': this.text_location,
- 'text_size': this.text_size,
- 'video': this.video,
- 'windows': this.windows
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return AICCStudentPreferences;
-}(Scorm12CMI.CMIStudentPreference);
-/**
- * StudentData class for AICC
- */
-
-
-var _tries_during_lesson = /*#__PURE__*/new WeakMap();
-
-var AICCCMIStudentData = /*#__PURE__*/function (_Scorm12CMI$CMIStuden2) {
- _inherits(AICCCMIStudentData, _Scorm12CMI$CMIStuden2);
-
- var _super5 = _createSuper(AICCCMIStudentData);
-
- /**
- * Constructor for AICC StudentData object
- */
- function AICCCMIStudentData() {
- var _this4;
-
- _classCallCheck(this, AICCCMIStudentData);
-
- _this4 = _super5.call(this, aicc_constants.student_data_children);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _tries_during_lesson, {
- writable: true,
- value: ''
- });
-
- _this4.tries = new CMITries();
- return _this4;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(AICCCMIStudentData, [{
- key: "initialize",
- value: function initialize() {
- var _this$tries;
-
- _get(_getPrototypeOf(AICCCMIStudentData.prototype), "initialize", this).call(this);
-
- (_this$tries = this.tries) === null || _this$tries === void 0 ? void 0 : _this$tries.initialize();
- }
- }, {
- key: "tries_during_lesson",
- get:
- /**
- * Getter for tries_during_lesson
- * @return {string}
- */
- function get() {
- return _classPrivateFieldGet(this, _tries_during_lesson);
- }
- /**
- * Setter for #tries_during_lesson. Sets an error if trying to set after
- * initialization.
- * @param {string} tries_during_lesson
- */
- ,
- set: function set(tries_during_lesson) {
- !this.initialized ? _classPrivateFieldSet(this, _tries_during_lesson, tries_during_lesson) : throwReadOnlyError();
- }
- /**
- * toJSON for cmi.student_data object
- * @return {
- * {
- * mastery_score: string,
- * max_time_allowed: string,
- * time_limit_action: string,
- * tries: CMITries
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'mastery_score': this.mastery_score,
- 'max_time_allowed': this.max_time_allowed,
- 'time_limit_action': this.time_limit_action,
- 'tries': this.tries
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return AICCCMIStudentData;
-}(Scorm12CMI.CMIStudentData);
-/**
- * Class representing the AICC cmi.student_demographics object
- */
-
-
-var _children = /*#__PURE__*/new WeakMap();
-
-var _city = /*#__PURE__*/new WeakMap();
-
-var _class = /*#__PURE__*/new WeakMap();
-
-var _company = /*#__PURE__*/new WeakMap();
-
-var _country = /*#__PURE__*/new WeakMap();
-
-var _experience = /*#__PURE__*/new WeakMap();
-
-var _familiar_name = /*#__PURE__*/new WeakMap();
-
-var _instructor_name = /*#__PURE__*/new WeakMap();
-
-var _title = /*#__PURE__*/new WeakMap();
-
-var _native_language = /*#__PURE__*/new WeakMap();
-
-var _state = /*#__PURE__*/new WeakMap();
-
-var _street_address = /*#__PURE__*/new WeakMap();
-
-var _telephone = /*#__PURE__*/new WeakMap();
-
-var _years_experience = /*#__PURE__*/new WeakMap();
-
-var CMIStudentDemographics = /*#__PURE__*/function (_BaseCMI2) {
- _inherits(CMIStudentDemographics, _BaseCMI2);
-
- var _super6 = _createSuper(CMIStudentDemographics);
-
- /**
- * Constructor for AICC StudentDemographics object
- */
- function CMIStudentDemographics() {
- var _this5;
-
- _classCallCheck(this, CMIStudentDemographics);
-
- _this5 = _super6.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _children, {
- writable: true,
- value: aicc_constants.student_demographics_children
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _city, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _class, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _company, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _country, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _experience, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _familiar_name, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _instructor_name, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _title, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _native_language, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _state, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _street_address, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _telephone, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _years_experience, {
- writable: true,
- value: ''
- });
-
- return _this5;
- }
-
- _createClass(CMIStudentDemographics, [{
- key: "_children",
- get:
- /**
- * Getter for _children
- * @return {string}
- */
- function get() {
- return _classPrivateFieldGet(this, _children);
- }
- /**
- * Getter for city
- * @return {string}
- */
-
- }, {
- key: "city",
- get: function get() {
- return _classPrivateFieldGet(this, _city);
- }
- /**
- * Setter for #city. Sets an error if trying to set after
- * initialization.
- * @param {string} city
- */
- ,
- set: function set(city) {
- !this.initialized ? _classPrivateFieldSet(this, _city, city) : throwReadOnlyError();
- }
- /**
- * Getter for class
- * @return {string}
- */
-
- }, {
- key: "class",
- get: function get() {
- return _classPrivateFieldGet(this, _class);
- }
- /**
- * Setter for #class. Sets an error if trying to set after
- * initialization.
- * @param {string} clazz
- */
- ,
- set: function set(clazz) {
- !this.initialized ? _classPrivateFieldSet(this, _class, clazz) : throwReadOnlyError();
- }
- /**
- * Getter for company
- * @return {string}
- */
-
- }, {
- key: "company",
- get: function get() {
- return _classPrivateFieldGet(this, _company);
- }
- /**
- * Setter for #company. Sets an error if trying to set after
- * initialization.
- * @param {string} company
- */
- ,
- set: function set(company) {
- !this.initialized ? _classPrivateFieldSet(this, _company, company) : throwReadOnlyError();
- }
- /**
- * Getter for country
- * @return {string}
- */
-
- }, {
- key: "country",
- get: function get() {
- return _classPrivateFieldGet(this, _country);
- }
- /**
- * Setter for #country. Sets an error if trying to set after
- * initialization.
- * @param {string} country
- */
- ,
- set: function set(country) {
- !this.initialized ? _classPrivateFieldSet(this, _country, country) : throwReadOnlyError();
- }
- /**
- * Getter for experience
- * @return {string}
- */
-
- }, {
- key: "experience",
- get: function get() {
- return _classPrivateFieldGet(this, _experience);
- }
- /**
- * Setter for #experience. Sets an error if trying to set after
- * initialization.
- * @param {string} experience
- */
- ,
- set: function set(experience) {
- !this.initialized ? _classPrivateFieldSet(this, _experience, experience) : throwReadOnlyError();
- }
- /**
- * Getter for familiar_name
- * @return {string}
- */
-
- }, {
- key: "familiar_name",
- get: function get() {
- return _classPrivateFieldGet(this, _familiar_name);
- }
- /**
- * Setter for #familiar_name. Sets an error if trying to set after
- * initialization.
- * @param {string} familiar_name
- */
- ,
- set: function set(familiar_name) {
- !this.initialized ? _classPrivateFieldSet(this, _familiar_name, familiar_name) : throwReadOnlyError();
- }
- /**
- * Getter for instructor_name
- * @return {string}
- */
-
- }, {
- key: "instructor_name",
- get: function get() {
- return _classPrivateFieldGet(this, _instructor_name);
- }
- /**
- * Setter for #instructor_name. Sets an error if trying to set after
- * initialization.
- * @param {string} instructor_name
- */
- ,
- set: function set(instructor_name) {
- !this.initialized ? _classPrivateFieldSet(this, _instructor_name, instructor_name) : throwReadOnlyError();
- }
- /**
- * Getter for title
- * @return {string}
- */
-
- }, {
- key: "title",
- get: function get() {
- return _classPrivateFieldGet(this, _title);
- }
- /**
- * Setter for #title. Sets an error if trying to set after
- * initialization.
- * @param {string} title
- */
- ,
- set: function set(title) {
- !this.initialized ? _classPrivateFieldSet(this, _title, title) : throwReadOnlyError();
- }
- /**
- * Getter for native_language
- * @return {string}
- */
-
- }, {
- key: "native_language",
- get: function get() {
- return _classPrivateFieldGet(this, _native_language);
- }
- /**
- * Setter for #native_language. Sets an error if trying to set after
- * initialization.
- * @param {string} native_language
- */
- ,
- set: function set(native_language) {
- !this.initialized ? _classPrivateFieldSet(this, _native_language, native_language) : throwReadOnlyError();
- }
- /**
- * Getter for state
- * @return {string}
- */
-
- }, {
- key: "state",
- get: function get() {
- return _classPrivateFieldGet(this, _state);
- }
- /**
- * Setter for #state. Sets an error if trying to set after
- * initialization.
- * @param {string} state
- */
- ,
- set: function set(state) {
- !this.initialized ? _classPrivateFieldSet(this, _state, state) : throwReadOnlyError();
- }
- /**
- * Getter for street_address
- * @return {string}
- */
-
- }, {
- key: "street_address",
- get: function get() {
- return _classPrivateFieldGet(this, _street_address);
- }
- /**
- * Setter for #street_address. Sets an error if trying to set after
- * initialization.
- * @param {string} street_address
- */
- ,
- set: function set(street_address) {
- !this.initialized ? _classPrivateFieldSet(this, _street_address, street_address) : throwReadOnlyError();
- }
- /**
- * Getter for telephone
- * @return {string}
- */
-
- }, {
- key: "telephone",
- get: function get() {
- return _classPrivateFieldGet(this, _telephone);
- }
- /**
- * Setter for #telephone. Sets an error if trying to set after
- * initialization.
- * @param {string} telephone
- */
- ,
- set: function set(telephone) {
- !this.initialized ? _classPrivateFieldSet(this, _telephone, telephone) : throwReadOnlyError();
- }
- /**
- * Getter for years_experience
- * @return {string}
- */
-
- }, {
- key: "years_experience",
- get: function get() {
- return _classPrivateFieldGet(this, _years_experience);
- }
- /**
- * Setter for #years_experience. Sets an error if trying to set after
- * initialization.
- * @param {string} years_experience
- */
- ,
- set: function set(years_experience) {
- !this.initialized ? _classPrivateFieldSet(this, _years_experience, years_experience) : throwReadOnlyError();
- }
- /**
- * toJSON for cmi.student_demographics object
- * @return {
- * {
- * city: string,
- * class: string,
- * company: string,
- * country: string,
- * experience: string,
- * familiar_name: string,
- * instructor_name: string,
- * title: string,
- * native_language: string,
- * state: string,
- * street_address: string,
- * telephone: string,
- * years_experience: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'city': this.city,
- 'class': this["class"],
- 'company': this.company,
- 'country': this.country,
- 'experience': this.experience,
- 'familiar_name': this.familiar_name,
- 'instructor_name': this.instructor_name,
- 'title': this.title,
- 'native_language': this.native_language,
- 'state': this.state,
- 'street_address': this.street_address,
- 'telephone': this.telephone,
- 'years_experience': this.years_experience
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIStudentDemographics;
-}(_common.BaseCMI);
-/**
- * Class representing the AICC cmi.paths object
- */
-
-
-exports.CMIStudentDemographics = CMIStudentDemographics;
-
-var CMIPaths = /*#__PURE__*/function (_CMIArray2) {
- _inherits(CMIPaths, _CMIArray2);
-
- var _super7 = _createSuper(CMIPaths);
-
- /**
- * Constructor for inline Paths Array class
- */
- function CMIPaths() {
- _classCallCheck(this, CMIPaths);
-
- return _super7.call(this, {
- children: aicc_constants.paths_children
- });
- }
-
- return _createClass(CMIPaths);
-}(_common.CMIArray);
-/**
- * Class for AICC Paths
- */
-
-
-exports.CMIPaths = CMIPaths;
-
-var _location_id = /*#__PURE__*/new WeakMap();
-
-var _date = /*#__PURE__*/new WeakMap();
-
-var _time = /*#__PURE__*/new WeakMap();
-
-var _status = /*#__PURE__*/new WeakMap();
-
-var _why_left = /*#__PURE__*/new WeakMap();
-
-var _time_in_element = /*#__PURE__*/new WeakMap();
-
-var CMIPathsObject = /*#__PURE__*/function (_BaseCMI3) {
- _inherits(CMIPathsObject, _BaseCMI3);
-
- var _super8 = _createSuper(CMIPathsObject);
-
- /**
- * Constructor for AICC Paths objects
- */
- function CMIPathsObject() {
- var _this6;
-
- _classCallCheck(this, CMIPathsObject);
-
- _this6 = _super8.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _location_id, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _date, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _time, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _status, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _why_left, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _time_in_element, {
- writable: true,
- value: ''
- });
-
- return _this6;
- }
-
- _createClass(CMIPathsObject, [{
- key: "location_id",
- get:
- /**
- * Getter for #location_id
- * @return {string}
- */
- function get() {
- return _classPrivateFieldGet(this, _location_id);
- }
- /**
- * Setter for #location_id
- * @param {string} location_id
- */
- ,
- set: function set(location_id) {
- if (checkAICCValidFormat(location_id, aicc_regex.CMIString256)) {
- _classPrivateFieldSet(this, _location_id, location_id);
- }
- }
- /**
- * Getter for #date
- * @return {string}
- */
-
- }, {
- key: "date",
- get: function get() {
- return _classPrivateFieldGet(this, _date);
- }
- /**
- * Setter for #date
- * @param {string} date
- */
- ,
- set: function set(date) {
- if (checkAICCValidFormat(date, aicc_regex.CMIString256)) {
- _classPrivateFieldSet(this, _date, date);
- }
- }
- /**
- * Getter for #time
- * @return {string}
- */
-
- }, {
- key: "time",
- get: function get() {
- return _classPrivateFieldGet(this, _time);
- }
- /**
- * Setter for #time
- * @param {string} time
- */
- ,
- set: function set(time) {
- if (checkAICCValidFormat(time, aicc_regex.CMITime)) {
- _classPrivateFieldSet(this, _time, time);
- }
- }
- /**
- * Getter for #status
- * @return {string}
- */
-
- }, {
- key: "status",
- get: function get() {
- return _classPrivateFieldGet(this, _status);
- }
- /**
- * Setter for #status
- * @param {string} status
- */
- ,
- set: function set(status) {
- if (checkAICCValidFormat(status, aicc_regex.CMIStatus2)) {
- _classPrivateFieldSet(this, _status, status);
- }
- }
- /**
- * Getter for #why_left
- * @return {string}
- */
-
- }, {
- key: "why_left",
- get: function get() {
- return _classPrivateFieldGet(this, _why_left);
- }
- /**
- * Setter for #why_left
- * @param {string} why_left
- */
- ,
- set: function set(why_left) {
- if (checkAICCValidFormat(why_left, aicc_regex.CMIString256)) {
- _classPrivateFieldSet(this, _why_left, why_left);
- }
- }
- /**
- * Getter for #time_in_element
- * @return {string}
- */
-
- }, {
- key: "time_in_element",
- get: function get() {
- return _classPrivateFieldGet(this, _time_in_element);
- }
- /**
- * Setter for #time_in_element
- * @param {string} time_in_element
- */
- ,
- set: function set(time_in_element) {
- if (checkAICCValidFormat(time_in_element, aicc_regex.CMITime)) {
- _classPrivateFieldSet(this, _time_in_element, time_in_element);
- }
- }
- /**
- * toJSON for cmi.paths.n object
- * @return {
- * {
- * location_id: string,
- * date: string,
- * time: string,
- * status: string,
- * why_left: string,
- * time_in_element: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'location_id': this.location_id,
- 'date': this.date,
- 'time': this.time,
- 'status': this.status,
- 'why_left': this.why_left,
- 'time_in_element': this.time_in_element
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIPathsObject;
-}(_common.BaseCMI);
-/**
- * Class representing the AICC cmi.student_data.tries object
- */
-
-
-exports.CMIPathsObject = CMIPathsObject;
-
-var CMITries = /*#__PURE__*/function (_CMIArray3) {
- _inherits(CMITries, _CMIArray3);
-
- var _super9 = _createSuper(CMITries);
-
- /**
- * Constructor for inline Tries Array class
- */
- function CMITries() {
- _classCallCheck(this, CMITries);
-
- return _super9.call(this, {
- children: aicc_constants.tries_children
- });
- }
-
- return _createClass(CMITries);
-}(_common.CMIArray);
-/**
- * Class for AICC Tries
- */
-
-
-exports.CMITries = CMITries;
-
-var _status2 = /*#__PURE__*/new WeakMap();
-
-var _time2 = /*#__PURE__*/new WeakMap();
-
-var CMITriesObject = /*#__PURE__*/function (_BaseCMI4) {
- _inherits(CMITriesObject, _BaseCMI4);
-
- var _super10 = _createSuper(CMITriesObject);
-
- /**
- * Constructor for AICC Tries object
- */
- function CMITriesObject() {
- var _this7;
-
- _classCallCheck(this, CMITriesObject);
-
- _this7 = _super10.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this7), _status2, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this7), _time2, {
- writable: true,
- value: ''
- });
-
- _this7.score = new _common.CMIScore({
- score_children: aicc_constants.score_children,
- score_range: aicc_regex.score_range,
- invalidErrorCode: aicc_error_codes.INVALID_SET_VALUE,
- invalidTypeCode: aicc_error_codes.TYPE_MISMATCH,
- invalidRangeCode: aicc_error_codes.VALUE_OUT_OF_RANGE,
- errorClass: _exceptions.AICCValidationError
- });
- return _this7;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(CMITriesObject, [{
- key: "initialize",
- value: function initialize() {
- var _this$score;
-
- _get(_getPrototypeOf(CMITriesObject.prototype), "initialize", this).call(this);
-
- (_this$score = this.score) === null || _this$score === void 0 ? void 0 : _this$score.initialize();
- }
- }, {
- key: "status",
- get:
- /**
- * Getter for #status
- * @return {string}
- */
- function get() {
- return _classPrivateFieldGet(this, _status2);
- }
- /**
- * Setter for #status
- * @param {string} status
- */
- ,
- set: function set(status) {
- if (checkAICCValidFormat(status, aicc_regex.CMIStatus2)) {
- _classPrivateFieldSet(this, _status2, status);
- }
- }
- /**
- * Getter for #time
- * @return {string}
- */
-
- }, {
- key: "time",
- get: function get() {
- return _classPrivateFieldGet(this, _time2);
- }
- /**
- * Setter for #time
- * @param {string} time
- */
- ,
- set: function set(time) {
- if (checkAICCValidFormat(time, aicc_regex.CMITime)) {
- _classPrivateFieldSet(this, _time2, time);
- }
- }
- /**
- * toJSON for cmi.student_data.tries.n object
- * @return {
- * {
- * status: string,
- * time: string,
- * score: CMIScore
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'status': this.status,
- 'time': this.time,
- 'score': this.score
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMITriesObject;
-}(_common.BaseCMI);
-/**
- * Class for cmi.student_data.attempt_records array
- */
-
-
-exports.CMITriesObject = CMITriesObject;
-
-var CMIAttemptRecords = /*#__PURE__*/function (_CMIArray4) {
- _inherits(CMIAttemptRecords, _CMIArray4);
-
- var _super11 = _createSuper(CMIAttemptRecords);
-
- /**
- * Constructor for inline Tries Array class
- */
- function CMIAttemptRecords() {
- _classCallCheck(this, CMIAttemptRecords);
-
- return _super11.call(this, {
- children: aicc_constants.attempt_records_children
- });
- }
-
- return _createClass(CMIAttemptRecords);
-}(_common.CMIArray);
-/**
- * Class for AICC Attempt Records
- */
-
-
-exports.CMIAttemptRecords = CMIAttemptRecords;
-
-var _lesson_status = /*#__PURE__*/new WeakMap();
-
-var CMIAttemptRecordsObject = /*#__PURE__*/function (_BaseCMI5) {
- _inherits(CMIAttemptRecordsObject, _BaseCMI5);
-
- var _super12 = _createSuper(CMIAttemptRecordsObject);
-
- /**
- * Constructor for AICC Attempt Records object
- */
- function CMIAttemptRecordsObject() {
- var _this8;
-
- _classCallCheck(this, CMIAttemptRecordsObject);
-
- _this8 = _super12.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this8), _lesson_status, {
- writable: true,
- value: ''
- });
-
- _this8.score = new _common.CMIScore({
- score_children: aicc_constants.score_children,
- score_range: aicc_regex.score_range,
- invalidErrorCode: aicc_error_codes.INVALID_SET_VALUE,
- invalidTypeCode: aicc_error_codes.TYPE_MISMATCH,
- invalidRangeCode: aicc_error_codes.VALUE_OUT_OF_RANGE,
- errorClass: _exceptions.AICCValidationError
- });
- return _this8;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(CMIAttemptRecordsObject, [{
- key: "initialize",
- value: function initialize() {
- var _this$score2;
-
- _get(_getPrototypeOf(CMIAttemptRecordsObject.prototype), "initialize", this).call(this);
-
- (_this$score2 = this.score) === null || _this$score2 === void 0 ? void 0 : _this$score2.initialize();
- }
- }, {
- key: "lesson_status",
- get:
- /**
- * Getter for #lesson_status
- * @return {string}
- */
- function get() {
- return _classPrivateFieldGet(this, _lesson_status);
- }
- /**
- * Setter for #lesson_status
- * @param {string} lesson_status
- */
- ,
- set: function set(lesson_status) {
- if (checkAICCValidFormat(lesson_status, aicc_regex.CMIStatus2)) {
- _classPrivateFieldSet(this, _lesson_status, lesson_status);
- }
- }
- /**
- * toJSON for cmi.student_data.attempt_records.n object
- * @return {
- * {
- * status: string,
- * time: string,
- * score: CMIScore
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'lesson_status': this.lesson_status,
- 'score': this.score
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIAttemptRecordsObject;
-}(_common.BaseCMI);
-/**
- * Class for AICC Evaluation Comments
- */
-
-
-exports.CMIAttemptRecordsObject = CMIAttemptRecordsObject;
-
-var _content = /*#__PURE__*/new WeakMap();
-
-var _location = /*#__PURE__*/new WeakMap();
-
-var _time3 = /*#__PURE__*/new WeakMap();
-
-var CMIEvaluationCommentsObject = /*#__PURE__*/function (_BaseCMI6) {
- _inherits(CMIEvaluationCommentsObject, _BaseCMI6);
-
- var _super13 = _createSuper(CMIEvaluationCommentsObject);
-
- /**
- * Constructor for Evaluation Comments
- */
- function CMIEvaluationCommentsObject() {
- var _this9;
-
- _classCallCheck(this, CMIEvaluationCommentsObject);
-
- _this9 = _super13.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this9), _content, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this9), _location, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this9), _time3, {
- writable: true,
- value: ''
- });
-
- return _this9;
- }
-
- _createClass(CMIEvaluationCommentsObject, [{
- key: "content",
- get:
- /**
- * Getter for #content
- * @return {string}
- */
- function get() {
- return _classPrivateFieldGet(this, _content);
- }
- /**
- * Setter for #content
- * @param {string} content
- */
- ,
- set: function set(content) {
- if (checkAICCValidFormat(content, aicc_regex.CMIString256)) {
- _classPrivateFieldSet(this, _content, content);
- }
- }
- /**
- * Getter for #location
- * @return {string}
- */
-
- }, {
- key: "location",
- get: function get() {
- return _classPrivateFieldGet(this, _location);
- }
- /**
- * Setter for #location
- * @param {string} location
- */
- ,
- set: function set(location) {
- if (checkAICCValidFormat(location, aicc_regex.CMIString256)) {
- _classPrivateFieldSet(this, _location, location);
- }
- }
- /**
- * Getter for #time
- * @return {string}
- */
-
- }, {
- key: "time",
- get: function get() {
- return _classPrivateFieldGet(this, _time3);
- }
- /**
- * Setting for #time
- * @param {string} time
- */
- ,
- set: function set(time) {
- if (checkAICCValidFormat(time, aicc_regex.CMITime)) {
- _classPrivateFieldSet(this, _time3, time);
- }
- }
- /**
- * toJSON for cmi.evaulation.comments.n object
- * @return {
- * {
- * content: string,
- * location: string,
- * time: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'content': this.content,
- 'location': this.location,
- 'time': this.time
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIEvaluationCommentsObject;
-}(_common.BaseCMI);
-
-exports.CMIEvaluationCommentsObject = CMIEvaluationCommentsObject;
-
-},{"../constants/api_constants":10,"../constants/error_codes":11,"../constants/regex":13,"../exceptions":15,"./common":7,"./scorm12_cmi":8}],7:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.CMIScore = exports.CMIArray = exports.BaseCMI = void 0;
-exports.checkValidFormat = checkValidFormat;
-exports.checkValidRange = checkValidRange;
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
-
-function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
-
-function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-
-function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
-
-function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
-
-function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-
-var scorm12_constants = _api_constants["default"].scorm12;
-var scorm12_regex = _regex["default"].scorm12;
-var scorm12_error_codes = _error_codes["default"].scorm12;
-/**
- * Check if the value matches the proper format. If not, throw proper error code.
- *
- * @param {string} value
- * @param {string} regexPattern
- * @param {number} errorCode
- * @param {class} errorClass
- * @param {boolean} allowEmptyString
- * @return {boolean}
- */
-
-function checkValidFormat(value, regexPattern, errorCode, errorClass, allowEmptyString) {
- var formatRegex = new RegExp(regexPattern);
- var matches = value.match(formatRegex);
-
- if (allowEmptyString && value === '') {
- return true;
- }
-
- if (value === undefined || !matches || matches[0] === '') {
- throw new errorClass.prototype.constructor(errorCode);
- }
-
- return true;
-}
-/**
- * Check if the value matches the proper range. If not, throw proper error code.
- *
- * @param {*} value
- * @param {string} rangePattern
- * @param {number} errorCode
- * @param {class} errorClass
- * @return {boolean}
- */
-
-
-function checkValidRange(value, rangePattern, errorCode, errorClass) {
- var ranges = rangePattern.split('#');
- value = value * 1.0;
-
- if (value >= ranges[0]) {
- if (ranges[1] === '*' || value <= ranges[1]) {
- return true;
- } else {
- throw new errorClass.prototype.constructor(errorCode);
- }
- } else {
- throw new errorClass.prototype.constructor(errorCode);
- }
-}
-/**
- * Base class for API cmi objects
- */
-
-
-var _initialized = /*#__PURE__*/new WeakMap();
-
-var _start_time = /*#__PURE__*/new WeakMap();
-
-var BaseCMI = /*#__PURE__*/function () {
- /**
- * Constructor for BaseCMI, just marks the class as abstract
- */
- function BaseCMI() {
- _classCallCheck(this, BaseCMI);
-
- _defineProperty(this, "jsonString", false);
-
- _classPrivateFieldInitSpec(this, _initialized, {
- writable: true,
- value: false
- });
-
- _classPrivateFieldInitSpec(this, _start_time, {
- writable: true,
- value: void 0
- });
-
- if ((this instanceof BaseCMI ? this.constructor : void 0) === BaseCMI) {
- throw new TypeError('Cannot construct BaseCMI instances directly');
- }
- }
- /**
- * Getter for #initialized
- * @return {boolean}
- */
-
-
- _createClass(BaseCMI, [{
- key: "initialized",
- get: function get() {
- return _classPrivateFieldGet(this, _initialized);
- }
- /**
- * Getter for #start_time
- * @return {Number}
- */
-
- }, {
- key: "start_time",
- get: function get() {
- return _classPrivateFieldGet(this, _start_time);
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
- }, {
- key: "initialize",
- value: function initialize() {
- _classPrivateFieldSet(this, _initialized, true);
- }
- /**
- * Called when the player should override the 'session_time' provided by
- * the module
- */
-
- }, {
- key: "setStartTime",
- value: function setStartTime() {
- _classPrivateFieldSet(this, _start_time, new Date().getTime());
- }
- }]);
-
- return BaseCMI;
-}();
-/**
- * Base class for cmi *.score objects
- */
-
-
-exports.BaseCMI = BaseCMI;
-
-var _children2 = /*#__PURE__*/new WeakMap();
-
-var _score_range = /*#__PURE__*/new WeakMap();
-
-var _invalid_error_code = /*#__PURE__*/new WeakMap();
-
-var _invalid_type_code = /*#__PURE__*/new WeakMap();
-
-var _invalid_range_code = /*#__PURE__*/new WeakMap();
-
-var _decimal_regex = /*#__PURE__*/new WeakMap();
-
-var _error_class = /*#__PURE__*/new WeakMap();
-
-var _raw = /*#__PURE__*/new WeakMap();
-
-var _min = /*#__PURE__*/new WeakMap();
-
-var _max = /*#__PURE__*/new WeakMap();
-
-var CMIScore = /*#__PURE__*/function (_BaseCMI) {
- _inherits(CMIScore, _BaseCMI);
-
- var _super = _createSuper(CMIScore);
-
- /**
- * Constructor for *.score
- * @param {string} score_children
- * @param {string} score_range
- * @param {string} max
- * @param {number} invalidErrorCode
- * @param {number} invalidTypeCode
- * @param {number} invalidRangeCode
- * @param {string} decimalRegex
- * @param {class} errorClass
- */
- function CMIScore(_ref) {
- var _this;
-
- var score_children = _ref.score_children,
- score_range = _ref.score_range,
- max = _ref.max,
- invalidErrorCode = _ref.invalidErrorCode,
- invalidTypeCode = _ref.invalidTypeCode,
- invalidRangeCode = _ref.invalidRangeCode,
- decimalRegex = _ref.decimalRegex,
- errorClass = _ref.errorClass;
-
- _classCallCheck(this, CMIScore);
-
- _this = _super.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _children2, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _score_range, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _invalid_error_code, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _invalid_type_code, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _invalid_range_code, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _decimal_regex, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _error_class, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _raw, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _min, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _max, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _children2, score_children || scorm12_constants.score_children);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _score_range, !score_range ? false : scorm12_regex.score_range);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _max, max || max === '' ? max : '100');
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _invalid_error_code, invalidErrorCode || scorm12_error_codes.INVALID_SET_VALUE);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _invalid_type_code, invalidTypeCode || scorm12_error_codes.TYPE_MISMATCH);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _invalid_range_code, invalidRangeCode || scorm12_error_codes.VALUE_OUT_OF_RANGE);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _decimal_regex, decimalRegex || scorm12_regex.CMIDecimal);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _error_class, errorClass);
-
- return _this;
- }
-
- _createClass(CMIScore, [{
- key: "_children",
- get:
- /**
- * Getter for _children
- * @return {string}
- * @private
- */
- function get() {
- return _classPrivateFieldGet(this, _children2);
- }
- /**
- * Setter for _children. Just throws an error.
- * @param {string} _children
- * @private
- */
- ,
- set: function set(_children) {
- throw new (_classPrivateFieldGet(this, _error_class).prototype.constructor)(_classPrivateFieldGet(this, _invalid_error_code));
- }
- /**
- * Getter for #raw
- * @return {string}
- */
-
- }, {
- key: "raw",
- get: function get() {
- return _classPrivateFieldGet(this, _raw);
- }
- /**
- * Setter for #raw
- * @param {string} raw
- */
- ,
- set: function set(raw) {
- if (checkValidFormat(raw, _classPrivateFieldGet(this, _decimal_regex), _classPrivateFieldGet(this, _invalid_type_code), _classPrivateFieldGet(this, _error_class)) && (!_classPrivateFieldGet(this, _score_range) || checkValidRange(raw, _classPrivateFieldGet(this, _score_range), _classPrivateFieldGet(this, _invalid_range_code), _classPrivateFieldGet(this, _error_class)))) {
- _classPrivateFieldSet(this, _raw, raw);
- }
- }
- /**
- * Getter for #min
- * @return {string}
- */
-
- }, {
- key: "min",
- get: function get() {
- return _classPrivateFieldGet(this, _min);
- }
- /**
- * Setter for #min
- * @param {string} min
- */
- ,
- set: function set(min) {
- if (checkValidFormat(min, _classPrivateFieldGet(this, _decimal_regex), _classPrivateFieldGet(this, _invalid_type_code), _classPrivateFieldGet(this, _error_class)) && (!_classPrivateFieldGet(this, _score_range) || checkValidRange(min, _classPrivateFieldGet(this, _score_range), _classPrivateFieldGet(this, _invalid_range_code), _classPrivateFieldGet(this, _error_class)))) {
- _classPrivateFieldSet(this, _min, min);
- }
- }
- /**
- * Getter for #max
- * @return {string}
- */
-
- }, {
- key: "max",
- get: function get() {
- return _classPrivateFieldGet(this, _max);
- }
- /**
- * Setter for #max
- * @param {string} max
- */
- ,
- set: function set(max) {
- if (checkValidFormat(max, _classPrivateFieldGet(this, _decimal_regex), _classPrivateFieldGet(this, _invalid_type_code), _classPrivateFieldGet(this, _error_class)) && (!_classPrivateFieldGet(this, _score_range) || checkValidRange(max, _classPrivateFieldGet(this, _score_range), _classPrivateFieldGet(this, _invalid_range_code), _classPrivateFieldGet(this, _error_class)))) {
- _classPrivateFieldSet(this, _max, max);
- }
- }
- /**
- * toJSON for *.score
- * @return {{min: string, max: string, raw: string}}
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'raw': this.raw,
- 'min': this.min,
- 'max': this.max
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIScore;
-}(BaseCMI);
-/**
- * Base class for cmi *.n objects
- */
-
-
-exports.CMIScore = CMIScore;
-
-var _errorCode = /*#__PURE__*/new WeakMap();
-
-var _errorClass = /*#__PURE__*/new WeakMap();
-
-var _children3 = /*#__PURE__*/new WeakMap();
-
-var CMIArray = /*#__PURE__*/function (_BaseCMI2) {
- _inherits(CMIArray, _BaseCMI2);
-
- var _super2 = _createSuper(CMIArray);
-
- /**
- * Constructor cmi *.n arrays
- * @param {string} children
- * @param {number} errorCode
- * @param {class} errorClass
- */
- function CMIArray(_ref2) {
- var _this2;
-
- var children = _ref2.children,
- errorCode = _ref2.errorCode,
- errorClass = _ref2.errorClass;
-
- _classCallCheck(this, CMIArray);
-
- _this2 = _super2.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _errorCode, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _errorClass, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _children3, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldSet(_assertThisInitialized(_this2), _children3, children);
-
- _classPrivateFieldSet(_assertThisInitialized(_this2), _errorCode, errorCode);
-
- _classPrivateFieldSet(_assertThisInitialized(_this2), _errorClass, errorClass);
-
- _this2.childArray = [];
- return _this2;
- }
-
- _createClass(CMIArray, [{
- key: "_children",
- get:
- /**
- * Getter for _children
- * @return {*}
- */
- function get() {
- return _classPrivateFieldGet(this, _children3);
- }
- /**
- * Setter for _children. Just throws an error.
- * @param {string} _children
- */
- ,
- set: function set(_children) {
- throw new (_classPrivateFieldGet(this, _errorClass).prototype.constructor)(_classPrivateFieldGet(this, _errorCode));
- }
- /**
- * Getter for _count
- * @return {number}
- */
-
- }, {
- key: "_count",
- get: function get() {
- return this.childArray.length;
- }
- /**
- * Setter for _count. Just throws an error.
- * @param {number} _count
- */
- ,
- set: function set(_count) {
- throw new (_classPrivateFieldGet(this, _errorClass).prototype.constructor)(_classPrivateFieldGet(this, _errorCode));
- }
- /**
- * toJSON for *.n arrays
- * @return {object}
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {};
-
- for (var i = 0; i < this.childArray.length; i++) {
- result[i + ''] = this.childArray[i];
- }
-
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIArray;
-}(BaseCMI);
-
-exports.CMIArray = CMIArray;
-
-},{"../constants/api_constants":10,"../constants/error_codes":11,"../constants/regex":13}],8:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.NAV = exports.CMIStudentPreference = exports.CMIStudentData = exports.CMIObjectivesObject = exports.CMIInteractionsObjectivesObject = exports.CMIInteractionsObject = exports.CMIInteractionsCorrectResponsesObject = exports.CMI = void 0;
-exports.check12ValidFormat = check12ValidFormat;
-exports.check12ValidRange = check12ValidRange;
-exports.throwReadOnlyError = throwReadOnlyError;
-exports.throwWriteOnlyError = throwWriteOnlyError;
-
-var _common = require("./common");
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-var _exceptions = require("../exceptions");
-
-var Utilities = _interopRequireWildcard(require("../utilities"));
-
-var Util = Utilities;
-
-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; }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); }
-
-function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
-
-function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
-
-function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
-
-function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-
-function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
-
-function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
-
-function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-
-var scorm12_constants = _api_constants["default"].scorm12;
-var scorm12_regex = _regex["default"].scorm12;
-var scorm12_error_codes = _error_codes["default"].scorm12;
-/**
- * Helper method for throwing Read Only error
- */
-
-function throwReadOnlyError() {
- throw new _exceptions.Scorm12ValidationError(scorm12_error_codes.READ_ONLY_ELEMENT);
-}
-/**
- * Helper method for throwing Write Only error
- */
-
-
-function throwWriteOnlyError() {
- throw new _exceptions.Scorm12ValidationError(scorm12_error_codes.WRITE_ONLY_ELEMENT);
-}
-/**
- * Helper method for throwing Invalid Set error
- */
-
-
-function throwInvalidValueError() {
- throw new _exceptions.Scorm12ValidationError(scorm12_error_codes.INVALID_SET_VALUE);
-}
-/**
- * Helper method, no reason to have to pass the same error codes every time
- * @param {*} value
- * @param {string} regexPattern
- * @param {boolean} allowEmptyString
- * @return {boolean}
- */
-
-
-function check12ValidFormat(value, regexPattern, allowEmptyString) {
- return (0, _common.checkValidFormat)(value, regexPattern, scorm12_error_codes.TYPE_MISMATCH, _exceptions.Scorm12ValidationError, allowEmptyString);
-}
-/**
- * Helper method, no reason to have to pass the same error codes every time
- * @param {*} value
- * @param {string} rangePattern
- * @param {boolean} allowEmptyString
- * @return {boolean}
- */
-
-
-function check12ValidRange(value, rangePattern, allowEmptyString) {
- return (0, _common.checkValidRange)(value, rangePattern, scorm12_error_codes.VALUE_OUT_OF_RANGE, _exceptions.Scorm12ValidationError, allowEmptyString);
-}
-/**
- * Class representing the cmi object for SCORM 1.2
- */
-
-
-var _children2 = /*#__PURE__*/new WeakMap();
-
-var _version2 = /*#__PURE__*/new WeakMap();
-
-var _launch_data = /*#__PURE__*/new WeakMap();
-
-var _comments = /*#__PURE__*/new WeakMap();
-
-var _comments_from_lms = /*#__PURE__*/new WeakMap();
-
-var CMI = /*#__PURE__*/function (_BaseCMI) {
- _inherits(CMI, _BaseCMI);
-
- var _super = _createSuper(CMI);
-
- /**
- * Constructor for the SCORM 1.2 cmi object
- * @param {string} cmi_children
- * @param {(CMIStudentData|AICCCMIStudentData)} student_data
- * @param {boolean} initialized
- */
- function CMI(cmi_children, student_data, initialized) {
- var _this;
-
- _classCallCheck(this, CMI);
-
- _this = _super.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _children2, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _version2, {
- writable: true,
- value: '3.4'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _launch_data, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _comments, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _comments_from_lms, {
- writable: true,
- value: ''
- });
-
- _defineProperty(_assertThisInitialized(_this), "student_data", null);
-
- if (initialized) _this.initialize();
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _children2, cmi_children ? cmi_children : scorm12_constants.cmi_children);
-
- _this.core = new CMICore();
- _this.objectives = new CMIObjectives();
- _this.student_data = student_data ? student_data : new CMIStudentData();
- _this.student_preference = new CMIStudentPreference();
- _this.interactions = new CMIInteractions();
- return _this;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(CMI, [{
- key: "initialize",
- value: function initialize() {
- var _this$core, _this$objectives, _this$student_data, _this$student_prefere, _this$interactions;
-
- _get(_getPrototypeOf(CMI.prototype), "initialize", this).call(this);
-
- (_this$core = this.core) === null || _this$core === void 0 ? void 0 : _this$core.initialize();
- (_this$objectives = this.objectives) === null || _this$objectives === void 0 ? void 0 : _this$objectives.initialize();
- (_this$student_data = this.student_data) === null || _this$student_data === void 0 ? void 0 : _this$student_data.initialize();
- (_this$student_prefere = this.student_preference) === null || _this$student_prefere === void 0 ? void 0 : _this$student_prefere.initialize();
- (_this$interactions = this.interactions) === null || _this$interactions === void 0 ? void 0 : _this$interactions.initialize();
- }
- /**
- * toJSON for cmi
- *
- * @return {
- * {
- * suspend_data: string,
- * launch_data: string,
- * comments: string,
- * comments_from_lms: string,
- * core: CMICore,
- * objectives: CMIObjectives,
- * student_data: CMIStudentData,
- * student_preference: CMIStudentPreference,
- * interactions: CMIInteractions
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'suspend_data': this.suspend_data,
- 'launch_data': this.launch_data,
- 'comments': this.comments,
- 'comments_from_lms': this.comments_from_lms,
- 'core': this.core,
- 'objectives': this.objectives,
- 'student_data': this.student_data,
- 'student_preference': this.student_preference,
- 'interactions': this.interactions
- };
- delete this.jsonString;
- return result;
- }
- /**
- * Getter for #_version
- * @return {string}
- */
-
- }, {
- key: "_version",
- get: function get() {
- return _classPrivateFieldGet(this, _version2);
- }
- /**
- * Setter for #_version. Just throws an error.
- * @param {string} _version
- */
- ,
- set: function set(_version) {
- throwInvalidValueError();
- }
- /**
- * Getter for #_children
- * @return {string}
- */
-
- }, {
- key: "_children",
- get: function get() {
- return _classPrivateFieldGet(this, _children2);
- }
- /**
- * Setter for #_version. Just throws an error.
- * @param {string} _children
- */
- ,
- set: function set(_children) {
- throwInvalidValueError();
- }
- /**
- * Getter for #suspend_data
- * @return {string}
- */
-
- }, {
- key: "suspend_data",
- get: function get() {
- var _this$core2;
-
- return (_this$core2 = this.core) === null || _this$core2 === void 0 ? void 0 : _this$core2.suspend_data;
- }
- /**
- * Setter for #suspend_data
- * @param {string} suspend_data
- */
- ,
- set: function set(suspend_data) {
- if (this.core) {
- this.core.suspend_data = suspend_data;
- }
- }
- /**
- * Getter for #launch_data
- * @return {string}
- */
-
- }, {
- key: "launch_data",
- get: function get() {
- return _classPrivateFieldGet(this, _launch_data);
- }
- /**
- * Setter for #launch_data. Can only be called before initialization.
- * @param {string} launch_data
- */
- ,
- set: function set(launch_data) {
- !this.initialized ? _classPrivateFieldSet(this, _launch_data, launch_data) : throwReadOnlyError();
- }
- /**
- * Getter for #comments
- * @return {string}
- */
-
- }, {
- key: "comments",
- get: function get() {
- return _classPrivateFieldGet(this, _comments);
- }
- /**
- * Setter for #comments
- * @param {string} comments
- */
- ,
- set: function set(comments) {
- if (check12ValidFormat(comments, scorm12_regex.CMIString4096, true)) {
- _classPrivateFieldSet(this, _comments, comments);
- }
- }
- /**
- * Getter for #comments_from_lms
- * @return {string}
- */
-
- }, {
- key: "comments_from_lms",
- get: function get() {
- return _classPrivateFieldGet(this, _comments_from_lms);
- }
- /**
- * Setter for #comments_from_lms. Can only be called before initialization.
- * @param {string} comments_from_lms
- */
- ,
- set: function set(comments_from_lms) {
- !this.initialized ? _classPrivateFieldSet(this, _comments_from_lms, comments_from_lms) : throwReadOnlyError();
- }
- /**
- * Adds the current session time to the existing total time.
- *
- * @return {string}
- */
-
- }, {
- key: "getCurrentTotalTime",
- value: function getCurrentTotalTime() {
- return this.core.getCurrentTotalTime(this.start_time);
- }
- }]);
-
- return CMI;
-}(_common.BaseCMI);
-/**
- * Class representing the cmi.core object
- * @extends BaseCMI
- */
-
-
-exports.CMI = CMI;
-
-var _children3 = /*#__PURE__*/new WeakMap();
-
-var _student_id = /*#__PURE__*/new WeakMap();
-
-var _student_name = /*#__PURE__*/new WeakMap();
-
-var _lesson_location = /*#__PURE__*/new WeakMap();
-
-var _credit = /*#__PURE__*/new WeakMap();
-
-var _lesson_status = /*#__PURE__*/new WeakMap();
-
-var _entry = /*#__PURE__*/new WeakMap();
-
-var _total_time = /*#__PURE__*/new WeakMap();
-
-var _lesson_mode = /*#__PURE__*/new WeakMap();
-
-var _exit = /*#__PURE__*/new WeakMap();
-
-var _session_time = /*#__PURE__*/new WeakMap();
-
-var _suspend_data = /*#__PURE__*/new WeakMap();
-
-var CMICore = /*#__PURE__*/function (_BaseCMI2) {
- _inherits(CMICore, _BaseCMI2);
-
- var _super2 = _createSuper(CMICore);
-
- /**
- * Constructor for cmi.core
- */
- function CMICore() {
- var _this2;
-
- _classCallCheck(this, CMICore);
-
- _this2 = _super2.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _children3, {
- writable: true,
- value: scorm12_constants.core_children
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _student_id, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _student_name, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _lesson_location, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _credit, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _lesson_status, {
- writable: true,
- value: 'not attempted'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _entry, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _total_time, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _lesson_mode, {
- writable: true,
- value: 'normal'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _exit, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _session_time, {
- writable: true,
- value: '00:00:00'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _suspend_data, {
- writable: true,
- value: ''
- });
-
- _this2.score = new _common.CMIScore({
- score_children: scorm12_constants.score_children,
- score_range: scorm12_regex.score_range,
- invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,
- invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,
- invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,
- errorClass: _exceptions.Scorm12ValidationError
- });
- return _this2;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(CMICore, [{
- key: "initialize",
- value: function initialize() {
- var _this$score;
-
- _get(_getPrototypeOf(CMICore.prototype), "initialize", this).call(this);
-
- (_this$score = this.score) === null || _this$score === void 0 ? void 0 : _this$score.initialize();
- }
- }, {
- key: "_children",
- get:
- /**
- * Getter for #_children
- * @return {string}
- * @private
- */
- function get() {
- return _classPrivateFieldGet(this, _children3);
- }
- /**
- * Setter for #_children. Just throws an error.
- * @param {string} _children
- * @private
- */
- ,
- set: function set(_children) {
- throwInvalidValueError();
- }
- /**
- * Getter for #student_id
- * @return {string}
- */
-
- }, {
- key: "student_id",
- get: function get() {
- return _classPrivateFieldGet(this, _student_id);
- }
- /**
- * Setter for #student_id. Can only be called before initialization.
- * @param {string} student_id
- */
- ,
- set: function set(student_id) {
- !this.initialized ? _classPrivateFieldSet(this, _student_id, student_id) : throwReadOnlyError();
- }
- /**
- * Getter for #student_name
- * @return {string}
- */
-
- }, {
- key: "student_name",
- get: function get() {
- return _classPrivateFieldGet(this, _student_name);
- }
- /**
- * Setter for #student_name. Can only be called before initialization.
- * @param {string} student_name
- */
- ,
- set: function set(student_name) {
- !this.initialized ? _classPrivateFieldSet(this, _student_name, student_name) : throwReadOnlyError();
- }
- /**
- * Getter for #lesson_location
- * @return {string}
- */
-
- }, {
- key: "lesson_location",
- get: function get() {
- return _classPrivateFieldGet(this, _lesson_location);
- }
- /**
- * Setter for #lesson_location
- * @param {string} lesson_location
- */
- ,
- set: function set(lesson_location) {
- if (check12ValidFormat(lesson_location, scorm12_regex.CMIString256, true)) {
- _classPrivateFieldSet(this, _lesson_location, lesson_location);
- }
- }
- /**
- * Getter for #credit
- * @return {string}
- */
-
- }, {
- key: "credit",
- get: function get() {
- return _classPrivateFieldGet(this, _credit);
- }
- /**
- * Setter for #credit. Can only be called before initialization.
- * @param {string} credit
- */
- ,
- set: function set(credit) {
- !this.initialized ? _classPrivateFieldSet(this, _credit, credit) : throwReadOnlyError();
- }
- /**
- * Getter for #lesson_status
- * @return {string}
- */
-
- }, {
- key: "lesson_status",
- get: function get() {
- return _classPrivateFieldGet(this, _lesson_status);
- }
- /**
- * Setter for #lesson_status
- * @param {string} lesson_status
- */
- ,
- set: function set(lesson_status) {
- if (this.initialized) {
- if (check12ValidFormat(lesson_status, scorm12_regex.CMIStatus)) {
- _classPrivateFieldSet(this, _lesson_status, lesson_status);
- }
- } else {
- if (check12ValidFormat(lesson_status, scorm12_regex.CMIStatus2)) {
- _classPrivateFieldSet(this, _lesson_status, lesson_status);
- }
- }
- }
- /**
- * Getter for #entry
- * @return {string}
- */
-
- }, {
- key: "entry",
- get: function get() {
- return _classPrivateFieldGet(this, _entry);
- }
- /**
- * Setter for #entry. Can only be called before initialization.
- * @param {string} entry
- */
- ,
- set: function set(entry) {
- !this.initialized ? _classPrivateFieldSet(this, _entry, entry) : throwReadOnlyError();
- }
- /**
- * Getter for #total_time
- * @return {string}
- */
-
- }, {
- key: "total_time",
- get: function get() {
- return _classPrivateFieldGet(this, _total_time);
- }
- /**
- * Setter for #total_time. Can only be called before initialization.
- * @param {string} total_time
- */
- ,
- set: function set(total_time) {
- !this.initialized ? _classPrivateFieldSet(this, _total_time, total_time) : throwReadOnlyError();
- }
- /**
- * Getter for #lesson_mode
- * @return {string}
- */
-
- }, {
- key: "lesson_mode",
- get: function get() {
- return _classPrivateFieldGet(this, _lesson_mode);
- }
- /**
- * Setter for #lesson_mode. Can only be called before initialization.
- * @param {string} lesson_mode
- */
- ,
- set: function set(lesson_mode) {
- !this.initialized ? _classPrivateFieldSet(this, _lesson_mode, lesson_mode) : throwReadOnlyError();
- }
- /**
- * Getter for #exit. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "exit",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _exit);
- }
- /**
- * Setter for #exit
- * @param {string} exit
- */
- ,
- set: function set(exit) {
- if (check12ValidFormat(exit, scorm12_regex.CMIExit, true)) {
- _classPrivateFieldSet(this, _exit, exit);
- }
- }
- /**
- * Getter for #session_time. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "session_time",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _session_time);
- }
- /**
- * Setter for #session_time
- * @param {string} session_time
- */
- ,
- set: function set(session_time) {
- if (check12ValidFormat(session_time, scorm12_regex.CMITimespan)) {
- _classPrivateFieldSet(this, _session_time, session_time);
- }
- }
- /**
- * Getter for #suspend_data
- * @return {string}
- */
-
- }, {
- key: "suspend_data",
- get: function get() {
- return _classPrivateFieldGet(this, _suspend_data);
- }
- /**
- * Setter for #suspend_data
- * @param {string} suspend_data
- */
- ,
- set: function set(suspend_data) {
- if (check12ValidFormat(suspend_data, scorm12_regex.CMIString4096, true)) {
- _classPrivateFieldSet(this, _suspend_data, suspend_data);
- }
- }
- /**
- * Adds the current session time to the existing total time.
- * @param {Number} start_time
- * @return {string}
- */
-
- }, {
- key: "getCurrentTotalTime",
- value: function getCurrentTotalTime(start_time) {
- var sessionTime = _classPrivateFieldGet(this, _session_time);
-
- var startTime = start_time;
-
- if (typeof startTime !== 'undefined' && startTime !== null) {
- var seconds = new Date().getTime() - startTime;
- sessionTime = Util.getSecondsAsHHMMSS(seconds / 1000);
- }
-
- return Utilities.addHHMMSSTimeStrings(_classPrivateFieldGet(this, _total_time), sessionTime, new RegExp(scorm12_regex.CMITimespan));
- }
- /**
- * toJSON for cmi.core
- *
- * @return {
- * {
- * student_name: string,
- * entry: string,
- * exit: string,
- * score: CMIScore,
- * student_id: string,
- * lesson_mode: string,
- * lesson_location: string,
- * lesson_status: string,
- * credit: string,
- * session_time: *
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'student_id': this.student_id,
- 'student_name': this.student_name,
- 'lesson_location': this.lesson_location,
- 'credit': this.credit,
- 'lesson_status': this.lesson_status,
- 'entry': this.entry,
- 'lesson_mode': this.lesson_mode,
- 'exit': this.exit,
- 'session_time': this.session_time,
- 'score': this.score
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMICore;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 1.2's cmi.objectives object
- * @extends CMIArray
- */
-
-
-var CMIObjectives = /*#__PURE__*/function (_CMIArray) {
- _inherits(CMIObjectives, _CMIArray);
-
- var _super3 = _createSuper(CMIObjectives);
-
- /**
- * Constructor for cmi.objectives
- */
- function CMIObjectives() {
- _classCallCheck(this, CMIObjectives);
-
- return _super3.call(this, {
- children: scorm12_constants.objectives_children,
- errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError
- });
- }
-
- return _createClass(CMIObjectives);
-}(_common.CMIArray);
-/**
- * Class representing SCORM 1.2's cmi.student_data object
- * @extends BaseCMI
- */
-
-
-var _children4 = /*#__PURE__*/new WeakMap();
-
-var _mastery_score = /*#__PURE__*/new WeakMap();
-
-var _max_time_allowed = /*#__PURE__*/new WeakMap();
-
-var _time_limit_action = /*#__PURE__*/new WeakMap();
-
-var CMIStudentData = /*#__PURE__*/function (_BaseCMI3) {
- _inherits(CMIStudentData, _BaseCMI3);
-
- var _super4 = _createSuper(CMIStudentData);
-
- /**
- * Constructor for cmi.student_data
- * @param {string} student_data_children
- */
- function CMIStudentData(student_data_children) {
- var _this3;
-
- _classCallCheck(this, CMIStudentData);
-
- _this3 = _super4.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _children4, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _mastery_score, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _max_time_allowed, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _time_limit_action, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldSet(_assertThisInitialized(_this3), _children4, student_data_children ? student_data_children : scorm12_constants.student_data_children);
-
- return _this3;
- }
- /**
- * Getter for #_children
- * @return {*}
- * @private
- */
-
-
- _createClass(CMIStudentData, [{
- key: "_children",
- get: function get() {
- return _classPrivateFieldGet(this, _children4);
- }
- /**
- * Setter for #_children. Just throws an error.
- * @param {string} _children
- * @private
- */
- ,
- set: function set(_children) {
- throwInvalidValueError();
- }
- /**
- * Getter for #master_score
- * @return {string}
- */
-
- }, {
- key: "mastery_score",
- get: function get() {
- return _classPrivateFieldGet(this, _mastery_score);
- }
- /**
- * Setter for #master_score. Can only be called before initialization.
- * @param {string} mastery_score
- */
- ,
- set: function set(mastery_score) {
- !this.initialized ? _classPrivateFieldSet(this, _mastery_score, mastery_score) : throwReadOnlyError();
- }
- /**
- * Getter for #max_time_allowed
- * @return {string}
- */
-
- }, {
- key: "max_time_allowed",
- get: function get() {
- return _classPrivateFieldGet(this, _max_time_allowed);
- }
- /**
- * Setter for #max_time_allowed. Can only be called before initialization.
- * @param {string} max_time_allowed
- */
- ,
- set: function set(max_time_allowed) {
- !this.initialized ? _classPrivateFieldSet(this, _max_time_allowed, max_time_allowed) : throwReadOnlyError();
- }
- /**
- * Getter for #time_limit_action
- * @return {string}
- */
-
- }, {
- key: "time_limit_action",
- get: function get() {
- return _classPrivateFieldGet(this, _time_limit_action);
- }
- /**
- * Setter for #time_limit_action. Can only be called before initialization.
- * @param {string} time_limit_action
- */
- ,
- set: function set(time_limit_action) {
- !this.initialized ? _classPrivateFieldSet(this, _time_limit_action, time_limit_action) : throwReadOnlyError();
- }
- /**
- * toJSON for cmi.student_data
- *
- * @return {
- * {
- * max_time_allowed: string,
- * time_limit_action: string,
- * mastery_score: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'mastery_score': this.mastery_score,
- 'max_time_allowed': this.max_time_allowed,
- 'time_limit_action': this.time_limit_action
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIStudentData;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 1.2's cmi.student_preference object
- * @extends BaseCMI
- */
-
-
-exports.CMIStudentData = CMIStudentData;
-
-var _children5 = /*#__PURE__*/new WeakMap();
-
-var _audio = /*#__PURE__*/new WeakMap();
-
-var _language = /*#__PURE__*/new WeakMap();
-
-var _speed = /*#__PURE__*/new WeakMap();
-
-var _text = /*#__PURE__*/new WeakMap();
-
-var CMIStudentPreference = /*#__PURE__*/function (_BaseCMI4) {
- _inherits(CMIStudentPreference, _BaseCMI4);
-
- var _super5 = _createSuper(CMIStudentPreference);
-
- /**
- * Constructor for cmi.student_preference
- * @param {string} student_preference_children
- */
- function CMIStudentPreference(student_preference_children) {
- var _this4;
-
- _classCallCheck(this, CMIStudentPreference);
-
- _this4 = _super5.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _children5, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _audio, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _language, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _speed, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _text, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldSet(_assertThisInitialized(_this4), _children5, student_preference_children ? student_preference_children : scorm12_constants.student_preference_children);
-
- return _this4;
- }
-
- _createClass(CMIStudentPreference, [{
- key: "_children",
- get:
- /**
- * Getter for #_children
- * @return {string}
- * @private
- */
- function get() {
- return _classPrivateFieldGet(this, _children5);
- }
- /**
- * Setter for #_children. Just throws an error.
- * @param {string} _children
- * @private
- */
- ,
- set: function set(_children) {
- throwInvalidValueError();
- }
- /**
- * Getter for #audio
- * @return {string}
- */
-
- }, {
- key: "audio",
- get: function get() {
- return _classPrivateFieldGet(this, _audio);
- }
- /**
- * Setter for #audio
- * @param {string} audio
- */
- ,
- set: function set(audio) {
- if (check12ValidFormat(audio, scorm12_regex.CMISInteger) && check12ValidRange(audio, scorm12_regex.audio_range)) {
- _classPrivateFieldSet(this, _audio, audio);
- }
- }
- /**
- * Getter for #language
- * @return {string}
- */
-
- }, {
- key: "language",
- get: function get() {
- return _classPrivateFieldGet(this, _language);
- }
- /**
- * Setter for #language
- * @param {string} language
- */
- ,
- set: function set(language) {
- if (check12ValidFormat(language, scorm12_regex.CMIString256)) {
- _classPrivateFieldSet(this, _language, language);
- }
- }
- /**
- * Getter for #speed
- * @return {string}
- */
-
- }, {
- key: "speed",
- get: function get() {
- return _classPrivateFieldGet(this, _speed);
- }
- /**
- * Setter for #speed
- * @param {string} speed
- */
- ,
- set: function set(speed) {
- if (check12ValidFormat(speed, scorm12_regex.CMISInteger) && check12ValidRange(speed, scorm12_regex.speed_range)) {
- _classPrivateFieldSet(this, _speed, speed);
- }
- }
- /**
- * Getter for #text
- * @return {string}
- */
-
- }, {
- key: "text",
- get: function get() {
- return _classPrivateFieldGet(this, _text);
- }
- /**
- * Setter for #text
- * @param {string} text
- */
- ,
- set: function set(text) {
- if (check12ValidFormat(text, scorm12_regex.CMISInteger) && check12ValidRange(text, scorm12_regex.text_range)) {
- _classPrivateFieldSet(this, _text, text);
- }
- }
- /**
- * toJSON for cmi.student_preference
- *
- * @return {
- * {
- * audio: string,
- * language: string,
- * speed: string,
- * text: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'audio': this.audio,
- 'language': this.language,
- 'speed': this.speed,
- 'text': this.text
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIStudentPreference;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 1.2's cmi.interactions object
- * @extends BaseCMI
- */
-
-
-exports.CMIStudentPreference = CMIStudentPreference;
-
-var CMIInteractions = /*#__PURE__*/function (_CMIArray2) {
- _inherits(CMIInteractions, _CMIArray2);
-
- var _super6 = _createSuper(CMIInteractions);
-
- /**
- * Constructor for cmi.interactions
- */
- function CMIInteractions() {
- _classCallCheck(this, CMIInteractions);
-
- return _super6.call(this, {
- children: scorm12_constants.interactions_children,
- errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError
- });
- }
-
- return _createClass(CMIInteractions);
-}(_common.CMIArray);
-/**
- * Class representing SCORM 1.2's cmi.interactions.n object
- * @extends BaseCMI
- */
-
-
-var _id = /*#__PURE__*/new WeakMap();
-
-var _time = /*#__PURE__*/new WeakMap();
-
-var _type = /*#__PURE__*/new WeakMap();
-
-var _weighting = /*#__PURE__*/new WeakMap();
-
-var _student_response = /*#__PURE__*/new WeakMap();
-
-var _result = /*#__PURE__*/new WeakMap();
-
-var _latency = /*#__PURE__*/new WeakMap();
-
-var CMIInteractionsObject = /*#__PURE__*/function (_BaseCMI5) {
- _inherits(CMIInteractionsObject, _BaseCMI5);
-
- var _super7 = _createSuper(CMIInteractionsObject);
-
- /**
- * Constructor for cmi.interactions.n object
- */
- function CMIInteractionsObject() {
- var _this5;
-
- _classCallCheck(this, CMIInteractionsObject);
-
- _this5 = _super7.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _id, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _time, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _type, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _weighting, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _student_response, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _result, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _latency, {
- writable: true,
- value: ''
- });
-
- _this5.objectives = new _common.CMIArray({
- errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError,
- children: scorm12_constants.objectives_children
- });
- _this5.correct_responses = new _common.CMIArray({
- errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError,
- children: scorm12_constants.correct_responses_children
- });
- return _this5;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(CMIInteractionsObject, [{
- key: "initialize",
- value: function initialize() {
- var _this$objectives2, _this$correct_respons;
-
- _get(_getPrototypeOf(CMIInteractionsObject.prototype), "initialize", this).call(this);
-
- (_this$objectives2 = this.objectives) === null || _this$objectives2 === void 0 ? void 0 : _this$objectives2.initialize();
- (_this$correct_respons = this.correct_responses) === null || _this$correct_respons === void 0 ? void 0 : _this$correct_respons.initialize();
- }
- }, {
- key: "id",
- get:
- /**
- * Getter for #id. Should only be called during JSON export.
- * @return {*}
- */
- function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _id);
- }
- /**
- * Setter for #id
- * @param {string} id
- */
- ,
- set: function set(id) {
- if (check12ValidFormat(id, scorm12_regex.CMIIdentifier)) {
- _classPrivateFieldSet(this, _id, id);
- }
- }
- /**
- * Getter for #time. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "time",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _time);
- }
- /**
- * Setter for #time
- * @param {string} time
- */
- ,
- set: function set(time) {
- if (check12ValidFormat(time, scorm12_regex.CMITime)) {
- _classPrivateFieldSet(this, _time, time);
- }
- }
- /**
- * Getter for #type. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "type",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _type);
- }
- /**
- * Setter for #type
- * @param {string} type
- */
- ,
- set: function set(type) {
- if (check12ValidFormat(type, scorm12_regex.CMIType)) {
- _classPrivateFieldSet(this, _type, type);
- }
- }
- /**
- * Getter for #weighting. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "weighting",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _weighting);
- }
- /**
- * Setter for #weighting
- * @param {string} weighting
- */
- ,
- set: function set(weighting) {
- if (check12ValidFormat(weighting, scorm12_regex.CMIDecimal) && check12ValidRange(weighting, scorm12_regex.weighting_range)) {
- _classPrivateFieldSet(this, _weighting, weighting);
- }
- }
- /**
- * Getter for #student_response. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "student_response",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _student_response);
- }
- /**
- * Setter for #student_response
- * @param {string} student_response
- */
- ,
- set: function set(student_response) {
- if (check12ValidFormat(student_response, scorm12_regex.CMIFeedback, true)) {
- _classPrivateFieldSet(this, _student_response, student_response);
- }
- }
- /**
- * Getter for #result. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "result",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _result);
- }
- /**
- * Setter for #result
- * @param {string} result
- */
- ,
- set: function set(result) {
- if (check12ValidFormat(result, scorm12_regex.CMIResult)) {
- _classPrivateFieldSet(this, _result, result);
- }
- }
- /**
- * Getter for #latency. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "latency",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _latency);
- }
- /**
- * Setter for #latency
- * @param {string} latency
- */
- ,
- set: function set(latency) {
- if (check12ValidFormat(latency, scorm12_regex.CMITimespan)) {
- _classPrivateFieldSet(this, _latency, latency);
- }
- }
- /**
- * toJSON for cmi.interactions.n
- *
- * @return {
- * {
- * id: string,
- * time: string,
- * type: string,
- * weighting: string,
- * student_response: string,
- * result: string,
- * latency: string,
- * objectives: CMIArray,
- * correct_responses: CMIArray
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'id': this.id,
- 'time': this.time,
- 'type': this.type,
- 'weighting': this.weighting,
- 'student_response': this.student_response,
- 'result': this.result,
- 'latency': this.latency,
- 'objectives': this.objectives,
- 'correct_responses': this.correct_responses
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIInteractionsObject;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 1.2's cmi.objectives.n object
- * @extends BaseCMI
- */
-
-
-exports.CMIInteractionsObject = CMIInteractionsObject;
-
-var _id2 = /*#__PURE__*/new WeakMap();
-
-var _status = /*#__PURE__*/new WeakMap();
-
-var CMIObjectivesObject = /*#__PURE__*/function (_BaseCMI6) {
- _inherits(CMIObjectivesObject, _BaseCMI6);
-
- var _super8 = _createSuper(CMIObjectivesObject);
-
- /**
- * Constructor for cmi.objectives.n
- */
- function CMIObjectivesObject() {
- var _this6;
-
- _classCallCheck(this, CMIObjectivesObject);
-
- _this6 = _super8.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _id2, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _status, {
- writable: true,
- value: ''
- });
-
- _this6.score = new _common.CMIScore({
- score_children: scorm12_constants.score_children,
- score_range: scorm12_regex.score_range,
- invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,
- invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,
- invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,
- errorClass: _exceptions.Scorm12ValidationError
- });
- return _this6;
- }
-
- _createClass(CMIObjectivesObject, [{
- key: "id",
- get:
- /**
- * Getter for #id
- * @return {""}
- */
- function get() {
- return _classPrivateFieldGet(this, _id2);
- }
- /**
- * Setter for #id
- * @param {string} id
- */
- ,
- set: function set(id) {
- if (check12ValidFormat(id, scorm12_regex.CMIIdentifier)) {
- _classPrivateFieldSet(this, _id2, id);
- }
- }
- /**
- * Getter for #status
- * @return {""}
- */
-
- }, {
- key: "status",
- get: function get() {
- return _classPrivateFieldGet(this, _status);
- }
- /**
- * Setter for #status
- * @param {string} status
- */
- ,
- set: function set(status) {
- if (check12ValidFormat(status, scorm12_regex.CMIStatus2)) {
- _classPrivateFieldSet(this, _status, status);
- }
- }
- /**
- * toJSON for cmi.objectives.n
- * @return {
- * {
- * id: string,
- * status: string,
- * score: CMIScore
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'id': this.id,
- 'status': this.status,
- 'score': this.score
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIObjectivesObject;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 1.2's cmi.interactions.n.objectives.n object
- * @extends BaseCMI
- */
-
-
-exports.CMIObjectivesObject = CMIObjectivesObject;
-
-var _id3 = /*#__PURE__*/new WeakMap();
-
-var CMIInteractionsObjectivesObject = /*#__PURE__*/function (_BaseCMI7) {
- _inherits(CMIInteractionsObjectivesObject, _BaseCMI7);
-
- var _super9 = _createSuper(CMIInteractionsObjectivesObject);
-
- /**
- * Constructor for cmi.interactions.n.objectives.n
- */
- function CMIInteractionsObjectivesObject() {
- var _this7;
-
- _classCallCheck(this, CMIInteractionsObjectivesObject);
-
- _this7 = _super9.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this7), _id3, {
- writable: true,
- value: ''
- });
-
- return _this7;
- }
-
- _createClass(CMIInteractionsObjectivesObject, [{
- key: "id",
- get:
- /**
- * Getter for #id
- * @return {""}
- */
- function get() {
- return _classPrivateFieldGet(this, _id3);
- }
- /**
- * Setter for #id
- * @param {string} id
- */
- ,
- set: function set(id) {
- if (check12ValidFormat(id, scorm12_regex.CMIIdentifier)) {
- _classPrivateFieldSet(this, _id3, id);
- }
- }
- /**
- * toJSON for cmi.interactions.n.objectives.n
- * @return {
- * {
- * id: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'id': this.id
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIInteractionsObjectivesObject;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 1.2's cmi.interactions.correct_responses.n object
- * @extends BaseCMI
- */
-
-
-exports.CMIInteractionsObjectivesObject = CMIInteractionsObjectivesObject;
-
-var _pattern = /*#__PURE__*/new WeakMap();
-
-var CMIInteractionsCorrectResponsesObject = /*#__PURE__*/function (_BaseCMI8) {
- _inherits(CMIInteractionsCorrectResponsesObject, _BaseCMI8);
-
- var _super10 = _createSuper(CMIInteractionsCorrectResponsesObject);
-
- /**
- * Constructor for cmi.interactions.correct_responses.n
- */
- function CMIInteractionsCorrectResponsesObject() {
- var _this8;
-
- _classCallCheck(this, CMIInteractionsCorrectResponsesObject);
-
- _this8 = _super10.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this8), _pattern, {
- writable: true,
- value: ''
- });
-
- return _this8;
- }
-
- _createClass(CMIInteractionsCorrectResponsesObject, [{
- key: "pattern",
- get:
- /**
- * Getter for #pattern
- * @return {string}
- */
- function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _pattern);
- }
- /**
- * Setter for #pattern
- * @param {string} pattern
- */
- ,
- set: function set(pattern) {
- if (check12ValidFormat(pattern, scorm12_regex.CMIFeedback, true)) {
- _classPrivateFieldSet(this, _pattern, pattern);
- }
- }
- /**
- * toJSON for cmi.interactions.correct_responses.n
- * @return {
- * {
- * pattern: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'pattern': this.pattern
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIInteractionsCorrectResponsesObject;
-}(_common.BaseCMI);
-/**
- * Class for AICC Navigation object
- */
-
-
-exports.CMIInteractionsCorrectResponsesObject = CMIInteractionsCorrectResponsesObject;
-
-var _event = /*#__PURE__*/new WeakMap();
-
-var NAV = /*#__PURE__*/function (_BaseCMI9) {
- _inherits(NAV, _BaseCMI9);
-
- var _super11 = _createSuper(NAV);
-
- /**
- * Constructor for NAV object
- */
- function NAV() {
- var _this9;
-
- _classCallCheck(this, NAV);
-
- _this9 = _super11.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this9), _event, {
- writable: true,
- value: ''
- });
-
- return _this9;
- }
-
- _createClass(NAV, [{
- key: "event",
- get:
- /**
- * Getter for #event
- * @return {string}
- */
- function get() {
- return _classPrivateFieldGet(this, _event);
- }
- /**
- * Setter for #event
- * @param {string} event
- */
- ,
- set: function set(event) {
- if (check12ValidFormat(event, scorm12_regex.NAVEvent)) {
- _classPrivateFieldSet(this, _event, event);
- }
- }
- /**
- * toJSON for nav object
- * @return {
- * {
- * event: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'event': this.event
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return NAV;
-}(_common.BaseCMI);
-
-exports.NAV = NAV;
-
-},{"../constants/api_constants":10,"../constants/error_codes":11,"../constants/regex":13,"../exceptions":15,"../utilities":17,"./common":7}],9:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.CMIObjectivesObject = exports.CMIInteractionsObjectivesObject = exports.CMIInteractionsObject = exports.CMIInteractionsCorrectResponsesObject = exports.CMICommentsObject = exports.CMI = exports.ADL = void 0;
-
-var _common = require("./common");
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _response_constants = _interopRequireDefault(require("../constants/response_constants"));
-
-var _exceptions = require("../exceptions");
-
-var Util = _interopRequireWildcard(require("../utilities"));
-
-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; }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); }
-
-function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
-
-function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
-
-function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
-
-function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-
-function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
-
-function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
-
-function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-
-var scorm2004_constants = _api_constants["default"].scorm2004;
-var scorm2004_error_codes = _error_codes["default"].scorm2004;
-var learner_responses = _response_constants["default"].learner;
-var scorm2004_regex = _regex["default"].scorm2004;
-/**
- * Helper method for throwing Read Only error
- */
-
-function throwReadOnlyError() {
- throw new _exceptions.Scorm2004ValidationError(scorm2004_error_codes.READ_ONLY_ELEMENT);
-}
-/**
- * Helper method for throwing Write Only error
- */
-
-
-function throwWriteOnlyError() {
- throw new _exceptions.Scorm2004ValidationError(scorm2004_error_codes.WRITE_ONLY_ELEMENT);
-}
-/**
- * Helper method for throwing Type Mismatch error
- */
-
-
-function throwTypeMismatchError() {
- throw new _exceptions.Scorm2004ValidationError(scorm2004_error_codes.TYPE_MISMATCH);
-}
-/**
- * Helper method for throwing Dependency Not Established error
- */
-
-
-function throwDependencyNotEstablishedError() {
- throw new _exceptions.Scorm2004ValidationError(scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);
-}
-/**
- * Helper method for throwing Dependency Not Established error
- */
-
-
-function throwGeneralSetError() {
- throw new _exceptions.Scorm2004ValidationError(scorm2004_error_codes.GENERAL_SET_FAILURE);
-}
-/**
- * Helper method, no reason to have to pass the same error codes every time
- * @param {*} value
- * @param {string} regexPattern
- * @param {boolean} allowEmptyString
- * @return {boolean}
- */
-
-
-function check2004ValidFormat(value, regexPattern, allowEmptyString) {
- return (0, _common.checkValidFormat)(value, regexPattern, scorm2004_error_codes.TYPE_MISMATCH, _exceptions.Scorm2004ValidationError, allowEmptyString);
-}
-/**
- * Helper method, no reason to have to pass the same error codes every time
- * @param {*} value
- * @param {string} rangePattern
- * @return {boolean}
- */
-
-
-function check2004ValidRange(value, rangePattern) {
- return (0, _common.checkValidRange)(value, rangePattern, scorm2004_error_codes.VALUE_OUT_OF_RANGE, _exceptions.Scorm2004ValidationError);
-}
-/**
- * Class representing cmi object for SCORM 2004
- */
-
-
-var _version2 = /*#__PURE__*/new WeakMap();
-
-var _children2 = /*#__PURE__*/new WeakMap();
-
-var _completion_status = /*#__PURE__*/new WeakMap();
-
-var _completion_threshold = /*#__PURE__*/new WeakMap();
-
-var _credit = /*#__PURE__*/new WeakMap();
-
-var _entry = /*#__PURE__*/new WeakMap();
-
-var _exit = /*#__PURE__*/new WeakMap();
-
-var _launch_data = /*#__PURE__*/new WeakMap();
-
-var _learner_id = /*#__PURE__*/new WeakMap();
-
-var _learner_name = /*#__PURE__*/new WeakMap();
-
-var _location = /*#__PURE__*/new WeakMap();
-
-var _max_time_allowed = /*#__PURE__*/new WeakMap();
-
-var _mode = /*#__PURE__*/new WeakMap();
-
-var _progress_measure = /*#__PURE__*/new WeakMap();
-
-var _scaled_passing_score = /*#__PURE__*/new WeakMap();
-
-var _session_time = /*#__PURE__*/new WeakMap();
-
-var _success_status = /*#__PURE__*/new WeakMap();
-
-var _suspend_data = /*#__PURE__*/new WeakMap();
-
-var _time_limit_action = /*#__PURE__*/new WeakMap();
-
-var _total_time = /*#__PURE__*/new WeakMap();
-
-var CMI = /*#__PURE__*/function (_BaseCMI) {
- _inherits(CMI, _BaseCMI);
-
- var _super = _createSuper(CMI);
-
- /**
- * Constructor for the SCORM 2004 cmi object
- * @param {boolean} initialized
- */
- function CMI(initialized) {
- var _this;
-
- _classCallCheck(this, CMI);
-
- _this = _super.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _version2, {
- writable: true,
- value: '1.0'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _children2, {
- writable: true,
- value: scorm2004_constants.cmi_children
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _completion_status, {
- writable: true,
- value: 'unknown'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _completion_threshold, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _credit, {
- writable: true,
- value: 'credit'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _entry, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _exit, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _launch_data, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _learner_id, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _learner_name, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _location, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _max_time_allowed, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _mode, {
- writable: true,
- value: 'normal'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _progress_measure, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _scaled_passing_score, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _session_time, {
- writable: true,
- value: 'PT0H0M0S'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _success_status, {
- writable: true,
- value: 'unknown'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _suspend_data, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _time_limit_action, {
- writable: true,
- value: 'continue,no message'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _total_time, {
- writable: true,
- value: ''
- });
-
- _this.learner_preference = new CMILearnerPreference();
- _this.score = new Scorm2004CMIScore();
- _this.comments_from_learner = new CMICommentsFromLearner();
- _this.comments_from_lms = new CMICommentsFromLMS();
- _this.interactions = new CMIInteractions();
- _this.objectives = new CMIObjectives();
- if (initialized) _this.initialize();
- return _this;
- }
-
- _createClass(CMI, [{
- key: "initialize",
- value:
- /**
- * Called when the API has been initialized after the CMI has been created
- */
- function initialize() {
- var _this$learner_prefere, _this$score, _this$comments_from_l, _this$comments_from_l2, _this$interactions, _this$objectives;
-
- _get(_getPrototypeOf(CMI.prototype), "initialize", this).call(this);
-
- (_this$learner_prefere = this.learner_preference) === null || _this$learner_prefere === void 0 ? void 0 : _this$learner_prefere.initialize();
- (_this$score = this.score) === null || _this$score === void 0 ? void 0 : _this$score.initialize();
- (_this$comments_from_l = this.comments_from_learner) === null || _this$comments_from_l === void 0 ? void 0 : _this$comments_from_l.initialize();
- (_this$comments_from_l2 = this.comments_from_lms) === null || _this$comments_from_l2 === void 0 ? void 0 : _this$comments_from_l2.initialize();
- (_this$interactions = this.interactions) === null || _this$interactions === void 0 ? void 0 : _this$interactions.initialize();
- (_this$objectives = this.objectives) === null || _this$objectives === void 0 ? void 0 : _this$objectives.initialize();
- }
- /**
- * Getter for #_version
- * @return {string}
- * @private
- */
-
- }, {
- key: "_version",
- get: function get() {
- return _classPrivateFieldGet(this, _version2);
- }
- /**
- * Setter for #_version. Just throws an error.
- * @param {string} _version
- * @private
- */
- ,
- set: function set(_version) {
- throwReadOnlyError();
- }
- /**
- * Getter for #_children
- * @return {string}
- * @private
- */
-
- }, {
- key: "_children",
- get: function get() {
- return _classPrivateFieldGet(this, _children2);
- }
- /**
- * Setter for #_children. Just throws an error.
- * @param {number} _children
- * @private
- */
- ,
- set: function set(_children) {
- throwReadOnlyError();
- }
- /**
- * Getter for #completion_status
- * @return {string}
- */
-
- }, {
- key: "completion_status",
- get: function get() {
- return _classPrivateFieldGet(this, _completion_status);
- }
- /**
- * Setter for #completion_status
- * @param {string} completion_status
- */
- ,
- set: function set(completion_status) {
- if (check2004ValidFormat(completion_status, scorm2004_regex.CMICStatus)) {
- _classPrivateFieldSet(this, _completion_status, completion_status);
- }
- }
- /**
- * Getter for #completion_threshold
- * @return {string}
- */
-
- }, {
- key: "completion_threshold",
- get: function get() {
- return _classPrivateFieldGet(this, _completion_threshold);
- }
- /**
- * Setter for #completion_threshold. Can only be called before initialization.
- * @param {string} completion_threshold
- */
- ,
- set: function set(completion_threshold) {
- !this.initialized ? _classPrivateFieldSet(this, _completion_threshold, completion_threshold) : throwReadOnlyError();
- }
- /**
- * Setter for #credit
- * @return {string}
- */
-
- }, {
- key: "credit",
- get: function get() {
- return _classPrivateFieldGet(this, _credit);
- }
- /**
- * Setter for #credit. Can only be called before initialization.
- * @param {string} credit
- */
- ,
- set: function set(credit) {
- !this.initialized ? _classPrivateFieldSet(this, _credit, credit) : throwReadOnlyError();
- }
- /**
- * Getter for #entry
- * @return {string}
- */
-
- }, {
- key: "entry",
- get: function get() {
- return _classPrivateFieldGet(this, _entry);
- }
- /**
- * Setter for #entry. Can only be called before initialization.
- * @param {string} entry
- */
- ,
- set: function set(entry) {
- !this.initialized ? _classPrivateFieldSet(this, _entry, entry) : throwReadOnlyError();
- }
- /**
- * Getter for #exit. Should only be called during JSON export.
- * @return {string}
- */
-
- }, {
- key: "exit",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _exit);
- }
- /**
- * Getter for #exit
- * @param {string} exit
- */
- ,
- set: function set(exit) {
- if (check2004ValidFormat(exit, scorm2004_regex.CMIExit, true)) {
- _classPrivateFieldSet(this, _exit, exit);
- }
- }
- /**
- * Getter for #launch_data
- * @return {string}
- */
-
- }, {
- key: "launch_data",
- get: function get() {
- return _classPrivateFieldGet(this, _launch_data);
- }
- /**
- * Setter for #launch_data. Can only be called before initialization.
- * @param {string} launch_data
- */
- ,
- set: function set(launch_data) {
- !this.initialized ? _classPrivateFieldSet(this, _launch_data, launch_data) : throwReadOnlyError();
- }
- /**
- * Getter for #learner_id
- * @return {string}
- */
-
- }, {
- key: "learner_id",
- get: function get() {
- return _classPrivateFieldGet(this, _learner_id);
- }
- /**
- * Setter for #learner_id. Can only be called before initialization.
- * @param {string} learner_id
- */
- ,
- set: function set(learner_id) {
- !this.initialized ? _classPrivateFieldSet(this, _learner_id, learner_id) : throwReadOnlyError();
- }
- /**
- * Getter for #learner_name
- * @return {string}
- */
-
- }, {
- key: "learner_name",
- get: function get() {
- return _classPrivateFieldGet(this, _learner_name);
- }
- /**
- * Setter for #learner_name. Can only be called before initialization.
- * @param {string} learner_name
- */
- ,
- set: function set(learner_name) {
- !this.initialized ? _classPrivateFieldSet(this, _learner_name, learner_name) : throwReadOnlyError();
- }
- /**
- * Getter for #location
- * @return {string}
- */
-
- }, {
- key: "location",
- get: function get() {
- return _classPrivateFieldGet(this, _location);
- }
- /**
- * Setter for #location
- * @param {string} location
- */
- ,
- set: function set(location) {
- if (check2004ValidFormat(location, scorm2004_regex.CMIString1000)) {
- _classPrivateFieldSet(this, _location, location);
- }
- }
- /**
- * Getter for #max_time_allowed
- * @return {string}
- */
-
- }, {
- key: "max_time_allowed",
- get: function get() {
- return _classPrivateFieldGet(this, _max_time_allowed);
- }
- /**
- * Setter for #max_time_allowed. Can only be called before initialization.
- * @param {string} max_time_allowed
- */
- ,
- set: function set(max_time_allowed) {
- !this.initialized ? _classPrivateFieldSet(this, _max_time_allowed, max_time_allowed) : throwReadOnlyError();
- }
- /**
- * Getter for #mode
- * @return {string}
- */
-
- }, {
- key: "mode",
- get: function get() {
- return _classPrivateFieldGet(this, _mode);
- }
- /**
- * Setter for #mode. Can only be called before initialization.
- * @param {string} mode
- */
- ,
- set: function set(mode) {
- !this.initialized ? _classPrivateFieldSet(this, _mode, mode) : throwReadOnlyError();
- }
- /**
- * Getter for #progress_measure
- * @return {string}
- */
-
- }, {
- key: "progress_measure",
- get: function get() {
- return _classPrivateFieldGet(this, _progress_measure);
- }
- /**
- * Setter for #progress_measure
- * @param {string} progress_measure
- */
- ,
- set: function set(progress_measure) {
- if (check2004ValidFormat(progress_measure, scorm2004_regex.CMIDecimal) && check2004ValidRange(progress_measure, scorm2004_regex.progress_range)) {
- _classPrivateFieldSet(this, _progress_measure, progress_measure);
- }
- }
- /**
- * Getter for #scaled_passing_score
- * @return {string}
- */
-
- }, {
- key: "scaled_passing_score",
- get: function get() {
- return _classPrivateFieldGet(this, _scaled_passing_score);
- }
- /**
- * Setter for #scaled_passing_score. Can only be called before initialization.
- * @param {string} scaled_passing_score
- */
- ,
- set: function set(scaled_passing_score) {
- !this.initialized ? _classPrivateFieldSet(this, _scaled_passing_score, scaled_passing_score) : throwReadOnlyError();
- }
- /**
- * Getter for #session_time. Should only be called during JSON export.
- * @return {string}
- */
-
- }, {
- key: "session_time",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _session_time);
- }
- /**
- * Setter for #session_time
- * @param {string} session_time
- */
- ,
- set: function set(session_time) {
- if (check2004ValidFormat(session_time, scorm2004_regex.CMITimespan)) {
- _classPrivateFieldSet(this, _session_time, session_time);
- }
- }
- /**
- * Getter for #success_status
- * @return {string}
- */
-
- }, {
- key: "success_status",
- get: function get() {
- return _classPrivateFieldGet(this, _success_status);
- }
- /**
- * Setter for #success_status
- * @param {string} success_status
- */
- ,
- set: function set(success_status) {
- if (check2004ValidFormat(success_status, scorm2004_regex.CMISStatus)) {
- _classPrivateFieldSet(this, _success_status, success_status);
- }
- }
- /**
- * Getter for #suspend_data
- * @return {string}
- */
-
- }, {
- key: "suspend_data",
- get: function get() {
- return _classPrivateFieldGet(this, _suspend_data);
- }
- /**
- * Setter for #suspend_data
- * @param {string} suspend_data
- */
- ,
- set: function set(suspend_data) {
- if (check2004ValidFormat(suspend_data, scorm2004_regex.CMIString64000, true)) {
- _classPrivateFieldSet(this, _suspend_data, suspend_data);
- }
- }
- /**
- * Getter for #time_limit_action
- * @return {string}
- */
-
- }, {
- key: "time_limit_action",
- get: function get() {
- return _classPrivateFieldGet(this, _time_limit_action);
- }
- /**
- * Setter for #time_limit_action. Can only be called before initialization.
- * @param {string} time_limit_action
- */
- ,
- set: function set(time_limit_action) {
- !this.initialized ? _classPrivateFieldSet(this, _time_limit_action, time_limit_action) : throwReadOnlyError();
- }
- /**
- * Getter for #total_time
- * @return {string}
- */
-
- }, {
- key: "total_time",
- get: function get() {
- return _classPrivateFieldGet(this, _total_time);
- }
- /**
- * Setter for #total_time. Can only be called before initialization.
- * @param {string} total_time
- */
- ,
- set: function set(total_time) {
- !this.initialized ? _classPrivateFieldSet(this, _total_time, total_time) : throwReadOnlyError();
- }
- /**
- * Adds the current session time to the existing total time.
- *
- * @return {string} ISO8601 Duration
- */
-
- }, {
- key: "getCurrentTotalTime",
- value: function getCurrentTotalTime() {
- var sessionTime = _classPrivateFieldGet(this, _session_time);
-
- var startTime = this.start_time;
-
- if (typeof startTime !== 'undefined' && startTime !== null) {
- var seconds = new Date().getTime() - startTime;
- sessionTime = Util.getSecondsAsISODuration(seconds / 1000);
- }
-
- return Util.addTwoDurations(_classPrivateFieldGet(this, _total_time), sessionTime, scorm2004_regex.CMITimespan);
- }
- /**
- * toJSON for cmi
- *
- * @return {
- * {
- * comments_from_learner: CMICommentsFromLearner,
- * comments_from_lms: CMICommentsFromLMS,
- * completion_status: string,
- * completion_threshold: string,
- * credit: string,
- * entry: string,
- * exit: string,
- * interactions: CMIInteractions,
- * launch_data: string,
- * learner_id: string,
- * learner_name: string,
- * learner_preference: CMILearnerPreference,
- * location: string,
- * max_time_allowed: string,
- * mode: string,
- * objectives: CMIObjectives,
- * progress_measure: string,
- * scaled_passing_score: string,
- * score: Scorm2004CMIScore,
- * session_time: string,
- * success_status: string,
- * suspend_data: string,
- * time_limit_action: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'comments_from_learner': this.comments_from_learner,
- 'comments_from_lms': this.comments_from_lms,
- 'completion_status': this.completion_status,
- 'completion_threshold': this.completion_threshold,
- 'credit': this.credit,
- 'entry': this.entry,
- 'exit': this.exit,
- 'interactions': this.interactions,
- 'launch_data': this.launch_data,
- 'learner_id': this.learner_id,
- 'learner_name': this.learner_name,
- 'learner_preference': this.learner_preference,
- 'location': this.location,
- 'max_time_allowed': this.max_time_allowed,
- 'mode': this.mode,
- 'objectives': this.objectives,
- 'progress_measure': this.progress_measure,
- 'scaled_passing_score': this.scaled_passing_score,
- 'score': this.score,
- 'session_time': this.session_time,
- 'success_status': this.success_status,
- 'suspend_data': this.suspend_data,
- 'time_limit_action': this.time_limit_action
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMI;
-}(_common.BaseCMI);
-/**
- * Class for SCORM 2004's cmi.learner_preference object
- */
-
-
-exports.CMI = CMI;
-
-var _children3 = /*#__PURE__*/new WeakMap();
-
-var _audio_level = /*#__PURE__*/new WeakMap();
-
-var _language = /*#__PURE__*/new WeakMap();
-
-var _delivery_speed = /*#__PURE__*/new WeakMap();
-
-var _audio_captioning = /*#__PURE__*/new WeakMap();
-
-var CMILearnerPreference = /*#__PURE__*/function (_BaseCMI2) {
- _inherits(CMILearnerPreference, _BaseCMI2);
-
- var _super2 = _createSuper(CMILearnerPreference);
-
- /**
- * Constructor for cmi.learner_preference
- */
- function CMILearnerPreference() {
- var _this2;
-
- _classCallCheck(this, CMILearnerPreference);
-
- _this2 = _super2.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _children3, {
- writable: true,
- value: scorm2004_constants.student_preference_children
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _audio_level, {
- writable: true,
- value: '1'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _language, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _delivery_speed, {
- writable: true,
- value: '1'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _audio_captioning, {
- writable: true,
- value: '0'
- });
-
- return _this2;
- }
- /**
- * Getter for #_children
- * @return {string}
- * @private
- */
-
-
- _createClass(CMILearnerPreference, [{
- key: "_children",
- get: function get() {
- return _classPrivateFieldGet(this, _children3);
- }
- /**
- * Setter for #_children. Just throws an error.
- * @param {string} _children
- * @private
- */
- ,
- set: function set(_children) {
- throwReadOnlyError();
- }
- /**
- * Getter for #audio_level
- * @return {string}
- */
-
- }, {
- key: "audio_level",
- get: function get() {
- return _classPrivateFieldGet(this, _audio_level);
- }
- /**
- * Setter for #audio_level
- * @param {string} audio_level
- */
- ,
- set: function set(audio_level) {
- if (check2004ValidFormat(audio_level, scorm2004_regex.CMIDecimal) && check2004ValidRange(audio_level, scorm2004_regex.audio_range)) {
- _classPrivateFieldSet(this, _audio_level, audio_level);
- }
- }
- /**
- * Getter for #language
- * @return {string}
- */
-
- }, {
- key: "language",
- get: function get() {
- return _classPrivateFieldGet(this, _language);
- }
- /**
- * Setter for #language
- * @param {string} language
- */
- ,
- set: function set(language) {
- if (check2004ValidFormat(language, scorm2004_regex.CMILang)) {
- _classPrivateFieldSet(this, _language, language);
- }
- }
- /**
- * Getter for #delivery_speed
- * @return {string}
- */
-
- }, {
- key: "delivery_speed",
- get: function get() {
- return _classPrivateFieldGet(this, _delivery_speed);
- }
- /**
- * Setter for #delivery_speed
- * @param {string} delivery_speed
- */
- ,
- set: function set(delivery_speed) {
- if (check2004ValidFormat(delivery_speed, scorm2004_regex.CMIDecimal) && check2004ValidRange(delivery_speed, scorm2004_regex.speed_range)) {
- _classPrivateFieldSet(this, _delivery_speed, delivery_speed);
- }
- }
- /**
- * Getter for #audio_captioning
- * @return {string}
- */
-
- }, {
- key: "audio_captioning",
- get: function get() {
- return _classPrivateFieldGet(this, _audio_captioning);
- }
- /**
- * Setter for #audio_captioning
- * @param {string} audio_captioning
- */
- ,
- set: function set(audio_captioning) {
- if (check2004ValidFormat(audio_captioning, scorm2004_regex.CMISInteger) && check2004ValidRange(audio_captioning, scorm2004_regex.text_range)) {
- _classPrivateFieldSet(this, _audio_captioning, audio_captioning);
- }
- }
- /**
- * toJSON for cmi.learner_preference
- *
- * @return {
- * {
- * audio_level: string,
- * language: string,
- * delivery_speed: string,
- * audio_captioning: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'audio_level': this.audio_level,
- 'language': this.language,
- 'delivery_speed': this.delivery_speed,
- 'audio_captioning': this.audio_captioning
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMILearnerPreference;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 2004's cmi.interactions object
- */
-
-
-var CMIInteractions = /*#__PURE__*/function (_CMIArray) {
- _inherits(CMIInteractions, _CMIArray);
-
- var _super3 = _createSuper(CMIInteractions);
-
- /**
- * Constructor for cmi.objectives Array
- */
- function CMIInteractions() {
- _classCallCheck(this, CMIInteractions);
-
- return _super3.call(this, {
- children: scorm2004_constants.interactions_children,
- errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError
- });
- }
-
- return _createClass(CMIInteractions);
-}(_common.CMIArray);
-/**
- * Class representing SCORM 2004's cmi.objectives object
- */
-
-
-var CMIObjectives = /*#__PURE__*/function (_CMIArray2) {
- _inherits(CMIObjectives, _CMIArray2);
-
- var _super4 = _createSuper(CMIObjectives);
-
- /**
- * Constructor for cmi.objectives Array
- */
- function CMIObjectives() {
- _classCallCheck(this, CMIObjectives);
-
- return _super4.call(this, {
- children: scorm2004_constants.objectives_children,
- errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError
- });
- }
-
- return _createClass(CMIObjectives);
-}(_common.CMIArray);
-/**
- * Class representing SCORM 2004's cmi.comments_from_lms object
- */
-
-
-var CMICommentsFromLMS = /*#__PURE__*/function (_CMIArray3) {
- _inherits(CMICommentsFromLMS, _CMIArray3);
-
- var _super5 = _createSuper(CMICommentsFromLMS);
-
- /**
- * Constructor for cmi.comments_from_lms Array
- */
- function CMICommentsFromLMS() {
- _classCallCheck(this, CMICommentsFromLMS);
-
- return _super5.call(this, {
- children: scorm2004_constants.comments_children,
- errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError
- });
- }
-
- return _createClass(CMICommentsFromLMS);
-}(_common.CMIArray);
-/**
- * Class representing SCORM 2004's cmi.comments_from_learner object
- */
-
-
-var CMICommentsFromLearner = /*#__PURE__*/function (_CMIArray4) {
- _inherits(CMICommentsFromLearner, _CMIArray4);
-
- var _super6 = _createSuper(CMICommentsFromLearner);
-
- /**
- * Constructor for cmi.comments_from_learner Array
- */
- function CMICommentsFromLearner() {
- _classCallCheck(this, CMICommentsFromLearner);
-
- return _super6.call(this, {
- children: scorm2004_constants.comments_children,
- errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError
- });
- }
-
- return _createClass(CMICommentsFromLearner);
-}(_common.CMIArray);
-/**
- * Class for SCORM 2004's cmi.interaction.n object
- */
-
-
-var _id = /*#__PURE__*/new WeakMap();
-
-var _type = /*#__PURE__*/new WeakMap();
-
-var _timestamp = /*#__PURE__*/new WeakMap();
-
-var _weighting = /*#__PURE__*/new WeakMap();
-
-var _learner_response = /*#__PURE__*/new WeakMap();
-
-var _result = /*#__PURE__*/new WeakMap();
-
-var _latency = /*#__PURE__*/new WeakMap();
-
-var _description = /*#__PURE__*/new WeakMap();
-
-var CMIInteractionsObject = /*#__PURE__*/function (_BaseCMI3) {
- _inherits(CMIInteractionsObject, _BaseCMI3);
-
- var _super7 = _createSuper(CMIInteractionsObject);
-
- /**
- * Constructor for cmi.interaction.n
- */
- function CMIInteractionsObject() {
- var _this3;
-
- _classCallCheck(this, CMIInteractionsObject);
-
- _this3 = _super7.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _id, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _type, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _timestamp, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _weighting, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _learner_response, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _result, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _latency, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _description, {
- writable: true,
- value: ''
- });
-
- _this3.objectives = new _common.CMIArray({
- errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError,
- children: scorm2004_constants.objectives_children
- });
- _this3.correct_responses = new _common.CMIArray({
- errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError,
- children: scorm2004_constants.correct_responses_children
- });
- return _this3;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(CMIInteractionsObject, [{
- key: "initialize",
- value: function initialize() {
- var _this$objectives2, _this$correct_respons;
-
- _get(_getPrototypeOf(CMIInteractionsObject.prototype), "initialize", this).call(this);
-
- (_this$objectives2 = this.objectives) === null || _this$objectives2 === void 0 ? void 0 : _this$objectives2.initialize();
- (_this$correct_respons = this.correct_responses) === null || _this$correct_respons === void 0 ? void 0 : _this$correct_respons.initialize();
- }
- /**
- * Getter for #id
- * @return {string}
- */
-
- }, {
- key: "id",
- get: function get() {
- return _classPrivateFieldGet(this, _id);
- }
- /**
- * Setter for #id
- * @param {string} id
- */
- ,
- set: function set(id) {
- if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) {
- _classPrivateFieldSet(this, _id, id);
- }
- }
- /**
- * Getter for #type
- * @return {string}
- */
-
- }, {
- key: "type",
- get: function get() {
- return _classPrivateFieldGet(this, _type);
- }
- /**
- * Setter for #type
- * @param {string} type
- */
- ,
- set: function set(type) {
- if (this.initialized && _classPrivateFieldGet(this, _id) === '') {
- throwDependencyNotEstablishedError();
- } else {
- if (check2004ValidFormat(type, scorm2004_regex.CMIType)) {
- _classPrivateFieldSet(this, _type, type);
- }
- }
- }
- /**
- * Getter for #timestamp
- * @return {string}
- */
-
- }, {
- key: "timestamp",
- get: function get() {
- return _classPrivateFieldGet(this, _timestamp);
- }
- /**
- * Setter for #timestamp
- * @param {string} timestamp
- */
- ,
- set: function set(timestamp) {
- if (this.initialized && _classPrivateFieldGet(this, _id) === '') {
- throwDependencyNotEstablishedError();
- } else {
- if (check2004ValidFormat(timestamp, scorm2004_regex.CMITime)) {
- _classPrivateFieldSet(this, _timestamp, timestamp);
- }
- }
- }
- /**
- * Getter for #weighting
- * @return {string}
- */
-
- }, {
- key: "weighting",
- get: function get() {
- return _classPrivateFieldGet(this, _weighting);
- }
- /**
- * Setter for #weighting
- * @param {string} weighting
- */
- ,
- set: function set(weighting) {
- if (this.initialized && _classPrivateFieldGet(this, _id) === '') {
- throwDependencyNotEstablishedError();
- } else {
- if (check2004ValidFormat(weighting, scorm2004_regex.CMIDecimal)) {
- _classPrivateFieldSet(this, _weighting, weighting);
- }
- }
- }
- /**
- * Getter for #learner_response
- * @return {string}
- */
-
- }, {
- key: "learner_response",
- get: function get() {
- return _classPrivateFieldGet(this, _learner_response);
- }
- /**
- * Setter for #learner_response. Does type validation to make sure response
- * matches SCORM 2004's spec
- * @param {string} learner_response
- */
- ,
- set: function set(learner_response) {
- if (this.initialized && (_classPrivateFieldGet(this, _type) === '' || _classPrivateFieldGet(this, _id) === '')) {
- throwDependencyNotEstablishedError();
- } else {
- var nodes = [];
- var response_type = learner_responses[this.type];
-
- if (response_type) {
- if (response_type !== null && response_type !== void 0 && response_type.delimiter) {
- nodes = learner_response.split(response_type.delimiter);
- } else {
- nodes[0] = learner_response;
- }
-
- if (nodes.length > 0 && nodes.length <= response_type.max) {
- var formatRegex = new RegExp(response_type.format);
-
- for (var i = 0; i < nodes.length; i++) {
- if (response_type !== null && response_type !== void 0 && response_type.delimiter2) {
- var values = nodes[i].split(response_type.delimiter2);
-
- if (values.length === 2) {
- if (!values[0].match(formatRegex)) {
- throwTypeMismatchError();
- } else {
- if (!values[1].match(new RegExp(response_type.format2))) {
- throwTypeMismatchError();
- }
- }
- } else {
- throwTypeMismatchError();
- }
- } else {
- if (!nodes[i].match(formatRegex)) {
- throwTypeMismatchError();
- } else {
- if (nodes[i] !== '' && response_type.unique) {
- for (var j = 0; j < i; j++) {
- if (nodes[i] === nodes[j]) {
- throwTypeMismatchError();
- }
- }
- }
- }
- }
- }
- } else {
- throwGeneralSetError();
- }
-
- _classPrivateFieldSet(this, _learner_response, learner_response);
- } else {
- throwTypeMismatchError();
- }
- }
- }
- /**
- * Getter for #result
- * @return {string}
- */
-
- }, {
- key: "result",
- get: function get() {
- return _classPrivateFieldGet(this, _result);
- }
- /**
- * Setter for #result
- * @param {string} result
- */
- ,
- set: function set(result) {
- if (check2004ValidFormat(result, scorm2004_regex.CMIResult)) {
- _classPrivateFieldSet(this, _result, result);
- }
- }
- /**
- * Getter for #latency
- * @return {string}
- */
-
- }, {
- key: "latency",
- get: function get() {
- return _classPrivateFieldGet(this, _latency);
- }
- /**
- * Setter for #latency
- * @param {string} latency
- */
- ,
- set: function set(latency) {
- if (this.initialized && _classPrivateFieldGet(this, _id) === '') {
- throwDependencyNotEstablishedError();
- } else {
- if (check2004ValidFormat(latency, scorm2004_regex.CMITimespan)) {
- _classPrivateFieldSet(this, _latency, latency);
- }
- }
- }
- /**
- * Getter for #description
- * @return {string}
- */
-
- }, {
- key: "description",
- get: function get() {
- return _classPrivateFieldGet(this, _description);
- }
- /**
- * Setter for #description
- * @param {string} description
- */
- ,
- set: function set(description) {
- if (this.initialized && _classPrivateFieldGet(this, _id) === '') {
- throwDependencyNotEstablishedError();
- } else {
- if (check2004ValidFormat(description, scorm2004_regex.CMILangString250, true)) {
- _classPrivateFieldSet(this, _description, description);
- }
- }
- }
- /**
- * toJSON for cmi.interactions.n
- *
- * @return {
- * {
- * id: string,
- * type: string,
- * objectives: CMIArray,
- * timestamp: string,
- * correct_responses: CMIArray,
- * weighting: string,
- * learner_response: string,
- * result: string,
- * latency: string,
- * description: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'id': this.id,
- 'type': this.type,
- 'objectives': this.objectives,
- 'timestamp': this.timestamp,
- 'weighting': this.weighting,
- 'learner_response': this.learner_response,
- 'result': this.result,
- 'latency': this.latency,
- 'description': this.description,
- 'correct_responses': this.correct_responses
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIInteractionsObject;
-}(_common.BaseCMI);
-/**
- * Class for SCORM 2004's cmi.objectives.n object
- */
-
-
-exports.CMIInteractionsObject = CMIInteractionsObject;
-
-var _id2 = /*#__PURE__*/new WeakMap();
-
-var _success_status2 = /*#__PURE__*/new WeakMap();
-
-var _completion_status2 = /*#__PURE__*/new WeakMap();
-
-var _progress_measure2 = /*#__PURE__*/new WeakMap();
-
-var _description2 = /*#__PURE__*/new WeakMap();
-
-var CMIObjectivesObject = /*#__PURE__*/function (_BaseCMI4) {
- _inherits(CMIObjectivesObject, _BaseCMI4);
-
- var _super8 = _createSuper(CMIObjectivesObject);
-
- /**
- * Constructor for cmi.objectives.n
- */
- function CMIObjectivesObject() {
- var _this4;
-
- _classCallCheck(this, CMIObjectivesObject);
-
- _this4 = _super8.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _id2, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _success_status2, {
- writable: true,
- value: 'unknown'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _completion_status2, {
- writable: true,
- value: 'unknown'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _progress_measure2, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _description2, {
- writable: true,
- value: ''
- });
-
- _this4.score = new Scorm2004CMIScore();
- return _this4;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(CMIObjectivesObject, [{
- key: "initialize",
- value: function initialize() {
- var _this$score2;
-
- _get(_getPrototypeOf(CMIObjectivesObject.prototype), "initialize", this).call(this);
-
- (_this$score2 = this.score) === null || _this$score2 === void 0 ? void 0 : _this$score2.initialize();
- }
- /**
- * Getter for #id
- * @return {string}
- */
-
- }, {
- key: "id",
- get: function get() {
- return _classPrivateFieldGet(this, _id2);
- }
- /**
- * Setter for #id
- * @param {string} id
- */
- ,
- set: function set(id) {
- if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) {
- _classPrivateFieldSet(this, _id2, id);
- }
- }
- /**
- * Getter for #success_status
- * @return {string}
- */
-
- }, {
- key: "success_status",
- get: function get() {
- return _classPrivateFieldGet(this, _success_status2);
- }
- /**
- * Setter for #success_status
- * @param {string} success_status
- */
- ,
- set: function set(success_status) {
- if (this.initialized && _classPrivateFieldGet(this, _id2) === '') {
- throwDependencyNotEstablishedError();
- } else {
- if (check2004ValidFormat(success_status, scorm2004_regex.CMISStatus)) {
- _classPrivateFieldSet(this, _success_status2, success_status);
- }
- }
- }
- /**
- * Getter for #completion_status
- * @return {string}
- */
-
- }, {
- key: "completion_status",
- get: function get() {
- return _classPrivateFieldGet(this, _completion_status2);
- }
- /**
- * Setter for #completion_status
- * @param {string} completion_status
- */
- ,
- set: function set(completion_status) {
- if (this.initialized && _classPrivateFieldGet(this, _id2) === '') {
- throwDependencyNotEstablishedError();
- } else {
- if (check2004ValidFormat(completion_status, scorm2004_regex.CMICStatus)) {
- _classPrivateFieldSet(this, _completion_status2, completion_status);
- }
- }
- }
- /**
- * Getter for #progress_measure
- * @return {string}
- */
-
- }, {
- key: "progress_measure",
- get: function get() {
- return _classPrivateFieldGet(this, _progress_measure2);
- }
- /**
- * Setter for #progress_measure
- * @param {string} progress_measure
- */
- ,
- set: function set(progress_measure) {
- if (this.initialized && _classPrivateFieldGet(this, _id2) === '') {
- throwDependencyNotEstablishedError();
- } else {
- if (check2004ValidFormat(progress_measure, scorm2004_regex.CMIDecimal) && check2004ValidRange(progress_measure, scorm2004_regex.progress_range)) {
- _classPrivateFieldSet(this, _progress_measure2, progress_measure);
- }
- }
- }
- /**
- * Getter for #description
- * @return {string}
- */
-
- }, {
- key: "description",
- get: function get() {
- return _classPrivateFieldGet(this, _description2);
- }
- /**
- * Setter for #description
- * @param {string} description
- */
- ,
- set: function set(description) {
- if (this.initialized && _classPrivateFieldGet(this, _id2) === '') {
- throwDependencyNotEstablishedError();
- } else {
- if (check2004ValidFormat(description, scorm2004_regex.CMILangString250, true)) {
- _classPrivateFieldSet(this, _description2, description);
- }
- }
- }
- /**
- * toJSON for cmi.objectives.n
- *
- * @return {
- * {
- * id: string,
- * success_status: string,
- * completion_status: string,
- * progress_measure: string,
- * description: string,
- * score: Scorm2004CMIScore
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'id': this.id,
- 'success_status': this.success_status,
- 'completion_status': this.completion_status,
- 'progress_measure': this.progress_measure,
- 'description': this.description,
- 'score': this.score
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIObjectivesObject;
-}(_common.BaseCMI);
-/**
- * Class for SCORM 2004's cmi *.score object
- */
-
-
-exports.CMIObjectivesObject = CMIObjectivesObject;
-
-var _scaled = /*#__PURE__*/new WeakMap();
-
-var Scorm2004CMIScore = /*#__PURE__*/function (_CMIScore) {
- _inherits(Scorm2004CMIScore, _CMIScore);
-
- var _super9 = _createSuper(Scorm2004CMIScore);
-
- /**
- * Constructor for cmi *.score
- */
- function Scorm2004CMIScore() {
- var _this5;
-
- _classCallCheck(this, Scorm2004CMIScore);
-
- _this5 = _super9.call(this, {
- score_children: scorm2004_constants.score_children,
- max: '',
- invalidErrorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- invalidTypeCode: scorm2004_error_codes.TYPE_MISMATCH,
- invalidRangeCode: scorm2004_error_codes.VALUE_OUT_OF_RANGE,
- decimalRegex: scorm2004_regex.CMIDecimal,
- errorClass: _exceptions.Scorm2004ValidationError
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _scaled, {
- writable: true,
- value: ''
- });
-
- return _this5;
- }
- /**
- * Getter for #scaled
- * @return {string}
- */
-
-
- _createClass(Scorm2004CMIScore, [{
- key: "scaled",
- get: function get() {
- return _classPrivateFieldGet(this, _scaled);
- }
- /**
- * Setter for #scaled
- * @param {string} scaled
- */
- ,
- set: function set(scaled) {
- if (check2004ValidFormat(scaled, scorm2004_regex.CMIDecimal) && check2004ValidRange(scaled, scorm2004_regex.scaled_range)) {
- _classPrivateFieldSet(this, _scaled, scaled);
- }
- }
- /**
- * toJSON for cmi *.score
- *
- * @return {
- * {
- * scaled: string,
- * raw: string,
- * min: string,
- * max: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'scaled': this.scaled,
- 'raw': _get(_getPrototypeOf(Scorm2004CMIScore.prototype), "raw", this),
- 'min': _get(_getPrototypeOf(Scorm2004CMIScore.prototype), "min", this),
- 'max': _get(_getPrototypeOf(Scorm2004CMIScore.prototype), "max", this)
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return Scorm2004CMIScore;
-}(_common.CMIScore);
-/**
- * Class representing SCORM 2004's cmi.comments_from_learner.n and cmi.comments_from_lms.n object
- */
-
-
-var _comment = /*#__PURE__*/new WeakMap();
-
-var _location2 = /*#__PURE__*/new WeakMap();
-
-var _timestamp2 = /*#__PURE__*/new WeakMap();
-
-var _readOnlyAfterInit = /*#__PURE__*/new WeakMap();
-
-var CMICommentsObject = /*#__PURE__*/function (_BaseCMI5) {
- _inherits(CMICommentsObject, _BaseCMI5);
-
- var _super10 = _createSuper(CMICommentsObject);
-
- /**
- * Constructor for cmi.comments_from_learner.n and cmi.comments_from_lms.n
- * @param {boolean} readOnlyAfterInit
- */
- function CMICommentsObject() {
- var _this6;
-
- var readOnlyAfterInit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
-
- _classCallCheck(this, CMICommentsObject);
-
- _this6 = _super10.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _comment, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _location2, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _timestamp2, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _readOnlyAfterInit, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldSet(_assertThisInitialized(_this6), _comment, '');
-
- _classPrivateFieldSet(_assertThisInitialized(_this6), _location2, '');
-
- _classPrivateFieldSet(_assertThisInitialized(_this6), _timestamp2, '');
-
- _classPrivateFieldSet(_assertThisInitialized(_this6), _readOnlyAfterInit, readOnlyAfterInit);
-
- return _this6;
- }
- /**
- * Getter for #comment
- * @return {string}
- */
-
-
- _createClass(CMICommentsObject, [{
- key: "comment",
- get: function get() {
- return _classPrivateFieldGet(this, _comment);
- }
- /**
- * Setter for #comment
- * @param {string} comment
- */
- ,
- set: function set(comment) {
- if (this.initialized && _classPrivateFieldGet(this, _readOnlyAfterInit)) {
- throwReadOnlyError();
- } else {
- if (check2004ValidFormat(comment, scorm2004_regex.CMILangString4000, true)) {
- _classPrivateFieldSet(this, _comment, comment);
- }
- }
- }
- /**
- * Getter for #location
- * @return {string}
- */
-
- }, {
- key: "location",
- get: function get() {
- return _classPrivateFieldGet(this, _location2);
- }
- /**
- * Setter for #location
- * @param {string} location
- */
- ,
- set: function set(location) {
- if (this.initialized && _classPrivateFieldGet(this, _readOnlyAfterInit)) {
- throwReadOnlyError();
- } else {
- if (check2004ValidFormat(location, scorm2004_regex.CMIString250)) {
- _classPrivateFieldSet(this, _location2, location);
- }
- }
- }
- /**
- * Getter for #timestamp
- * @return {string}
- */
-
- }, {
- key: "timestamp",
- get: function get() {
- return _classPrivateFieldGet(this, _timestamp2);
- }
- /**
- * Setter for #timestamp
- * @param {string} timestamp
- */
- ,
- set: function set(timestamp) {
- if (this.initialized && _classPrivateFieldGet(this, _readOnlyAfterInit)) {
- throwReadOnlyError();
- } else {
- if (check2004ValidFormat(timestamp, scorm2004_regex.CMITime)) {
- _classPrivateFieldSet(this, _timestamp2, timestamp);
- }
- }
- }
- /**
- * toJSON for cmi.comments_from_learner.n object
- * @return {
- * {
- * comment: string,
- * location: string,
- * timestamp: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'comment': this.comment,
- 'location': this.location,
- 'timestamp': this.timestamp
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMICommentsObject;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 2004's cmi.interactions.n.objectives.n object
- */
-
-
-exports.CMICommentsObject = CMICommentsObject;
-
-var _id3 = /*#__PURE__*/new WeakMap();
-
-var CMIInteractionsObjectivesObject = /*#__PURE__*/function (_BaseCMI6) {
- _inherits(CMIInteractionsObjectivesObject, _BaseCMI6);
-
- var _super11 = _createSuper(CMIInteractionsObjectivesObject);
-
- /**
- * Constructor for cmi.interactions.n.objectives.n
- */
- function CMIInteractionsObjectivesObject() {
- var _this7;
-
- _classCallCheck(this, CMIInteractionsObjectivesObject);
-
- _this7 = _super11.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this7), _id3, {
- writable: true,
- value: ''
- });
-
- return _this7;
- }
- /**
- * Getter for #id
- * @return {string}
- */
-
-
- _createClass(CMIInteractionsObjectivesObject, [{
- key: "id",
- get: function get() {
- return _classPrivateFieldGet(this, _id3);
- }
- /**
- * Setter for #id
- * @param {string} id
- */
- ,
- set: function set(id) {
- if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) {
- _classPrivateFieldSet(this, _id3, id);
- }
- }
- /**
- * toJSON for cmi.interactions.n.objectives.n
- * @return {
- * {
- * id: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'id': this.id
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIInteractionsObjectivesObject;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 2004's cmi.interactions.n.correct_responses.n object
- */
-
-
-exports.CMIInteractionsObjectivesObject = CMIInteractionsObjectivesObject;
-
-var _pattern = /*#__PURE__*/new WeakMap();
-
-var CMIInteractionsCorrectResponsesObject = /*#__PURE__*/function (_BaseCMI7) {
- _inherits(CMIInteractionsCorrectResponsesObject, _BaseCMI7);
-
- var _super12 = _createSuper(CMIInteractionsCorrectResponsesObject);
-
- /**
- * Constructor for cmi.interactions.n.correct_responses.n
- */
- function CMIInteractionsCorrectResponsesObject() {
- var _this8;
-
- _classCallCheck(this, CMIInteractionsCorrectResponsesObject);
-
- _this8 = _super12.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this8), _pattern, {
- writable: true,
- value: ''
- });
-
- return _this8;
- }
- /**
- * Getter for #pattern
- * @return {string}
- */
-
-
- _createClass(CMIInteractionsCorrectResponsesObject, [{
- key: "pattern",
- get: function get() {
- return _classPrivateFieldGet(this, _pattern);
- }
- /**
- * Setter for #pattern
- * @param {string} pattern
- */
- ,
- set: function set(pattern) {
- if (check2004ValidFormat(pattern, scorm2004_regex.CMIFeedback)) {
- _classPrivateFieldSet(this, _pattern, pattern);
- }
- }
- /**
- * toJSON cmi.interactions.n.correct_responses.n object
- * @return {
- * {
- * pattern: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'pattern': this.pattern
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIInteractionsCorrectResponsesObject;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 2004's adl object
- */
-
-
-exports.CMIInteractionsCorrectResponsesObject = CMIInteractionsCorrectResponsesObject;
-
-var ADL = /*#__PURE__*/function (_BaseCMI8) {
- _inherits(ADL, _BaseCMI8);
-
- var _super13 = _createSuper(ADL);
-
- /**
- * Constructor for adl
- */
- function ADL() {
- var _this9;
-
- _classCallCheck(this, ADL);
-
- _this9 = _super13.call(this);
- _this9.nav = new ADLNav();
- return _this9;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(ADL, [{
- key: "initialize",
- value: function initialize() {
- var _this$nav;
-
- _get(_getPrototypeOf(ADL.prototype), "initialize", this).call(this);
-
- (_this$nav = this.nav) === null || _this$nav === void 0 ? void 0 : _this$nav.initialize();
- }
- /**
- * toJSON for adl
- * @return {
- * {
- * nav: {
- * request: string
- * }
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'nav': this.nav
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return ADL;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 2004's adl.nav object
- */
-
-
-exports.ADL = ADL;
-
-var _request = /*#__PURE__*/new WeakMap();
-
-var ADLNav = /*#__PURE__*/function (_BaseCMI9) {
- _inherits(ADLNav, _BaseCMI9);
-
- var _super14 = _createSuper(ADLNav);
-
- /**
- * Constructor for adl.nav
- */
- function ADLNav() {
- var _this10;
-
- _classCallCheck(this, ADLNav);
-
- _this10 = _super14.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this10), _request, {
- writable: true,
- value: '_none_'
- });
-
- _this10.request_valid = new ADLNavRequestValid();
- return _this10;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(ADLNav, [{
- key: "initialize",
- value: function initialize() {
- var _this$request_valid;
-
- _get(_getPrototypeOf(ADLNav.prototype), "initialize", this).call(this);
-
- (_this$request_valid = this.request_valid) === null || _this$request_valid === void 0 ? void 0 : _this$request_valid.initialize();
- }
- /**
- * Getter for #request
- * @return {string}
- */
-
- }, {
- key: "request",
- get: function get() {
- return _classPrivateFieldGet(this, _request);
- }
- /**
- * Setter for #request
- * @param {string} request
- */
- ,
- set: function set(request) {
- if (check2004ValidFormat(request, scorm2004_regex.NAVEvent)) {
- _classPrivateFieldSet(this, _request, request);
- }
- }
- /**
- * toJSON for adl.nav
- *
- * @return {
- * {
- * request: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'request': this.request
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return ADLNav;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 2004's adl.nav.request_valid object
- */
-
-
-var _continue = /*#__PURE__*/new WeakMap();
-
-var _previous = /*#__PURE__*/new WeakMap();
-
-var ADLNavRequestValid = /*#__PURE__*/function (_BaseCMI10) {
- _inherits(ADLNavRequestValid, _BaseCMI10);
-
- var _super15 = _createSuper(ADLNavRequestValid);
-
- /**
- * Constructor for adl.nav.request_valid
- */
- function ADLNavRequestValid() {
- var _this11;
-
- _classCallCheck(this, ADLNavRequestValid);
-
- _this11 = _super15.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this11), _continue, {
- writable: true,
- value: 'unknown'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this11), _previous, {
- writable: true,
- value: 'unknown'
- });
-
- _defineProperty(_assertThisInitialized(_this11), "choice", /*#__PURE__*/function () {
- function _class2() {
- _classCallCheck(this, _class2);
-
- _defineProperty(this, "_isTargetValid", function (_target) {
- return 'unknown';
- });
- }
-
- return _createClass(_class2);
- }());
-
- _defineProperty(_assertThisInitialized(_this11), "jump", /*#__PURE__*/function () {
- function _class4() {
- _classCallCheck(this, _class4);
-
- _defineProperty(this, "_isTargetValid", function (_target) {
- return 'unknown';
- });
- }
-
- return _createClass(_class4);
- }());
-
- return _this11;
- }
- /**
- * Getter for #continue
- * @return {string}
- */
-
-
- _createClass(ADLNavRequestValid, [{
- key: "continue",
- get: function get() {
- return _classPrivateFieldGet(this, _continue);
- }
- /**
- * Setter for #continue. Just throws an error.
- * @param {*} _
- */
- ,
- set: function set(_) {
- throwReadOnlyError();
- }
- /**
- * Getter for #previous
- * @return {string}
- */
-
- }, {
- key: "previous",
- get: function get() {
- return _classPrivateFieldGet(this, _previous);
- }
- /**
- * Setter for #previous. Just throws an error.
- * @param {*} _
- */
- ,
- set: function set(_) {
- throwReadOnlyError();
- }
- /**
- * toJSON for adl.nav.request_valid
- *
- * @return {
- * {
- * previous: string,
- * continue: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'previous': this.previous,
- 'continue': this["continue"]
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return ADLNavRequestValid;
-}(_common.BaseCMI);
-
-},{"../constants/api_constants":10,"../constants/error_codes":11,"../constants/regex":13,"../constants/response_constants":14,"../exceptions":15,"../utilities":17,"./common":7}],10:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-var global = {
- SCORM_TRUE: 'true',
- SCORM_FALSE: 'false',
- STATE_NOT_INITIALIZED: 0,
- STATE_INITIALIZED: 1,
- STATE_TERMINATED: 2,
- LOG_LEVEL_DEBUG: 1,
- LOG_LEVEL_INFO: 2,
- LOG_LEVEL_WARNING: 3,
- LOG_LEVEL_ERROR: 4,
- LOG_LEVEL_NONE: 5
-};
-var scorm12 = {
- // Children lists
- cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions',
- core_children: 'student_id,student_name,lesson_location,credit,lesson_status,entry,score,total_time,lesson_mode,exit,session_time',
- score_children: 'raw,min,max',
- comments_children: 'content,location,time',
- objectives_children: 'id,score,status',
- correct_responses_children: 'pattern',
- student_data_children: 'mastery_score,max_time_allowed,time_limit_action',
- student_preference_children: 'audio,language,speed,text',
- interactions_children: 'id,objectives,time,type,correct_responses,weighting,student_response,result,latency',
- error_descriptions: {
- '101': {
- basicMessage: 'General Exception',
- detailMessage: 'No specific error code exists to describe the error. Use LMSGetDiagnostic for more information'
- },
- '201': {
- basicMessage: 'Invalid argument error',
- detailMessage: 'Indicates that an argument represents an invalid data model element or is otherwise incorrect.'
- },
- '202': {
- basicMessage: 'Element cannot have children',
- detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in "_children" for a data model element that does not support the "_children" suffix.'
- },
- '203': {
- basicMessage: 'Element not an array - cannot have count',
- detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in "_count" for a data model element that does not support the "_count" suffix.'
- },
- '301': {
- basicMessage: 'Not initialized',
- detailMessage: 'Indicates that an API call was made before the call to lmsInitialize.'
- },
- '401': {
- basicMessage: 'Not implemented error',
- detailMessage: 'The data model element indicated in a call to LMSGetValue or LMSSetValue is valid, but was not implemented by this LMS. SCORM 1.2 defines a set of data model elements as being optional for an LMS to implement.'
- },
- '402': {
- basicMessage: 'Invalid set value, element is a keyword',
- detailMessage: 'Indicates that LMSSetValue was called on a data model element that represents a keyword (elements that end in "_children" and "_count").'
- },
- '403': {
- basicMessage: 'Element is read only',
- detailMessage: 'LMSSetValue was called with a data model element that can only be read.'
- },
- '404': {
- basicMessage: 'Element is write only',
- detailMessage: 'LMSGetValue was called on a data model element that can only be written to.'
- },
- '405': {
- basicMessage: 'Incorrect Data Type',
- detailMessage: 'LMSSetValue was called with a value that is not consistent with the data format of the supplied data model element.'
- },
- '407': {
- basicMessage: 'Element Value Out Of Range',
- detailMessage: 'The numeric value supplied to a LMSSetValue call is outside of the numeric range allowed for the supplied data model element.'
- },
- '408': {
- basicMessage: 'Data Model Dependency Not Established',
- detailMessage: 'Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.'
- }
- }
-};
-
-var aicc = _objectSpread(_objectSpread({}, scorm12), {
- cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions,evaluation',
- student_preference_children: 'audio,language,lesson_type,speed,text,text_color,text_location,text_size,video,windows',
- student_data_children: 'attempt_number,tries,mastery_score,max_time_allowed,time_limit_action',
- student_demographics_children: 'city,class,company,country,experience,familiar_name,instructor_name,title,native_language,state,street_address,telephone,years_experience',
- tries_children: 'time,status,score',
- attempt_records_children: 'score,lesson_status',
- paths_children: 'location_id,date,time,status,why_left,time_in_element'
-});
-
-var scorm2004 = {
- // Children lists
- cmi_children: '_version,comments_from_learner,comments_from_lms,completion_status,credit,entry,exit,interactions,launch_data,learner_id,learner_name,learner_preference,location,max_time_allowed,mode,objectives,progress_measure,scaled_passing_score,score,session_time,success_status,suspend_data,time_limit_action,total_time',
- comments_children: 'comment,timestamp,location',
- score_children: 'max,raw,scaled,min',
- objectives_children: 'progress_measure,completion_status,success_status,description,score,id',
- correct_responses_children: 'pattern',
- student_data_children: 'mastery_score,max_time_allowed,time_limit_action',
- student_preference_children: 'audio_level,audio_captioning,delivery_speed,language',
- interactions_children: 'id,type,objectives,timestamp,correct_responses,weighting,learner_response,result,latency,description',
- error_descriptions: {
- '0': {
- basicMessage: 'No Error',
- detailMessage: 'No error occurred, the previous API call was successful.'
- },
- '101': {
- basicMessage: 'General Exception',
- detailMessage: 'No specific error code exists to describe the error. Use GetDiagnostic for more information.'
- },
- '102': {
- basicMessage: 'General Initialization Failure',
- detailMessage: 'Call to Initialize failed for an unknown reason.'
- },
- '103': {
- basicMessage: 'Already Initialized',
- detailMessage: 'Call to Initialize failed because Initialize was already called.'
- },
- '104': {
- basicMessage: 'Content Instance Terminated',
- detailMessage: 'Call to Initialize failed because Terminate was already called.'
- },
- '111': {
- basicMessage: 'General Termination Failure',
- detailMessage: 'Call to Terminate failed for an unknown reason.'
- },
- '112': {
- basicMessage: 'Termination Before Initialization',
- detailMessage: 'Call to Terminate failed because it was made before the call to Initialize.'
- },
- '113': {
- basicMessage: 'Termination After Termination',
- detailMessage: 'Call to Terminate failed because Terminate was already called.'
- },
- '122': {
- basicMessage: 'Retrieve Data Before Initialization',
- detailMessage: 'Call to GetValue failed because it was made before the call to Initialize.'
- },
- '123': {
- basicMessage: 'Retrieve Data After Termination',
- detailMessage: 'Call to GetValue failed because it was made after the call to Terminate.'
- },
- '132': {
- basicMessage: 'Store Data Before Initialization',
- detailMessage: 'Call to SetValue failed because it was made before the call to Initialize.'
- },
- '133': {
- basicMessage: 'Store Data After Termination',
- detailMessage: 'Call to SetValue failed because it was made after the call to Terminate.'
- },
- '142': {
- basicMessage: 'Commit Before Initialization',
- detailMessage: 'Call to Commit failed because it was made before the call to Initialize.'
- },
- '143': {
- basicMessage: 'Commit After Termination',
- detailMessage: 'Call to Commit failed because it was made after the call to Terminate.'
- },
- '201': {
- basicMessage: 'General Argument Error',
- detailMessage: 'An invalid argument was passed to an API method (usually indicates that Initialize, Commit or Terminate did not receive the expected empty string argument.'
- },
- '301': {
- basicMessage: 'General Get Failure',
- detailMessage: 'Indicates a failed GetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.'
- },
- '351': {
- basicMessage: 'General Set Failure',
- detailMessage: 'Indicates a failed SetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.'
- },
- '391': {
- basicMessage: 'General Commit Failure',
- detailMessage: 'Indicates a failed Commit call where no other specific error code is applicable. Use GetDiagnostic for more information.'
- },
- '401': {
- basicMessage: 'Undefined Data Model Element',
- detailMessage: 'The data model element name passed to GetValue or SetValue is not a valid SCORM data model element.'
- },
- '402': {
- basicMessage: 'Unimplemented Data Model Element',
- detailMessage: 'The data model element indicated in a call to GetValue or SetValue is valid, but was not implemented by this LMS. In SCORM 2004, this error would indicate an LMS that is not fully SCORM conformant.'
- },
- '403': {
- basicMessage: 'Data Model Element Value Not Initialized',
- detailMessage: 'Attempt to read a data model element that has not been initialized by the LMS or through a SetValue call. This error condition is often reached during normal execution of a SCO.'
- },
- '404': {
- basicMessage: 'Data Model Element Is Read Only',
- detailMessage: 'SetValue was called with a data model element that can only be read.'
- },
- '405': {
- basicMessage: 'Data Model Element Is Write Only',
- detailMessage: 'GetValue was called on a data model element that can only be written to.'
- },
- '406': {
- basicMessage: 'Data Model Element Type Mismatch',
- detailMessage: 'SetValue was called with a value that is not consistent with the data format of the supplied data model element.'
- },
- '407': {
- basicMessage: 'Data Model Element Value Out Of Range',
- detailMessage: 'The numeric value supplied to a SetValue call is outside of the numeric range allowed for the supplied data model element.'
- },
- '408': {
- basicMessage: 'Data Model Dependency Not Established',
- detailMessage: 'Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.'
- }
- }
-};
-var APIConstants = {
- global: global,
- scorm12: scorm12,
- aicc: aicc,
- scorm2004: scorm2004
-};
-var _default = APIConstants;
-exports["default"] = _default;
-
-},{}],11:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-var global = {
- GENERAL: 101,
- INITIALIZATION_FAILED: 101,
- INITIALIZED: 101,
- TERMINATED: 101,
- TERMINATION_FAILURE: 101,
- TERMINATION_BEFORE_INIT: 101,
- MULTIPLE_TERMINATION: 101,
- RETRIEVE_BEFORE_INIT: 101,
- RETRIEVE_AFTER_TERM: 101,
- STORE_BEFORE_INIT: 101,
- STORE_AFTER_TERM: 101,
- COMMIT_BEFORE_INIT: 101,
- COMMIT_AFTER_TERM: 101,
- ARGUMENT_ERROR: 101,
- CHILDREN_ERROR: 101,
- COUNT_ERROR: 101,
- GENERAL_GET_FAILURE: 101,
- GENERAL_SET_FAILURE: 101,
- GENERAL_COMMIT_FAILURE: 101,
- UNDEFINED_DATA_MODEL: 101,
- UNIMPLEMENTED_ELEMENT: 101,
- VALUE_NOT_INITIALIZED: 101,
- INVALID_SET_VALUE: 101,
- READ_ONLY_ELEMENT: 101,
- WRITE_ONLY_ELEMENT: 101,
- TYPE_MISMATCH: 101,
- VALUE_OUT_OF_RANGE: 101,
- DEPENDENCY_NOT_ESTABLISHED: 101
-};
-
-var scorm12 = _objectSpread(_objectSpread({}, global), {
- RETRIEVE_BEFORE_INIT: 301,
- STORE_BEFORE_INIT: 301,
- COMMIT_BEFORE_INIT: 301,
- ARGUMENT_ERROR: 201,
- CHILDREN_ERROR: 202,
- COUNT_ERROR: 203,
- UNDEFINED_DATA_MODEL: 401,
- UNIMPLEMENTED_ELEMENT: 401,
- VALUE_NOT_INITIALIZED: 301,
- INVALID_SET_VALUE: 402,
- READ_ONLY_ELEMENT: 403,
- WRITE_ONLY_ELEMENT: 404,
- TYPE_MISMATCH: 405,
- VALUE_OUT_OF_RANGE: 407,
- DEPENDENCY_NOT_ESTABLISHED: 408
-});
-
-var scorm2004 = _objectSpread(_objectSpread({}, global), {
- INITIALIZATION_FAILED: 102,
- INITIALIZED: 103,
- TERMINATED: 104,
- TERMINATION_FAILURE: 111,
- TERMINATION_BEFORE_INIT: 112,
- MULTIPLE_TERMINATIONS: 113,
- RETRIEVE_BEFORE_INIT: 122,
- RETRIEVE_AFTER_TERM: 123,
- STORE_BEFORE_INIT: 132,
- STORE_AFTER_TERM: 133,
- COMMIT_BEFORE_INIT: 142,
- COMMIT_AFTER_TERM: 143,
- ARGUMENT_ERROR: 201,
- GENERAL_GET_FAILURE: 301,
- GENERAL_SET_FAILURE: 351,
- GENERAL_COMMIT_FAILURE: 391,
- UNDEFINED_DATA_MODEL: 401,
- UNIMPLEMENTED_ELEMENT: 402,
- VALUE_NOT_INITIALIZED: 403,
- READ_ONLY_ELEMENT: 404,
- WRITE_ONLY_ELEMENT: 405,
- TYPE_MISMATCH: 406,
- VALUE_OUT_OF_RANGE: 407,
- DEPENDENCY_NOT_ESTABLISHED: 408
-});
-
-var ErrorCodes = {
- scorm12: scorm12,
- scorm2004: scorm2004
-};
-var _default = ErrorCodes;
-exports["default"] = _default;
-
-},{}],12:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-var ValidLanguages = {
- 'aa': 'aa',
- 'ab': 'ab',
- 'ae': 'ae',
- 'af': 'af',
- 'ak': 'ak',
- 'am': 'am',
- 'an': 'an',
- 'ar': 'ar',
- 'as': 'as',
- 'av': 'av',
- 'ay': 'ay',
- 'az': 'az',
- 'ba': 'ba',
- 'be': 'be',
- 'bg': 'bg',
- 'bh': 'bh',
- 'bi': 'bi',
- 'bm': 'bm',
- 'bn': 'bn',
- 'bo': 'bo',
- 'br': 'br',
- 'bs': 'bs',
- 'ca': 'ca',
- 'ce': 'ce',
- 'ch': 'ch',
- 'co': 'co',
- 'cr': 'cr',
- 'cs': 'cs',
- 'cu': 'cu',
- 'cv': 'cv',
- 'cy': 'cy',
- 'da': 'da',
- 'de': 'de',
- 'dv': 'dv',
- 'dz': 'dz',
- 'ee': 'ee',
- 'el': 'el',
- 'en': 'en',
- 'eo': 'eo',
- 'es': 'es',
- 'et': 'et',
- 'eu': 'eu',
- 'fa': 'fa',
- 'ff': 'ff',
- 'fi': 'fi',
- 'fj': 'fj',
- 'fo': 'fo',
- 'fr': 'fr',
- 'fy': 'fy',
- 'ga': 'ga',
- 'gd': 'gd',
- 'gl': 'gl',
- 'gn': 'gn',
- 'gu': 'gu',
- 'gv': 'gv',
- 'ha': 'ha',
- 'he': 'he',
- 'hi': 'hi',
- 'ho': 'ho',
- 'hr': 'hr',
- 'ht': 'ht',
- 'hu': 'hu',
- 'hy': 'hy',
- 'hz': 'hz',
- 'ia': 'ia',
- 'id': 'id',
- 'ie': 'ie',
- 'ig': 'ig',
- 'ii': 'ii',
- 'ik': 'ik',
- 'io': 'io',
- 'is': 'is',
- 'it': 'it',
- 'iu': 'iu',
- 'ja': 'ja',
- 'jv': 'jv',
- 'ka': 'ka',
- 'kg': 'kg',
- 'ki': 'ki',
- 'kj': 'kj',
- 'kk': 'kk',
- 'kl': 'kl',
- 'km': 'km',
- 'kn': 'kn',
- 'ko': 'ko',
- 'kr': 'kr',
- 'ks': 'ks',
- 'ku': 'ku',
- 'kv': 'kv',
- 'kw': 'kw',
- 'ky': 'ky',
- 'la': 'la',
- 'lb': 'lb',
- 'lg': 'lg',
- 'li': 'li',
- 'ln': 'ln',
- 'lo': 'lo',
- 'lt': 'lt',
- 'lu': 'lu',
- 'lv': 'lv',
- 'mg': 'mg',
- 'mh': 'mh',
- 'mi': 'mi',
- 'mk': 'mk',
- 'ml': 'ml',
- 'mn': 'mn',
- 'mo': 'mo',
- 'mr': 'mr',
- 'ms': 'ms',
- 'mt': 'mt',
- 'my': 'my',
- 'na': 'na',
- 'nb': 'nb',
- 'nd': 'nd',
- 'ne': 'ne',
- 'ng': 'ng',
- 'nl': 'nl',
- 'nn': 'nn',
- 'no': 'no',
- 'nr': 'nr',
- 'nv': 'nv',
- 'ny': 'ny',
- 'oc': 'oc',
- 'oj': 'oj',
- 'om': 'om',
- 'or': 'or',
- 'os': 'os',
- 'pa': 'pa',
- 'pi': 'pi',
- 'pl': 'pl',
- 'ps': 'ps',
- 'pt': 'pt',
- 'qu': 'qu',
- 'rm': 'rm',
- 'rn': 'rn',
- 'ro': 'ro',
- 'ru': 'ru',
- 'rw': 'rw',
- 'sa': 'sa',
- 'sc': 'sc',
- 'sd': 'sd',
- 'se': 'se',
- 'sg': 'sg',
- 'sh': 'sh',
- 'si': 'si',
- 'sk': 'sk',
- 'sl': 'sl',
- 'sm': 'sm',
- 'sn': 'sn',
- 'so': 'so',
- 'sq': 'sq',
- 'sr': 'sr',
- 'ss': 'ss',
- 'st': 'st',
- 'su': 'su',
- 'sv': 'sv',
- 'sw': 'sw',
- 'ta': 'ta',
- 'te': 'te',
- 'tg': 'tg',
- 'th': 'th',
- 'ti': 'ti',
- 'tk': 'tk',
- 'tl': 'tl',
- 'tn': 'tn',
- 'to': 'to',
- 'tr': 'tr',
- 'ts': 'ts',
- 'tt': 'tt',
- 'tw': 'tw',
- 'ty': 'ty',
- 'ug': 'ug',
- 'uk': 'uk',
- 'ur': 'ur',
- 'uz': 'uz',
- 've': 've',
- 'vi': 'vi',
- 'vo': 'vo',
- 'wa': 'wa',
- 'wo': 'wo',
- 'xh': 'xh',
- 'yi': 'yi',
- 'yo': 'yo',
- 'za': 'za',
- 'zh': 'zh',
- 'zu': 'zu',
- 'aar': 'aar',
- 'abk': 'abk',
- 'ave': 'ave',
- 'afr': 'afr',
- 'aka': 'aka',
- 'amh': 'amh',
- 'arg': 'arg',
- 'ara': 'ara',
- 'asm': 'asm',
- 'ava': 'ava',
- 'aym': 'aym',
- 'aze': 'aze',
- 'bak': 'bak',
- 'bel': 'bel',
- 'bul': 'bul',
- 'bih': 'bih',
- 'bis': 'bis',
- 'bam': 'bam',
- 'ben': 'ben',
- 'tib': 'tib',
- 'bod': 'bod',
- 'bre': 'bre',
- 'bos': 'bos',
- 'cat': 'cat',
- 'che': 'che',
- 'cha': 'cha',
- 'cos': 'cos',
- 'cre': 'cre',
- 'cze': 'cze',
- 'ces': 'ces',
- 'chu': 'chu',
- 'chv': 'chv',
- 'wel': 'wel',
- 'cym': 'cym',
- 'dan': 'dan',
- 'ger': 'ger',
- 'deu': 'deu',
- 'div': 'div',
- 'dzo': 'dzo',
- 'ewe': 'ewe',
- 'gre': 'gre',
- 'ell': 'ell',
- 'eng': 'eng',
- 'epo': 'epo',
- 'spa': 'spa',
- 'est': 'est',
- 'baq': 'baq',
- 'eus': 'eus',
- 'per': 'per',
- 'fas': 'fas',
- 'ful': 'ful',
- 'fin': 'fin',
- 'fij': 'fij',
- 'fao': 'fao',
- 'fre': 'fre',
- 'fra': 'fra',
- 'fry': 'fry',
- 'gle': 'gle',
- 'gla': 'gla',
- 'glg': 'glg',
- 'grn': 'grn',
- 'guj': 'guj',
- 'glv': 'glv',
- 'hau': 'hau',
- 'heb': 'heb',
- 'hin': 'hin',
- 'hmo': 'hmo',
- 'hrv': 'hrv',
- 'hat': 'hat',
- 'hun': 'hun',
- 'arm': 'arm',
- 'hye': 'hye',
- 'her': 'her',
- 'ina': 'ina',
- 'ind': 'ind',
- 'ile': 'ile',
- 'ibo': 'ibo',
- 'iii': 'iii',
- 'ipk': 'ipk',
- 'ido': 'ido',
- 'ice': 'ice',
- 'isl': 'isl',
- 'ita': 'ita',
- 'iku': 'iku',
- 'jpn': 'jpn',
- 'jav': 'jav',
- 'geo': 'geo',
- 'kat': 'kat',
- 'kon': 'kon',
- 'kik': 'kik',
- 'kua': 'kua',
- 'kaz': 'kaz',
- 'kal': 'kal',
- 'khm': 'khm',
- 'kan': 'kan',
- 'kor': 'kor',
- 'kau': 'kau',
- 'kas': 'kas',
- 'kur': 'kur',
- 'kom': 'kom',
- 'cor': 'cor',
- 'kir': 'kir',
- 'lat': 'lat',
- 'ltz': 'ltz',
- 'lug': 'lug',
- 'lim': 'lim',
- 'lin': 'lin',
- 'lao': 'lao',
- 'lit': 'lit',
- 'lub': 'lub',
- 'lav': 'lav',
- 'mlg': 'mlg',
- 'mah': 'mah',
- 'mao': 'mao',
- 'mri': 'mri',
- 'mac': 'mac',
- 'mkd': 'mkd',
- 'mal': 'mal',
- 'mon': 'mon',
- 'mol': 'mol',
- 'mar': 'mar',
- 'may': 'may',
- 'msa': 'msa',
- 'mlt': 'mlt',
- 'bur': 'bur',
- 'mya': 'mya',
- 'nau': 'nau',
- 'nob': 'nob',
- 'nde': 'nde',
- 'nep': 'nep',
- 'ndo': 'ndo',
- 'dut': 'dut',
- 'nld': 'nld',
- 'nno': 'nno',
- 'nor': 'nor',
- 'nbl': 'nbl',
- 'nav': 'nav',
- 'nya': 'nya',
- 'oci': 'oci',
- 'oji': 'oji',
- 'orm': 'orm',
- 'ori': 'ori',
- 'oss': 'oss',
- 'pan': 'pan',
- 'pli': 'pli',
- 'pol': 'pol',
- 'pus': 'pus',
- 'por': 'por',
- 'que': 'que',
- 'roh': 'roh',
- 'run': 'run',
- 'rum': 'rum',
- 'ron': 'ron',
- 'rus': 'rus',
- 'kin': 'kin',
- 'san': 'san',
- 'srd': 'srd',
- 'snd': 'snd',
- 'sme': 'sme',
- 'sag': 'sag',
- 'slo': 'slo',
- 'sin': 'sin',
- 'slk': 'slk',
- 'slv': 'slv',
- 'smo': 'smo',
- 'sna': 'sna',
- 'som': 'som',
- 'alb': 'alb',
- 'sqi': 'sqi',
- 'srp': 'srp',
- 'ssw': 'ssw',
- 'sot': 'sot',
- 'sun': 'sun',
- 'swe': 'swe',
- 'swa': 'swa',
- 'tam': 'tam',
- 'tel': 'tel',
- 'tgk': 'tgk',
- 'tha': 'tha',
- 'tir': 'tir',
- 'tuk': 'tuk',
- 'tgl': 'tgl',
- 'tsn': 'tsn',
- 'ton': 'ton',
- 'tur': 'tur',
- 'tso': 'tso',
- 'tat': 'tat',
- 'twi': 'twi',
- 'tah': 'tah',
- 'uig': 'uig',
- 'ukr': 'ukr',
- 'urd': 'urd',
- 'uzb': 'uzb',
- 'ven': 'ven',
- 'vie': 'vie',
- 'vol': 'vol',
- 'wln': 'wln',
- 'wol': 'wol',
- 'xho': 'xho',
- 'yid': 'yid',
- 'yor': 'yor',
- 'zha': 'zha',
- 'chi': 'chi',
- 'zho': 'zho',
- 'zul': 'zul'
-};
-var _default = ValidLanguages;
-exports["default"] = _default;
-
-},{}],13:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-var scorm12 = {
- CMIString256: '^.{0,255}$',
- CMIString4096: '^.{0,4096}$',
- CMITime: '^(?:[01]\\d|2[0123]):(?:[012345]\\d):(?:[012345]\\d)$',
- // eslint-disable-line
- CMITimespan: '^([0-9]{2,}):([0-9]{2}):([0-9]{2})(\.[0-9]{1,2})?$',
- // eslint-disable-line
- CMIInteger: '^\\d+$',
- CMISInteger: '^-?([0-9]+)$',
- CMIDecimal: '^-?([0-9]{0,3})(\.[0-9]*)?$',
- // eslint-disable-line
- CMIIdentifier: "^[\\u0021-\\u007E\\s]{0,255}$",
- CMIFeedback: '^.{0,255}$',
- // This must be redefined
- CMIIndex: '[._](\\d+).',
- // Vocabulary Data Type Definition
- CMIStatus: '^(passed|completed|failed|incomplete|browsed)$',
- CMIStatus2: '^(passed|completed|failed|incomplete|browsed|not attempted)$',
- CMIExit: '^(time-out|suspend|logout|)$',
- CMIType: '^(true-false|choice|fill-in|matching|performance|sequencing|likert|numeric)$',
- CMIResult: '^(correct|wrong|unanticipated|neutral|([0-9]{0,3})?(\\.[0-9]*)?)$',
- // eslint-disable-line
- NAVEvent: '^(previous|continue)$',
- // Data ranges
- score_range: '0#100',
- audio_range: '-1#100',
- speed_range: '-100#100',
- weighting_range: '-100#100',
- text_range: '-1#1'
-};
-
-var aicc = _objectSpread(_objectSpread({}, scorm12), {
- CMIIdentifier: '^\\w{1,255}$'
-});
-
-var scorm2004 = {
- CMIString200: "^[\\u0000-\\uFFFF]{0,200}$",
- CMIString250: "^[\\u0000-\\uFFFF]{0,250}$",
- CMIString1000: "^[\\u0000-\\uFFFF]{0,1000}$",
- CMIString4000: "^[\\u0000-\\uFFFF]{0,4000}$",
- CMIString64000: "^[\\u0000-\\uFFFF]{0,64000}$",
- CMILang: '^([a-zA-Z]{2,3}|i|x)(\-[a-zA-Z0-9\-]{2,8})?$|^$',
- // eslint-disable-line
- CMILangString250: '^(\{lang=([a-zA-Z]{2,3}|i|x)(\-[a-zA-Z0-9\-]{2,8})?\})?((?!\{.*$).{0,250}$)?$',
- // eslint-disable-line
- CMILangcr: '^((\{lang=([a-zA-Z]{2,3}|i|x)?(\-[a-zA-Z0-9\-]{2,8})?\}))(.*?)$',
- // eslint-disable-line
- CMILangString250cr: '^((\{lang=([a-zA-Z]{2,3}|i|x)?(\-[a-zA-Z0-9\-]{2,8})?\})?(.{0,250})?)?$',
- // eslint-disable-line
- CMILangString4000: '^(\{lang=([a-zA-Z]{2,3}|i|x)(\-[a-zA-Z0-9\-]{2,8})?\})?((?!\{.*$).{0,4000}$)?$',
- // eslint-disable-line
- CMITime: '^(19[7-9]{1}[0-9]{1}|20[0-2]{1}[0-9]{1}|203[0-8]{1})((-(0[1-9]{1}|1[0-2]{1}))((-(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1}))(T([0-1]{1}[0-9]{1}|2[0-3]{1})((:[0-5]{1}[0-9]{1})((:[0-5]{1}[0-9]{1})((\\.[0-9]{1,2})((Z|([+|-]([0-1]{1}[0-9]{1}|2[0-3]{1})))(:[0-5]{1}[0-9]{1})?)?)?)?)?)?)?)?$',
- CMITimespan: '^P(?:([.,\\d]+)Y)?(?:([.,\\d]+)M)?(?:([.,\\d]+)W)?(?:([.,\\d]+)D)?(?:T?(?:([.,\\d]+)H)?(?:([.,\\d]+)M)?(?:([.,\\d]+)S)?)?$',
- CMIInteger: '^\\d+$',
- CMISInteger: '^-?([0-9]+)$',
- CMIDecimal: '^-?([0-9]{1,5})(\\.[0-9]{1,18})?$',
- CMIIdentifier: '^\\S{1,250}[a-zA-Z0-9]$',
- CMIShortIdentifier: '^[\\w\\.\\-\\_]{1,250}$',
- // eslint-disable-line
- CMILongIdentifier: '^(?:(?!urn:)\\S{1,4000}|urn:[A-Za-z0-9-]{1,31}:\\S{1,4000}|.{1,4000})$',
- // need to re-examine this
- CMIFeedback: '^.*$',
- // This must be redefined
- CMIIndex: '[._](\\d+).',
- CMIIndexStore: '.N(\\d+).',
- // Vocabulary Data Type Definition
- CMICStatus: '^(completed|incomplete|not attempted|unknown)$',
- CMISStatus: '^(passed|failed|unknown)$',
- CMIExit: '^(time-out|suspend|logout|normal)$',
- CMIType: '^(true-false|choice|fill-in|long-fill-in|matching|performance|sequencing|likert|numeric|other)$',
- CMIResult: '^(correct|incorrect|unanticipated|neutral|-?([0-9]{1,4})(\\.[0-9]{1,18})?)$',
- NAVEvent: '^(previous|continue|exit|exitAll|abandon|abandonAll|suspendAll|\{target=\\S{0,200}[a-zA-Z0-9]\}choice|jump)$',
- // eslint-disable-line
- NAVBoolean: '^(unknown|true|false$)',
- NAVTarget: '^(previous|continue|choice.{target=\\S{0,200}[a-zA-Z0-9]})$',
- // Data ranges
- scaled_range: '-1#1',
- audio_range: '0#*',
- speed_range: '0#*',
- text_range: '-1#1',
- progress_range: '0#1'
-};
-var Regex = {
- aicc: aicc,
- scorm12: scorm12,
- scorm2004: scorm2004
-};
-var _default = Regex;
-exports["default"] = _default;
-
-},{}],14:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _regex = _interopRequireDefault(require("./regex"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-var scorm2004_regex = _regex["default"].scorm2004;
-var learner = {
- 'true-false': {
- format: '^true$|^false$',
- max: 1,
- delimiter: '',
- unique: false
- },
- 'choice': {
- format: scorm2004_regex.CMILongIdentifier,
- max: 36,
- delimiter: '[,]',
- unique: true
- },
- 'fill-in': {
- format: scorm2004_regex.CMILangString250,
- max: 10,
- delimiter: '[,]',
- unique: false
- },
- 'long-fill-in': {
- format: scorm2004_regex.CMILangString4000,
- max: 1,
- delimiter: '',
- unique: false
- },
- 'matching': {
- format: scorm2004_regex.CMIShortIdentifier,
- format2: scorm2004_regex.CMIShortIdentifier,
- max: 36,
- delimiter: '[,]',
- delimiter2: '[.]',
- unique: false
- },
- 'performance': {
- format: '^$|' + scorm2004_regex.CMIShortIdentifier,
- format2: scorm2004_regex.CMIDecimal + '|^$|' + scorm2004_regex.CMIShortIdentifier,
- max: 250,
- delimiter: '[,]',
- delimiter2: '[.]',
- unique: false
- },
- 'sequencing': {
- format: scorm2004_regex.CMIShortIdentifier,
- max: 36,
- delimiter: '[,]',
- unique: false
- },
- 'likert': {
- format: scorm2004_regex.CMIShortIdentifier,
- max: 1,
- delimiter: '',
- unique: false
- },
- 'numeric': {
- format: scorm2004_regex.CMIDecimal,
- max: 1,
- delimiter: '',
- unique: false
- },
- 'other': {
- format: scorm2004_regex.CMIString4000,
- max: 1,
- delimiter: '',
- unique: false
- }
-};
-var correct = {
- 'true-false': {
- max: 1,
- delimiter: '',
- unique: false,
- duplicate: false,
- format: '^true$|^false$',
- limit: 1
- },
- 'choice': {
- max: 36,
- delimiter: '[,]',
- unique: true,
- duplicate: false,
- format: scorm2004_regex.CMILongIdentifier
- },
- 'fill-in': {
- max: 10,
- delimiter: '[,]',
- unique: false,
- duplicate: false,
- format: scorm2004_regex.CMILangString250cr
- },
- 'long-fill-in': {
- max: 1,
- delimiter: '',
- unique: false,
- duplicate: true,
- format: scorm2004_regex.CMILangString4000
- },
- 'matching': {
- max: 36,
- delimiter: '[,]',
- delimiter2: '[.]',
- unique: false,
- duplicate: false,
- format: scorm2004_regex.CMIShortIdentifier,
- format2: scorm2004_regex.CMIShortIdentifier
- },
- 'performance': {
- max: 250,
- delimiter: '[,]',
- delimiter2: '[.]',
- unique: false,
- duplicate: false,
- format: '^$|' + scorm2004_regex.CMIShortIdentifier,
- format2: scorm2004_regex.CMIDecimal + '|^$|' + scorm2004_regex.CMIShortIdentifier
- },
- 'sequencing': {
- max: 36,
- delimiter: '[,]',
- unique: false,
- duplicate: false,
- format: scorm2004_regex.CMIShortIdentifier
- },
- 'likert': {
- max: 1,
- delimiter: '',
- unique: false,
- duplicate: false,
- format: scorm2004_regex.CMIShortIdentifier,
- limit: 1
- },
- 'numeric': {
- max: 2,
- delimiter: '[:]',
- unique: false,
- duplicate: false,
- format: scorm2004_regex.CMIDecimal,
- limit: 1
- },
- 'other': {
- max: 1,
- delimiter: '',
- unique: false,
- duplicate: false,
- format: scorm2004_regex.CMIString4000,
- limit: 1
- }
-};
-var Responses = {
- learner: learner,
- correct: correct
-};
-var _default = Responses;
-exports["default"] = _default;
-
-},{"./regex":13}],15:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.ValidationError = exports.Scorm2004ValidationError = exports.Scorm12ValidationError = exports.AICCValidationError = void 0;
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); }
-
-function _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
-
-function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
-
-function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
-
-function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-
-function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
-
-function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
-
-function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-
-var scorm12_errors = _api_constants["default"].scorm12.error_descriptions;
-var aicc_errors = _api_constants["default"].aicc.error_descriptions;
-var scorm2004_errors = _api_constants["default"].scorm2004.error_descriptions;
-/**
- * Base Validation Exception
- */
-
-var _errorCode = /*#__PURE__*/new WeakMap();
-
-var _errorMessage = /*#__PURE__*/new WeakMap();
-
-var _detailedMessage = /*#__PURE__*/new WeakMap();
-
-var ValidationError = /*#__PURE__*/function (_Error) {
- _inherits(ValidationError, _Error);
-
- var _super = _createSuper(ValidationError);
-
- /**
- * Constructor to take in an error message and code
- * @param {number} errorCode
- * @param {string} errorMessage
- * @param {string} detailedMessage
- */
- function ValidationError(errorCode, errorMessage, detailedMessage) {
- var _this;
-
- _classCallCheck(this, ValidationError);
-
- _this = _super.call(this, errorMessage);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _errorCode, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _errorMessage, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _detailedMessage, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _errorCode, errorCode);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _errorMessage, errorMessage);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _detailedMessage, detailedMessage);
-
- return _this;
- }
-
- _createClass(ValidationError, [{
- key: "errorCode",
- get:
- /**
- * Getter for #errorCode
- * @return {number}
- */
- function get() {
- return _classPrivateFieldGet(this, _errorCode);
- }
- /**
- * Getter for #errorMessage
- * @return {string}
- */
-
- }, {
- key: "errorMessage",
- get: function get() {
- return _classPrivateFieldGet(this, _errorMessage);
- }
- /**
- * Getter for #detailedMessage
- * @return {string}
- */
-
- }, {
- key: "detailedMessage",
- get: function get() {
- return _classPrivateFieldGet(this, _detailedMessage);
- }
- }]);
-
- return ValidationError;
-}( /*#__PURE__*/_wrapNativeSuper(Error));
-/**
- * SCORM 1.2 Validation Error
- */
-
-
-exports.ValidationError = ValidationError;
-
-var Scorm12ValidationError = /*#__PURE__*/function (_ValidationError) {
- _inherits(Scorm12ValidationError, _ValidationError);
-
- var _super2 = _createSuper(Scorm12ValidationError);
-
- /**
- * Constructor to take in an error code
- * @param {number} errorCode
- */
- function Scorm12ValidationError(errorCode) {
- var _this2;
-
- _classCallCheck(this, Scorm12ValidationError);
-
- if ({}.hasOwnProperty.call(scorm12_errors, String(errorCode))) {
- _this2 = _super2.call(this, errorCode, scorm12_errors[String(errorCode)].basicMessage, scorm12_errors[String(errorCode)].detailMessage);
- } else {
- _this2 = _super2.call(this, 101, scorm12_errors['101'].basicMessage, scorm12_errors['101'].detailMessage);
- }
-
- return _possibleConstructorReturn(_this2);
- }
-
- return _createClass(Scorm12ValidationError);
-}(ValidationError);
-/**
- * AICC Validation Error
- */
-
-
-exports.Scorm12ValidationError = Scorm12ValidationError;
-
-var AICCValidationError = /*#__PURE__*/function (_ValidationError2) {
- _inherits(AICCValidationError, _ValidationError2);
-
- var _super3 = _createSuper(AICCValidationError);
-
- /**
- * Constructor to take in an error code
- * @param {number} errorCode
- */
- function AICCValidationError(errorCode) {
- var _this3;
-
- _classCallCheck(this, AICCValidationError);
-
- if ({}.hasOwnProperty.call(aicc_errors, String(errorCode))) {
- _this3 = _super3.call(this, errorCode, aicc_errors[String(errorCode)].basicMessage, aicc_errors[String(errorCode)].detailMessage);
- } else {
- _this3 = _super3.call(this, 101, aicc_errors['101'].basicMessage, aicc_errors['101'].detailMessage);
- }
-
- return _possibleConstructorReturn(_this3);
- }
-
- return _createClass(AICCValidationError);
-}(ValidationError);
-/**
- * SCORM 2004 Validation Error
- */
-
-
-exports.AICCValidationError = AICCValidationError;
-
-var Scorm2004ValidationError = /*#__PURE__*/function (_ValidationError3) {
- _inherits(Scorm2004ValidationError, _ValidationError3);
-
- var _super4 = _createSuper(Scorm2004ValidationError);
-
- /**
- * Constructor to take in an error code
- * @param {number} errorCode
- */
- function Scorm2004ValidationError(errorCode) {
- var _this4;
-
- _classCallCheck(this, Scorm2004ValidationError);
-
- if ({}.hasOwnProperty.call(scorm2004_errors, String(errorCode))) {
- _this4 = _super4.call(this, errorCode, scorm2004_errors[String(errorCode)].basicMessage, scorm2004_errors[String(errorCode)].detailMessage);
- } else {
- _this4 = _super4.call(this, 101, scorm2004_errors['101'].basicMessage, scorm2004_errors['101'].detailMessage);
- }
-
- return _possibleConstructorReturn(_this4);
- }
-
- return _createClass(Scorm2004ValidationError);
-}(ValidationError);
-
-exports.Scorm2004ValidationError = Scorm2004ValidationError;
-
-},{"./constants/api_constants":10}],16:[function(require,module,exports){
-"use strict";
-
-var _Scorm2004API = _interopRequireDefault(require("../Scorm2004API"));
-
-var _Scorm12API = _interopRequireDefault(require("../Scorm12API"));
-
-var _AICC = _interopRequireDefault(require("../AICC"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-window.Scorm12API = _Scorm12API["default"];
-window.Scorm2004API = _Scorm2004API["default"];
-window.AICC = _AICC["default"];
-
-},{"../AICC":2,"../Scorm12API":4,"../Scorm2004API":5}],17:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.SECONDS_PER_SECOND = exports.SECONDS_PER_MINUTE = exports.SECONDS_PER_HOUR = exports.SECONDS_PER_DAY = void 0;
-exports.addHHMMSSTimeStrings = addHHMMSSTimeStrings;
-exports.addTwoDurations = addTwoDurations;
-exports.countDecimals = countDecimals;
-exports.flatten = flatten;
-exports.getDurationAsSeconds = getDurationAsSeconds;
-exports.getSecondsAsHHMMSS = getSecondsAsHHMMSS;
-exports.getSecondsAsISODuration = getSecondsAsISODuration;
-exports.getTimeAsSeconds = getTimeAsSeconds;
-exports.unflatten = unflatten;
-
-function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
-
-function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
-
-function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
-
-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; }
-
-function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
-
-function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
-
-var SECONDS_PER_SECOND = 1.0;
-exports.SECONDS_PER_SECOND = SECONDS_PER_SECOND;
-var SECONDS_PER_MINUTE = 60;
-exports.SECONDS_PER_MINUTE = SECONDS_PER_MINUTE;
-var SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE;
-exports.SECONDS_PER_HOUR = SECONDS_PER_HOUR;
-var SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;
-exports.SECONDS_PER_DAY = SECONDS_PER_DAY;
-var designations = [['D', SECONDS_PER_DAY], ['H', SECONDS_PER_HOUR], ['M', SECONDS_PER_MINUTE], ['S', SECONDS_PER_SECOND]];
-/**
- * Converts a Number to a String of HH:MM:SS
- *
- * @param {Number} totalSeconds
- * @return {string}
- */
-
-function getSecondsAsHHMMSS(totalSeconds) {
- // SCORM spec does not deal with negative durations, give zero back
- if (!totalSeconds || totalSeconds <= 0) {
- return '00:00:00';
- }
-
- var hours = Math.floor(totalSeconds / SECONDS_PER_HOUR);
- var dateObj = new Date(totalSeconds * 1000);
- var minutes = dateObj.getUTCMinutes(); // make sure we add any possible decimal value
-
- var seconds = dateObj.getSeconds();
- var ms = totalSeconds % 1.0;
- var msStr = '';
-
- if (countDecimals(ms) > 0) {
- if (countDecimals(ms) > 2) {
- msStr = ms.toFixed(2);
- } else {
- msStr = String(ms);
- }
-
- msStr = '.' + msStr.split('.')[1];
- }
-
- return (hours + ':' + minutes + ':' + seconds).replace(/\b\d\b/g, '0$&') + msStr;
-}
-/**
- * Calculate the number of seconds from ISO 8601 Duration
- *
- * @param {Number} seconds
- * @return {String}
- */
-
-
-function getSecondsAsISODuration(seconds) {
- // SCORM spec does not deal with negative durations, give zero back
- if (!seconds || seconds <= 0) {
- return 'PT0S';
- }
-
- var duration = 'P';
- var remainder = seconds;
- designations.forEach(function (_ref) {
- var _ref2 = _slicedToArray(_ref, 2),
- sign = _ref2[0],
- current_seconds = _ref2[1];
-
- var value = Math.floor(remainder / current_seconds);
- remainder = remainder % current_seconds;
-
- if (countDecimals(remainder) > 2) {
- remainder = Number(Number(remainder).toFixed(2));
- } // If we have anything left in the remainder, and we're currently adding
- // seconds to the duration, go ahead and add the decimal to the seconds
-
-
- if (sign === 'S' && remainder > 0) {
- value += remainder;
- }
-
- if (value) {
- if ((duration.indexOf('D') > 0 || sign === 'H' || sign === 'M' || sign === 'S') && duration.indexOf('T') === -1) {
- duration += 'T';
- }
-
- duration += "".concat(value).concat(sign);
- }
- });
- return duration;
-}
-/**
- * Calculate the number of seconds from HH:MM:SS.DDDDDD
- *
- * @param {string} timeString
- * @param {RegExp} timeRegex
- * @return {number}
- */
-
-
-function getTimeAsSeconds(timeString, timeRegex) {
- if (!timeString || typeof timeString !== 'string' || !timeString.match(timeRegex)) {
- return 0;
- }
-
- var parts = timeString.split(':');
- var hours = Number(parts[0]);
- var minutes = Number(parts[1]);
- var seconds = Number(parts[2]);
- return hours * 3600 + minutes * 60 + seconds;
-}
-/**
- * Calculate the number of seconds from ISO 8601 Duration
- *
- * @param {string} duration
- * @param {RegExp} durationRegex
- * @return {number}
- */
-
-
-function getDurationAsSeconds(duration, durationRegex) {
- if (!duration || !duration.match(durationRegex)) {
- return 0;
- }
-
- var _ref3 = new RegExp(durationRegex).exec(duration) || [],
- _ref4 = _slicedToArray(_ref3, 8),
- years = _ref4[1],
- months = _ref4[2],
- days = _ref4[4],
- hours = _ref4[5],
- minutes = _ref4[6],
- seconds = _ref4[7];
-
- var result = 0.0;
- result += Number(seconds) * 1.0 || 0.0;
- result += Number(minutes) * 60.0 || 0.0;
- result += Number(hours) * 3600.0 || 0.0;
- result += Number(days) * (60 * 60 * 24.0) || 0.0;
- result += Number(years) * (60 * 60 * 24 * 365.0) || 0.0;
- return result;
-}
-/**
- * Adds together two ISO8601 Duration strings
- *
- * @param {string} first
- * @param {string} second
- * @param {RegExp} durationRegex
- * @return {string}
- */
-
-
-function addTwoDurations(first, second, durationRegex) {
- return getSecondsAsISODuration(getDurationAsSeconds(first, durationRegex) + getDurationAsSeconds(second, durationRegex));
-}
-/**
- * Add together two HH:MM:SS.DD strings
- *
- * @param {string} first
- * @param {string} second
- * @param {RegExp} timeRegex
- * @return {string}
- */
-
-
-function addHHMMSSTimeStrings(first, second, timeRegex) {
- return getSecondsAsHHMMSS(getTimeAsSeconds(first, timeRegex) + getTimeAsSeconds(second, timeRegex));
-}
-/**
- * Flatten a JSON object down to string paths for each values
- * @param {object} data
- * @return {object}
- */
-
-
-function flatten(data) {
- var result = {};
- /**
- * Recurse through the object
- * @param {*} cur
- * @param {*} prop
- */
-
- function recurse(cur, prop) {
- if (Object(cur) !== cur) {
- result[prop] = cur;
- } else if (Array.isArray(cur)) {
- for (var i = 0, l = cur.length; i < l; i++) {
- recurse(cur[i], prop + '[' + i + ']');
- if (l === 0) result[prop] = [];
- }
- } else {
- var isEmpty = true;
-
- for (var p in cur) {
- if ({}.hasOwnProperty.call(cur, p)) {
- isEmpty = false;
- recurse(cur[p], prop ? prop + '.' + p : p);
- }
- }
-
- if (isEmpty && prop) result[prop] = {};
- }
- }
-
- recurse(data, '');
- return result;
-}
-/**
- * Un-flatten a flat JSON object
- * @param {object} data
- * @return {object}
- */
-
-
-function unflatten(data) {
- 'use strict';
-
- if (Object(data) !== data || Array.isArray(data)) return data;
- var regex = /\.?([^.[\]]+)|\[(\d+)]/g;
- var result = {};
-
- for (var p in data) {
- if ({}.hasOwnProperty.call(data, p)) {
- var cur = result;
- var prop = '';
- var m = regex.exec(p);
-
- while (m) {
- cur = cur[prop] || (cur[prop] = m[2] ? [] : {});
- prop = m[2] || m[1];
- m = regex.exec(p);
- }
-
- cur[prop] = data[p];
- }
- }
-
- return result[''] || result;
-}
-/**
- * Counts the number of decimal places
- * @param {number} num
- * @return {number}
- */
-
-
-function countDecimals(num) {
- if (Math.floor(num) === num || String(num).indexOf('.') < 0) return 0;
- var parts = num.toString().split('.')[1];
- return parts.length || 0;
-}
-
-},{}]},{},[16]);
+!function(){var n={"./node_modules/lodash.debounce/index.js":
+/*!***********************************************!*\
+ !*** ./node_modules/lodash.debounce/index.js ***!
+ \***********************************************/function(e,s,t){function n(e){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function v(){return f.Date.now()}var r=NaN,i="[object Symbol]",o=/^\s+|\s+$/g,a=/^[-+]0x[0-9a-f]+$/i,c=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt,t="object"==(void 0===t.g?"undefined":n(t.g))&&t.g&&t.g.Object===Object&&t.g,h="object"==("undefined"==typeof self?"undefined":n(self))&&self&&self.Object===Object&&self,f=t||h||Function("return this")(),d=Object.prototype.toString,w=Math.max,M=Math.min;function _(e){var t=n(e);return e&&("object"==t||"function"==t)}function m(e){return"symbol"==n(e)||!!(t=e)&&"object"==n(t)&&d.call(e)==i;var t}function b(e){if("number"==typeof e)return e;if(m(e))return r;if("string"!=typeof(e=_(e)?_(t="function"==typeof e.valueOf?e.valueOf():e)?t+"":t:e))return 0===e?e:+e;e=e.replace(o,"");var t=c.test(e);return t||l.test(e)?u(e.slice(2),t?2:8):a.test(e)?r:+e}e.exports=function(h,n,e){var r,i,o,a,s,c,l=0,f=!1,u=!1,t=!0;if("function"!=typeof h)throw new TypeError("Expected a function");function d(e){var t=r,n=i;return r=i=void 0,l=e,a=h.apply(n,t)}function m(e){var t=e-c;return void 0===c||n<=t||t<0||u&&o<=e-l}function p(){var e,t=v();if(m(t))return y(t);s=setTimeout(p,(e=n-((t=t)-c),u?M(e,o-(t-l)):e))}function y(e){return s=void 0,t&&r?d(e):(r=i=void 0,a)}function g(){var e=v(),t=m(e);if(r=arguments,i=this,c=e,t){if(void 0===s)return l=e=c,s=setTimeout(p,n),f?d(e):a;if(u)return s=setTimeout(p,n),d(c)}return void 0===s&&(s=setTimeout(p,n)),a}return n=b(n)||0,_(e)&&(f=!!e.leading,u="maxWait"in e,o=u?w(b(e.maxWait)||0,n):o,t="trailing"in e?!!e.trailing:t),g.cancel=function(){void 0!==s&&clearTimeout(s),r=c=i=s=void(l=0)},g.flush=function(){return void 0===s?a:y(v())},g}},"./src/AICC.js":
+/*!*********************!*\
+ !*** ./src/AICC.js ***!
+ \*********************/function(r,e,t){"use strict";t.r(e),t.d(e,{default:function(){return d}});var e=t(/*! ./Scorm12API */"./src/Scorm12API.js"),o=t(/*! ./cmi/aicc_cmi */"./src/cmi/aicc_cmi.js"),h=t(/*! ./cmi/scorm12_cmi */"./src/cmi/scorm12_cmi.js");function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function n(t,e){var n,r=Object.keys(t);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(t),e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)),r}function a(r){for(var e=1;ee.length)&&(t=e.length);for(var n=0,r=new Array(t);n=this.apiLogLevel&&this.settings.onLogMessage(r,n)}},{key:"formatMessage",value:function(e,t,n){for(var r="",i=20-(r+=e).length,o=0;o=parseFloat(this.cmi.student_data.mastery_score)?this.cmi.core.lesson_status="passed":this.cmi.core.lesson_status="failed"):"browse"===this.cmi.core.lesson_mode&&""===((null===(i=this.startingData)||void 0===i||null===(n=i.cmi)||void 0===n||null===(r=n.core)||void 0===r?void 0:r.lesson_status)||"")&&"not attempted"===t&&(this.cmi.core.lesson_status="browsed"));var t,n,r,i=this.renderCommitCMI(e||this.settings.alwaysSendTotalTime);return this.apiLogLevel===u.LOG_LEVEL_DEBUG&&(console.debug("Commit (terminated: "+(e?"yes":"no")+"): "),console.debug(i)),this.settings.lmsCommitUrl?this.processHttpRequest(this.settings.lmsCommitUrl,i,e):u.SCORM_TRUE}}])&&f(t.prototype,e),n&&f(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}(e.default)},"./src/Scorm2004API.js":
+/*!*****************************!*\
+ !*** ./src/Scorm2004API.js ***!
+ \*****************************/function(n,e,t){"use strict";t.r(e),t.d(e,{default:function(){return O}});var e=t(/*! ./BaseAPI */"./src/BaseAPI.js"),a=t(/*! ./cmi/scorm2004_cmi */"./src/cmi/scorm2004_cmi.js"),o=t(/*! ./utilities */"./src/utilities.js"),r=t(/*! ./constants/api_constants */"./src/constants/api_constants.js"),f=t(/*! ./constants/error_codes */"./src/constants/error_codes.js"),d=t(/*! ./constants/response_constants */"./src/constants/response_constants.js"),m=t(/*! ./constants/language_constants */"./src/constants/language_constants.js"),t=t(/*! ./constants/regex */"./src/constants/regex.js");function p(e){return(p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function y(t,e){var n,r=Object.keys(t);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(t),e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),r.push.apply(r,n)),r}function g(t){for(var e=1;ee.max&&this.throwSCORMError(u.GENERAL_SET_FAILURE,"Data Model Element Pattern Too Long")}},{key:"checkDuplicateChoiceResponse",value:function(e,t){var n=e.correct_responses._count;if("choice"===e.type)for(var r=0;rNumber(t[1])&&this.throwSCORMError(u.TYPE_MISMATCH);else if(""!==t[o]&&r.unique)for(var s=0;s=this.cmi.completion_threshold?(console.debug("Setting Completion Status: Completed"),this.cmi.completion_status="completed"):(console.debug("Setting Completion Status: Incomplete"),this.cmi.completion_status="incomplete")),this.cmi.scaled_passing_score&&this.cmi.score.scaled&&(this.cmi.score.scaled>=this.cmi.scaled_passing_score?(console.debug("Setting Success Status: Passed"),this.cmi.success_status="passed"):(console.debug("Setting Success Status: Failed"),this.cmi.success_status="failed")));var t,n,r=!1,i=(this.adl.nav.request!==(null===(i=this.startingData)||void 0===i||null===(n=i.adl)||void 0===n||null===(t=n.nav)||void 0===t?void 0:t.request)&&"_none_"!==this.adl.nav.request&&(this.adl.nav.request=encodeURIComponent(this.adl.nav.request),r=!0),this.renderCommitCMI(e||this.settings.alwaysSendTotalTime));return this.apiLogLevel===l.LOG_LEVEL_DEBUG&&(console.debug("Commit (terminated: "+(e?"yes":"no")+"): "),console.debug(i)),this.settings.lmsCommitUrl?(n=this.processHttpRequest(this.settings.lmsCommitUrl,i,e),r&&void 0!==n.navRequest&&""!==n.navRequest&&Function('"use strict";(() => { '.concat(n.navRequest," })()"))(),n):l.SCORM_TRUE}}])&&v(t.prototype,e),n&&v(t,n),Object.defineProperty(t,"prototype",{writable:!1}),i}(e.default)},"./src/cmi/aicc_cmi.js":
+/*!*****************************!*\
+ !*** ./src/cmi/aicc_cmi.js ***!
+ \*****************************/function(t,n,f){"use strict";f.r(n),f.d(n,{CMI:function(){return C},CMIStudentDemographics:function(){return K},CMIPaths:function(){return Q},CMIPathsObject:function(){return ae},CMITries:function(){return se},CMITriesObject:function(){return ue},CMIAttemptRecords:function(){return he},CMIAttemptRecordsObject:function(){return de},CMIEvaluationCommentsObject:function(){return ge}});var d=f(/*! ./scorm12_cmi */"./src/cmi/scorm12_cmi.js"),r=f(/*! ./common */"./src/cmi/common.js"),n=f(/*! ../constants/api_constants */"./src/constants/api_constants.js"),m=f(/*! ../constants/regex */"./src/constants/regex.js"),p=f(/*! ../constants/error_codes */"./src/constants/error_codes.js"),y=f(/*! ../exceptions */"./src/exceptions.js");function g(e){return(g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function i(e,t,n){var r=e;if(t.has(r))throw new TypeError("Cannot initialize the same private elements twice on an object");t.set(e,n)}function o(e,t,n){var t=v(e,t,"set"),r=n;if(t.set)t.set.call(e,r);else{if(!t.writable)throw new TypeError("attempted to set read only private field");t.value=r}return n}function e(e,t){t=v(e,t,"get");return t.get?t.get.call(e):t.value}function v(e,t,n){if(!t.has(e))throw new TypeError("attempted to "+n+" private field on non-instance");return t.get(e)}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _(e,t){for(var n=0;n=t[0]){if("*"===t[1]||e<=t[1])return!0;throw new r.prototype.constructor(n)}throw new r.prototype.constructor(n)}var C=new WeakMap,k=new WeakMap,T=function(){function r(){var e,t,n;if(_(this,r),n=!(t="jsonString"),t in(e=this)?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,f(this,C,{writable:!0,value:!1}),f(this,k,{writable:!0,value:void 0}),(this instanceof r?this.constructor:void 0)===r)throw new TypeError("Cannot construct BaseCMI instances directly")}return b(r,[{key:"initialized",get:function(){return t(this,C)}},{key:"start_time",get:function(){return t(this,k)}},{key:"initialize",value:function(){d(this,C,!0)}},{key:"setStartTime",value:function(){d(this,k,(new Date).getTime())}}]),r}(),j=new WeakMap,m=new WeakMap,R=new WeakMap,p=new WeakMap,y=new WeakMap,g=new WeakMap,v=new WeakMap,L=new WeakMap,A=new WeakMap,N=new WeakMap,D=function(){a(u,T);var l=c(u);function u(e){var t,n=e.score_children,r=e.score_range,i=e.max,o=e.invalidErrorCode,a=e.invalidTypeCode,s=e.invalidRangeCode,c=e.decimalRegex,e=e.errorClass;return _(this,u),f(h(t=l.call(this)),j,{writable:!0,value:void 0}),f(h(t),m,{writable:!0,value:void 0}),f(h(t),R,{writable:!0,value:void 0}),f(h(t),p,{writable:!0,value:void 0}),f(h(t),y,{writable:!0,value:void 0}),f(h(t),g,{writable:!0,value:void 0}),f(h(t),v,{writable:!0,value:void 0}),f(h(t),L,{writable:!0,value:""}),f(h(t),A,{writable:!0,value:""}),f(h(t),N,{writable:!0,value:void 0}),d(h(t),j,n||M.score_children),d(h(t),m,!!r&&E.score_range),d(h(t),N,i||""===i?i:"100"),d(h(t),R,o||S.INVALID_SET_VALUE),d(h(t),p,a||S.TYPE_MISMATCH),d(h(t),y,s||S.VALUE_OUT_OF_RANGE),d(h(t),g,c||E.CMIDecimal),d(h(t),v,e),t}return b(u,[{key:"_children",get:function(){return t(this,j)},set:function(e){throw new(t(this,v).prototype.constructor)(t(this,R))}},{key:"raw",get:function(){return t(this,L)},set:function(e){!I(e,t(this,g),t(this,p),t(this,v))||t(this,m)&&!O(e,t(this,m),t(this,y),t(this,v))||d(this,L,e)}},{key:"min",get:function(){return t(this,A)},set:function(e){!I(e,t(this,g),t(this,p),t(this,v))||t(this,m)&&!O(e,t(this,m),t(this,y),t(this,v))||d(this,A,e)}},{key:"max",get:function(){return t(this,N)},set:function(e){!I(e,t(this,g),t(this,p),t(this,v))||t(this,m)&&!O(e,t(this,m),t(this,y),t(this,v))||d(this,N,e)}},{key:"toJSON",value:function(){this.jsonString=!0;var e={raw:this.raw,min:this.min,max:this.max};return delete this.jsonString,e}}]),u}(),P=new WeakMap,z=new WeakMap,V=new WeakMap,x=function(){a(o,T);var i=c(o);function o(e){var t,n=e.children,r=e.errorCode,e=e.errorClass;return _(this,o),f(h(t=i.call(this)),P,{writable:!0,value:void 0}),f(h(t),z,{writable:!0,value:void 0}),f(h(t),V,{writable:!0,value:void 0}),d(h(t),V,n),d(h(t),P,r),d(h(t),z,e),t.childArray=[],t}return b(o,[{key:"_children",get:function(){return t(this,V)},set:function(e){throw new(t(this,z).prototype.constructor)(t(this,P))}},{key:"_count",get:function(){return this.childArray.length},set:function(e){throw new(t(this,z).prototype.constructor)(t(this,P))}},{key:"toJSON",value:function(){this.jsonString=!0;for(var e={},t=0;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n
* Build: `lodash modularize exports="npm" -o ./`
@@ -11,51 +20,50 @@
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = 'Expected a function';
-
/** Used as references for various `Number` constants. */
+
var NAN = 0 / 0;
-
/** `Object#toString` result references. */
+
var symbolTag = '[object Symbol]';
-
/** Used to match leading and trailing whitespace. */
+
var reTrim = /^\s+|\s+$/g;
-
/** Used to detect bad signed hexadecimal string values. */
+
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
-
/** Used to detect binary string values. */
+
var reIsBinary = /^0b[01]+$/i;
-
/** Used to detect octal string values. */
+
var reIsOctal = /^0o[0-7]+$/i;
-
/** Built-in method references without a dependency on `root`. */
+
var freeParseInt = parseInt;
-
/** Detect free variable `global` from Node.js. */
-var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
+var freeGlobal = (typeof __webpack_require__.g === "undefined" ? "undefined" : _typeof(__webpack_require__.g)) == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;
/** Detect free variable `self`. */
-var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
+var freeSelf = (typeof self === "undefined" ? "undefined" : _typeof(self)) == 'object' && self && self.Object === Object && self;
/** Used as a reference to the global object. */
+
var root = freeGlobal || freeSelf || Function('return this')();
-
/** Used for built-in method references. */
-var objectProto = Object.prototype;
+var objectProto = Object.prototype;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
* of values.
*/
-var objectToString = objectProto.toString;
+var objectToString = objectProto.toString;
/* Built-in method references for those with the same name as other `lodash` methods. */
+
var nativeMax = Math.max,
nativeMin = Math.min;
-
/**
* Gets the timestamp of the number of milliseconds that have elapsed since
* the Unix epoch (1 January 1970 00:00:00 UTC).
@@ -72,10 +80,10 @@ var nativeMax = Math.max,
* }, _.now());
* // => Logs the number of milliseconds it took for the deferred invocation.
*/
-var now = function() {
+
+var now = function now() {
return root.Date.now();
};
-
/**
* Creates a debounced function that delays invoking `func` until after `wait`
* milliseconds have elapsed since the last time the debounced function was
@@ -130,6 +138,8 @@ var now = function() {
* // Cancel the trailing debounced invocation.
* jQuery(window).on('popstate', debounced.cancel);
*/
+
+
function debounce(func, wait, options) {
var lastArgs,
lastThis,
@@ -145,7 +155,9 @@ function debounce(func, wait, options) {
if (typeof func != 'function') {
throw new TypeError(FUNC_ERROR_TEXT);
}
+
wait = toNumber(wait) || 0;
+
if (isObject(options)) {
leading = !!options.leading;
maxing = 'maxWait' in options;
@@ -156,7 +168,6 @@ function debounce(func, wait, options) {
function invokeFunc(time) {
var args = lastArgs,
thisArg = lastThis;
-
lastArgs = lastThis = undefined;
lastInvokeTime = time;
result = func.apply(thisArg, args);
@@ -165,10 +176,10 @@ function debounce(func, wait, options) {
function leadingEdge(time) {
// Reset any `maxWait` timer.
- lastInvokeTime = time;
- // Start the timer for the trailing edge.
- timerId = setTimeout(timerExpired, wait);
- // Invoke the leading edge.
+ lastInvokeTime = time; // Start the timer for the trailing edge.
+
+ timerId = setTimeout(timerExpired, wait); // Invoke the leading edge.
+
return leading ? invokeFunc(time) : result;
}
@@ -176,38 +187,37 @@ function debounce(func, wait, options) {
var timeSinceLastCall = time - lastCallTime,
timeSinceLastInvoke = time - lastInvokeTime,
result = wait - timeSinceLastCall;
-
return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
}
function shouldInvoke(time) {
var timeSinceLastCall = time - lastCallTime,
- timeSinceLastInvoke = time - lastInvokeTime;
-
- // Either this is the first call, activity has stopped and we're at the
+ timeSinceLastInvoke = time - lastInvokeTime; // Either this is the first call, activity has stopped and we're at the
// trailing edge, the system time has gone backwards and we're treating
// it as the trailing edge, or we've hit the `maxWait` limit.
- return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
- (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
+
+ return lastCallTime === undefined || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
}
function timerExpired() {
var time = now();
+
if (shouldInvoke(time)) {
return trailingEdge(time);
- }
- // Restart the timer.
+ } // Restart the timer.
+
+
timerId = setTimeout(timerExpired, remainingWait(time));
}
function trailingEdge(time) {
- timerId = undefined;
-
- // Only invoke if we have `lastArgs` which means `func` has been
+ timerId = undefined; // Only invoke if we have `lastArgs` which means `func` has been
// debounced at least once.
+
if (trailing && lastArgs) {
return invokeFunc(time);
}
+
lastArgs = lastThis = undefined;
return result;
}
@@ -216,6 +226,7 @@ function debounce(func, wait, options) {
if (timerId !== undefined) {
clearTimeout(timerId);
}
+
lastInvokeTime = 0;
lastArgs = lastCallTime = lastThis = timerId = undefined;
}
@@ -227,7 +238,6 @@ function debounce(func, wait, options) {
function debounced() {
var time = now(),
isInvoking = shouldInvoke(time);
-
lastArgs = arguments;
lastThis = this;
lastCallTime = time;
@@ -236,22 +246,25 @@ function debounce(func, wait, options) {
if (timerId === undefined) {
return leadingEdge(lastCallTime);
}
+
if (maxing) {
// Handle invocations in a tight loop.
timerId = setTimeout(timerExpired, wait);
return invokeFunc(lastCallTime);
}
}
+
if (timerId === undefined) {
timerId = setTimeout(timerExpired, wait);
}
+
return result;
}
+
debounced.cancel = cancel;
debounced.flush = flush;
return debounced;
}
-
/**
* Checks if `value` is the
* [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
@@ -277,11 +290,13 @@ function debounce(func, wait, options) {
* _.isObject(null);
* // => false
*/
+
+
function isObject(value) {
- var type = typeof value;
+ var type = _typeof(value);
+
return !!value && (type == 'object' || type == 'function');
}
-
/**
* Checks if `value` is object-like. A value is object-like if it's not `null`
* and has a `typeof` result of "object".
@@ -306,10 +321,11 @@ function isObject(value) {
* _.isObjectLike(null);
* // => false
*/
-function isObjectLike(value) {
- return !!value && typeof value == 'object';
-}
+
+function isObjectLike(value) {
+ return !!value && _typeof(value) == 'object';
+}
/**
* Checks if `value` is classified as a `Symbol` primitive or object.
*
@@ -327,11 +343,11 @@ function isObjectLike(value) {
* _.isSymbol('abc');
* // => false
*/
-function isSymbol(value) {
- return typeof value == 'symbol' ||
- (isObjectLike(value) && objectToString.call(value) == symbolTag);
-}
+
+function isSymbol(value) {
+ return _typeof(value) == 'symbol' || isObjectLike(value) && objectToString.call(value) == symbolTag;
+}
/**
* Converts `value` to a number.
*
@@ -355,53 +371,53 @@ function isSymbol(value) {
* _.toNumber('3.2');
* // => 3.2
*/
+
+
function toNumber(value) {
if (typeof value == 'number') {
return value;
}
+
if (isSymbol(value)) {
return NAN;
}
+
if (isObject(value)) {
var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
- value = isObject(other) ? (other + '') : other;
+ value = isObject(other) ? other + '' : other;
}
+
if (typeof value != 'string') {
return value === 0 ? value : +value;
}
+
value = value.replace(reTrim, '');
var isBinary = reIsBinary.test(value);
- return (isBinary || reIsOctal.test(value))
- ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
- : (reIsBadHex.test(value) ? NAN : +value);
+ return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
}
module.exports = debounce;
-}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+/***/ }),
+
+/***/ "./src/BaseAPI.js":
+/*!************************!*\
+ !*** ./src/BaseAPI.js ***!
+ \************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{}],2:[function(require,module,exports){
"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _common = require("./cmi/common");
-
-var _exceptions = require("./exceptions");
-
-var _error_codes2 = _interopRequireDefault(require("./constants/error_codes"));
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-var _utilities = require("./utilities");
-
-var _lodash = _interopRequireDefault(require("lodash.debounce"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ BaseAPI; }
+/* harmony export */ });
+/* harmony import */ var _cmi_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cmi/common */ "./src/cmi/common.js");
+/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./exceptions */ "./src/exceptions.js");
+/* harmony import */ var _constants_error_codes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants/error_codes */ "./src/constants/error_codes.js");
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants/api_constants */ "./src/constants/api_constants.js");
+/* harmony import */ var _utilities__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utilities */ "./src/utilities.js");
+/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash.debounce */ "./node_modules/lodash.debounce/index.js");
+/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash_debounce__WEBPACK_IMPORTED_MODULE_5__);
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -442,8 +458,14 @@ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!priva
function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-var global_constants = _api_constants["default"].global;
-var scorm12_error_codes = _error_codes2["default"].scorm12;
+
+
+
+
+
+
+var global_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__["default"].global;
+var scorm12_error_codes = _constants_error_codes__WEBPACK_IMPORTED_MODULE_2__["default"].scorm12;
/**
* Base API class for AICC, SCORM 1.2, and SCORM 2004. Should be considered
* abstract, and never initialized on it's own.
@@ -514,6 +536,9 @@ var BaseAPI = /*#__PURE__*/function () {
return result;
},
+ requestHandler: function requestHandler(commitObject) {
+ return commitObject;
+ },
onLogMessage: function onLogMessage(messageLevel, logMessage) {
switch (messageLevel) {
case global_constants.LOG_LEVEL_ERROR:
@@ -672,7 +697,7 @@ var BaseAPI = /*#__PURE__*/function () {
try {
returnValue = this.getCMIValue(CMIElement);
} catch (e) {
- if (e instanceof _exceptions.ValidationError) {
+ if (e instanceof _exceptions__WEBPACK_IMPORTED_MODULE_1__.ValidationError) {
this.lastErrorCode = e.errorCode;
returnValue = global_constants.SCORM_FALSE;
} else {
@@ -719,7 +744,7 @@ var BaseAPI = /*#__PURE__*/function () {
try {
returnValue = this.setCMIValue(CMIElement, value);
} catch (e) {
- if (e instanceof _exceptions.ValidationError) {
+ if (e instanceof _exceptions__WEBPACK_IMPORTED_MODULE_1__.ValidationError) {
this.lastErrorCode = e.errorCode;
returnValue = global_constants.SCORM_FALSE;
} else {
@@ -1037,7 +1062,7 @@ var BaseAPI = /*#__PURE__*/function () {
break;
}
- if (refObject instanceof _common.CMIArray) {
+ if (refObject instanceof _cmi_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray) {
var index = parseInt(structure[i + 1], 10); // SCO is trying to set an item on an array
if (!isNaN(index)) {
@@ -1149,7 +1174,7 @@ var BaseAPI = /*#__PURE__*/function () {
break;
}
- if (refObject instanceof _common.CMIArray) {
+ if (refObject instanceof _cmi_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray) {
var index = parseInt(structure[i + 1], 10); // SCO is trying to set an item on an array
if (!isNaN(index)) {
@@ -1491,7 +1516,7 @@ var BaseAPI = /*#__PURE__*/function () {
obj = {};
obj[element[0]] = element[1];
- _this3.loadFromJSON((0, _utilities.unflatten)(obj), CMIElement);
+ _this3.loadFromJSON((0,_utilities__WEBPACK_IMPORTED_MODULE_4__.unflatten)(obj), CMIElement);
});
}
/**
@@ -1615,6 +1640,8 @@ var BaseAPI = /*#__PURE__*/function () {
}
try {
+ params = settings.requestHandler(params);
+
if (params instanceof Array) {
httpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
httpReq.send(params.join('&'));
@@ -1684,8 +1711,8 @@ var BaseAPI = /*#__PURE__*/function () {
return result;
};
- if (typeof _lodash["default"] !== 'undefined') {
- var debounced = (0, _lodash["default"])(process, 500);
+ if (typeof (lodash_debounce__WEBPACK_IMPORTED_MODULE_5___default()) !== 'undefined') {
+ var debounced = lodash_debounce__WEBPACK_IMPORTED_MODULE_5___default()(process, 500);
debounced(url, params, this.settings, this.error_codes); // if we're terminating, go ahead and commit immediately
if (immediate) {
@@ -1738,7 +1765,7 @@ var BaseAPI = /*#__PURE__*/function () {
*/
-exports["default"] = BaseAPI;
+
var _API = /*#__PURE__*/new WeakMap();
@@ -1814,32 +1841,26 @@ var ScheduledCommit = /*#__PURE__*/function () {
return ScheduledCommit;
}();
-},{"./cmi/common":4,"./constants/api_constants":6,"./constants/error_codes":7,"./exceptions":9,"./utilities":11,"lodash.debounce":1}],3:[function(require,module,exports){
+/***/ }),
+
+/***/ "./src/Scorm12API.js":
+/*!***************************!*\
+ !*** ./src/Scorm12API.js ***!
+ \***************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ Scorm12API; }
+/* harmony export */ });
+/* harmony import */ var _BaseAPI__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BaseAPI */ "./src/BaseAPI.js");
+/* harmony import */ var _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cmi/scorm12_cmi */ "./src/cmi/scorm12_cmi.js");
+/* harmony import */ var _utilities__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utilities */ "./src/utilities.js");
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants/api_constants */ "./src/constants/api_constants.js");
+/* harmony import */ var _constants_error_codes__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./constants/error_codes */ "./src/constants/error_codes.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _BaseAPI2 = _interopRequireDefault(require("./BaseAPI"));
-
-var _scorm12_cmi = require("./cmi/scorm12_cmi");
-
-var Utilities = _interopRequireWildcard(require("./utilities"));
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("./constants/error_codes"));
-
-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; }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -1866,9 +1887,14 @@ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Re
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-var scorm12_constants = _api_constants["default"].scorm12;
-var global_constants = _api_constants["default"].global;
-var scorm12_error_codes = _error_codes["default"].scorm12;
+
+
+
+
+
+var scorm12_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__["default"].scorm12;
+var global_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__["default"].global;
+var scorm12_error_codes = _constants_error_codes__WEBPACK_IMPORTED_MODULE_4__["default"].scorm12;
/**
* API class for SCORM 1.2
*/
@@ -1892,8 +1918,8 @@ var Scorm12API = /*#__PURE__*/function (_BaseAPI) {
}), settings);
_this = _super.call(this, scorm12_error_codes, finalSettings);
- _this.cmi = new _scorm12_cmi.CMI();
- _this.nav = new _scorm12_cmi.NAV(); // Rename functions to match 1.2 Spec and expose to modules
+ _this.cmi = new _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_1__.CMI();
+ _this.nav = new _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_1__.NAV(); // Rename functions to match 1.2 Spec and expose to modules
_this.LMSInitialize = _this.lmsInitialize;
_this.LMSFinish = _this.lmsFinish;
@@ -2054,13 +2080,13 @@ var Scorm12API = /*#__PURE__*/function (_BaseAPI) {
var newChild;
if (this.stringMatches(CMIElement, 'cmi\\.objectives\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIObjectivesObject();
+ newChild = new _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIObjectivesObject();
} else if (foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+\\.correct_responses\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIInteractionsCorrectResponsesObject();
+ newChild = new _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIInteractionsCorrectResponsesObject();
} else if (foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+\\.objectives\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIInteractionsObjectivesObject();
+ newChild = new _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIInteractionsObjectivesObject();
} else if (!foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIInteractionsObject();
+ newChild = new _cmi_scorm12_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIInteractionsObject();
}
return newChild;
@@ -2130,11 +2156,11 @@ var Scorm12API = /*#__PURE__*/function (_BaseAPI) {
}
var result = [];
- var flattened = Utilities.flatten(cmiExport);
+ var flattened = _utilities__WEBPACK_IMPORTED_MODULE_2__.flatten(cmiExport);
switch (this.settings.dataCommitFormat) {
case 'flattened':
- return Utilities.flatten(cmiExport);
+ return _utilities__WEBPACK_IMPORTED_MODULE_2__.flatten(cmiExport);
case 'params':
for (var item in flattened) {
@@ -2202,30 +2228,32 @@ var Scorm12API = /*#__PURE__*/function (_BaseAPI) {
}]);
return Scorm12API;
-}(_BaseAPI2["default"]);
+}(_BaseAPI__WEBPACK_IMPORTED_MODULE_0__["default"]);
-exports["default"] = Scorm12API;
-},{"./BaseAPI":2,"./cmi/scorm12_cmi":5,"./constants/api_constants":6,"./constants/error_codes":7,"./utilities":11}],4:[function(require,module,exports){
+
+/***/ }),
+
+/***/ "./src/cmi/common.js":
+/*!***************************!*\
+ !*** ./src/cmi/common.js ***!
+ \***************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "checkValidFormat": function() { return /* binding */ checkValidFormat; },
+/* harmony export */ "checkValidRange": function() { return /* binding */ checkValidRange; },
+/* harmony export */ "BaseCMI": function() { return /* binding */ BaseCMI; },
+/* harmony export */ "CMIScore": function() { return /* binding */ CMIScore; },
+/* harmony export */ "CMIArray": function() { return /* binding */ CMIArray; }
+/* harmony export */ });
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants/api_constants */ "./src/constants/api_constants.js");
+/* harmony import */ var _constants_error_codes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants/error_codes */ "./src/constants/error_codes.js");
+/* harmony import */ var _constants_regex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants/regex */ "./src/constants/regex.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.CMIScore = exports.CMIArray = exports.BaseCMI = void 0;
-exports.checkValidFormat = checkValidFormat;
-exports.checkValidRange = checkValidRange;
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
@@ -2262,9 +2290,12 @@ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!priva
function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-var scorm12_constants = _api_constants["default"].scorm12;
-var scorm12_regex = _regex["default"].scorm12;
-var scorm12_error_codes = _error_codes["default"].scorm12;
+
+
+
+var scorm12_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__["default"].scorm12;
+var scorm12_regex = _constants_regex__WEBPACK_IMPORTED_MODULE_2__["default"].scorm12;
+var scorm12_error_codes = _constants_error_codes__WEBPACK_IMPORTED_MODULE_1__["default"].scorm12;
/**
* Check if the value matches the proper format. If not, throw proper error code.
*
@@ -2300,7 +2331,6 @@ function checkValidFormat(value, regexPattern, errorCode, errorClass, allowEmpty
* @return {boolean}
*/
-
function checkValidRange(value, rangePattern, errorCode, errorClass) {
var ranges = rangePattern.split('#');
value = value * 1.0;
@@ -2319,7 +2349,6 @@ function checkValidRange(value, rangePattern, errorCode, errorClass) {
* Base class for API cmi objects
*/
-
var _initialized = /*#__PURE__*/new WeakMap();
var _start_time = /*#__PURE__*/new WeakMap();
@@ -2395,9 +2424,6 @@ var BaseCMI = /*#__PURE__*/function () {
* Base class for cmi *.score objects
*/
-
-exports.BaseCMI = BaseCMI;
-
var _children2 = /*#__PURE__*/new WeakMap();
var _score_range = /*#__PURE__*/new WeakMap();
@@ -2624,9 +2650,6 @@ var CMIScore = /*#__PURE__*/function (_BaseCMI) {
* Base class for cmi *.n objects
*/
-
-exports.CMIScore = CMIScore;
-
var _errorCode = /*#__PURE__*/new WeakMap();
var _errorClass = /*#__PURE__*/new WeakMap();
@@ -2739,42 +2762,38 @@ var CMIArray = /*#__PURE__*/function (_BaseCMI2) {
return CMIArray;
}(BaseCMI);
-exports.CMIArray = CMIArray;
+/***/ }),
+
+/***/ "./src/cmi/scorm12_cmi.js":
+/*!********************************!*\
+ !*** ./src/cmi/scorm12_cmi.js ***!
+ \********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{"../constants/api_constants":6,"../constants/error_codes":7,"../constants/regex":8}],5:[function(require,module,exports){
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "throwReadOnlyError": function() { return /* binding */ throwReadOnlyError; },
+/* harmony export */ "throwWriteOnlyError": function() { return /* binding */ throwWriteOnlyError; },
+/* harmony export */ "check12ValidFormat": function() { return /* binding */ check12ValidFormat; },
+/* harmony export */ "check12ValidRange": function() { return /* binding */ check12ValidRange; },
+/* harmony export */ "CMI": function() { return /* binding */ CMI; },
+/* harmony export */ "CMIStudentData": function() { return /* binding */ CMIStudentData; },
+/* harmony export */ "CMIStudentPreference": function() { return /* binding */ CMIStudentPreference; },
+/* harmony export */ "CMIInteractionsObject": function() { return /* binding */ CMIInteractionsObject; },
+/* harmony export */ "CMIObjectivesObject": function() { return /* binding */ CMIObjectivesObject; },
+/* harmony export */ "CMIInteractionsObjectivesObject": function() { return /* binding */ CMIInteractionsObjectivesObject; },
+/* harmony export */ "CMIInteractionsCorrectResponsesObject": function() { return /* binding */ CMIInteractionsCorrectResponsesObject; },
+/* harmony export */ "NAV": function() { return /* binding */ NAV; }
+/* harmony export */ });
+/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./common */ "./src/cmi/common.js");
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants/api_constants */ "./src/constants/api_constants.js");
+/* harmony import */ var _constants_error_codes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants/error_codes */ "./src/constants/error_codes.js");
+/* harmony import */ var _constants_regex__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../constants/regex */ "./src/constants/regex.js");
+/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../exceptions */ "./src/exceptions.js");
+/* harmony import */ var _utilities__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utilities */ "./src/utilities.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.NAV = exports.CMIStudentPreference = exports.CMIStudentData = exports.CMIObjectivesObject = exports.CMIInteractionsObjectivesObject = exports.CMIInteractionsObject = exports.CMIInteractionsCorrectResponsesObject = exports.CMI = void 0;
-exports.check12ValidFormat = check12ValidFormat;
-exports.check12ValidRange = check12ValidRange;
-exports.throwReadOnlyError = throwReadOnlyError;
-exports.throwWriteOnlyError = throwWriteOnlyError;
-
-var _common = require("./common");
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-var _exceptions = require("../exceptions");
-
-var Utilities = _interopRequireWildcard(require("../utilities"));
-
-var Util = Utilities;
-
-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; }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
@@ -2815,31 +2834,36 @@ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!priva
function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-var scorm12_constants = _api_constants["default"].scorm12;
-var scorm12_regex = _regex["default"].scorm12;
-var scorm12_error_codes = _error_codes["default"].scorm12;
+
+
+
+
+
+
+
+var scorm12_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_1__["default"].scorm12;
+var scorm12_regex = _constants_regex__WEBPACK_IMPORTED_MODULE_3__["default"].scorm12;
+var scorm12_error_codes = _constants_error_codes__WEBPACK_IMPORTED_MODULE_2__["default"].scorm12;
/**
* Helper method for throwing Read Only error
*/
function throwReadOnlyError() {
- throw new _exceptions.Scorm12ValidationError(scorm12_error_codes.READ_ONLY_ELEMENT);
+ throw new _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError(scorm12_error_codes.READ_ONLY_ELEMENT);
}
/**
* Helper method for throwing Write Only error
*/
-
function throwWriteOnlyError() {
- throw new _exceptions.Scorm12ValidationError(scorm12_error_codes.WRITE_ONLY_ELEMENT);
+ throw new _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError(scorm12_error_codes.WRITE_ONLY_ELEMENT);
}
/**
* Helper method for throwing Invalid Set error
*/
-
function throwInvalidValueError() {
- throw new _exceptions.Scorm12ValidationError(scorm12_error_codes.INVALID_SET_VALUE);
+ throw new _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError(scorm12_error_codes.INVALID_SET_VALUE);
}
/**
* Helper method, no reason to have to pass the same error codes every time
@@ -2851,7 +2875,7 @@ function throwInvalidValueError() {
function check12ValidFormat(value, regexPattern, allowEmptyString) {
- return (0, _common.checkValidFormat)(value, regexPattern, scorm12_error_codes.TYPE_MISMATCH, _exceptions.Scorm12ValidationError, allowEmptyString);
+ return (0,_common__WEBPACK_IMPORTED_MODULE_0__.checkValidFormat)(value, regexPattern, scorm12_error_codes.TYPE_MISMATCH, _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError, allowEmptyString);
}
/**
* Helper method, no reason to have to pass the same error codes every time
@@ -2861,15 +2885,13 @@ function check12ValidFormat(value, regexPattern, allowEmptyString) {
* @return {boolean}
*/
-
function check12ValidRange(value, rangePattern, allowEmptyString) {
- return (0, _common.checkValidRange)(value, rangePattern, scorm12_error_codes.VALUE_OUT_OF_RANGE, _exceptions.Scorm12ValidationError, allowEmptyString);
+ return (0,_common__WEBPACK_IMPORTED_MODULE_0__.checkValidRange)(value, rangePattern, scorm12_error_codes.VALUE_OUT_OF_RANGE, _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError, allowEmptyString);
}
/**
* Class representing the cmi object for SCORM 1.2
*/
-
var _children2 = /*#__PURE__*/new WeakMap();
var _version2 = /*#__PURE__*/new WeakMap();
@@ -3118,15 +3140,12 @@ var CMI = /*#__PURE__*/function (_BaseCMI) {
}]);
return CMI;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing the cmi.core object
* @extends BaseCMI
*/
-
-exports.CMI = CMI;
-
var _children3 = /*#__PURE__*/new WeakMap();
var _student_id = /*#__PURE__*/new WeakMap();
@@ -3226,13 +3245,13 @@ var CMICore = /*#__PURE__*/function (_BaseCMI2) {
value: ''
});
- _this2.score = new _common.CMIScore({
+ _this2.score = new _common__WEBPACK_IMPORTED_MODULE_0__.CMIScore({
score_children: scorm12_constants.score_children,
score_range: scorm12_regex.score_range,
invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,
invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,
invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,
- errorClass: _exceptions.Scorm12ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError
});
return _this2;
}
@@ -3499,10 +3518,10 @@ var CMICore = /*#__PURE__*/function (_BaseCMI2) {
if (typeof startTime !== 'undefined' && startTime !== null) {
var seconds = new Date().getTime() - startTime;
- sessionTime = Util.getSecondsAsHHMMSS(seconds / 1000);
+ sessionTime = _utilities__WEBPACK_IMPORTED_MODULE_5__.getSecondsAsHHMMSS(seconds / 1000);
}
- return Utilities.addHHMMSSTimeStrings(_classPrivateFieldGet(this, _total_time), sessionTime, new RegExp(scorm12_regex.CMITimespan));
+ return _utilities__WEBPACK_IMPORTED_MODULE_5__.addHHMMSSTimeStrings(_classPrivateFieldGet(this, _total_time), sessionTime, new RegExp(scorm12_regex.CMITimespan));
}
/**
* toJSON for cmi.core
@@ -3545,7 +3564,7 @@ var CMICore = /*#__PURE__*/function (_BaseCMI2) {
}]);
return CMICore;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 1.2's cmi.objectives object
* @extends CMIArray
@@ -3566,12 +3585,12 @@ var CMIObjectives = /*#__PURE__*/function (_CMIArray) {
return _super3.call(this, {
children: scorm12_constants.objectives_children,
errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError
});
}
return _createClass(CMIObjectives);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray);
/**
* Class representing SCORM 1.2's cmi.student_data object
* @extends BaseCMI
@@ -3728,15 +3747,12 @@ var CMIStudentData = /*#__PURE__*/function (_BaseCMI3) {
}]);
return CMIStudentData;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 1.2's cmi.student_preference object
* @extends BaseCMI
*/
-
-exports.CMIStudentData = CMIStudentData;
-
var _children5 = /*#__PURE__*/new WeakMap();
var _audio = /*#__PURE__*/new WeakMap();
@@ -3922,15 +3938,12 @@ var CMIStudentPreference = /*#__PURE__*/function (_BaseCMI4) {
}]);
return CMIStudentPreference;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 1.2's cmi.interactions object
* @extends BaseCMI
*/
-
-exports.CMIStudentPreference = CMIStudentPreference;
-
var CMIInteractions = /*#__PURE__*/function (_CMIArray2) {
_inherits(CMIInteractions, _CMIArray2);
@@ -3945,12 +3958,12 @@ var CMIInteractions = /*#__PURE__*/function (_CMIArray2) {
return _super6.call(this, {
children: scorm12_constants.interactions_children,
errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError
});
}
return _createClass(CMIInteractions);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray);
/**
* Class representing SCORM 1.2's cmi.interactions.n object
* @extends BaseCMI
@@ -4021,14 +4034,14 @@ var CMIInteractionsObject = /*#__PURE__*/function (_BaseCMI5) {
value: ''
});
- _this5.objectives = new _common.CMIArray({
+ _this5.objectives = new _common__WEBPACK_IMPORTED_MODULE_0__.CMIArray({
errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError,
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError,
children: scorm12_constants.objectives_children
});
- _this5.correct_responses = new _common.CMIArray({
+ _this5.correct_responses = new _common__WEBPACK_IMPORTED_MODULE_0__.CMIArray({
errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError,
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError,
children: scorm12_constants.correct_responses_children
});
return _this5;
@@ -4227,15 +4240,12 @@ var CMIInteractionsObject = /*#__PURE__*/function (_BaseCMI5) {
}]);
return CMIInteractionsObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 1.2's cmi.objectives.n object
* @extends BaseCMI
*/
-
-exports.CMIInteractionsObject = CMIInteractionsObject;
-
var _id2 = /*#__PURE__*/new WeakMap();
var _status = /*#__PURE__*/new WeakMap();
@@ -4265,13 +4275,13 @@ var CMIObjectivesObject = /*#__PURE__*/function (_BaseCMI6) {
value: ''
});
- _this6.score = new _common.CMIScore({
+ _this6.score = new _common__WEBPACK_IMPORTED_MODULE_0__.CMIScore({
score_children: scorm12_constants.score_children,
score_range: scorm12_regex.score_range,
invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,
invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,
invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,
- errorClass: _exceptions.Scorm12ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_4__.Scorm12ValidationError
});
return _this6;
}
@@ -4342,15 +4352,12 @@ var CMIObjectivesObject = /*#__PURE__*/function (_BaseCMI6) {
}]);
return CMIObjectivesObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 1.2's cmi.interactions.n.objectives.n object
* @extends BaseCMI
*/
-
-exports.CMIObjectivesObject = CMIObjectivesObject;
-
var _id3 = /*#__PURE__*/new WeakMap();
var CMIInteractionsObjectivesObject = /*#__PURE__*/function (_BaseCMI7) {
@@ -4418,15 +4425,12 @@ var CMIInteractionsObjectivesObject = /*#__PURE__*/function (_BaseCMI7) {
}]);
return CMIInteractionsObjectivesObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 1.2's cmi.interactions.correct_responses.n object
* @extends BaseCMI
*/
-
-exports.CMIInteractionsObjectivesObject = CMIInteractionsObjectivesObject;
-
var _pattern = /*#__PURE__*/new WeakMap();
var CMIInteractionsCorrectResponsesObject = /*#__PURE__*/function (_BaseCMI8) {
@@ -4494,14 +4498,11 @@ var CMIInteractionsCorrectResponsesObject = /*#__PURE__*/function (_BaseCMI8) {
}]);
return CMIInteractionsCorrectResponsesObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class for AICC Navigation object
*/
-
-exports.CMIInteractionsCorrectResponsesObject = CMIInteractionsCorrectResponsesObject;
-
var _event = /*#__PURE__*/new WeakMap();
var NAV = /*#__PURE__*/function (_BaseCMI9) {
@@ -4569,18 +4570,18 @@ var NAV = /*#__PURE__*/function (_BaseCMI9) {
}]);
return NAV;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
-exports.NAV = NAV;
+/***/ }),
+
+/***/ "./src/constants/api_constants.js":
+/*!****************************************!*\
+ !*** ./src/constants/api_constants.js ***!
+ \****************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{"../constants/api_constants":6,"../constants/error_codes":7,"../constants/regex":8,"../exceptions":9,"../utilities":11,"./common":4}],6:[function(require,module,exports){
"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
+__webpack_require__.r(__webpack_exports__);
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -4795,17 +4796,18 @@ var APIConstants = {
aicc: aicc,
scorm2004: scorm2004
};
-var _default = APIConstants;
-exports["default"] = _default;
+/* harmony default export */ __webpack_exports__["default"] = (APIConstants);
+
+/***/ }),
+
+/***/ "./src/constants/error_codes.js":
+/*!**************************************!*\
+ !*** ./src/constants/error_codes.js ***!
+ \**************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{}],7:[function(require,module,exports){
"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
+__webpack_require__.r(__webpack_exports__);
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -4892,17 +4894,18 @@ var ErrorCodes = {
scorm12: scorm12,
scorm2004: scorm2004
};
-var _default = ErrorCodes;
-exports["default"] = _default;
+/* harmony default export */ __webpack_exports__["default"] = (ErrorCodes);
+
+/***/ }),
+
+/***/ "./src/constants/regex.js":
+/*!********************************!*\
+ !*** ./src/constants/regex.js ***!
+ \********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{}],8:[function(require,module,exports){
"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
+__webpack_require__.r(__webpack_exports__);
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -4996,23 +4999,27 @@ var Regex = {
scorm12: scorm12,
scorm2004: scorm2004
};
-var _default = Regex;
-exports["default"] = _default;
+/* harmony default export */ __webpack_exports__["default"] = (Regex);
+
+/***/ }),
+
+/***/ "./src/exceptions.js":
+/*!***************************!*\
+ !*** ./src/exceptions.js ***!
+ \***************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{}],9:[function(require,module,exports){
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "ValidationError": function() { return /* binding */ ValidationError; },
+/* harmony export */ "Scorm12ValidationError": function() { return /* binding */ Scorm12ValidationError; },
+/* harmony export */ "AICCValidationError": function() { return /* binding */ AICCValidationError; },
+/* harmony export */ "Scorm2004ValidationError": function() { return /* binding */ Scorm2004ValidationError; }
+/* harmony export */ });
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants/api_constants */ "./src/constants/api_constants.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.ValidationError = exports.Scorm2004ValidationError = exports.Scorm12ValidationError = exports.AICCValidationError = void 0;
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
@@ -5053,9 +5060,10 @@ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!priva
function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-var scorm12_errors = _api_constants["default"].scorm12.error_descriptions;
-var aicc_errors = _api_constants["default"].aicc.error_descriptions;
-var scorm2004_errors = _api_constants["default"].scorm2004.error_descriptions;
+
+var scorm12_errors = _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__["default"].scorm12.error_descriptions;
+var aicc_errors = _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__["default"].aicc.error_descriptions;
+var scorm2004_errors = _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__["default"].scorm2004.error_descriptions;
/**
* Base Validation Exception
*/
@@ -5146,9 +5154,6 @@ var ValidationError = /*#__PURE__*/function (_Error) {
* SCORM 1.2 Validation Error
*/
-
-exports.ValidationError = ValidationError;
-
var Scorm12ValidationError = /*#__PURE__*/function (_ValidationError) {
_inherits(Scorm12ValidationError, _ValidationError);
@@ -5178,9 +5183,6 @@ var Scorm12ValidationError = /*#__PURE__*/function (_ValidationError) {
* AICC Validation Error
*/
-
-exports.Scorm12ValidationError = Scorm12ValidationError;
-
var AICCValidationError = /*#__PURE__*/function (_ValidationError2) {
_inherits(AICCValidationError, _ValidationError2);
@@ -5210,9 +5212,6 @@ var AICCValidationError = /*#__PURE__*/function (_ValidationError2) {
* SCORM 2004 Validation Error
*/
-
-exports.AICCValidationError = AICCValidationError;
-
var Scorm2004ValidationError = /*#__PURE__*/function (_ValidationError3) {
_inherits(Scorm2004ValidationError, _ValidationError3);
@@ -5239,34 +5238,31 @@ var Scorm2004ValidationError = /*#__PURE__*/function (_ValidationError3) {
return _createClass(Scorm2004ValidationError);
}(ValidationError);
-exports.Scorm2004ValidationError = Scorm2004ValidationError;
+/***/ }),
+
+/***/ "./src/utilities.js":
+/*!**************************!*\
+ !*** ./src/utilities.js ***!
+ \**************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{"./constants/api_constants":6}],10:[function(require,module,exports){
"use strict";
-
-var _Scorm12API = _interopRequireDefault(require("../Scorm12API"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-window.Scorm12API = _Scorm12API["default"];
-
-},{"../Scorm12API":3}],11:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.SECONDS_PER_SECOND = exports.SECONDS_PER_MINUTE = exports.SECONDS_PER_HOUR = exports.SECONDS_PER_DAY = void 0;
-exports.addHHMMSSTimeStrings = addHHMMSSTimeStrings;
-exports.addTwoDurations = addTwoDurations;
-exports.countDecimals = countDecimals;
-exports.flatten = flatten;
-exports.getDurationAsSeconds = getDurationAsSeconds;
-exports.getSecondsAsHHMMSS = getSecondsAsHHMMSS;
-exports.getSecondsAsISODuration = getSecondsAsISODuration;
-exports.getTimeAsSeconds = getTimeAsSeconds;
-exports.unflatten = unflatten;
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "SECONDS_PER_SECOND": function() { return /* binding */ SECONDS_PER_SECOND; },
+/* harmony export */ "SECONDS_PER_MINUTE": function() { return /* binding */ SECONDS_PER_MINUTE; },
+/* harmony export */ "SECONDS_PER_HOUR": function() { return /* binding */ SECONDS_PER_HOUR; },
+/* harmony export */ "SECONDS_PER_DAY": function() { return /* binding */ SECONDS_PER_DAY; },
+/* harmony export */ "getSecondsAsHHMMSS": function() { return /* binding */ getSecondsAsHHMMSS; },
+/* harmony export */ "getSecondsAsISODuration": function() { return /* binding */ getSecondsAsISODuration; },
+/* harmony export */ "getTimeAsSeconds": function() { return /* binding */ getTimeAsSeconds; },
+/* harmony export */ "getDurationAsSeconds": function() { return /* binding */ getDurationAsSeconds; },
+/* harmony export */ "addTwoDurations": function() { return /* binding */ addTwoDurations; },
+/* harmony export */ "addHHMMSSTimeStrings": function() { return /* binding */ addHHMMSSTimeStrings; },
+/* harmony export */ "flatten": function() { return /* binding */ flatten; },
+/* harmony export */ "unflatten": function() { return /* binding */ unflatten; },
+/* harmony export */ "countDecimals": function() { return /* binding */ countDecimals; }
+/* harmony export */ });
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -5280,13 +5276,9 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
var SECONDS_PER_SECOND = 1.0;
-exports.SECONDS_PER_SECOND = SECONDS_PER_SECOND;
var SECONDS_PER_MINUTE = 60;
-exports.SECONDS_PER_MINUTE = SECONDS_PER_MINUTE;
var SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE;
-exports.SECONDS_PER_HOUR = SECONDS_PER_HOUR;
var SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;
-exports.SECONDS_PER_DAY = SECONDS_PER_DAY;
var designations = [['D', SECONDS_PER_DAY], ['H', SECONDS_PER_HOUR], ['M', SECONDS_PER_MINUTE], ['S', SECONDS_PER_SECOND]];
/**
* Converts a Number to a String of HH:MM:SS
@@ -5328,7 +5320,6 @@ function getSecondsAsHHMMSS(totalSeconds) {
* @return {String}
*/
-
function getSecondsAsISODuration(seconds) {
// SCORM spec does not deal with negative durations, give zero back
if (!seconds || seconds <= 0) {
@@ -5373,7 +5364,6 @@ function getSecondsAsISODuration(seconds) {
* @return {number}
*/
-
function getTimeAsSeconds(timeString, timeRegex) {
if (!timeString || typeof timeString !== 'string' || !timeString.match(timeRegex)) {
return 0;
@@ -5393,7 +5383,6 @@ function getTimeAsSeconds(timeString, timeRegex) {
* @return {number}
*/
-
function getDurationAsSeconds(duration, durationRegex) {
if (!duration || !duration.match(durationRegex)) {
return 0;
@@ -5425,7 +5414,6 @@ function getDurationAsSeconds(duration, durationRegex) {
* @return {string}
*/
-
function addTwoDurations(first, second, durationRegex) {
return getSecondsAsISODuration(getDurationAsSeconds(first, durationRegex) + getDurationAsSeconds(second, durationRegex));
}
@@ -5438,7 +5426,6 @@ function addTwoDurations(first, second, durationRegex) {
* @return {string}
*/
-
function addHHMMSSTimeStrings(first, second, timeRegex) {
return getSecondsAsHHMMSS(getTimeAsSeconds(first, timeRegex) + getTimeAsSeconds(second, timeRegex));
}
@@ -5448,7 +5435,6 @@ function addHHMMSSTimeStrings(first, second, timeRegex) {
* @return {object}
*/
-
function flatten(data) {
var result = {};
/**
@@ -5488,7 +5474,6 @@ function flatten(data) {
* @return {object}
*/
-
function unflatten(data) {
'use strict';
@@ -5520,12 +5505,106 @@ function unflatten(data) {
* @return {number}
*/
-
function countDecimals(num) {
if (Math.floor(num) === num || String(num).indexOf('.') < 0) return 0;
var parts = num.toString().split('.')[1];
return parts.length || 0;
}
-},{}]},{},[10])
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLmRlYm91bmNlL2luZGV4LmpzIiwic3JjL0Jhc2VBUEkuanMiLCJzcmMvU2Nvcm0xMkFQSS5qcyIsInNyYy9jbWkvY29tbW9uLmpzIiwic3JjL2NtaS9zY29ybTEyX2NtaS5qcyIsInNyYy9jb25zdGFudHMvYXBpX2NvbnN0YW50cy5qcyIsInNyYy9jb25zdGFudHMvZXJyb3JfY29kZXMuanMiLCJzcmMvY29uc3RhbnRzL3JlZ2V4LmpzIiwic3JjL2V4Y2VwdGlvbnMuanMiLCJzcmMvZXhwb3J0cy9zY29ybTEyLmpzIiwic3JjL3V0aWxpdGllcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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LElBQUQsQ0FBSCxHQUFZLElBQUksQ0FBQyxDQUFELENBQWhCO0FBQ0Q7QUFDRjs7QUFDRCxTQUFPLE1BQU0sQ0FBQyxFQUFELENBQU4sSUFBYyxNQUFyQjtBQUNEO0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sU0FBUyxhQUFULENBQXVCLEdBQXZCLEVBQW9DO0FBQ3pDLE1BQUksSUFBSSxDQUFDLEtBQUwsQ0FBVyxHQUFYLE1BQW9CLEdBQXBCLElBQTJCLE1BQU0sQ0FBQyxHQUFELENBQU4sQ0FBWSxPQUFaLENBQW9CLEdBQXBCLElBQTJCLENBQTFELEVBQTZELE9BQU8sQ0FBUDtBQUM3RCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBSixHQUFlLEtBQWYsQ0FBcUIsR0FBckIsRUFBMEIsQ0FBMUIsQ0FBZDtBQUNBLFNBQU8sS0FBSyxDQUFDLE1BQU4sSUFBZ0IsQ0FBdkI7QUFDRCIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIi8qKlxuICogbG9kYXNoIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9qcXVlcnkub3JnLz5cbiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlIDxodHRwczovL2xvZGFzaC5jb20vbGljZW5zZT5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqL1xuXG4vKiogVXNlZCBhcyB0aGUgYFR5cGVFcnJvcmAgbWVzc2FnZSBmb3IgXCJGdW5jdGlvbnNcIiBtZXRob2RzLiAqL1xudmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJztcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTkFOID0gMCAvIDA7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqIFVzZWQgdG8gbWF0Y2ggbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW0gPSAvXlxccyt8XFxzKyQvZztcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovXG52YXIgbmF0aXZlTWF4ID0gTWF0aC5tYXgsXG4gICAgbmF0aXZlTWluID0gTWF0aC5taW47XG5cbi8qKlxuICogR2V0cyB0aGUgdGltZXN0YW1wIG9mIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRoYXQgaGF2ZSBlbGFwc2VkIHNpbmNlXG4gKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDIuNC4wXG4gKiBAY2F0ZWdvcnkgRGF0ZVxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7XG4gKiAgIGNvbnNvbGUubG9nKF8ubm93KCkgLSBzdGFtcCk7XG4gKiB9LCBfLm5vdygpKTtcbiAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uXG4gKi9cbnZhciBub3cgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHJvb3QuRGF0ZS5ub3coKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgXG4gKiBtaWxsaXNlY29uZHMgaGF2ZSBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhlIGRlYm91bmNlZCBmdW5jdGlvbiB3YXNcbiAqIGludm9rZWQuIFRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gY29tZXMgd2l0aCBhIGBjYW5jZWxgIG1ldGhvZCB0byBjYW5jZWxcbiAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLlxuICogUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2Agc2hvdWxkIGJlIGludm9rZWQgb24gdGhlXG4gKiBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyBlZGdlIG9mIHRoZSBgd2FpdGAgdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkXG4gKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50XG4gKiBjYWxscyB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGBmdW5jYFxuICogaW52b2NhdGlvbi5cbiAqXG4gKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzXG4gKiBpbnZva2VkIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIGRlYm91bmNlZCBmdW5jdGlvblxuICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LlxuICpcbiAqIElmIGB3YWl0YCBpcyBgMGAgYW5kIGBsZWFkaW5nYCBpcyBgZmFsc2VgLCBgZnVuY2AgaW52b2NhdGlvbiBpcyBkZWZlcnJlZFxuICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLlxuICpcbiAqIFNlZSBbRGF2aWQgQ29yYmFjaG8ncyBhcnRpY2xlXShodHRwczovL2Nzcy10cmlja3MuY29tL2RlYm91bmNpbmctdGhyb3R0bGluZy1leHBsYWluZWQtZXhhbXBsZXMvKVxuICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgRnVuY3Rpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLlxuICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1heFdhaXRdXG4gKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRyYWlsaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi5cbiAqIEBleGFtcGxlXG4gKlxuICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCBfLmRlYm91bmNlKGNhbGN1bGF0ZUxheW91dCwgMTUwKSk7XG4gKlxuICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuXG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgXy5kZWJvdW5jZShzZW5kTWFpbCwgMzAwLCB7XG4gKiAgICdsZWFkaW5nJzogdHJ1ZSxcbiAqICAgJ3RyYWlsaW5nJzogZmFsc2VcbiAqIH0pKTtcbiAqXG4gKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLlxuICogdmFyIGRlYm91bmNlZCA9IF8uZGVib3VuY2UoYmF0Y2hMb2csIDI1MCwgeyAnbWF4V2FpdCc6IDEwMDAgfSk7XG4gKiB2YXIgc291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvc3RyZWFtJyk7XG4gKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7XG4gKlxuICogLy8gQ2FuY2VsIHRoZSB0cmFpbGluZyBkZWJvdW5jZWQgaW52b2NhdGlvbi5cbiAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpO1xuICovXG5mdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gIHZhciBsYXN0QXJncyxcbiAgICAgIGxhc3RUaGlzLFxuICAgICAgbWF4V2FpdCxcbiAgICAgIHJlc3VsdCxcbiAgICAgIHRpbWVySWQsXG4gICAgICBsYXN0Q2FsbFRpbWUsXG4gICAgICBsYXN0SW52b2tlVGltZSA9IDAsXG4gICAgICBsZWFkaW5nID0gZmFsc2UsXG4gICAgICBtYXhpbmcgPSBmYWxzZSxcbiAgICAgIHRyYWlsaW5nID0gdHJ1ZTtcblxuICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcbiAgfVxuICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDtcbiAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgbGVhZGluZyA9ICEhb3B0aW9ucy5sZWFkaW5nO1xuICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zO1xuICAgIG1heFdhaXQgPSBtYXhpbmcgPyBuYXRpdmVNYXgodG9OdW1iZXIob3B0aW9ucy5tYXhXYWl0KSB8fCAwLCB3YWl0KSA6IG1heFdhaXQ7XG4gICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZztcbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZUZ1bmModGltZSkge1xuICAgIHZhciBhcmdzID0gbGFzdEFyZ3MsXG4gICAgICAgIHRoaXNBcmcgPSBsYXN0VGhpcztcblxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxlYWRpbmdFZGdlKHRpbWUpIHtcbiAgICAvLyBSZXNldCBhbnkgYG1heFdhaXRgIHRpbWVyLlxuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICAvLyBTdGFydCB0aGUgdGltZXIgZm9yIHRoZSB0cmFpbGluZyBlZGdlLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgLy8gSW52b2tlIHRoZSBsZWFkaW5nIGVkZ2UuXG4gICAgcmV0dXJuIGxlYWRpbmcgPyBpbnZva2VGdW5jKHRpbWUpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZSxcbiAgICAgICAgcmVzdWx0ID0gd2FpdCAtIHRpbWVTaW5jZUxhc3RDYWxsO1xuXG4gICAgcmV0dXJuIG1heGluZyA/IG5hdGl2ZU1pbihyZXN1bHQsIG1heFdhaXQgLSB0aW1lU2luY2VMYXN0SW52b2tlKSA6IHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3VsZEludm9rZSh0aW1lKSB7XG4gICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSxcbiAgICAgICAgdGltZVNpbmNlTGFzdEludm9rZSA9IHRpbWUgLSBsYXN0SW52b2tlVGltZTtcblxuICAgIC8vIEVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCBhY3Rpdml0eSBoYXMgc3RvcHBlZCBhbmQgd2UncmUgYXQgdGhlXG4gICAgLy8gdHJhaWxpbmcgZWRnZSwgdGhlIHN5c3RlbSB0aW1lIGhhcyBnb25lIGJhY2t3YXJkcyBhbmQgd2UncmUgdHJlYXRpbmdcbiAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuXG4gICAgcmV0dXJuIChsYXN0Q2FsbFRpbWUgPT09IHVuZGVmaW5lZCB8fCAodGltZVNpbmNlTGFzdENhbGwgPj0gd2FpdCkgfHxcbiAgICAgICh0aW1lU2luY2VMYXN0Q2FsbCA8IDApIHx8IChtYXhpbmcgJiYgdGltZVNpbmNlTGFzdEludm9rZSA+PSBtYXhXYWl0KSk7XG4gIH1cblxuICBmdW5jdGlvbiB0aW1lckV4cGlyZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKTtcbiAgICBpZiAoc2hvdWxkSW52b2tlKHRpbWUpKSB7XG4gICAgICByZXR1cm4gdHJhaWxpbmdFZGdlKHRpbWUpO1xuICAgIH1cbiAgICAvLyBSZXN0YXJ0IHRoZSB0aW1lci5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHJlbWFpbmluZ1dhaXQodGltZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHtcbiAgICB0aW1lcklkID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gT25seSBpbnZva2UgaWYgd2UgaGF2ZSBgbGFzdEFyZ3NgIHdoaWNoIG1lYW5zIGBmdW5jYCBoYXMgYmVlblxuICAgIC8vIGRlYm91bmNlZCBhdCBsZWFzdCBvbmNlLlxuICAgIGlmICh0cmFpbGluZyAmJiBsYXN0QXJncykge1xuICAgICAgcmV0dXJuIGludm9rZUZ1bmModGltZSk7XG4gICAgfVxuICAgIGxhc3RBcmdzID0gbGFzdFRoaXMgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbCgpIHtcbiAgICBpZiAodGltZXJJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXJJZCk7XG4gICAgfVxuICAgIGxhc3RJbnZva2VUaW1lID0gMDtcbiAgICBsYXN0QXJncyA9IGxhc3RDYWxsVGltZSA9IGxhc3RUaGlzID0gdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIHJldHVybiB0aW1lcklkID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiB0cmFpbGluZ0VkZ2Uobm93KCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVib3VuY2VkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCksXG4gICAgICAgIGlzSW52b2tpbmcgPSBzaG91bGRJbnZva2UodGltZSk7XG5cbiAgICBsYXN0QXJncyA9IGFyZ3VtZW50cztcbiAgICBsYXN0VGhpcyA9IHRoaXM7XG4gICAgbGFzdENhbGxUaW1lID0gdGltZTtcblxuICAgIGlmIChpc0ludm9raW5nKSB7XG4gICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBsZWFkaW5nRWRnZShsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgICAgaWYgKG1heGluZykge1xuICAgICAgICAvLyBIYW5kbGUgaW52b2NhdGlvbnMgaW4gYSB0aWdodCBsb29wLlxuICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGRlYm91bmNlZC5jYW5jZWwgPSBjYW5jZWw7XG4gIGRlYm91bmNlZC5mbHVzaCA9IGZsdXNoO1xuICByZXR1cm4gZGVib3VuY2VkO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuICEhdmFsdWUgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG51bWJlci5cbiAqIEBleGFtcGxlXG4gKlxuICogXy50b051bWJlcigzLjIpO1xuICogLy8gPT4gMy4yXG4gKlxuICogXy50b051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IDVlLTMyNFxuICpcbiAqIF8udG9OdW1iZXIoSW5maW5pdHkpO1xuICogLy8gPT4gSW5maW5pdHlcbiAqXG4gKiBfLnRvTnVtYmVyKCczLjInKTtcbiAqIC8vID0+IDMuMlxuICovXG5mdW5jdGlvbiB0b051bWJlcih2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gTkFOO1xuICB9XG4gIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICB2YXIgb3RoZXIgPSB0eXBlb2YgdmFsdWUudmFsdWVPZiA9PSAnZnVuY3Rpb24nID8gdmFsdWUudmFsdWVPZigpIDogdmFsdWU7XG4gICAgdmFsdWUgPSBpc09iamVjdChvdGhlcikgPyAob3RoZXIgKyAnJykgOiBvdGhlcjtcbiAgfVxuICBpZiAodHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiArdmFsdWU7XG4gIH1cbiAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKHJlVHJpbSwgJycpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJvdW5jZTtcbiIsIi8vIEBmbG93XG5pbXBvcnQge0NNSUFycmF5fSBmcm9tICcuL2NtaS9jb21tb24nO1xuaW1wb3J0IHtWYWxpZGF0aW9uRXJyb3J9IGZyb20gJy4vZXhjZXB0aW9ucyc7XG5pbXBvcnQgRXJyb3JDb2RlcyBmcm9tICcuL2NvbnN0YW50cy9lcnJvcl9jb2Rlcyc7XG5pbXBvcnQgQVBJQ29uc3RhbnRzIGZyb20gJy4vY29uc3RhbnRzL2FwaV9jb25zdGFudHMnO1xuaW1wb3J0IHt1bmZsYXR0ZW59IGZyb20gJy4vdXRpbGl0aWVzJztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICdsb2Rhc2guZGVib3VuY2UnO1xuXG5jb25zdCBnbG9iYWxfY29uc3RhbnRzID0gQVBJQ29uc3RhbnRzLmdsb2JhbDtcbmNvbnN0IHNjb3JtMTJfZXJyb3JfY29kZXMgPSBFcnJvckNvZGVzLnNjb3JtMTI7XG5cbi8qKlxuICogQmFzZSBBUEkgY2xhc3MgZm9yIEFJQ0MsIFNDT1JNIDEuMiwgYW5kIFNDT1JNIDIwMDQuIFNob3VsZCBiZSBjb25zaWRlcmVkXG4gKiBhYnN0cmFjdCwgYW5kIG5ldmVyIGluaXRpYWxpemVkIG9uIGl0J3Mgb3duLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlQVBJIHtcbiAgI3RpbWVvdXQ7XG4gICNlcnJvcl9jb2RlcztcbiAgI3NldHRpbmdzID0ge1xuICAgIGF1dG9jb21taXQ6IGZhbHNlLFxuICAgIGF1dG9jb21taXRTZWNvbmRzOiAxMCxcbiAgICBhc3luY0NvbW1pdDogZmFsc2UsXG4gICAgc2VuZEJlYWNvbkNvbW1pdDogZmFsc2UsXG4gICAgbG1zQ29tbWl0VXJsOiBmYWxzZSxcbiAgICBkYXRhQ29tbWl0Rm9ybWF0OiAnanNvbicsIC8vIHZhbGlkIGZvcm1hdHMgYXJlICdqc29uJyBvciAnZmxhdHRlbmVkJywgJ3BhcmFtcydcbiAgICBjb21taXRSZXF1ZXN0RGF0YVR5cGU6ICdhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLFxuICAgIGF1dG9Qcm9ncmVzczogZmFsc2UsXG4gICAgbG9nTGV2ZWw6IGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0VSUk9SLFxuICAgIHNlbGZSZXBvcnRTZXNzaW9uVGltZTogZmFsc2UsXG4gICAgYWx3YXlzU2VuZFRvdGFsVGltZTogZmFsc2UsXG4gICAgc3RyaWN0X2Vycm9yczogdHJ1ZSxcbiAgICB4aHJIZWFkZXJzOiB7fSxcbiAgICB4aHJXaXRoQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgIHJlc3BvbnNlSGFuZGxlcjogZnVuY3Rpb24oeGhyKSB7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgaWYgKHR5cGVvZiB4aHIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgIXt9Lmhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCAncmVzdWx0JykpIHtcbiAgICAgICAgICByZXN1bHQgPSB7fTtcbiAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXN1bHQucmVzdWx0ID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFO1xuICAgICAgICAgICAgcmVzdWx0LmVycm9yQ29kZSA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5yZXN1bHQgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuICAgICAgICAgICAgcmVzdWx0LmVycm9yQ29kZSA9IDEwMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgICBvbkxvZ01lc3NhZ2U6IGZ1bmN0aW9uKG1lc3NhZ2VMZXZlbCwgbG9nTWVzc2FnZSkge1xuICAgICAgc3dpdGNoIChtZXNzYWdlTGV2ZWwpIHtcbiAgICAgICAgY2FzZSBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9FUlJPUjpcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX1dBUk5JTkc6XG4gICAgICAgICAgY29uc29sZS53YXJuKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0lORk86XG4gICAgICAgICAgY29uc29sZS5pbmZvKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0RFQlVHOlxuICAgICAgICAgIGlmIChjb25zb2xlLmRlYnVnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhsb2dNZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbiAgY21pO1xuICBzdGFydGluZ0RhdGE6IHt9O1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgQmFzZSBBUEkgY2xhc3MuIFNldHMgc29tZSBzaGFyZWQgQVBJIGZpZWxkcywgYXMgd2VsbCBhc1xuICAgKiBzZXRzIHVwIG9wdGlvbnMgZm9yIHRoZSBBUEkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBlcnJvcl9jb2Rlc1xuICAgKiBAcGFyYW0ge29iamVjdH0gc2V0dGluZ3NcbiAgICovXG4gIGNvbnN0cnVjdG9yKGVycm9yX2NvZGVzLCBzZXR0aW5ncykge1xuICAgIGlmIChuZXcudGFyZ2V0ID09PSBCYXNlQVBJKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29uc3RydWN0IEJhc2VBUEkgaW5zdGFuY2VzIGRpcmVjdGx5Jyk7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudFN0YXRlID0gZ2xvYmFsX2NvbnN0YW50cy5TVEFURV9OT1RfSU5JVElBTElaRUQ7XG4gICAgdGhpcy5sYXN0RXJyb3JDb2RlID0gMDtcbiAgICB0aGlzLmxpc3RlbmVyQXJyYXkgPSBbXTtcblxuICAgIHRoaXMuI3RpbWVvdXQgPSBudWxsO1xuICAgIHRoaXMuI2Vycm9yX2NvZGVzID0gZXJyb3JfY29kZXM7XG5cbiAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgdGhpcy5hcGlMb2dMZXZlbCA9IHRoaXMuc2V0dGluZ3MubG9nTGV2ZWw7XG4gICAgdGhpcy5zZWxmUmVwb3J0U2Vzc2lvblRpbWUgPSB0aGlzLnNldHRpbmdzLnNlbGZSZXBvcnRTZXNzaW9uVGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBBUElcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrTmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW5pdGlhbGl6ZU1lc3NhZ2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlcm1pbmF0aW9uTWVzc2FnZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBpbml0aWFsaXplKFxuICAgICAgY2FsbGJhY2tOYW1lOiBTdHJpbmcsXG4gICAgICBpbml0aWFsaXplTWVzc2FnZT86IFN0cmluZyxcbiAgICAgIHRlcm1pbmF0aW9uTWVzc2FnZT86IFN0cmluZykge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0U7XG5cbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKCkpIHtcbiAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHRoaXMuI2Vycm9yX2NvZGVzLklOSVRJQUxJWkVELCBpbml0aWFsaXplTWVzc2FnZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzVGVybWluYXRlZCgpKSB7XG4gICAgICB0aGlzLnRocm93U0NPUk1FcnJvcih0aGlzLiNlcnJvcl9jb2Rlcy5URVJNSU5BVEVELCB0ZXJtaW5hdGlvbk1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5zZWxmUmVwb3J0U2Vzc2lvblRpbWUpIHtcbiAgICAgICAgdGhpcy5jbWkuc2V0U3RhcnRUaW1lKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY3VycmVudFN0YXRlID0gZ2xvYmFsX2NvbnN0YW50cy5TVEFURV9JTklUSUFMSVpFRDtcbiAgICAgIHRoaXMubGFzdEVycm9yQ29kZSA9IDA7XG4gICAgICByZXR1cm5WYWx1ZSA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fVFJVRTtcbiAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycyhjYWxsYmFja05hbWUpO1xuICAgIH1cblxuICAgIHRoaXMuYXBpTG9nKGNhbGxiYWNrTmFtZSwgbnVsbCwgJ3JldHVybmVkOiAnICsgcmV0dXJuVmFsdWUsXG4gICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0lORk8pO1xuICAgIHRoaXMuY2xlYXJTQ09STUVycm9yKHJldHVyblZhbHVlKTtcblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNlcnJvcl9jb2Rlc1xuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICBnZXQgZXJyb3JfY29kZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2Vycm9yX2NvZGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3NldHRpbmdzXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIGdldCBzZXR0aW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy4jc2V0dGluZ3M7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc2V0dGluZ3NcbiAgICogQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzXG4gICAqL1xuICBzZXQgc2V0dGluZ3Moc2V0dGluZ3M6IE9iamVjdCkge1xuICAgIHRoaXMuI3NldHRpbmdzID0gey4uLnRoaXMuI3NldHRpbmdzLCAuLi5zZXR0aW5nc307XG4gIH1cblxuICAvKipcbiAgICogVGVybWluYXRlcyB0aGUgY3VycmVudCBydW4gb2YgdGhlIEFQSVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2tOYW1lXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tUZXJtaW5hdGVkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRlcm1pbmF0ZShcbiAgICAgIGNhbGxiYWNrTmFtZTogU3RyaW5nLFxuICAgICAgY2hlY2tUZXJtaW5hdGVkOiBib29sZWFuKSB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcblxuICAgIGlmICh0aGlzLmNoZWNrU3RhdGUoY2hlY2tUZXJtaW5hdGVkLFxuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5URVJNSU5BVElPTl9CRUZPUkVfSU5JVCxcbiAgICAgICAgdGhpcy4jZXJyb3JfY29kZXMuTVVMVElQTEVfVEVSTUlOQVRJT04pKSB7XG4gICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IGdsb2JhbF9jb25zdGFudHMuU1RBVEVfVEVSTUlOQVRFRDtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zdG9yZURhdGEodHJ1ZSk7XG4gICAgICBpZiAoIXRoaXMuc2V0dGluZ3Muc2VuZEJlYWNvbkNvbW1pdCAmJiAhdGhpcy5zZXR0aW5ncy5hc3luY0NvbW1pdCAmJlxuICAgICAgICAgIHR5cGVvZiByZXN1bHQuZXJyb3JDb2RlICE9PSAndW5kZWZpbmVkJyAmJiByZXN1bHQuZXJyb3JDb2RlID4gMCkge1xuICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihyZXN1bHQuZXJyb3JDb2RlKTtcbiAgICAgIH1cbiAgICAgIHJldHVyblZhbHVlID0gKHR5cGVvZiByZXN1bHQgIT09ICd1bmRlZmluZWQnICYmIHJlc3VsdC5yZXN1bHQpID9cbiAgICAgICAgICByZXN1bHQucmVzdWx0IDogZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcblxuICAgICAgaWYgKGNoZWNrVGVybWluYXRlZCkgdGhpcy5sYXN0RXJyb3JDb2RlID0gMDtcblxuICAgICAgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX1RSVUU7XG4gICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoY2FsbGJhY2tOYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLmFwaUxvZyhjYWxsYmFja05hbWUsIG51bGwsICdyZXR1cm5lZDogJyArIHJldHVyblZhbHVlLFxuICAgICAgICBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9JTkZPKTtcbiAgICB0aGlzLmNsZWFyU0NPUk1FcnJvcihyZXR1cm5WYWx1ZSk7XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgQ01JRWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrTmFtZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNoZWNrVGVybWluYXRlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXRWYWx1ZShcbiAgICAgIGNhbGxiYWNrTmFtZTogU3RyaW5nLFxuICAgICAgY2hlY2tUZXJtaW5hdGVkOiBib29sZWFuLFxuICAgICAgQ01JRWxlbWVudDogU3RyaW5nKSB7XG4gICAgbGV0IHJldHVyblZhbHVlO1xuXG4gICAgaWYgKHRoaXMuY2hlY2tTdGF0ZShjaGVja1Rlcm1pbmF0ZWQsXG4gICAgICAgIHRoaXMuI2Vycm9yX2NvZGVzLlJFVFJJRVZFX0JFRk9SRV9JTklULFxuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5SRVRSSUVWRV9BRlRFUl9URVJNKSkge1xuICAgICAgaWYgKGNoZWNrVGVybWluYXRlZCkgdGhpcy5sYXN0RXJyb3JDb2RlID0gMDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVyblZhbHVlID0gdGhpcy5nZXRDTUlWYWx1ZShDTUlFbGVtZW50KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgICB0aGlzLmxhc3RFcnJvckNvZGUgPSBlLmVycm9yQ29kZTtcbiAgICAgICAgICByZXR1cm5WYWx1ZSA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGUubWVzc2FnZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlLm1lc3NhZ2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcih0aGlzLiNlcnJvcl9jb2Rlcy5HRU5FUkFMKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKGNhbGxiYWNrTmFtZSwgQ01JRWxlbWVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCBDTUlFbGVtZW50LCAnOiByZXR1cm5lZDogJyArIHJldHVyblZhbHVlLFxuICAgICAgICBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9JTkZPKTtcbiAgICB0aGlzLmNsZWFyU0NPUk1FcnJvcihyZXR1cm5WYWx1ZSk7XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIENNSUVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsYmFja05hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1pdENhbGxiYWNrXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tUZXJtaW5hdGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgc2V0VmFsdWUoXG4gICAgICBjYWxsYmFja05hbWU6IFN0cmluZyxcbiAgICAgIGNvbW1pdENhbGxiYWNrOiBTdHJpbmcsXG4gICAgICBjaGVja1Rlcm1pbmF0ZWQ6IGJvb2xlYW4sXG4gICAgICBDTUlFbGVtZW50LFxuICAgICAgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgICBsZXQgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuXG4gICAgaWYgKHRoaXMuY2hlY2tTdGF0ZShjaGVja1Rlcm1pbmF0ZWQsIHRoaXMuI2Vycm9yX2NvZGVzLlNUT1JFX0JFRk9SRV9JTklULFxuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5TVE9SRV9BRlRFUl9URVJNKSkge1xuICAgICAgaWYgKGNoZWNrVGVybWluYXRlZCkgdGhpcy5sYXN0RXJyb3JDb2RlID0gMDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVyblZhbHVlID0gdGhpcy5zZXRDTUlWYWx1ZShDTUlFbGVtZW50LCB2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICAgICAgdGhpcy5sYXN0RXJyb3JDb2RlID0gZS5lcnJvckNvZGU7XG4gICAgICAgICAgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChlLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IodGhpcy4jZXJyb3JfY29kZXMuR0VORVJBTCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycyhjYWxsYmFja05hbWUsIENNSUVsZW1lbnQsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAocmV0dXJuVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGRpZG4ndCBoYXZlIGFueSBlcnJvcnMgd2hpbGUgc2V0dGluZyB0aGUgZGF0YSwgZ28gYWhlYWQgYW5kXG4gICAgLy8gc2NoZWR1bGUgYSBjb21taXQsIGlmIGF1dG9jb21taXQgaXMgdHVybmVkIG9uXG4gICAgaWYgKFN0cmluZyh0aGlzLmxhc3RFcnJvckNvZGUpID09PSAnMCcpIHtcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzLmF1dG9jb21taXQgJiYgIXRoaXMuI3RpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZUNvbW1pdCh0aGlzLnNldHRpbmdzLmF1dG9jb21taXRTZWNvbmRzICogMTAwMCwgY29tbWl0Q2FsbGJhY2spO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuYXBpTG9nKGNhbGxiYWNrTmFtZSwgQ01JRWxlbWVudCxcbiAgICAgICAgJzogJyArIHZhbHVlICsgJzogcmVzdWx0OiAnICsgcmV0dXJuVmFsdWUsXG4gICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0lORk8pO1xuICAgIHRoaXMuY2xlYXJTQ09STUVycm9yKHJldHVyblZhbHVlKTtcblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcmRlcnMgTE1TIHRvIHN0b3JlIGFsbCBjb250ZW50IHBhcmFtZXRlcnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrTmFtZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGNoZWNrVGVybWluYXRlZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBjb21taXQoXG4gICAgICBjYWxsYmFja05hbWU6IFN0cmluZyxcbiAgICAgIGNoZWNrVGVybWluYXRlZDogYm9vbGVhbikge1xuICAgIHRoaXMuY2xlYXJTY2hlZHVsZWRDb21taXQoKTtcblxuICAgIGxldCByZXR1cm5WYWx1ZSA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0U7XG5cbiAgICBpZiAodGhpcy5jaGVja1N0YXRlKGNoZWNrVGVybWluYXRlZCwgdGhpcy4jZXJyb3JfY29kZXMuQ09NTUlUX0JFRk9SRV9JTklULFxuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5DT01NSVRfQUZURVJfVEVSTSkpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc3RvcmVEYXRhKGZhbHNlKTtcbiAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5zZW5kQmVhY29uQ29tbWl0ICYmICF0aGlzLnNldHRpbmdzLmFzeW5jQ29tbWl0ICYmXG4gICAgICAgICAgcmVzdWx0LmVycm9yQ29kZSAmJiByZXN1bHQuZXJyb3JDb2RlID4gMCkge1xuICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihyZXN1bHQuZXJyb3JDb2RlKTtcbiAgICAgIH1cbiAgICAgIHJldHVyblZhbHVlID0gKHR5cGVvZiByZXN1bHQgIT09ICd1bmRlZmluZWQnICYmIHJlc3VsdC5yZXN1bHQpID9cbiAgICAgICAgICByZXN1bHQucmVzdWx0IDogZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcblxuICAgICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCAnSHR0cFJlcXVlc3QnLCAnIFJlc3VsdDogJyArIHJldHVyblZhbHVlLFxuICAgICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0RFQlVHKTtcblxuICAgICAgaWYgKGNoZWNrVGVybWluYXRlZCkgdGhpcy5sYXN0RXJyb3JDb2RlID0gMDtcblxuICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKGNhbGxiYWNrTmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCBudWxsLCAncmV0dXJuZWQ6ICcgKyByZXR1cm5WYWx1ZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG4gICAgdGhpcy5jbGVhclNDT1JNRXJyb3IocmV0dXJuVmFsdWUpO1xuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgbGFzdCBlcnJvciBjb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsYmFja05hbWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0TGFzdEVycm9yKGNhbGxiYWNrTmFtZTogU3RyaW5nKSB7XG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSBTdHJpbmcodGhpcy5sYXN0RXJyb3JDb2RlKTtcblxuICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycyhjYWxsYmFja05hbWUpO1xuXG4gICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCBudWxsLCAncmV0dXJuZWQ6ICcgKyByZXR1cm5WYWx1ZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZXJyb3JOdW1iZXIgZXJyb3IgZGVzY3JpcHRpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrTmFtZVxuICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gQ01JRXJyb3JDb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldEVycm9yU3RyaW5nKGNhbGxiYWNrTmFtZTogU3RyaW5nLCBDTUlFcnJvckNvZGUpIHtcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSAnJztcblxuICAgIGlmIChDTUlFcnJvckNvZGUgIT09IG51bGwgJiYgQ01JRXJyb3JDb2RlICE9PSAnJykge1xuICAgICAgcmV0dXJuVmFsdWUgPSB0aGlzLmdldExtc0Vycm9yTWVzc2FnZURldGFpbHMoQ01JRXJyb3JDb2RlKTtcbiAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycyhjYWxsYmFja05hbWUpO1xuICAgIH1cblxuICAgIHRoaXMuYXBpTG9nKGNhbGxiYWNrTmFtZSwgbnVsbCwgJ3JldHVybmVkOiAnICsgcmV0dXJuVmFsdWUsXG4gICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0lORk8pO1xuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb21wcmVoZW5zaXZlIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvck51bWJlciBlcnJvci5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrTmFtZVxuICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gQ01JRXJyb3JDb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldERpYWdub3N0aWMoY2FsbGJhY2tOYW1lOiBTdHJpbmcsIENNSUVycm9yQ29kZSkge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuXG4gICAgaWYgKENNSUVycm9yQ29kZSAhPT0gbnVsbCAmJiBDTUlFcnJvckNvZGUgIT09ICcnKSB7XG4gICAgICByZXR1cm5WYWx1ZSA9IHRoaXMuZ2V0TG1zRXJyb3JNZXNzYWdlRGV0YWlscyhDTUlFcnJvckNvZGUsIHRydWUpO1xuICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKGNhbGxiYWNrTmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCBudWxsLCAncmV0dXJuZWQ6ICcgKyByZXR1cm5WYWx1ZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHRoZSBMTVMgc3RhdGUgYW5kIGVuc3VyZXMgaXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tUZXJtaW5hdGVkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBiZWZvcmVJbml0RXJyb3JcbiAgICogQHBhcmFtIHtudW1iZXJ9IGFmdGVyVGVybUVycm9yXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBjaGVja1N0YXRlKFxuICAgICAgY2hlY2tUZXJtaW5hdGVkOiBib29sZWFuLFxuICAgICAgYmVmb3JlSW5pdEVycm9yOiBudW1iZXIsXG4gICAgICBhZnRlclRlcm1FcnJvcj86IG51bWJlcikge1xuICAgIGlmICh0aGlzLmlzTm90SW5pdGlhbGl6ZWQoKSkge1xuICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IoYmVmb3JlSW5pdEVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGNoZWNrVGVybWluYXRlZCAmJiB0aGlzLmlzVGVybWluYXRlZCgpKSB7XG4gICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihhZnRlclRlcm1FcnJvcik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogTG9nZ2luZyBmb3IgYWxsIFNDT1JNIGFjdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uTmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9nTWVzc2FnZVxuICAgKiBAcGFyYW0ge251bWJlcn1tZXNzYWdlTGV2ZWxcbiAgICovXG4gIGFwaUxvZyhcbiAgICAgIGZ1bmN0aW9uTmFtZTogU3RyaW5nLFxuICAgICAgQ01JRWxlbWVudDogU3RyaW5nLFxuICAgICAgbG9nTWVzc2FnZTogU3RyaW5nLFxuICAgICAgbWVzc2FnZUxldmVsOiBudW1iZXIpIHtcbiAgICBsb2dNZXNzYWdlID0gdGhpcy5mb3JtYXRNZXNzYWdlKGZ1bmN0aW9uTmFtZSwgQ01JRWxlbWVudCwgbG9nTWVzc2FnZSk7XG5cbiAgICBpZiAobWVzc2FnZUxldmVsID49IHRoaXMuYXBpTG9nTGV2ZWwpIHtcbiAgICAgIHRoaXMuc2V0dGluZ3Mub25Mb2dNZXNzYWdlKG1lc3NhZ2VMZXZlbCwgbG9nTWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgdGhlIFNDT1JNIG1lc3NhZ2VzIGZvciBlYXN5IHJlYWRpbmdcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uTmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBmb3JtYXRNZXNzYWdlKGZ1bmN0aW9uTmFtZTogU3RyaW5nLCBDTUlFbGVtZW50OiBTdHJpbmcsIG1lc3NhZ2U6IFN0cmluZykge1xuICAgIGNvbnN0IGJhc2VMZW5ndGggPSAyMDtcbiAgICBsZXQgbWVzc2FnZVN0cmluZyA9ICcnO1xuXG4gICAgbWVzc2FnZVN0cmluZyArPSBmdW5jdGlvbk5hbWU7XG5cbiAgICBsZXQgZmlsbENoYXJzID0gYmFzZUxlbmd0aCAtIG1lc3NhZ2VTdHJpbmcubGVuZ3RoO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxsQ2hhcnM7IGkrKykge1xuICAgICAgbWVzc2FnZVN0cmluZyArPSAnICc7XG4gICAgfVxuXG4gICAgbWVzc2FnZVN0cmluZyArPSAnOiAnO1xuXG4gICAgaWYgKENNSUVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IENNSUVsZW1lbnRCYXNlTGVuZ3RoID0gNzA7XG5cbiAgICAgIG1lc3NhZ2VTdHJpbmcgKz0gQ01JRWxlbWVudDtcblxuICAgICAgZmlsbENoYXJzID0gQ01JRWxlbWVudEJhc2VMZW5ndGggLSBtZXNzYWdlU3RyaW5nLmxlbmd0aDtcblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBmaWxsQ2hhcnM7IGorKykge1xuICAgICAgICBtZXNzYWdlU3RyaW5nICs9ICcgJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZSkge1xuICAgICAgbWVzc2FnZVN0cmluZyArPSBtZXNzYWdlO1xuICAgIH1cblxuICAgIHJldHVybiBtZXNzYWdlU3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB0byBzZWUgaWYge3N0cn0gY29udGFpbnMge3Rlc3Rlcn1cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciBTdHJpbmcgdG8gY2hlY2sgYWdhaW5zdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVzdGVyIFN0cmluZyB0byBjaGVjayBmb3JcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIHN0cmluZ01hdGNoZXMoc3RyOiBTdHJpbmcsIHRlc3RlcjogU3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ciAmJiB0ZXN0ZXIgJiYgc3RyLm1hdGNoKHRlc3Rlcik7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBzcGVjaWZpYyBvYmplY3QgaGFzIHRoZSBnaXZlbiBwcm9wZXJ0eVxuICAgKiBAcGFyYW0geyp9IHJlZk9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2hlY2tPYmplY3RIYXNQcm9wZXJ0eShyZWZPYmplY3QsIGF0dHJpYnV0ZTogU3RyaW5nKSB7XG4gICAgcmV0dXJuIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlZk9iamVjdCwgYXR0cmlidXRlKSB8fFxuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHJlZk9iamVjdCksIGF0dHJpYnV0ZSkgfHxcbiAgICAgICAgKGF0dHJpYnV0ZSBpbiByZWZPYmplY3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG1lc3NhZ2UgdGhhdCBjb3JyZXNwb25kcyB0byBlcnJvck51bWJlclxuICAgKiBBUElzIHRoYXQgaW5oZXJpdCBCYXNlQVBJIHNob3VsZCBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpfSBfZXJyb3JOdW1iZXJcbiAgICogQHBhcmFtIHtib29sZWFufSBfZGV0YWlsXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBnZXRMbXNFcnJvck1lc3NhZ2VEZXRhaWxzKF9lcnJvck51bWJlciwgX2RldGFpbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSBnZXRMbXNFcnJvck1lc3NhZ2VEZXRhaWxzIG1ldGhvZCBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmljIGVsZW1lbnQuXG4gICAqIEFQSXMgdGhhdCBpbmhlcml0IEJhc2VBUEkgc2hvdWxkIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IF9DTUlFbGVtZW50XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBnZXRDTUlWYWx1ZShfQ01JRWxlbWVudCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGdldENNSVZhbHVlIG1ldGhvZCBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmljIGVsZW1lbnQuXG4gICAqIEFQSXMgdGhhdCBpbmhlcml0IEJhc2VBUEkgc2hvdWxkIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IF9DTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7YW55fSBfdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIHNldENNSVZhbHVlKF9DTUlFbGVtZW50LCBfdmFsdWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBzZXRDTUlWYWx1ZSBtZXRob2QgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmVkIEFQSSBtZXRob2QgdG8gc2V0IGEgdmFsaWQgZm9yIGEgZ2l2ZW4gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAgICogQHBhcmFtIHtib29sZWFufSBzY29ybTIwMDRcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBfY29tbW9uU2V0Q01JVmFsdWUoXG4gICAgICBtZXRob2ROYW1lOiBTdHJpbmcsIHNjb3JtMjAwNDogYm9vbGVhbiwgQ01JRWxlbWVudCwgdmFsdWUpIHtcbiAgICBpZiAoIUNNSUVsZW1lbnQgfHwgQ01JRWxlbWVudCA9PT0gJycpIHtcbiAgICAgIHJldHVybiBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cnVjdHVyZSA9IENNSUVsZW1lbnQuc3BsaXQoJy4nKTtcbiAgICBsZXQgcmVmT2JqZWN0ID0gdGhpcztcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuICAgIGxldCBmb3VuZEZpcnN0SW5kZXggPSBmYWxzZTtcblxuICAgIGNvbnN0IGludmFsaWRFcnJvck1lc3NhZ2UgPSBgVGhlIGRhdGEgbW9kZWwgZWxlbWVudCBwYXNzZWQgdG8gJHttZXRob2ROYW1lfSAoJHtDTUlFbGVtZW50fSkgaXMgbm90IGEgdmFsaWQgU0NPUk0gZGF0YSBtb2RlbCBlbGVtZW50LmA7XG4gICAgY29uc3QgaW52YWxpZEVycm9yQ29kZSA9IHNjb3JtMjAwNCA/XG4gICAgICAgIHRoaXMuI2Vycm9yX2NvZGVzLlVOREVGSU5FRF9EQVRBX01PREVMIDpcbiAgICAgICAgdGhpcy4jZXJyb3JfY29kZXMuR0VORVJBTDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RydWN0dXJlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSBzdHJ1Y3R1cmVbaV07XG5cbiAgICAgIGlmIChpID09PSBzdHJ1Y3R1cmUubGVuZ3RoIC0gMSkge1xuICAgICAgICBpZiAoc2Nvcm0yMDA0ICYmIChhdHRyaWJ1dGUuc3Vic3RyKDAsIDgpID09PSAne3RhcmdldD0nKSAmJlxuICAgICAgICAgICAgKHR5cGVvZiByZWZPYmplY3QuX2lzVGFyZ2V0VmFsaWQgPT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcih0aGlzLiNlcnJvcl9jb2Rlcy5SRUFEX09OTFlfRUxFTUVOVCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2NoZWNrT2JqZWN0SGFzUHJvcGVydHkocmVmT2JqZWN0LCBhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IoaW52YWxpZEVycm9yQ29kZSwgaW52YWxpZEVycm9yTWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCgpICYmXG4gICAgICAgICAgICAgIHRoaXMuc3RyaW5nTWF0Y2hlcyhDTUlFbGVtZW50LCAnXFxcXC5jb3JyZWN0X3Jlc3BvbnNlc1xcXFwuXFxcXGQrJykpIHtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGVDb3JyZWN0UmVzcG9uc2UoQ01JRWxlbWVudCwgdmFsdWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghc2Nvcm0yMDA0IHx8IHRoaXMubGFzdEVycm9yQ29kZSA9PT0gMCkge1xuICAgICAgICAgICAgcmVmT2JqZWN0W2F0dHJpYnV0ZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVyblZhbHVlID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVmT2JqZWN0ID0gcmVmT2JqZWN0W2F0dHJpYnV0ZV07XG4gICAgICAgIGlmICghcmVmT2JqZWN0KSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IoaW52YWxpZEVycm9yQ29kZSwgaW52YWxpZEVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVmT2JqZWN0IGluc3RhbmNlb2YgQ01JQXJyYXkpIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KHN0cnVjdHVyZVtpICsgMV0sIDEwKTtcblxuICAgICAgICAgIC8vIFNDTyBpcyB0cnlpbmcgdG8gc2V0IGFuIGl0ZW0gb24gYW4gYXJyYXlcbiAgICAgICAgICBpZiAoIWlzTmFOKGluZGV4KSkge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHJlZk9iamVjdC5jaGlsZEFycmF5W2luZGV4XTtcblxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgcmVmT2JqZWN0ID0gaXRlbTtcbiAgICAgICAgICAgICAgZm91bmRGaXJzdEluZGV4ID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld0NoaWxkID0gdGhpcy5nZXRDaGlsZEVsZW1lbnQoQ01JRWxlbWVudCwgdmFsdWUsXG4gICAgICAgICAgICAgICAgICBmb3VuZEZpcnN0SW5kZXgpO1xuICAgICAgICAgICAgICBmb3VuZEZpcnN0SW5kZXggPSB0cnVlO1xuXG4gICAgICAgICAgICAgIGlmICghbmV3Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihpbnZhbGlkRXJyb3JDb2RlLCBpbnZhbGlkRXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocmVmT2JqZWN0LmluaXRpYWxpemVkKSBuZXdDaGlsZC5pbml0aWFsaXplKCk7XG5cbiAgICAgICAgICAgICAgICByZWZPYmplY3QuY2hpbGRBcnJheS5wdXNoKG5ld0NoaWxkKTtcbiAgICAgICAgICAgICAgICByZWZPYmplY3QgPSBuZXdDaGlsZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBIYXZlIHRvIHVwZGF0ZSBpIHZhbHVlIHRvIHNraXAgdGhlIGFycmF5IHBvc2l0aW9uXG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJldHVyblZhbHVlID09PSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFKSB7XG4gICAgICB0aGlzLmFwaUxvZyhtZXRob2ROYW1lLCBudWxsLFxuICAgICAgICAgIGBUaGVyZSB3YXMgYW4gZXJyb3Igc2V0dGluZyB0aGUgdmFsdWUgZm9yOiAke0NNSUVsZW1lbnR9LCB2YWx1ZSBvZjogJHt2YWx1ZX1gLFxuICAgICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX1dBUk5JTkcpO1xuICAgIH1cblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYnN0cmFjdCBtZXRob2QgZm9yIHZhbGlkYXRpbmcgdGhhdCBhIHJlc3BvbnNlIGlzIGNvcnJlY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfQ01JRWxlbWVudFxuICAgKiBAcGFyYW0geyp9IF92YWx1ZVxuICAgKi9cbiAgdmFsaWRhdGVDb3JyZWN0UmVzcG9uc2UoX0NNSUVsZW1lbnQsIF92YWx1ZSkge1xuICAgIC8vIGp1c3QgYSBzdHViIG1ldGhvZFxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3IgYnVpbGRzIGEgbmV3IGNoaWxkIGVsZW1lbnQgdG8gYWRkIHRvIHRoZSBhcnJheS5cbiAgICogQVBJcyB0aGF0IGluaGVyaXQgQmFzZUFQSSBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfQ01JRWxlbWVudCAtIHVudXNlZFxuICAgKiBAcGFyYW0geyp9IF92YWx1ZSAtIHVudXNlZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IF9mb3VuZEZpcnN0SW5kZXggLSB1bnVzZWRcbiAgICogQHJldHVybiB7Kn1cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBnZXRDaGlsZEVsZW1lbnQoX0NNSUVsZW1lbnQsIF92YWx1ZSwgX2ZvdW5kRmlyc3RJbmRleCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGdldENoaWxkRWxlbWVudCBtZXRob2QgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHZhbHVlIGZyb20gdGhlIENNSSBPYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWVcbiAgICogQHBhcmFtIHtib29sZWFufSBzY29ybTIwMDRcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIF9jb21tb25HZXRDTUlWYWx1ZShtZXRob2ROYW1lOiBTdHJpbmcsIHNjb3JtMjAwNDogYm9vbGVhbiwgQ01JRWxlbWVudCkge1xuICAgIGlmICghQ01JRWxlbWVudCB8fCBDTUlFbGVtZW50ID09PSAnJykge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGNvbnN0IHN0cnVjdHVyZSA9IENNSUVsZW1lbnQuc3BsaXQoJy4nKTtcbiAgICBsZXQgcmVmT2JqZWN0ID0gdGhpcztcbiAgICBsZXQgYXR0cmlidXRlID0gbnVsbDtcblxuICAgIGNvbnN0IHVuaW5pdGlhbGl6ZWRFcnJvck1lc3NhZ2UgPSBgVGhlIGRhdGEgbW9kZWwgZWxlbWVudCBwYXNzZWQgdG8gJHttZXRob2ROYW1lfSAoJHtDTUlFbGVtZW50fSkgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLmA7XG4gICAgY29uc3QgaW52YWxpZEVycm9yTWVzc2FnZSA9IGBUaGUgZGF0YSBtb2RlbCBlbGVtZW50IHBhc3NlZCB0byAke21ldGhvZE5hbWV9ICgke0NNSUVsZW1lbnR9KSBpcyBub3QgYSB2YWxpZCBTQ09STSBkYXRhIG1vZGVsIGVsZW1lbnQuYDtcbiAgICBjb25zdCBpbnZhbGlkRXJyb3JDb2RlID0gc2Nvcm0yMDA0ID9cbiAgICAgICAgdGhpcy4jZXJyb3JfY29kZXMuVU5ERUZJTkVEX0RBVEFfTU9ERUwgOlxuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5HRU5FUkFMO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJ1Y3R1cmUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGF0dHJpYnV0ZSA9IHN0cnVjdHVyZVtpXTtcblxuICAgICAgaWYgKCFzY29ybTIwMDQpIHtcbiAgICAgICAgaWYgKGkgPT09IHN0cnVjdHVyZS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLl9jaGVja09iamVjdEhhc1Byb3BlcnR5KHJlZk9iamVjdCwgYXR0cmlidXRlKSkge1xuICAgICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IoaW52YWxpZEVycm9yQ29kZSwgaW52YWxpZEVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoKFN0cmluZyhhdHRyaWJ1dGUpLnN1YnN0cigwLCA4KSA9PT0gJ3t0YXJnZXQ9JykgJiZcbiAgICAgICAgICAgICh0eXBlb2YgcmVmT2JqZWN0Ll9pc1RhcmdldFZhbGlkID09ICdmdW5jdGlvbicpKSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gU3RyaW5nKGF0dHJpYnV0ZSkuXG4gICAgICAgICAgICAgIHN1YnN0cig4LCBTdHJpbmcoYXR0cmlidXRlKS5sZW5ndGggLSA5KTtcbiAgICAgICAgICByZXR1cm4gcmVmT2JqZWN0Ll9pc1RhcmdldFZhbGlkKHRhcmdldCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2NoZWNrT2JqZWN0SGFzUHJvcGVydHkocmVmT2JqZWN0LCBhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IoaW52YWxpZEVycm9yQ29kZSwgaW52YWxpZEVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlZk9iamVjdCA9IHJlZk9iamVjdFthdHRyaWJ1dGVdO1xuICAgICAgaWYgKHJlZk9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKGludmFsaWRFcnJvckNvZGUsIGludmFsaWRFcnJvck1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlZk9iamVjdCBpbnN0YW5jZW9mIENNSUFycmF5KSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoc3RydWN0dXJlW2kgKyAxXSwgMTApO1xuXG4gICAgICAgIC8vIFNDTyBpcyB0cnlpbmcgdG8gc2V0IGFuIGl0ZW0gb24gYW4gYXJyYXlcbiAgICAgICAgaWYgKCFpc05hTihpbmRleCkpIHtcbiAgICAgICAgICBjb25zdCBpdGVtID0gcmVmT2JqZWN0LmNoaWxkQXJyYXlbaW5kZXhdO1xuXG4gICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIHJlZk9iamVjdCA9IGl0ZW07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHRoaXMuI2Vycm9yX2NvZGVzLlZBTFVFX05PVF9JTklUSUFMSVpFRCxcbiAgICAgICAgICAgICAgICB1bmluaXRpYWxpemVkRXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEhhdmUgdG8gdXBkYXRlIGkgdmFsdWUgdG8gc2tpcCB0aGUgYXJyYXkgcG9zaXRpb25cbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVmT2JqZWN0ID09PSBudWxsIHx8IHJlZk9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoIXNjb3JtMjAwNCkge1xuICAgICAgICBpZiAoYXR0cmlidXRlID09PSAnX2NoaWxkcmVuJykge1xuICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMTJfZXJyb3JfY29kZXMuQ0hJTERSRU5fRVJST1IpO1xuICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZSA9PT0gJ19jb3VudCcpIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTEyX2Vycm9yX2NvZGVzLkNPVU5UX0VSUk9SKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVmT2JqZWN0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEFQSSdzIGN1cnJlbnQgc3RhdGUgaXMgU1RBVEVfSU5JVElBTElaRURcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGlzSW5pdGlhbGl6ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlID09PSBnbG9iYWxfY29uc3RhbnRzLlNUQVRFX0lOSVRJQUxJWkVEO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQVBJJ3MgY3VycmVudCBzdGF0ZSBpcyBTVEFURV9OT1RfSU5JVElBTElaRURcbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGlzTm90SW5pdGlhbGl6ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlID09PSBnbG9iYWxfY29uc3RhbnRzLlNUQVRFX05PVF9JTklUSUFMSVpFRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIEFQSSdzIGN1cnJlbnQgc3RhdGUgaXMgU1RBVEVfVEVSTUlOQVRFRFxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaXNUZXJtaW5hdGVkKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZSA9PT0gZ2xvYmFsX2NvbnN0YW50cy5TVEFURV9URVJNSU5BVEVEO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBhdHRhY2hpbmcgdG8gYSBzcGVjaWZpYyBTQ09STSBldmVudFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGlzdGVuZXJOYW1lXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbihsaXN0ZW5lck5hbWU6IFN0cmluZywgY2FsbGJhY2s6IGZ1bmN0aW9uKSB7XG4gICAgaWYgKCFjYWxsYmFjaykgcmV0dXJuO1xuXG4gICAgY29uc3QgbGlzdGVuZXJGdW5jdGlvbnMgPSBsaXN0ZW5lck5hbWUuc3BsaXQoJyAnKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVyRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBsaXN0ZW5lclNwbGl0ID0gbGlzdGVuZXJGdW5jdGlvbnNbaV0uc3BsaXQoJy4nKTtcbiAgICAgIGlmIChsaXN0ZW5lclNwbGl0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBsaXN0ZW5lclNwbGl0WzBdO1xuXG4gICAgICBsZXQgQ01JRWxlbWVudCA9IG51bGw7XG4gICAgICBpZiAobGlzdGVuZXJTcGxpdC5sZW5ndGggPiAxKSB7XG4gICAgICAgIENNSUVsZW1lbnQgPSBsaXN0ZW5lck5hbWUucmVwbGFjZShmdW5jdGlvbk5hbWUgKyAnLicsICcnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5saXN0ZW5lckFycmF5LnB1c2goe1xuICAgICAgICBmdW5jdGlvbk5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgQ01JRWxlbWVudDogQ01JRWxlbWVudCxcbiAgICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuYXBpTG9nKCdvbicsIGZ1bmN0aW9uTmFtZSwgYEFkZGVkIGV2ZW50IGxpc3RlbmVyOiAke3RoaXMubGlzdGVuZXJBcnJheS5sZW5ndGh9YCwgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBkZXRhY2hpbmcgYSBzcGVjaWZpYyBTQ09STSBldmVudCBsaXN0ZW5lclxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGlzdGVuZXJOYW1lXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvZmYobGlzdGVuZXJOYW1lOiBTdHJpbmcsIGNhbGxiYWNrOiBmdW5jdGlvbikge1xuICAgIGlmICghY2FsbGJhY2spIHJldHVybjtcblxuICAgIGNvbnN0IGxpc3RlbmVyRnVuY3Rpb25zID0gbGlzdGVuZXJOYW1lLnNwbGl0KCcgJyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0ZW5lckZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbGlzdGVuZXJTcGxpdCA9IGxpc3RlbmVyRnVuY3Rpb25zW2ldLnNwbGl0KCcuJyk7XG4gICAgICBpZiAobGlzdGVuZXJTcGxpdC5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gbGlzdGVuZXJTcGxpdFswXTtcblxuICAgICAgbGV0IENNSUVsZW1lbnQgPSBudWxsO1xuICAgICAgaWYgKGxpc3RlbmVyU3BsaXQubGVuZ3RoID4gMSkge1xuICAgICAgICBDTUlFbGVtZW50ID0gbGlzdGVuZXJOYW1lLnJlcGxhY2UoZnVuY3Rpb25OYW1lICsgJy4nLCAnJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlbW92ZUluZGV4ID0gdGhpcy5saXN0ZW5lckFycmF5LmZpbmRJbmRleCgob2JqKSA9PlxuICAgICAgICBvYmouZnVuY3Rpb25OYW1lID09PSBmdW5jdGlvbk5hbWUgJiZcbiAgICAgICAgb2JqLkNNSUVsZW1lbnQgPT09IENNSUVsZW1lbnQgJiZcbiAgICAgICAgb2JqLmNhbGxiYWNrID09PSBjYWxsYmFja1xuICAgICAgKTtcbiAgICAgIGlmIChyZW1vdmVJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lckFycmF5LnNwbGljZShyZW1vdmVJbmRleCwgMSk7XG4gICAgICAgIHRoaXMuYXBpTG9nKCdvZmYnLCBmdW5jdGlvbk5hbWUsIGBSZW1vdmVkIGV2ZW50IGxpc3RlbmVyOiAke3RoaXMubGlzdGVuZXJBcnJheS5sZW5ndGh9YCwgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBjbGVhcmluZyBhbGwgbGlzdGVuZXJzIGZyb20gYSBzcGVjaWZpYyBTQ09STSBldmVudFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGlzdGVuZXJOYW1lXG4gICAqL1xuICBjbGVhcihsaXN0ZW5lck5hbWU6IFN0cmluZykge1xuICAgIGNvbnN0IGxpc3RlbmVyRnVuY3Rpb25zID0gbGlzdGVuZXJOYW1lLnNwbGl0KCcgJyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0ZW5lckZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbGlzdGVuZXJTcGxpdCA9IGxpc3RlbmVyRnVuY3Rpb25zW2ldLnNwbGl0KCcuJyk7XG4gICAgICBpZiAobGlzdGVuZXJTcGxpdC5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gbGlzdGVuZXJTcGxpdFswXTtcblxuICAgICAgbGV0IENNSUVsZW1lbnQgPSBudWxsO1xuICAgICAgaWYgKGxpc3RlbmVyU3BsaXQubGVuZ3RoID4gMSkge1xuICAgICAgICBDTUlFbGVtZW50ID0gbGlzdGVuZXJOYW1lLnJlcGxhY2UoZnVuY3Rpb25OYW1lICsgJy4nLCAnJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGlzdGVuZXJBcnJheSA9IHRoaXMubGlzdGVuZXJBcnJheS5maWx0ZXIoKG9iaikgPT5cbiAgICAgICAgb2JqLmZ1bmN0aW9uTmFtZSAhPT0gZnVuY3Rpb25OYW1lICYmXG4gICAgICAgIG9iai5DTUlFbGVtZW50ICE9PSBDTUlFbGVtZW50LFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIGFueSAnb24nIGxpc3RlbmVycyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmdW5jdGlvbk5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKi9cbiAgcHJvY2Vzc0xpc3RlbmVycyhmdW5jdGlvbk5hbWU6IFN0cmluZywgQ01JRWxlbWVudDogU3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5hcGlMb2coZnVuY3Rpb25OYW1lLCBDTUlFbGVtZW50LCB2YWx1ZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxpc3RlbmVyQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gdGhpcy5saXN0ZW5lckFycmF5W2ldO1xuICAgICAgY29uc3QgZnVuY3Rpb25zTWF0Y2ggPSBsaXN0ZW5lci5mdW5jdGlvbk5hbWUgPT09IGZ1bmN0aW9uTmFtZTtcbiAgICAgIGNvbnN0IGxpc3RlbmVySGFzQ01JRWxlbWVudCA9ICEhbGlzdGVuZXIuQ01JRWxlbWVudDtcbiAgICAgIGxldCBDTUlFbGVtZW50c01hdGNoID0gZmFsc2U7XG4gICAgICBpZiAoQ01JRWxlbWVudCAmJiBsaXN0ZW5lci5DTUlFbGVtZW50ICYmXG4gICAgICAgICAgbGlzdGVuZXIuQ01JRWxlbWVudC5zdWJzdHJpbmcobGlzdGVuZXIuQ01JRWxlbWVudC5sZW5ndGggLSAxKSA9PT1cbiAgICAgICAgICAnKicpIHtcbiAgICAgICAgQ01JRWxlbWVudHNNYXRjaCA9IENNSUVsZW1lbnQuaW5kZXhPZihsaXN0ZW5lci5DTUlFbGVtZW50LnN1YnN0cmluZygwLFxuICAgICAgICAgICAgbGlzdGVuZXIuQ01JRWxlbWVudC5sZW5ndGggLSAxKSkgPT09IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBDTUlFbGVtZW50c01hdGNoID0gbGlzdGVuZXIuQ01JRWxlbWVudCA9PT0gQ01JRWxlbWVudDtcbiAgICAgIH1cblxuICAgICAgaWYgKGZ1bmN0aW9uc01hdGNoICYmICghbGlzdGVuZXJIYXNDTUlFbGVtZW50IHx8IENNSUVsZW1lbnRzTWF0Y2gpKSB7XG4gICAgICAgIGxpc3RlbmVyLmNhbGxiYWNrKENNSUVsZW1lbnQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGEgU0NPUk0gZXJyb3JcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGVycm9yTnVtYmVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAqL1xuICB0aHJvd1NDT1JNRXJyb3IoZXJyb3JOdW1iZXI6IG51bWJlciwgbWVzc2FnZTogU3RyaW5nKSB7XG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICBtZXNzYWdlID0gdGhpcy5nZXRMbXNFcnJvck1lc3NhZ2VEZXRhaWxzKGVycm9yTnVtYmVyKTtcbiAgICB9XG5cbiAgICB0aGlzLmFwaUxvZygndGhyb3dTQ09STUVycm9yJywgbnVsbCwgZXJyb3JOdW1iZXIgKyAnOiAnICsgbWVzc2FnZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfRVJST1IpO1xuXG4gICAgdGhpcy5sYXN0RXJyb3JDb2RlID0gU3RyaW5nKGVycm9yTnVtYmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGxhc3QgU0NPUk0gZXJyb3IgY29kZSBvbiBzdWNjZXNzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VjY2Vzc1xuICAgKi9cbiAgY2xlYXJTQ09STUVycm9yKHN1Y2Nlc3M6IFN0cmluZykge1xuICAgIGlmIChzdWNjZXNzICE9PSB1bmRlZmluZWQgJiYgc3VjY2VzcyAhPT0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRSkge1xuICAgICAgdGhpcy5sYXN0RXJyb3JDb2RlID0gMDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdHMgdG8gc3RvcmUgdGhlIGRhdGEgdG8gdGhlIExNUywgbG9ncyBkYXRhIGlmIG5vIExNUyBjb25maWd1cmVkXG4gICAqIEFQSXMgdGhhdCBpbmhlcml0IEJhc2VBUEkgc2hvdWxkIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBfY2FsY3VsYXRlVG90YWxUaW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBzdG9yZURhdGEoX2NhbGN1bGF0ZVRvdGFsVGltZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSBzdG9yZURhdGEgbWV0aG9kIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgdGhlIENNSSBmcm9tIGEgZmxhdHRlbmVkIEpTT04gb2JqZWN0XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBqc29uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqL1xuICBsb2FkRnJvbUZsYXR0ZW5lZEpTT04oanNvbiwgQ01JRWxlbWVudCkge1xuICAgIGlmICghdGhpcy5pc05vdEluaXRpYWxpemVkKCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgJ2xvYWRGcm9tRmxhdHRlbmVkSlNPTiBjYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjYWxsIHRvIGxtc0luaXRpYWxpemUuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGVzdCBtYXRjaCBwYXR0ZXJuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY1xuICAgICAqIEBwYXJhbSB7UmVnRXhwfSBhX3BhdHRlcm5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAgICovXG4gICAgZnVuY3Rpb24gdGVzdFBhdHRlcm4oYSwgYywgYV9wYXR0ZXJuKSB7XG4gICAgICBjb25zdCBhX21hdGNoID0gYS5tYXRjaChhX3BhdHRlcm4pO1xuXG4gICAgICBsZXQgY19tYXRjaDtcbiAgICAgIGlmIChhX21hdGNoICE9PSBudWxsICYmIChjX21hdGNoID0gYy5tYXRjaChhX3BhdHRlcm4pKSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBhX251bSA9IE51bWJlcihhX21hdGNoWzJdKTtcbiAgICAgICAgY29uc3QgY19udW0gPSBOdW1iZXIoY19tYXRjaFsyXSk7XG4gICAgICAgIGlmIChhX251bSA9PT0gY19udW0pIHtcbiAgICAgICAgICBpZiAoYV9tYXRjaFszXSA9PT0gJ2lkJykge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYV9tYXRjaFszXSA9PT0gJ3R5cGUnKSB7XG4gICAgICAgICAgICBpZiAoY19tYXRjaFszXSA9PT0gJ2lkJykge1xuICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhX251bSAtIGNfbnVtO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBpbnRfcGF0dGVybiA9IC9eKGNtaVxcLmludGVyYWN0aW9uc1xcLikoXFxkKylcXC4oLiopJC87XG4gICAgY29uc3Qgb2JqX3BhdHRlcm4gPSAvXihjbWlcXC5vYmplY3RpdmVzXFwuKShcXGQrKVxcLiguKikkLztcblxuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5rZXlzKGpzb24pLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBbU3RyaW5nKGtleSksIGpzb25ba2V5XV07XG4gICAgfSk7XG5cbiAgICAvLyBDTUkgaW50ZXJhY3Rpb25zIG5lZWQgdG8gaGF2ZSBpZCBhbmQgdHlwZSBsb2FkZWQgYmVmb3JlIGFueSBvdGhlciBmaWVsZHNcbiAgICByZXN1bHQuc29ydChmdW5jdGlvbihbYSwgYl0sIFtjLCBkXSkge1xuICAgICAgbGV0IHRlc3Q7XG4gICAgICBpZiAoKHRlc3QgPSB0ZXN0UGF0dGVybihhLCBjLCBpbnRfcGF0dGVybikpICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0ZXN0O1xuICAgICAgfVxuICAgICAgaWYgKCh0ZXN0ID0gdGVzdFBhdHRlcm4oYSwgYywgb2JqX3BhdHRlcm4pKSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGVzdDtcbiAgICAgIH1cblxuICAgICAgaWYgKGEgPCBjKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIGlmIChhID4gYykge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuXG4gICAgbGV0IG9iajtcbiAgICByZXN1bHQuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgb2JqID0ge307XG4gICAgICBvYmpbZWxlbWVudFswXV0gPSBlbGVtZW50WzFdO1xuICAgICAgdGhpcy5sb2FkRnJvbUpTT04odW5mbGF0dGVuKG9iaiksIENNSUVsZW1lbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIENNSSBkYXRhIGZyb20gYSBKU09OIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGpzb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICovXG4gIGxvYWRGcm9tSlNPTihqc29uLCBDTUlFbGVtZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzTm90SW5pdGlhbGl6ZWQoKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAnbG9hZEZyb21KU09OIGNhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgdGhlIGNhbGwgdG8gbG1zSW5pdGlhbGl6ZS4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBDTUlFbGVtZW50ID0gQ01JRWxlbWVudCAhPT0gdW5kZWZpbmVkID8gQ01JRWxlbWVudCA6ICdjbWknO1xuXG4gICAgdGhpcy5zdGFydGluZ0RhdGEgPSBqc29uO1xuXG4gICAgLy8gY291bGQgdGhpcyBiZSByZWZhY3RvcmVkIGRvd24gdG8gZmxhdHRlbihqc29uKSB0aGVuIHNldENNSVZhbHVlIG9uIGVhY2g/XG4gICAgZm9yIChjb25zdCBrZXkgaW4ganNvbikge1xuICAgICAgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwoanNvbiwga2V5KSAmJiBqc29uW2tleV0pIHtcbiAgICAgICAgY29uc3QgY3VycmVudENNSUVsZW1lbnQgPSAoQ01JRWxlbWVudCA/IENNSUVsZW1lbnQgKyAnLicgOiAnJykgKyBrZXk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0ganNvbltrZXldO1xuXG4gICAgICAgIGlmICh2YWx1ZVsnY2hpbGRBcnJheSddKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZVsnY2hpbGRBcnJheSddLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRGcm9tSlNPTih2YWx1ZVsnY2hpbGRBcnJheSddW2ldLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRDTUlFbGVtZW50ICsgJy4nICsgaSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcbiAgICAgICAgICB0aGlzLmxvYWRGcm9tSlNPTih2YWx1ZSwgY3VycmVudENNSUVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0Q01JVmFsdWUoY3VycmVudENNSUVsZW1lbnQsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIENNSSBvYmplY3QgdG8gSlNPTiBmb3Igc2VuZGluZyB0byBhbiBMTVMuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHJlbmRlckNNSVRvSlNPTlN0cmluZygpIHtcbiAgICBjb25zdCBjbWkgPSB0aGlzLmNtaTtcbiAgICAvLyBEbyB3ZSB3YW50L25lZWQgdG8gcmV0dXJuIGZpZWxkcyB0aGF0IGhhdmUgbm8gc2V0IHZhbHVlP1xuICAgIC8vIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IGNtaSB9LCAoaywgdikgPT4gdiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHYsIDIpO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7Y21pfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEpTIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgY21pXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIHJlbmRlckNNSVRvSlNPTk9iamVjdCgpIHtcbiAgICAvLyBEbyB3ZSB3YW50L25lZWQgdG8gcmV0dXJuIGZpZWxkcyB0aGF0IGhhdmUgbm8gc2V0IHZhbHVlP1xuICAgIC8vIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IGNtaSB9LCAoaywgdikgPT4gdiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHYsIDIpO1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRoaXMucmVuZGVyQ01JVG9KU09OU3RyaW5nKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgY21pIG9iamVjdCB0byB0aGUgcHJvcGVyIGZvcm1hdCBmb3IgTE1TIGNvbW1pdFxuICAgKiBBUElzIHRoYXQgaW5oZXJpdCBCYXNlQVBJIHNob3VsZCBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gX3Rlcm1pbmF0ZUNvbW1pdFxuICAgKiBAcmV0dXJuIHsqfVxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIHJlbmRlckNvbW1pdENNSShfdGVybWluYXRlQ29tbWl0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIHN0b3JlRGF0YSBtZXRob2QgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCB0aGUgcmVxdWVzdCB0byB0aGUgTE1TXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtvYmplY3R8QXJyYXl9IHBhcmFtc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGltbWVkaWF0ZVxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICBwcm9jZXNzSHR0cFJlcXVlc3QodXJsOiBTdHJpbmcsIHBhcmFtcywgaW1tZWRpYXRlID0gZmFsc2UpIHtcbiAgICBjb25zdCBhcGkgPSB0aGlzO1xuICAgIGNvbnN0IHByb2Nlc3MgPSBmdW5jdGlvbih1cmwsIHBhcmFtcywgc2V0dGluZ3MsIGVycm9yX2NvZGVzKSB7XG4gICAgICBjb25zdCBnZW5lcmljRXJyb3IgPSB7XG4gICAgICAgICdyZXN1bHQnOiBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFLFxuICAgICAgICAnZXJyb3JDb2RlJzogZXJyb3JfY29kZXMuR0VORVJBTCxcbiAgICAgIH07XG5cbiAgICAgIGxldCByZXN1bHQ7XG4gICAgICBpZiAoIXNldHRpbmdzLnNlbmRCZWFjb25Db21taXQpIHtcbiAgICAgICAgY29uc3QgaHR0cFJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICBodHRwUmVxLm9wZW4oJ1BPU1QnLCB1cmwsIHNldHRpbmdzLmFzeW5jQ29tbWl0KTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoc2V0dGluZ3MueGhySGVhZGVycykubGVuZ3RoKSB7XG4gICAgICAgICAgT2JqZWN0LmtleXMoc2V0dGluZ3MueGhySGVhZGVycykuZm9yRWFjaCgoaGVhZGVyKSA9PiB7XG4gICAgICAgICAgICBodHRwUmVxLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBzZXR0aW5ncy54aHJIZWFkZXJzW2hlYWRlcl0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaHR0cFJlcS53aXRoQ3JlZGVudGlhbHMgPSBzZXR0aW5ncy54aHJXaXRoQ3JlZGVudGlhbHM7XG5cbiAgICAgICAgaWYgKHNldHRpbmdzLmFzeW5jQ29tbWl0KSB7XG4gICAgICAgICAgaHR0cFJlcS5vbmxvYWQgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNldHRpbmdzLnJlc3BvbnNlSGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICByZXN1bHQgPSBzZXR0aW5ncy5yZXNwb25zZUhhbmRsZXIoaHR0cFJlcSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKGh0dHBSZXEucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHBhcmFtcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICBodHRwUmVxLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuICAgICAgICAgICAgaHR0cFJlcS5zZW5kKHBhcmFtcy5qb2luKCcmJykpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBodHRwUmVxLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsXG4gICAgICAgICAgICAgICAgc2V0dGluZ3MuY29tbWl0UmVxdWVzdERhdGFUeXBlKTtcbiAgICAgICAgICAgIGh0dHBSZXEuc2VuZChKU09OLnN0cmluZ2lmeShwYXJhbXMpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIXNldHRpbmdzLmFzeW5jQ29tbWl0KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNldHRpbmdzLnJlc3BvbnNlSGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICByZXN1bHQgPSBzZXR0aW5ncy5yZXNwb25zZUhhbmRsZXIoaHR0cFJlcSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKGh0dHBSZXEucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0ge307XG4gICAgICAgICAgICByZXN1bHQucmVzdWx0ID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFO1xuICAgICAgICAgICAgcmVzdWx0LmVycm9yQ29kZSA9IDA7XG4gICAgICAgICAgICBhcGkucHJvY2Vzc0xpc3RlbmVycygnQ29tbWl0U3VjY2VzcycpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIGFwaS5wcm9jZXNzTGlzdGVuZXJzKCdDb21taXRFcnJvcicpO1xuICAgICAgICAgIHJldHVybiBnZW5lcmljRXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAgIHR5cGU6IHNldHRpbmdzLmNvbW1pdFJlcXVlc3REYXRhVHlwZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGxldCBibG9iO1xuICAgICAgICAgIGlmIChwYXJhbXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgYmxvYiA9IG5ldyBCbG9iKFtwYXJhbXMuam9pbignJicpXSwgaGVhZGVycyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkocGFyYW1zKV0sIGhlYWRlcnMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuICAgICAgICAgIGlmIChuYXZpZ2F0b3Iuc2VuZEJlYWNvbih1cmwsIGJsb2IpKSB7XG4gICAgICAgICAgICByZXN1bHQucmVzdWx0ID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFO1xuICAgICAgICAgICAgcmVzdWx0LmVycm9yQ29kZSA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5yZXN1bHQgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuICAgICAgICAgICAgcmVzdWx0LmVycm9yQ29kZSA9IDEwMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIGFwaS5wcm9jZXNzTGlzdGVuZXJzKCdDb21taXRFcnJvcicpO1xuICAgICAgICAgIHJldHVybiBnZW5lcmljRXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGFwaS5wcm9jZXNzTGlzdGVuZXJzKCdDb21taXRFcnJvcicpO1xuICAgICAgICByZXR1cm4gZ2VuZXJpY0Vycm9yO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LnJlc3VsdCA9PT0gdHJ1ZSB8fFxuICAgICAgICAgIHJlc3VsdC5yZXN1bHQgPT09IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fVFJVRSkge1xuICAgICAgICBhcGkucHJvY2Vzc0xpc3RlbmVycygnQ29tbWl0U3VjY2VzcycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXBpLnByb2Nlc3NMaXN0ZW5lcnMoJ0NvbW1pdEVycm9yJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIGlmICh0eXBlb2YgZGVib3VuY2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCBkZWJvdW5jZWQgPSBkZWJvdW5jZShwcm9jZXNzLCA1MDApO1xuICAgICAgZGVib3VuY2VkKHVybCwgcGFyYW1zLCB0aGlzLnNldHRpbmdzLCB0aGlzLmVycm9yX2NvZGVzKTtcblxuICAgICAgLy8gaWYgd2UncmUgdGVybWluYXRpbmcsIGdvIGFoZWFkIGFuZCBjb21taXQgaW1tZWRpYXRlbHlcbiAgICAgIGlmIChpbW1lZGlhdGUpIHtcbiAgICAgICAgZGVib3VuY2VkLmZsdXNoKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3VsdDogZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFLFxuICAgICAgICBlcnJvckNvZGU6IDAsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcHJvY2Vzcyh1cmwsIHBhcmFtcywgdGhpcy5zZXR0aW5ncywgdGhpcy5lcnJvcl9jb2Rlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhIFNDT1JNIGVycm9yXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB3aGVuIC0gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgY29tbWl0dGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2sgLSB0aGUgbmFtZSBvZiB0aGUgY29tbWl0IGV2ZW50IGNhbGxiYWNrXG4gICAqL1xuICBzY2hlZHVsZUNvbW1pdCh3aGVuOiBudW1iZXIsIGNhbGxiYWNrOiBzdHJpbmcpIHtcbiAgICB0aGlzLiN0aW1lb3V0ID0gbmV3IFNjaGVkdWxlZENvbW1pdCh0aGlzLCB3aGVuLCBjYWxsYmFjayk7XG4gICAgdGhpcy5hcGlMb2coJ3NjaGVkdWxlQ29tbWl0JywgJycsICdzY2hlZHVsZWQnLFxuICAgICAgICBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9ERUJVRyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIGFuZCBjYW5jZWxzIGFueSBjdXJyZW50bHkgc2NoZWR1bGVkIGNvbW1pdHNcbiAgICovXG4gIGNsZWFyU2NoZWR1bGVkQ29tbWl0KCkge1xuICAgIGlmICh0aGlzLiN0aW1lb3V0KSB7XG4gICAgICB0aGlzLiN0aW1lb3V0LmNhbmNlbCgpO1xuICAgICAgdGhpcy4jdGltZW91dCA9IG51bGw7XG4gICAgICB0aGlzLmFwaUxvZygnY2xlYXJTY2hlZHVsZWRDb21taXQnLCAnJywgJ2NsZWFyZWQnLFxuICAgICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0RFQlVHKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQcml2YXRlIGNsYXNzIHRoYXQgd3JhcHMgYSB0aW1lb3V0IGNhbGwgdG8gdGhlIGNvbW1pdCgpIGZ1bmN0aW9uXG4gKi9cbmNsYXNzIFNjaGVkdWxlZENvbW1pdCB7XG4gICNBUEk7XG4gICNjYW5jZWxsZWQgPSBmYWxzZTtcbiAgI3RpbWVvdXQ7XG4gICNjYWxsYmFjaztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIFNjaGVkdWxlZENvbW1pdFxuICAgKiBAcGFyYW0ge0Jhc2VBUEl9IEFQSVxuICAgKiBAcGFyYW0ge251bWJlcn0gd2hlblxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2tcbiAgICovXG4gIGNvbnN0cnVjdG9yKEFQSTogYW55LCB3aGVuOiBudW1iZXIsIGNhbGxiYWNrOiBzdHJpbmcpIHtcbiAgICB0aGlzLiNBUEkgPSBBUEk7XG4gICAgdGhpcy4jdGltZW91dCA9IHNldFRpbWVvdXQodGhpcy53cmFwcGVyLmJpbmQodGhpcyksIHdoZW4pO1xuICAgIHRoaXMuI2NhbGxiYWNrID0gY2FsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGFueSBjdXJyZW50bHkgc2NoZWR1bGVkIGNvbW1pdFxuICAgKi9cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuI2NhbmNlbGxlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuI3RpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLiN0aW1lb3V0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JhcCB0aGUgQVBJIGNvbW1pdCBjYWxsIHRvIGNoZWNrIGlmIHRoZSBjYWxsIGhhcyBhbHJlYWR5IGJlZW4gY2FuY2VsbGVkXG4gICAqL1xuICB3cmFwcGVyKCkge1xuICAgIGlmICghdGhpcy4jY2FuY2VsbGVkKSB7XG4gICAgICB0aGlzLiNBUEkuY29tbWl0KHRoaXMuI2NhbGxiYWNrKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgQmFzZUFQSSBmcm9tICcuL0Jhc2VBUEknO1xuaW1wb3J0IHtcbiAgQ01JLFxuICBDTUlJbnRlcmFjdGlvbnNDb3JyZWN0UmVzcG9uc2VzT2JqZWN0LFxuICBDTUlJbnRlcmFjdGlvbnNPYmplY3QsXG4gIENNSUludGVyYWN0aW9uc09iamVjdGl2ZXNPYmplY3QsXG4gIENNSU9iamVjdGl2ZXNPYmplY3QsIE5BVixcbn0gZnJvbSAnLi9jbWkvc2Nvcm0xMl9jbWknO1xuaW1wb3J0ICogYXMgVXRpbGl0aWVzIGZyb20gJy4vdXRpbGl0aWVzJztcbmltcG9ydCBBUElDb25zdGFudHMgZnJvbSAnLi9jb25zdGFudHMvYXBpX2NvbnN0YW50cyc7XG5pbXBvcnQgRXJyb3JDb2RlcyBmcm9tICcuL2NvbnN0YW50cy9lcnJvcl9jb2Rlcyc7XG5cbmNvbnN0IHNjb3JtMTJfY29uc3RhbnRzID0gQVBJQ29uc3RhbnRzLnNjb3JtMTI7XG5jb25zdCBnbG9iYWxfY29uc3RhbnRzID0gQVBJQ29uc3RhbnRzLmdsb2JhbDtcbmNvbnN0IHNjb3JtMTJfZXJyb3JfY29kZXMgPSBFcnJvckNvZGVzLnNjb3JtMTI7XG5cbi8qKlxuICogQVBJIGNsYXNzIGZvciBTQ09STSAxLjJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2Nvcm0xMkFQSSBleHRlbmRzIEJhc2VBUEkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIFNDT1JNIDEuMiBBUElcbiAgICogQHBhcmFtIHtvYmplY3R9IHNldHRpbmdzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzZXR0aW5nczoge30pIHtcbiAgICBjb25zdCBmaW5hbFNldHRpbmdzID0ge1xuICAgICAgLi4ue1xuICAgICAgICBtYXN0ZXJ5X292ZXJyaWRlOiBmYWxzZSxcbiAgICAgIH0sIC4uLnNldHRpbmdzLFxuICAgIH07XG5cbiAgICBzdXBlcihzY29ybTEyX2Vycm9yX2NvZGVzLCBmaW5hbFNldHRpbmdzKTtcblxuICAgIHRoaXMuY21pID0gbmV3IENNSSgpO1xuICAgIHRoaXMubmF2ID0gbmV3IE5BVigpO1xuXG4gICAgLy8gUmVuYW1lIGZ1bmN0aW9ucyB0byBtYXRjaCAxLjIgU3BlYyBhbmQgZXhwb3NlIHRvIG1vZHVsZXNcbiAgICB0aGlzLkxNU0luaXRpYWxpemUgPSB0aGlzLmxtc0luaXRpYWxpemU7XG4gICAgdGhpcy5MTVNGaW5pc2ggPSB0aGlzLmxtc0ZpbmlzaDtcbiAgICB0aGlzLkxNU0dldFZhbHVlID0gdGhpcy5sbXNHZXRWYWx1ZTtcbiAgICB0aGlzLkxNU1NldFZhbHVlID0gdGhpcy5sbXNTZXRWYWx1ZTtcbiAgICB0aGlzLkxNU0NvbW1pdCA9IHRoaXMubG1zQ29tbWl0O1xuICAgIHRoaXMuTE1TR2V0TGFzdEVycm9yID0gdGhpcy5sbXNHZXRMYXN0RXJyb3I7XG4gICAgdGhpcy5MTVNHZXRFcnJvclN0cmluZyA9IHRoaXMubG1zR2V0RXJyb3JTdHJpbmc7XG4gICAgdGhpcy5MTVNHZXREaWFnbm9zdGljID0gdGhpcy5sbXNHZXREaWFnbm9zdGljO1xuICB9XG5cbiAgLyoqXG4gICAqIGxtc0luaXRpYWxpemUgZnVuY3Rpb24gZnJvbSBTQ09STSAxLjIgU3BlY1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IGJvb2xcbiAgICovXG4gIGxtc0luaXRpYWxpemUoKSB7XG4gICAgdGhpcy5jbWkuaW5pdGlhbGl6ZSgpO1xuICAgIHJldHVybiB0aGlzLmluaXRpYWxpemUoJ0xNU0luaXRpYWxpemUnLCAnTE1TIHdhcyBhbHJlYWR5IGluaXRpYWxpemVkIScsXG4gICAgICAgICdMTVMgaXMgYWxyZWFkeSBmaW5pc2hlZCEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMTVNGaW5pc2ggZnVuY3Rpb24gZnJvbSBTQ09STSAxLjIgU3BlY1xuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IGJvb2xcbiAgICovXG4gIGxtc0ZpbmlzaCgpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnRlcm1pbmF0ZSgnTE1TRmluaXNoJywgdHJ1ZSk7XG5cbiAgICBpZiAocmVzdWx0ID09PSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX1RSVUUpIHtcbiAgICAgIGlmICh0aGlzLm5hdi5ldmVudCAhPT0gJycpIHtcbiAgICAgICAgaWYgKHRoaXMubmF2LmV2ZW50ID09PSAnY29udGludWUnKSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZU5leHQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoJ1NlcXVlbmNlUHJldmlvdXMnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNldHRpbmdzLmF1dG9Qcm9ncmVzcykge1xuICAgICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoJ1NlcXVlbmNlTmV4dCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogTE1TR2V0VmFsdWUgZnVuY3Rpb24gZnJvbSBTQ09STSAxLjIgU3BlY1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBsbXNHZXRWYWx1ZShDTUlFbGVtZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoJ0xNU0dldFZhbHVlJywgZmFsc2UsIENNSUVsZW1lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIExNU1NldFZhbHVlIGZ1bmN0aW9uIGZyb20gU0NPUk0gMS4yIFNwZWNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBsbXNTZXRWYWx1ZShDTUlFbGVtZW50LCB2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLnNldFZhbHVlKCdMTVNTZXRWYWx1ZScsICdMTVNDb21taXQnLCBmYWxzZSwgQ01JRWxlbWVudCwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExNU0NvbW1pdCBmdW5jdGlvbiBmcm9tIFNDT1JNIDEuMiBTcGVjXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gYm9vbFxuICAgKi9cbiAgbG1zQ29tbWl0KCkge1xuICAgIHJldHVybiB0aGlzLmNvbW1pdCgnTE1TQ29tbWl0JywgZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIExNU0dldExhc3RFcnJvciBmdW5jdGlvbiBmcm9tIFNDT1JNIDEuMiBTcGVjXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGxtc0dldExhc3RFcnJvcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMYXN0RXJyb3IoJ0xNU0dldExhc3RFcnJvcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIExNU0dldEVycm9yU3RyaW5nIGZ1bmN0aW9uIGZyb20gU0NPUk0gMS4yIFNwZWNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVycm9yQ29kZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBsbXNHZXRFcnJvclN0cmluZyhDTUlFcnJvckNvZGUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRFcnJvclN0cmluZygnTE1TR2V0RXJyb3JTdHJpbmcnLCBDTUlFcnJvckNvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExNU0dldERpYWdub3N0aWMgZnVuY3Rpb24gZnJvbSBTQ09STSAxLjIgU3BlY1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRXJyb3JDb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGxtc0dldERpYWdub3N0aWMoQ01JRXJyb3JDb2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGlhZ25vc3RpYygnTE1TR2V0RGlhZ25vc3RpYycsIENNSUVycm9yQ29kZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIHZhbHVlIG9uIHRoZSBDTUkgT2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgc2V0Q01JVmFsdWUoQ01JRWxlbWVudCwgdmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fY29tbW9uU2V0Q01JVmFsdWUoJ0xNU1NldFZhbHVlJywgZmFsc2UsIENNSUVsZW1lbnQsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgdmFsdWUgZnJvbSB0aGUgQ01JIE9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0Q01JVmFsdWUoQ01JRWxlbWVudCkge1xuICAgIHJldHVybiB0aGlzLl9jb21tb25HZXRDTUlWYWx1ZSgnZ2V0Q01JVmFsdWUnLCBmYWxzZSwgQ01JRWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBvciBidWlsZHMgYSBuZXcgY2hpbGQgZWxlbWVudCB0byBhZGQgdG8gdGhlIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm91bmRGaXJzdEluZGV4XG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIGdldENoaWxkRWxlbWVudChDTUlFbGVtZW50LCB2YWx1ZSwgZm91bmRGaXJzdEluZGV4KSB7XG4gICAgbGV0IG5ld0NoaWxkO1xuXG4gICAgaWYgKHRoaXMuc3RyaW5nTWF0Y2hlcyhDTUlFbGVtZW50LCAnY21pXFxcXC5vYmplY3RpdmVzXFxcXC5cXFxcZCsnKSkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JT2JqZWN0aXZlc09iamVjdCgpO1xuICAgIH0gZWxzZSBpZiAoZm91bmRGaXJzdEluZGV4ICYmIHRoaXMuc3RyaW5nTWF0Y2hlcyhDTUlFbGVtZW50LFxuICAgICAgICAnY21pXFxcXC5pbnRlcmFjdGlvbnNcXFxcLlxcXFxkK1xcXFwuY29ycmVjdF9yZXNwb25zZXNcXFxcLlxcXFxkKycpKSB7XG4gICAgICBuZXdDaGlsZCA9IG5ldyBDTUlJbnRlcmFjdGlvbnNDb3JyZWN0UmVzcG9uc2VzT2JqZWN0KCk7XG4gICAgfSBlbHNlIGlmIChmb3VuZEZpcnN0SW5kZXggJiYgdGhpcy5zdHJpbmdNYXRjaGVzKENNSUVsZW1lbnQsXG4gICAgICAgICdjbWlcXFxcLmludGVyYWN0aW9uc1xcXFwuXFxcXGQrXFxcXC5vYmplY3RpdmVzXFxcXC5cXFxcZCsnKSkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JSW50ZXJhY3Rpb25zT2JqZWN0aXZlc09iamVjdCgpO1xuICAgIH0gZWxzZSBpZiAoIWZvdW5kRmlyc3RJbmRleCAmJlxuICAgICAgICB0aGlzLnN0cmluZ01hdGNoZXMoQ01JRWxlbWVudCwgJ2NtaVxcXFwuaW50ZXJhY3Rpb25zXFxcXC5cXFxcZCsnKSkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JSW50ZXJhY3Rpb25zT2JqZWN0KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld0NoaWxkO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBDb3JyZWN0IFJlc3BvbnNlIHZhbHVlc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICB2YWxpZGF0ZUNvcnJlY3RSZXNwb25zZShDTUlFbGVtZW50LCB2YWx1ZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG1lc3NhZ2UgdGhhdCBjb3JyZXNwb25kcyB0byBlcnJvck51bWJlci5cbiAgICpcbiAgICogQHBhcmFtIHsqfSBlcnJvck51bWJlclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRldGFpbFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXRMbXNFcnJvck1lc3NhZ2VEZXRhaWxzKGVycm9yTnVtYmVyLCBkZXRhaWwpIHtcbiAgICBsZXQgYmFzaWNNZXNzYWdlID0gJ05vIEVycm9yJztcbiAgICBsZXQgZGV0YWlsTWVzc2FnZSA9ICdObyBFcnJvcic7XG5cbiAgICAvLyBTZXQgZXJyb3IgbnVtYmVyIHRvIHN0cmluZyBzaW5jZSBpbmNvbnNpc3RlbnQgZnJvbSBtb2R1bGVzIGlmIHN0cmluZyBvciBudW1iZXJcbiAgICBlcnJvck51bWJlciA9IFN0cmluZyhlcnJvck51bWJlcik7XG4gICAgaWYgKHNjb3JtMTJfY29uc3RhbnRzLmVycm9yX2Rlc2NyaXB0aW9uc1tlcnJvck51bWJlcl0pIHtcbiAgICAgIGJhc2ljTWVzc2FnZSA9IHNjb3JtMTJfY29uc3RhbnRzLmVycm9yX2Rlc2NyaXB0aW9uc1tlcnJvck51bWJlcl0uYmFzaWNNZXNzYWdlO1xuICAgICAgZGV0YWlsTWVzc2FnZSA9IHNjb3JtMTJfY29uc3RhbnRzLmVycm9yX2Rlc2NyaXB0aW9uc1tlcnJvck51bWJlcl0uZGV0YWlsTWVzc2FnZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGV0YWlsID8gZGV0YWlsTWVzc2FnZSA6IGJhc2ljTWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSB3aG9sZSBBUEkgd2l0aCBhbm90aGVyXG4gICAqXG4gICAqIEBwYXJhbSB7U2Nvcm0xMkFQSX0gbmV3QVBJXG4gICAqL1xuICByZXBsYWNlV2l0aEFub3RoZXJTY29ybUFQSShuZXdBUEkpIHtcbiAgICAvLyBEYXRhIE1vZGVsXG4gICAgdGhpcy5jbWkgPSBuZXdBUEkuY21pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgY21pIG9iamVjdCB0byB0aGUgcHJvcGVyIGZvcm1hdCBmb3IgTE1TIGNvbW1pdFxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHRlcm1pbmF0ZUNvbW1pdFxuICAgKiBAcmV0dXJuIHtvYmplY3R8QXJyYXl9XG4gICAqL1xuICByZW5kZXJDb21taXRDTUkodGVybWluYXRlQ29tbWl0OiBib29sZWFuKSB7XG4gICAgY29uc3QgY21pRXhwb3J0ID0gdGhpcy5yZW5kZXJDTUlUb0pTT05PYmplY3QoKTtcblxuICAgIGlmICh0ZXJtaW5hdGVDb21taXQpIHtcbiAgICAgIGNtaUV4cG9ydC5jbWkuY29yZS50b3RhbF90aW1lID0gdGhpcy5jbWkuZ2V0Q3VycmVudFRvdGFsVGltZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGNvbnN0IGZsYXR0ZW5lZCA9IFV0aWxpdGllcy5mbGF0dGVuKGNtaUV4cG9ydCk7XG4gICAgc3dpdGNoICh0aGlzLnNldHRpbmdzLmRhdGFDb21taXRGb3JtYXQpIHtcbiAgICAgIGNhc2UgJ2ZsYXR0ZW5lZCc6XG4gICAgICAgIHJldHVybiBVdGlsaXRpZXMuZmxhdHRlbihjbWlFeHBvcnQpO1xuICAgICAgY2FzZSAncGFyYW1zJzpcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIGluIGZsYXR0ZW5lZCkge1xuICAgICAgICAgIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZsYXR0ZW5lZCwgaXRlbSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGAke2l0ZW19PSR7ZmxhdHRlbmVkW2l0ZW1dfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgY2FzZSAnanNvbic6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gY21pRXhwb3J0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byBzdG9yZSB0aGUgZGF0YSB0byB0aGUgTE1TXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdGVybWluYXRlQ29tbWl0XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHN0b3JlRGF0YSh0ZXJtaW5hdGVDb21taXQ6IGJvb2xlYW4pIHtcbiAgICBpZiAodGVybWluYXRlQ29tbWl0KSB7XG4gICAgICBjb25zdCBvcmlnaW5hbFN0YXR1cyA9IHRoaXMuY21pLmNvcmUubGVzc29uX3N0YXR1cztcbiAgICAgIGlmIChvcmlnaW5hbFN0YXR1cyA9PT0gJ25vdCBhdHRlbXB0ZWQnKSB7XG4gICAgICAgIHRoaXMuY21pLmNvcmUubGVzc29uX3N0YXR1cyA9ICdjb21wbGV0ZWQnO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jbWkuY29yZS5sZXNzb25fbW9kZSA9PT0gJ25vcm1hbCcpIHtcbiAgICAgICAgaWYgKHRoaXMuY21pLmNvcmUuY3JlZGl0ID09PSAnY3JlZGl0Jykge1xuICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLm1hc3Rlcnlfb3ZlcnJpZGUgJiZcbiAgICAgICAgICAgICAgdGhpcy5jbWkuc3R1ZGVudF9kYXRhLm1hc3Rlcnlfc2NvcmUgIT09ICcnICYmXG4gICAgICAgICAgICAgIHRoaXMuY21pLmNvcmUuc2NvcmUucmF3ICE9PSAnJykge1xuICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQodGhpcy5jbWkuY29yZS5zY29yZS5yYXcpID49IHBhcnNlRmxvYXQodGhpcy5jbWkuc3R1ZGVudF9kYXRhLm1hc3Rlcnlfc2NvcmUpKSB7XG4gICAgICAgICAgICAgIHRoaXMuY21pLmNvcmUubGVzc29uX3N0YXR1cyA9ICdwYXNzZWQnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5jbWkuY29yZS5sZXNzb25fc3RhdHVzID0gJ2ZhaWxlZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY21pLmNvcmUubGVzc29uX21vZGUgPT09ICdicm93c2UnKSB7XG4gICAgICAgIGlmICgodGhpcy5zdGFydGluZ0RhdGE/LmNtaT8uY29yZT8ubGVzc29uX3N0YXR1cyB8fCAnJykgPT09ICcnICYmIG9yaWdpbmFsU3RhdHVzID09PSAnbm90IGF0dGVtcHRlZCcpIHtcbiAgICAgICAgICB0aGlzLmNtaS5jb3JlLmxlc3Nvbl9zdGF0dXMgPSAnYnJvd3NlZCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21taXRPYmplY3QgPSB0aGlzLnJlbmRlckNvbW1pdENNSSh0ZXJtaW5hdGVDb21taXQgfHxcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5hbHdheXNTZW5kVG90YWxUaW1lKTtcblxuICAgIGlmICh0aGlzLmFwaUxvZ0xldmVsID09PSBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9ERUJVRykge1xuICAgICAgY29uc29sZS5kZWJ1ZygnQ29tbWl0ICh0ZXJtaW5hdGVkOiAnICsgKHRlcm1pbmF0ZUNvbW1pdCA/ICd5ZXMnIDogJ25vJykgKyAnKTogJyk7XG4gICAgICBjb25zb2xlLmRlYnVnKGNvbW1pdE9iamVjdCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNldHRpbmdzLmxtc0NvbW1pdFVybCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0h0dHBSZXF1ZXN0KHRoaXMuc2V0dGluZ3MubG1zQ29tbWl0VXJsLCBjb21taXRPYmplY3QsIHRlcm1pbmF0ZUNvbW1pdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX1RSVUU7XG4gICAgfVxuICB9XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IEFQSUNvbnN0YW50cyBmcm9tICcuLi9jb25zdGFudHMvYXBpX2NvbnN0YW50cyc7XG5pbXBvcnQgRXJyb3JDb2RlcyBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JfY29kZXMnO1xuaW1wb3J0IFJlZ2V4IGZyb20gJy4uL2NvbnN0YW50cy9yZWdleCc7XG5cbmNvbnN0IHNjb3JtMTJfY29uc3RhbnRzID0gQVBJQ29uc3RhbnRzLnNjb3JtMTI7XG5jb25zdCBzY29ybTEyX3JlZ2V4ID0gUmVnZXguc2Nvcm0xMjtcbmNvbnN0IHNjb3JtMTJfZXJyb3JfY29kZXMgPSBFcnJvckNvZGVzLnNjb3JtMTI7XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHZhbHVlIG1hdGNoZXMgdGhlIHByb3BlciBmb3JtYXQuIElmIG5vdCwgdGhyb3cgcHJvcGVyIGVycm9yIGNvZGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVnZXhQYXR0ZXJuXG4gKiBAcGFyYW0ge251bWJlcn0gZXJyb3JDb2RlXG4gKiBAcGFyYW0ge2NsYXNzfSBlcnJvckNsYXNzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93RW1wdHlTdHJpbmdcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1ZhbGlkRm9ybWF0KFxuICAgIHZhbHVlOiBTdHJpbmcsXG4gICAgcmVnZXhQYXR0ZXJuOiBTdHJpbmcsXG4gICAgZXJyb3JDb2RlOiBudW1iZXIsXG4gICAgZXJyb3JDbGFzczogZnVuY3Rpb24sXG4gICAgYWxsb3dFbXB0eVN0cmluZz86IGJvb2xlYW4pIHtcbiAgY29uc3QgZm9ybWF0UmVnZXggPSBuZXcgUmVnRXhwKHJlZ2V4UGF0dGVybik7XG4gIGNvbnN0IG1hdGNoZXMgPSB2YWx1ZS5tYXRjaChmb3JtYXRSZWdleCk7XG4gIGlmIChhbGxvd0VtcHR5U3RyaW5nICYmIHZhbHVlID09PSAnJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8ICFtYXRjaGVzIHx8IG1hdGNoZXNbMF0gPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IGVycm9yQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yKGVycm9yQ29kZSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHZhbHVlIG1hdGNoZXMgdGhlIHByb3BlciByYW5nZS4gSWYgbm90LCB0aHJvdyBwcm9wZXIgZXJyb3IgY29kZS5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmFuZ2VQYXR0ZXJuXG4gKiBAcGFyYW0ge251bWJlcn0gZXJyb3JDb2RlXG4gKiBAcGFyYW0ge2NsYXNzfSBlcnJvckNsYXNzXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tWYWxpZFJhbmdlKFxuICAgIHZhbHVlOiBhbnksXG4gICAgcmFuZ2VQYXR0ZXJuOiBTdHJpbmcsXG4gICAgZXJyb3JDb2RlOiBudW1iZXIsXG4gICAgZXJyb3JDbGFzczogZnVuY3Rpb24pIHtcbiAgY29uc3QgcmFuZ2VzID0gcmFuZ2VQYXR0ZXJuLnNwbGl0KCcjJyk7XG4gIHZhbHVlID0gdmFsdWUgKiAxLjA7XG4gIGlmICh2YWx1ZSA+PSByYW5nZXNbMF0pIHtcbiAgICBpZiAoKHJhbmdlc1sxXSA9PT0gJyonKSB8fCAodmFsdWUgPD0gcmFuZ2VzWzFdKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBlcnJvckNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvcihlcnJvckNvZGUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IoZXJyb3JDb2RlKTtcbiAgfVxufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIEFQSSBjbWkgb2JqZWN0c1xuICovXG5leHBvcnQgY2xhc3MgQmFzZUNNSSB7XG4gIGpzb25TdHJpbmcgPSBmYWxzZTtcbiAgI2luaXRpYWxpemVkID0gZmFsc2U7XG4gICNzdGFydF90aW1lO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgQmFzZUNNSSwganVzdCBtYXJrcyB0aGUgY2xhc3MgYXMgYWJzdHJhY3RcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmIChuZXcudGFyZ2V0ID09PSBCYXNlQ01JKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29uc3RydWN0IEJhc2VDTUkgaW5zdGFuY2VzIGRpcmVjdGx5Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2luaXRpYWxpemVkXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBnZXQgaW5pdGlhbGl6ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2luaXRpYWxpemVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3N0YXJ0X3RpbWVcbiAgICogQHJldHVybiB7TnVtYmVyfVxuICAgKi9cbiAgZ2V0IHN0YXJ0X3RpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N0YXJ0X3RpbWU7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZCBhZnRlciB0aGUgQ01JIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIGluaXRpYWxpemUoKSB7XG4gICAgdGhpcy4jaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbGF5ZXIgc2hvdWxkIG92ZXJyaWRlIHRoZSAnc2Vzc2lvbl90aW1lJyBwcm92aWRlZCBieVxuICAgKiB0aGUgbW9kdWxlXG4gICAqL1xuICBzZXRTdGFydFRpbWUoKSB7XG4gICAgdGhpcy4jc3RhcnRfdGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgY21pICouc2NvcmUgb2JqZWN0c1xuICovXG5leHBvcnQgY2xhc3MgQ01JU2NvcmUgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciAqLnNjb3JlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY29yZV9jaGlsZHJlblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NvcmVfcmFuZ2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1heFxuICAgKiBAcGFyYW0ge251bWJlcn0gaW52YWxpZEVycm9yQ29kZVxuICAgKiBAcGFyYW0ge251bWJlcn0gaW52YWxpZFR5cGVDb2RlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbnZhbGlkUmFuZ2VDb2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZWNpbWFsUmVnZXhcbiAgICogQHBhcmFtIHtjbGFzc30gZXJyb3JDbGFzc1xuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgICB7XG4gICAgICAgIHNjb3JlX2NoaWxkcmVuLFxuICAgICAgICBzY29yZV9yYW5nZSxcbiAgICAgICAgbWF4LFxuICAgICAgICBpbnZhbGlkRXJyb3JDb2RlLFxuICAgICAgICBpbnZhbGlkVHlwZUNvZGUsXG4gICAgICAgIGludmFsaWRSYW5nZUNvZGUsXG4gICAgICAgIGRlY2ltYWxSZWdleCxcbiAgICAgICAgZXJyb3JDbGFzcyxcbiAgICAgIH0pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy4jX2NoaWxkcmVuID0gc2NvcmVfY2hpbGRyZW4gfHxcbiAgICAgICAgc2Nvcm0xMl9jb25zdGFudHMuc2NvcmVfY2hpbGRyZW47XG4gICAgdGhpcy4jX3Njb3JlX3JhbmdlID0gIXNjb3JlX3JhbmdlID8gZmFsc2UgOiBzY29ybTEyX3JlZ2V4LnNjb3JlX3JhbmdlO1xuICAgIHRoaXMuI21heCA9IChtYXggfHwgbWF4ID09PSAnJykgPyBtYXggOiAnMTAwJztcbiAgICB0aGlzLiNfaW52YWxpZF9lcnJvcl9jb2RlID0gaW52YWxpZEVycm9yQ29kZSB8fFxuICAgICAgICBzY29ybTEyX2Vycm9yX2NvZGVzLklOVkFMSURfU0VUX1ZBTFVFO1xuICAgIHRoaXMuI19pbnZhbGlkX3R5cGVfY29kZSA9IGludmFsaWRUeXBlQ29kZSB8fFxuICAgICAgICBzY29ybTEyX2Vycm9yX2NvZGVzLlRZUEVfTUlTTUFUQ0g7XG4gICAgdGhpcy4jX2ludmFsaWRfcmFuZ2VfY29kZSA9IGludmFsaWRSYW5nZUNvZGUgfHxcbiAgICAgICAgc2Nvcm0xMl9lcnJvcl9jb2Rlcy5WQUxVRV9PVVRfT0ZfUkFOR0U7XG4gICAgdGhpcy4jX2RlY2ltYWxfcmVnZXggPSBkZWNpbWFsUmVnZXggfHxcbiAgICAgICAgc2Nvcm0xMl9yZWdleC5DTUlEZWNpbWFsO1xuICAgIHRoaXMuI19lcnJvcl9jbGFzcyA9IGVycm9yQ2xhc3M7XG4gIH1cblxuICAjX2NoaWxkcmVuO1xuICAjX3Njb3JlX3JhbmdlO1xuICAjX2ludmFsaWRfZXJyb3JfY29kZTtcbiAgI19pbnZhbGlkX3R5cGVfY29kZTtcbiAgI19pbnZhbGlkX3JhbmdlX2NvZGU7XG4gICNfZGVjaW1hbF9yZWdleDtcbiAgI19lcnJvcl9jbGFzcztcbiAgI3JhdyA9ICcnO1xuICAjbWluID0gJyc7XG4gICNtYXg7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgX2NoaWxkcmVuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldCBfY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI19jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yIF9jaGlsZHJlbi4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfY2hpbGRyZW5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNldCBfY2hpbGRyZW4oX2NoaWxkcmVuKSB7XG4gICAgdGhyb3cgbmV3IHRoaXMuI19lcnJvcl9jbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IodGhpcy4jX2ludmFsaWRfZXJyb3JfY29kZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjcmF3XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCByYXcoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3JhdztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNyYXdcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJhd1xuICAgKi9cbiAgc2V0IHJhdyhyYXcpIHtcbiAgICBpZiAoY2hlY2tWYWxpZEZvcm1hdChyYXcsIHRoaXMuI19kZWNpbWFsX3JlZ2V4LCB0aGlzLiNfaW52YWxpZF90eXBlX2NvZGUsIHRoaXMuI19lcnJvcl9jbGFzcykgJiZcbiAgICAgICAgKCF0aGlzLiNfc2NvcmVfcmFuZ2UgfHxcbiAgICAgICAgICAgIGNoZWNrVmFsaWRSYW5nZShyYXcsIHRoaXMuI19zY29yZV9yYW5nZSwgdGhpcy4jX2ludmFsaWRfcmFuZ2VfY29kZSwgdGhpcy4jX2Vycm9yX2NsYXNzKSkpIHtcbiAgICAgIHRoaXMuI3JhdyA9IHJhdztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbWluXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBtaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI21pbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNtaW5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1pblxuICAgKi9cbiAgc2V0IG1pbihtaW4pIHtcbiAgICBpZiAoY2hlY2tWYWxpZEZvcm1hdChtaW4sIHRoaXMuI19kZWNpbWFsX3JlZ2V4LCB0aGlzLiNfaW52YWxpZF90eXBlX2NvZGUsIHRoaXMuI19lcnJvcl9jbGFzcykgJiZcbiAgICAgICAgKCF0aGlzLiNfc2NvcmVfcmFuZ2UgfHxcbiAgICAgICAgICAgIGNoZWNrVmFsaWRSYW5nZShtaW4sIHRoaXMuI19zY29yZV9yYW5nZSwgdGhpcy4jX2ludmFsaWRfcmFuZ2VfY29kZSwgdGhpcy4jX2Vycm9yX2NsYXNzKSkpIHtcbiAgICAgIHRoaXMuI21pbiA9IG1pbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbWF4XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBtYXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuI21heDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNtYXhcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1heFxuICAgKi9cbiAgc2V0IG1heChtYXgpIHtcbiAgICBpZiAoY2hlY2tWYWxpZEZvcm1hdChtYXgsIHRoaXMuI19kZWNpbWFsX3JlZ2V4LCB0aGlzLiNfaW52YWxpZF90eXBlX2NvZGUsIHRoaXMuI19lcnJvcl9jbGFzcykgJiZcbiAgICAgICAgKCF0aGlzLiNfc2NvcmVfcmFuZ2UgfHxcbiAgICAgICAgICAgIGNoZWNrVmFsaWRSYW5nZShtYXgsIHRoaXMuI19zY29yZV9yYW5nZSwgdGhpcy4jX2ludmFsaWRfcmFuZ2VfY29kZSwgdGhpcy4jX2Vycm9yX2NsYXNzKSkpIHtcbiAgICAgIHRoaXMuI21heCA9IG1heDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciAqLnNjb3JlXG4gICAqIEByZXR1cm4ge3ttaW46IHN0cmluZywgbWF4OiBzdHJpbmcsIHJhdzogc3RyaW5nfX1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdyYXcnOiB0aGlzLnJhdyxcbiAgICAgICdtaW4nOiB0aGlzLm1pbixcbiAgICAgICdtYXgnOiB0aGlzLm1heCxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNtaSAqLm4gb2JqZWN0c1xuICovXG5leHBvcnQgY2xhc3MgQ01JQXJyYXkgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGNtaSAqLm4gYXJyYXlzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjaGlsZHJlblxuICAgKiBAcGFyYW0ge251bWJlcn0gZXJyb3JDb2RlXG4gICAqIEBwYXJhbSB7Y2xhc3N9IGVycm9yQ2xhc3NcbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjaGlsZHJlbiwgZXJyb3JDb2RlLCBlcnJvckNsYXNzfSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jX2NoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgdGhpcy4jZXJyb3JDb2RlID0gZXJyb3JDb2RlO1xuICAgIHRoaXMuI2Vycm9yQ2xhc3MgPSBlcnJvckNsYXNzO1xuICAgIHRoaXMuY2hpbGRBcnJheSA9IFtdO1xuICB9XG5cbiAgI2Vycm9yQ29kZTtcbiAgI2Vycm9yQ2xhc3M7XG4gICNfY2hpbGRyZW47XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgX2NoaWxkcmVuXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBnZXQgX2NoaWxkcmVuKCkge1xuICAgIHJldHVybiB0aGlzLiNfY2hpbGRyZW47XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciBfY2hpbGRyZW4uIEp1c3QgdGhyb3dzIGFuIGVycm9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gX2NoaWxkcmVuXG4gICAqL1xuICBzZXQgX2NoaWxkcmVuKF9jaGlsZHJlbikge1xuICAgIHRocm93IG5ldyB0aGlzLiNlcnJvckNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcih0aGlzLiNlcnJvckNvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgX2NvdW50XG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCBfY291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGRBcnJheS5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciBfY291bnQuIEp1c3QgdGhyb3dzIGFuIGVycm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gX2NvdW50XG4gICAqL1xuICBzZXQgX2NvdW50KF9jb3VudCkge1xuICAgIHRocm93IG5ldyB0aGlzLiNlcnJvckNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcih0aGlzLiNlcnJvckNvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgKi5uIGFycmF5c1xuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7fTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2hpbGRBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0W2kgKyAnJ10gPSB0aGlzLmNoaWxkQXJyYXlbaV07XG4gICAgfVxuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIiwiLy8gQGZsb3dcbmltcG9ydCB7XG4gIEJhc2VDTUksXG4gIGNoZWNrVmFsaWRGb3JtYXQsXG4gIGNoZWNrVmFsaWRSYW5nZSxcbiAgQ01JQXJyYXksXG4gIENNSVNjb3JlLFxufSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgQVBJQ29uc3RhbnRzIGZyb20gJy4uL2NvbnN0YW50cy9hcGlfY29uc3RhbnRzJztcbmltcG9ydCBFcnJvckNvZGVzIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9jb2Rlcyc7XG5pbXBvcnQgUmVnZXggZnJvbSAnLi4vY29uc3RhbnRzL3JlZ2V4JztcbmltcG9ydCB7U2Nvcm0xMlZhbGlkYXRpb25FcnJvcn0gZnJvbSAnLi4vZXhjZXB0aW9ucyc7XG5pbXBvcnQgKiBhcyBVdGlsaXRpZXMgZnJvbSAnLi4vdXRpbGl0aWVzJztcbmltcG9ydCAqIGFzIFV0aWwgZnJvbSAnLi4vdXRpbGl0aWVzJztcblxuY29uc3Qgc2Nvcm0xMl9jb25zdGFudHMgPSBBUElDb25zdGFudHMuc2Nvcm0xMjtcbmNvbnN0IHNjb3JtMTJfcmVnZXggPSBSZWdleC5zY29ybTEyO1xuY29uc3Qgc2Nvcm0xMl9lcnJvcl9jb2RlcyA9IEVycm9yQ29kZXMuc2Nvcm0xMjtcblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kIGZvciB0aHJvd2luZyBSZWFkIE9ubHkgZXJyb3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRocm93UmVhZE9ubHlFcnJvcigpIHtcbiAgdGhyb3cgbmV3IFNjb3JtMTJWYWxpZGF0aW9uRXJyb3Ioc2Nvcm0xMl9lcnJvcl9jb2Rlcy5SRUFEX09OTFlfRUxFTUVOVCk7XG59XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCBmb3IgdGhyb3dpbmcgV3JpdGUgT25seSBlcnJvclxuICovXG5leHBvcnQgZnVuY3Rpb24gdGhyb3dXcml0ZU9ubHlFcnJvcigpIHtcbiAgdGhyb3cgbmV3IFNjb3JtMTJWYWxpZGF0aW9uRXJyb3Ioc2Nvcm0xMl9lcnJvcl9jb2Rlcy5XUklURV9PTkxZX0VMRU1FTlQpO1xufVxuXG4vKipcbiAqIEhlbHBlciBtZXRob2QgZm9yIHRocm93aW5nIEludmFsaWQgU2V0IGVycm9yXG4gKi9cbmZ1bmN0aW9uIHRocm93SW52YWxpZFZhbHVlRXJyb3IoKSB7XG4gIHRocm93IG5ldyBTY29ybTEyVmFsaWRhdGlvbkVycm9yKHNjb3JtMTJfZXJyb3JfY29kZXMuSU5WQUxJRF9TRVRfVkFMVUUpO1xufVxuXG4vKipcbiAqIEhlbHBlciBtZXRob2QsIG5vIHJlYXNvbiB0byBoYXZlIHRvIHBhc3MgdGhlIHNhbWUgZXJyb3IgY29kZXMgZXZlcnkgdGltZVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ2V4UGF0dGVyblxuICogQHBhcmFtIHtib29sZWFufSBhbGxvd0VtcHR5U3RyaW5nXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2sxMlZhbGlkRm9ybWF0KFxuICAgIHZhbHVlOiBTdHJpbmcsXG4gICAgcmVnZXhQYXR0ZXJuOiBTdHJpbmcsXG4gICAgYWxsb3dFbXB0eVN0cmluZz86IGJvb2xlYW4pIHtcbiAgcmV0dXJuIGNoZWNrVmFsaWRGb3JtYXQoXG4gICAgICB2YWx1ZSxcbiAgICAgIHJlZ2V4UGF0dGVybixcbiAgICAgIHNjb3JtMTJfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCxcbiAgICAgIFNjb3JtMTJWYWxpZGF0aW9uRXJyb3IsXG4gICAgICBhbGxvd0VtcHR5U3RyaW5nXG4gICk7XG59XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCwgbm8gcmVhc29uIHRvIGhhdmUgdG8gcGFzcyB0aGUgc2FtZSBlcnJvciBjb2RlcyBldmVyeSB0aW1lXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gcmFuZ2VQYXR0ZXJuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFsbG93RW1wdHlTdHJpbmdcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVjazEyVmFsaWRSYW5nZShcbiAgICB2YWx1ZTogYW55LFxuICAgIHJhbmdlUGF0dGVybjogU3RyaW5nLFxuICAgIGFsbG93RW1wdHlTdHJpbmc/OiBib29sZWFuKSB7XG4gIHJldHVybiBjaGVja1ZhbGlkUmFuZ2UoXG4gICAgICB2YWx1ZSxcbiAgICAgIHJhbmdlUGF0dGVybixcbiAgICAgIHNjb3JtMTJfZXJyb3JfY29kZXMuVkFMVUVfT1VUX09GX1JBTkdFLFxuICAgICAgU2Nvcm0xMlZhbGlkYXRpb25FcnJvcixcbiAgICAgIGFsbG93RW1wdHlTdHJpbmdcbiAgKTtcbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgdGhlIGNtaSBvYmplY3QgZm9yIFNDT1JNIDEuMlxuICovXG5leHBvcnQgY2xhc3MgQ01JIGV4dGVuZHMgQmFzZUNNSSB7XG4gICNfY2hpbGRyZW4gPSAnJztcbiAgI192ZXJzaW9uID0gJzMuNCc7XG4gICNsYXVuY2hfZGF0YSA9ICcnO1xuICAjY29tbWVudHMgPSAnJztcbiAgI2NvbW1lbnRzX2Zyb21fbG1zID0gJyc7XG5cbiAgc3R1ZGVudF9kYXRhID0gbnVsbDtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBTQ09STSAxLjIgY21pIG9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY21pX2NoaWxkcmVuXG4gICAqIEBwYXJhbSB7KENNSVN0dWRlbnREYXRhfEFJQ0NDTUlTdHVkZW50RGF0YSl9IHN0dWRlbnRfZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluaXRpYWxpemVkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjbWlfY2hpbGRyZW4sIHN0dWRlbnRfZGF0YSwgaW5pdGlhbGl6ZWQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKGluaXRpYWxpemVkKSB0aGlzLmluaXRpYWxpemUoKTtcblxuICAgIHRoaXMuI19jaGlsZHJlbiA9IGNtaV9jaGlsZHJlbiA/XG4gICAgICAgIGNtaV9jaGlsZHJlbiA6XG4gICAgICAgIHNjb3JtMTJfY29uc3RhbnRzLmNtaV9jaGlsZHJlbjtcbiAgICB0aGlzLmNvcmUgPSBuZXcgQ01JQ29yZSgpO1xuICAgIHRoaXMub2JqZWN0aXZlcyA9IG5ldyBDTUlPYmplY3RpdmVzKCk7XG4gICAgdGhpcy5zdHVkZW50X2RhdGEgPSBzdHVkZW50X2RhdGEgPyBzdHVkZW50X2RhdGEgOiBuZXcgQ01JU3R1ZGVudERhdGEoKTtcbiAgICB0aGlzLnN0dWRlbnRfcHJlZmVyZW5jZSA9IG5ldyBDTUlTdHVkZW50UHJlZmVyZW5jZSgpO1xuICAgIHRoaXMuaW50ZXJhY3Rpb25zID0gbmV3IENNSUludGVyYWN0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIENNSSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBpbml0aWFsaXplKCkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLmNvcmU/LmluaXRpYWxpemUoKTtcbiAgICB0aGlzLm9iamVjdGl2ZXM/LmluaXRpYWxpemUoKTtcbiAgICB0aGlzLnN0dWRlbnRfZGF0YT8uaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuc3R1ZGVudF9wcmVmZXJlbmNlPy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5pbnRlcmFjdGlvbnM/LmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaVxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIHN1c3BlbmRfZGF0YTogc3RyaW5nLFxuICAgKiAgICAgIGxhdW5jaF9kYXRhOiBzdHJpbmcsXG4gICAqICAgICAgY29tbWVudHM6IHN0cmluZyxcbiAgICogICAgICBjb21tZW50c19mcm9tX2xtczogc3RyaW5nLFxuICAgKiAgICAgIGNvcmU6IENNSUNvcmUsXG4gICAqICAgICAgb2JqZWN0aXZlczogQ01JT2JqZWN0aXZlcyxcbiAgICogICAgICBzdHVkZW50X2RhdGE6IENNSVN0dWRlbnREYXRhLFxuICAgKiAgICAgIHN0dWRlbnRfcHJlZmVyZW5jZTogQ01JU3R1ZGVudFByZWZlcmVuY2UsXG4gICAqICAgICAgaW50ZXJhY3Rpb25zOiBDTUlJbnRlcmFjdGlvbnNcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ3N1c3BlbmRfZGF0YSc6IHRoaXMuc3VzcGVuZF9kYXRhLFxuICAgICAgJ2xhdW5jaF9kYXRhJzogdGhpcy5sYXVuY2hfZGF0YSxcbiAgICAgICdjb21tZW50cyc6IHRoaXMuY29tbWVudHMsXG4gICAgICAnY29tbWVudHNfZnJvbV9sbXMnOiB0aGlzLmNvbW1lbnRzX2Zyb21fbG1zLFxuICAgICAgJ2NvcmUnOiB0aGlzLmNvcmUsXG4gICAgICAnb2JqZWN0aXZlcyc6IHRoaXMub2JqZWN0aXZlcyxcbiAgICAgICdzdHVkZW50X2RhdGEnOiB0aGlzLnN0dWRlbnRfZGF0YSxcbiAgICAgICdzdHVkZW50X3ByZWZlcmVuY2UnOiB0aGlzLnN0dWRlbnRfcHJlZmVyZW5jZSxcbiAgICAgICdpbnRlcmFjdGlvbnMnOiB0aGlzLmludGVyYWN0aW9ucyxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNfdmVyc2lvblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgX3ZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI192ZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI192ZXJzaW9uLiBKdXN0IHRocm93cyBhbiBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IF92ZXJzaW9uXG4gICAqL1xuICBzZXQgX3ZlcnNpb24oX3ZlcnNpb24pIHtcbiAgICB0aHJvd0ludmFsaWRWYWx1ZUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjX2NoaWxkcmVuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBfY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI19jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNfdmVyc2lvbi4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfY2hpbGRyZW5cbiAgICovXG4gIHNldCBfY2hpbGRyZW4oX2NoaWxkcmVuKSB7XG4gICAgdGhyb3dJbnZhbGlkVmFsdWVFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3N1c3BlbmRfZGF0YVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgc3VzcGVuZF9kYXRhKCkge1xuICAgIHJldHVybiB0aGlzLmNvcmU/LnN1c3BlbmRfZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzdXNwZW5kX2RhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1c3BlbmRfZGF0YVxuICAgKi9cbiAgc2V0IHN1c3BlbmRfZGF0YShzdXNwZW5kX2RhdGEpIHtcbiAgICBpZiAodGhpcy5jb3JlKSB7XG4gICAgICB0aGlzLmNvcmUuc3VzcGVuZF9kYXRhID0gc3VzcGVuZF9kYXRhO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsYXVuY2hfZGF0YVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbGF1bmNoX2RhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xhdW5jaF9kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xhdW5jaF9kYXRhLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxhdW5jaF9kYXRhXG4gICAqL1xuICBzZXQgbGF1bmNoX2RhdGEobGF1bmNoX2RhdGEpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/IHRoaXMuI2xhdW5jaF9kYXRhID0gbGF1bmNoX2RhdGEgOiB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNjb21tZW50c1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgY29tbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbW1lbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2NvbW1lbnRzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb21tZW50c1xuICAgKi9cbiAgc2V0IGNvbW1lbnRzKGNvbW1lbnRzKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChjb21tZW50cywgc2Nvcm0xMl9yZWdleC5DTUlTdHJpbmc0MDk2LCB0cnVlKSkge1xuICAgICAgdGhpcy4jY29tbWVudHMgPSBjb21tZW50cztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjY29tbWVudHNfZnJvbV9sbXNcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGNvbW1lbnRzX2Zyb21fbG1zKCkge1xuICAgIHJldHVybiB0aGlzLiNjb21tZW50c19mcm9tX2xtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNjb21tZW50c19mcm9tX2xtcy4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb21tZW50c19mcm9tX2xtc1xuICAgKi9cbiAgc2V0IGNvbW1lbnRzX2Zyb21fbG1zKGNvbW1lbnRzX2Zyb21fbG1zKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgICB0aGlzLiNjb21tZW50c19mcm9tX2xtcyA9IGNvbW1lbnRzX2Zyb21fbG1zIDpcbiAgICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyB0aGUgY3VycmVudCBzZXNzaW9uIHRpbWUgdG8gdGhlIGV4aXN0aW5nIHRvdGFsIHRpbWUuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldEN1cnJlbnRUb3RhbFRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5nZXRDdXJyZW50VG90YWxUaW1lKHRoaXMuc3RhcnRfdGltZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgdGhlIGNtaS5jb3JlIG9iamVjdFxuICogQGV4dGVuZHMgQmFzZUNNSVxuICovXG5jbGFzcyBDTUlDb3JlIGV4dGVuZHMgQmFzZUNNSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLmNvcmVcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLnNjb3JlID0gbmV3IENNSVNjb3JlKFxuICAgICAgICB7XG4gICAgICAgICAgc2NvcmVfY2hpbGRyZW46IHNjb3JtMTJfY29uc3RhbnRzLnNjb3JlX2NoaWxkcmVuLFxuICAgICAgICAgIHNjb3JlX3JhbmdlOiBzY29ybTEyX3JlZ2V4LnNjb3JlX3JhbmdlLFxuICAgICAgICAgIGludmFsaWRFcnJvckNvZGU6IHNjb3JtMTJfZXJyb3JfY29kZXMuSU5WQUxJRF9TRVRfVkFMVUUsXG4gICAgICAgICAgaW52YWxpZFR5cGVDb2RlOiBzY29ybTEyX2Vycm9yX2NvZGVzLlRZUEVfTUlTTUFUQ0gsXG4gICAgICAgICAgaW52YWxpZFJhbmdlQ29kZTogc2Nvcm0xMl9lcnJvcl9jb2Rlcy5WQUxVRV9PVVRfT0ZfUkFOR0UsXG4gICAgICAgICAgZXJyb3JDbGFzczogU2Nvcm0xMlZhbGlkYXRpb25FcnJvcixcbiAgICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZCBhZnRlciB0aGUgQ01JIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIGluaXRpYWxpemUoKSB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuc2NvcmU/LmluaXRpYWxpemUoKTtcbiAgfVxuXG4gICNfY2hpbGRyZW4gPSBzY29ybTEyX2NvbnN0YW50cy5jb3JlX2NoaWxkcmVuO1xuICAjc3R1ZGVudF9pZCA9ICcnO1xuICAjc3R1ZGVudF9uYW1lID0gJyc7XG4gICNsZXNzb25fbG9jYXRpb24gPSAnJztcbiAgI2NyZWRpdCA9ICcnO1xuICAjbGVzc29uX3N0YXR1cyA9ICdub3QgYXR0ZW1wdGVkJztcbiAgI2VudHJ5ID0gJyc7XG4gICN0b3RhbF90aW1lID0gJyc7XG4gICNsZXNzb25fbW9kZSA9ICdub3JtYWwnO1xuICAjZXhpdCA9ICcnO1xuICAjc2Vzc2lvbl90aW1lID0gJzAwOjAwOjAwJztcbiAgI3N1c3BlbmRfZGF0YSA9ICcnO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNfY2hpbGRyZW5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0IF9jaGlsZHJlbigpIHtcbiAgICByZXR1cm4gdGhpcy4jX2NoaWxkcmVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI19jaGlsZHJlbi4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfY2hpbGRyZW5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNldCBfY2hpbGRyZW4oX2NoaWxkcmVuKSB7XG4gICAgdGhyb3dJbnZhbGlkVmFsdWVFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3N0dWRlbnRfaWRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHN0dWRlbnRfaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N0dWRlbnRfaWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc3R1ZGVudF9pZC4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHVkZW50X2lkXG4gICAqL1xuICBzZXQgc3R1ZGVudF9pZChzdHVkZW50X2lkKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgPyB0aGlzLiNzdHVkZW50X2lkID0gc3R1ZGVudF9pZCA6IHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3N0dWRlbnRfbmFtZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgc3R1ZGVudF9uYW1lKCkge1xuICAgIHJldHVybiB0aGlzLiNzdHVkZW50X25hbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc3R1ZGVudF9uYW1lLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0dWRlbnRfbmFtZVxuICAgKi9cbiAgc2V0IHN0dWRlbnRfbmFtZShzdHVkZW50X25hbWUpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICAgIHRoaXMuI3N0dWRlbnRfbmFtZSA9IHN0dWRlbnRfbmFtZSA6XG4gICAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xlc3Nvbl9sb2NhdGlvblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbGVzc29uX2xvY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNsZXNzb25fbG9jYXRpb247XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbGVzc29uX2xvY2F0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsZXNzb25fbG9jYXRpb25cbiAgICovXG4gIHNldCBsZXNzb25fbG9jYXRpb24obGVzc29uX2xvY2F0aW9uKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChsZXNzb25fbG9jYXRpb24sIHNjb3JtMTJfcmVnZXguQ01JU3RyaW5nMjU2LCB0cnVlKSkge1xuICAgICAgdGhpcy4jbGVzc29uX2xvY2F0aW9uID0gbGVzc29uX2xvY2F0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNjcmVkaXRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGNyZWRpdCgpIHtcbiAgICByZXR1cm4gdGhpcy4jY3JlZGl0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2NyZWRpdC4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjcmVkaXRcbiAgICovXG4gIHNldCBjcmVkaXQoY3JlZGl0KSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgPyB0aGlzLiNjcmVkaXQgPSBjcmVkaXQgOiB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsZXNzb25fc3RhdHVzXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsZXNzb25fc3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLiNsZXNzb25fc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xlc3Nvbl9zdGF0dXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxlc3Nvbl9zdGF0dXNcbiAgICovXG4gIHNldCBsZXNzb25fc3RhdHVzKGxlc3Nvbl9zdGF0dXMpIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChsZXNzb25fc3RhdHVzLCBzY29ybTEyX3JlZ2V4LkNNSVN0YXR1cykpIHtcbiAgICAgICAgdGhpcy4jbGVzc29uX3N0YXR1cyA9IGxlc3Nvbl9zdGF0dXM7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQobGVzc29uX3N0YXR1cywgc2Nvcm0xMl9yZWdleC5DTUlTdGF0dXMyKSkge1xuICAgICAgICB0aGlzLiNsZXNzb25fc3RhdHVzID0gbGVzc29uX3N0YXR1cztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjZW50cnlcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGVudHJ5KCkge1xuICAgIHJldHVybiB0aGlzLiNlbnRyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNlbnRyeS4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlbnRyeVxuICAgKi9cbiAgc2V0IGVudHJ5KGVudHJ5KSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgPyB0aGlzLiNlbnRyeSA9IGVudHJ5IDogdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjdG90YWxfdGltZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdG90YWxfdGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jdG90YWxfdGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICN0b3RhbF90aW1lLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRvdGFsX3RpbWVcbiAgICovXG4gIHNldCB0b3RhbF90aW1lKHRvdGFsX3RpbWUpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/IHRoaXMuI3RvdGFsX3RpbWUgPSB0b3RhbF90aW1lIDogdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbGVzc29uX21vZGVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxlc3Nvbl9tb2RlKCkge1xuICAgIHJldHVybiB0aGlzLiNsZXNzb25fbW9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsZXNzb25fbW9kZS4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsZXNzb25fbW9kZVxuICAgKi9cbiAgc2V0IGxlc3Nvbl9tb2RlKGxlc3Nvbl9tb2RlKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgPyB0aGlzLiNsZXNzb25fbW9kZSA9IGxlc3Nvbl9tb2RlIDogdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjZXhpdC4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyBKU09OIGV4cG9ydC5cbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldCBleGl0KCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgPyB0aHJvd1dyaXRlT25seUVycm9yKCkgOiB0aGlzLiNleGl0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2V4aXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4aXRcbiAgICovXG4gIHNldCBleGl0KGV4aXQpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KGV4aXQsIHNjb3JtMTJfcmVnZXguQ01JRXhpdCwgdHJ1ZSkpIHtcbiAgICAgIHRoaXMuI2V4aXQgPSBleGl0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzZXNzaW9uX3RpbWUuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgSlNPTiBleHBvcnQuXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBnZXQgc2Vzc2lvbl90aW1lKCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgPyB0aHJvd1dyaXRlT25seUVycm9yKCkgOiB0aGlzLiNzZXNzaW9uX3RpbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc2Vzc2lvbl90aW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uX3RpbWVcbiAgICovXG4gIHNldCBzZXNzaW9uX3RpbWUoc2Vzc2lvbl90aW1lKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChzZXNzaW9uX3RpbWUsIHNjb3JtMTJfcmVnZXguQ01JVGltZXNwYW4pKSB7XG4gICAgICB0aGlzLiNzZXNzaW9uX3RpbWUgPSBzZXNzaW9uX3RpbWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3N1c3BlbmRfZGF0YVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgc3VzcGVuZF9kYXRhKCkge1xuICAgIHJldHVybiB0aGlzLiNzdXNwZW5kX2RhdGE7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc3VzcGVuZF9kYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdXNwZW5kX2RhdGFcbiAgICovXG4gIHNldCBzdXNwZW5kX2RhdGEoc3VzcGVuZF9kYXRhKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChzdXNwZW5kX2RhdGEsIHNjb3JtMTJfcmVnZXguQ01JU3RyaW5nNDA5NiwgdHJ1ZSkpIHtcbiAgICAgIHRoaXMuI3N1c3BlbmRfZGF0YSA9IHN1c3BlbmRfZGF0YTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyB0aGUgY3VycmVudCBzZXNzaW9uIHRpbWUgdG8gdGhlIGV4aXN0aW5nIHRvdGFsIHRpbWUuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBzdGFydF90aW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldEN1cnJlbnRUb3RhbFRpbWUoc3RhcnRfdGltZTogTnVtYmVyKSB7XG4gICAgbGV0IHNlc3Npb25UaW1lID0gdGhpcy4jc2Vzc2lvbl90aW1lO1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IHN0YXJ0X3RpbWU7XG5cbiAgICBpZiAodHlwZW9mIHN0YXJ0VGltZSAhPT0gJ3VuZGVmaW5lZCcgJiYgc3RhcnRUaW1lICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzZWNvbmRzID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBzdGFydFRpbWU7XG4gICAgICBzZXNzaW9uVGltZSA9IFV0aWwuZ2V0U2Vjb25kc0FzSEhNTVNTKHNlY29uZHMgLyAxMDAwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gVXRpbGl0aWVzLmFkZEhITU1TU1RpbWVTdHJpbmdzKFxuICAgICAgICB0aGlzLiN0b3RhbF90aW1lLFxuICAgICAgICBzZXNzaW9uVGltZSxcbiAgICAgICAgbmV3IFJlZ0V4cChzY29ybTEyX3JlZ2V4LkNNSVRpbWVzcGFuKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLmNvcmVcbiAgICpcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBzdHVkZW50X25hbWU6IHN0cmluZyxcbiAgICogICAgICBlbnRyeTogc3RyaW5nLFxuICAgKiAgICAgIGV4aXQ6IHN0cmluZyxcbiAgICogICAgICBzY29yZTogQ01JU2NvcmUsXG4gICAqICAgICAgc3R1ZGVudF9pZDogc3RyaW5nLFxuICAgKiAgICAgIGxlc3Nvbl9tb2RlOiBzdHJpbmcsXG4gICAqICAgICAgbGVzc29uX2xvY2F0aW9uOiBzdHJpbmcsXG4gICAqICAgICAgbGVzc29uX3N0YXR1czogc3RyaW5nLFxuICAgKiAgICAgIGNyZWRpdDogc3RyaW5nLFxuICAgKiAgICAgIHNlc3Npb25fdGltZTogKlxuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnc3R1ZGVudF9pZCc6IHRoaXMuc3R1ZGVudF9pZCxcbiAgICAgICdzdHVkZW50X25hbWUnOiB0aGlzLnN0dWRlbnRfbmFtZSxcbiAgICAgICdsZXNzb25fbG9jYXRpb24nOiB0aGlzLmxlc3Nvbl9sb2NhdGlvbixcbiAgICAgICdjcmVkaXQnOiB0aGlzLmNyZWRpdCxcbiAgICAgICdsZXNzb25fc3RhdHVzJzogdGhpcy5sZXNzb25fc3RhdHVzLFxuICAgICAgJ2VudHJ5JzogdGhpcy5lbnRyeSxcbiAgICAgICdsZXNzb25fbW9kZSc6IHRoaXMubGVzc29uX21vZGUsXG4gICAgICAnZXhpdCc6IHRoaXMuZXhpdCxcbiAgICAgICdzZXNzaW9uX3RpbWUnOiB0aGlzLnNlc3Npb25fdGltZSxcbiAgICAgICdzY29yZSc6IHRoaXMuc2NvcmUsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMS4yJ3MgY21pLm9iamVjdGl2ZXMgb2JqZWN0XG4gKiBAZXh0ZW5kcyBDTUlBcnJheVxuICovXG5jbGFzcyBDTUlPYmplY3RpdmVzIGV4dGVuZHMgQ01JQXJyYXkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5vYmplY3RpdmVzXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih7XG4gICAgICBjaGlsZHJlbjogc2Nvcm0xMl9jb25zdGFudHMub2JqZWN0aXZlc19jaGlsZHJlbixcbiAgICAgIGVycm9yQ29kZTogc2Nvcm0xMl9lcnJvcl9jb2Rlcy5JTlZBTElEX1NFVF9WQUxVRSxcbiAgICAgIGVycm9yQ2xhc3M6IFNjb3JtMTJWYWxpZGF0aW9uRXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMS4yJ3MgY21pLnN0dWRlbnRfZGF0YSBvYmplY3RcbiAqIEBleHRlbmRzIEJhc2VDTUlcbiAqL1xuZXhwb3J0IGNsYXNzIENNSVN0dWRlbnREYXRhIGV4dGVuZHMgQmFzZUNNSSB7XG4gICNfY2hpbGRyZW47XG4gICNtYXN0ZXJ5X3Njb3JlID0gJyc7XG4gICNtYXhfdGltZV9hbGxvd2VkID0gJyc7XG4gICN0aW1lX2xpbWl0X2FjdGlvbiA9ICcnO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLnN0dWRlbnRfZGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3R1ZGVudF9kYXRhX2NoaWxkcmVuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzdHVkZW50X2RhdGFfY2hpbGRyZW4pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy4jX2NoaWxkcmVuID0gc3R1ZGVudF9kYXRhX2NoaWxkcmVuID9cbiAgICAgICAgc3R1ZGVudF9kYXRhX2NoaWxkcmVuIDpcbiAgICAgICAgc2Nvcm0xMl9jb25zdGFudHMuc3R1ZGVudF9kYXRhX2NoaWxkcmVuO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI19jaGlsZHJlblxuICAgKiBAcmV0dXJuIHsqfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0IF9jaGlsZHJlbigpIHtcbiAgICByZXR1cm4gdGhpcy4jX2NoaWxkcmVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI19jaGlsZHJlbi4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfY2hpbGRyZW5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNldCBfY2hpbGRyZW4oX2NoaWxkcmVuKSB7XG4gICAgdGhyb3dJbnZhbGlkVmFsdWVFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI21hc3Rlcl9zY29yZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbWFzdGVyeV9zY29yZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jbWFzdGVyeV9zY29yZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNtYXN0ZXJfc2NvcmUuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWFzdGVyeV9zY29yZVxuICAgKi9cbiAgc2V0IG1hc3Rlcnlfc2NvcmUobWFzdGVyeV9zY29yZSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgICAgdGhpcy4jbWFzdGVyeV9zY29yZSA9IG1hc3Rlcnlfc2NvcmUgOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNtYXhfdGltZV9hbGxvd2VkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBtYXhfdGltZV9hbGxvd2VkKCkge1xuICAgIHJldHVybiB0aGlzLiNtYXhfdGltZV9hbGxvd2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI21heF90aW1lX2FsbG93ZWQuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF4X3RpbWVfYWxsb3dlZFxuICAgKi9cbiAgc2V0IG1heF90aW1lX2FsbG93ZWQobWF4X3RpbWVfYWxsb3dlZCkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgICAgdGhpcy4jbWF4X3RpbWVfYWxsb3dlZCA9IG1heF90aW1lX2FsbG93ZWQgOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0aW1lX2xpbWl0X2FjdGlvblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdGltZV9saW1pdF9hY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RpbWVfbGltaXRfYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RpbWVfbGltaXRfYWN0aW9uLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWVfbGltaXRfYWN0aW9uXG4gICAqL1xuICBzZXQgdGltZV9saW1pdF9hY3Rpb24odGltZV9saW1pdF9hY3Rpb24pIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICAgIHRoaXMuI3RpbWVfbGltaXRfYWN0aW9uID0gdGltZV9saW1pdF9hY3Rpb24gOlxuICAgICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5zdHVkZW50X2RhdGFcbiAgICpcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBtYXhfdGltZV9hbGxvd2VkOiBzdHJpbmcsXG4gICAqICAgICAgdGltZV9saW1pdF9hY3Rpb246IHN0cmluZyxcbiAgICogICAgICBtYXN0ZXJ5X3Njb3JlOiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ21hc3Rlcnlfc2NvcmUnOiB0aGlzLm1hc3Rlcnlfc2NvcmUsXG4gICAgICAnbWF4X3RpbWVfYWxsb3dlZCc6IHRoaXMubWF4X3RpbWVfYWxsb3dlZCxcbiAgICAgICd0aW1lX2xpbWl0X2FjdGlvbic6IHRoaXMudGltZV9saW1pdF9hY3Rpb24sXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMS4yJ3MgY21pLnN0dWRlbnRfcHJlZmVyZW5jZSBvYmplY3RcbiAqIEBleHRlbmRzIEJhc2VDTUlcbiAqL1xuZXhwb3J0IGNsYXNzIENNSVN0dWRlbnRQcmVmZXJlbmNlIGV4dGVuZHMgQmFzZUNNSSB7XG4gICNfY2hpbGRyZW47XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkuc3R1ZGVudF9wcmVmZXJlbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHVkZW50X3ByZWZlcmVuY2VfY2hpbGRyZW5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHN0dWRlbnRfcHJlZmVyZW5jZV9jaGlsZHJlbikge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLiNfY2hpbGRyZW4gPSBzdHVkZW50X3ByZWZlcmVuY2VfY2hpbGRyZW4gP1xuICAgICAgICBzdHVkZW50X3ByZWZlcmVuY2VfY2hpbGRyZW4gOlxuICAgICAgICBzY29ybTEyX2NvbnN0YW50cy5zdHVkZW50X3ByZWZlcmVuY2VfY2hpbGRyZW47XG4gIH1cblxuICAjYXVkaW8gPSAnJztcbiAgI2xhbmd1YWdlID0gJyc7XG4gICNzcGVlZCA9ICcnO1xuICAjdGV4dCA9ICcnO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNfY2hpbGRyZW5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0IF9jaGlsZHJlbigpIHtcbiAgICByZXR1cm4gdGhpcy4jX2NoaWxkcmVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI19jaGlsZHJlbi4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfY2hpbGRyZW5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNldCBfY2hpbGRyZW4oX2NoaWxkcmVuKSB7XG4gICAgdGhyb3dJbnZhbGlkVmFsdWVFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2F1ZGlvXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBhdWRpbygpIHtcbiAgICByZXR1cm4gdGhpcy4jYXVkaW87XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjYXVkaW9cbiAgICogQHBhcmFtIHtzdHJpbmd9IGF1ZGlvXG4gICAqL1xuICBzZXQgYXVkaW8oYXVkaW8pIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KGF1ZGlvLCBzY29ybTEyX3JlZ2V4LkNNSVNJbnRlZ2VyKSAmJlxuICAgICAgICBjaGVjazEyVmFsaWRSYW5nZShhdWRpbywgc2Nvcm0xMl9yZWdleC5hdWRpb19yYW5nZSkpIHtcbiAgICAgIHRoaXMuI2F1ZGlvID0gYXVkaW87XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xhbmd1YWdlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsYW5ndWFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jbGFuZ3VhZ2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbGFuZ3VhZ2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlXG4gICAqL1xuICBzZXQgbGFuZ3VhZ2UobGFuZ3VhZ2UpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KGxhbmd1YWdlLCBzY29ybTEyX3JlZ2V4LkNNSVN0cmluZzI1NikpIHtcbiAgICAgIHRoaXMuI2xhbmd1YWdlID0gbGFuZ3VhZ2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3NwZWVkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzcGVlZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jc3BlZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc3BlZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNwZWVkXG4gICAqL1xuICBzZXQgc3BlZWQoc3BlZWQpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHNwZWVkLCBzY29ybTEyX3JlZ2V4LkNNSVNJbnRlZ2VyKSAmJlxuICAgICAgICBjaGVjazEyVmFsaWRSYW5nZShzcGVlZCwgc2Nvcm0xMl9yZWdleC5zcGVlZF9yYW5nZSkpIHtcbiAgICAgIHRoaXMuI3NwZWVkID0gc3BlZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3RleHRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RleHQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdGV4dFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICAgKi9cbiAgc2V0IHRleHQodGV4dCkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQodGV4dCwgc2Nvcm0xMl9yZWdleC5DTUlTSW50ZWdlcikgJiZcbiAgICAgICAgY2hlY2sxMlZhbGlkUmFuZ2UodGV4dCwgc2Nvcm0xMl9yZWdleC50ZXh0X3JhbmdlKSkge1xuICAgICAgdGhpcy4jdGV4dCA9IHRleHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLnN0dWRlbnRfcHJlZmVyZW5jZVxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGF1ZGlvOiBzdHJpbmcsXG4gICAqICAgICAgbGFuZ3VhZ2U6IHN0cmluZyxcbiAgICogICAgICBzcGVlZDogc3RyaW5nLFxuICAgKiAgICAgIHRleHQ6IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnYXVkaW8nOiB0aGlzLmF1ZGlvLFxuICAgICAgJ2xhbmd1YWdlJzogdGhpcy5sYW5ndWFnZSxcbiAgICAgICdzcGVlZCc6IHRoaXMuc3BlZWQsXG4gICAgICAndGV4dCc6IHRoaXMudGV4dCxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAxLjIncyBjbWkuaW50ZXJhY3Rpb25zIG9iamVjdFxuICogQGV4dGVuZHMgQmFzZUNNSVxuICovXG5jbGFzcyBDTUlJbnRlcmFjdGlvbnMgZXh0ZW5kcyBDTUlBcnJheSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLmludGVyYWN0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoe1xuICAgICAgY2hpbGRyZW46IHNjb3JtMTJfY29uc3RhbnRzLmludGVyYWN0aW9uc19jaGlsZHJlbixcbiAgICAgIGVycm9yQ29kZTogc2Nvcm0xMl9lcnJvcl9jb2Rlcy5JTlZBTElEX1NFVF9WQUxVRSxcbiAgICAgIGVycm9yQ2xhc3M6IFNjb3JtMTJWYWxpZGF0aW9uRXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMS4yJ3MgY21pLmludGVyYWN0aW9ucy5uIG9iamVjdFxuICogQGV4dGVuZHMgQmFzZUNNSVxuICovXG5leHBvcnQgY2xhc3MgQ01JSW50ZXJhY3Rpb25zT2JqZWN0IGV4dGVuZHMgQmFzZUNNSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLmludGVyYWN0aW9ucy5uIG9iamVjdFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMub2JqZWN0aXZlcyA9IG5ldyBDTUlBcnJheSh7XG4gICAgICBlcnJvckNvZGU6IHNjb3JtMTJfZXJyb3JfY29kZXMuSU5WQUxJRF9TRVRfVkFMVUUsXG4gICAgICBlcnJvckNsYXNzOiBTY29ybTEyVmFsaWRhdGlvbkVycm9yLFxuICAgICAgY2hpbGRyZW46IHNjb3JtMTJfY29uc3RhbnRzLm9iamVjdGl2ZXNfY2hpbGRyZW4sXG4gICAgfSk7XG4gICAgdGhpcy5jb3JyZWN0X3Jlc3BvbnNlcyA9IG5ldyBDTUlBcnJheSh7XG4gICAgICBlcnJvckNvZGU6IHNjb3JtMTJfZXJyb3JfY29kZXMuSU5WQUxJRF9TRVRfVkFMVUUsXG4gICAgICBlcnJvckNsYXNzOiBTY29ybTEyVmFsaWRhdGlvbkVycm9yLFxuICAgICAgY2hpbGRyZW46IHNjb3JtMTJfY29uc3RhbnRzLmNvcnJlY3RfcmVzcG9uc2VzX2NoaWxkcmVuLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIENNSSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBpbml0aWFsaXplKCkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLm9iamVjdGl2ZXM/LmluaXRpYWxpemUoKTtcbiAgICB0aGlzLmNvcnJlY3RfcmVzcG9uc2VzPy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAjaWQgPSAnJztcbiAgI3RpbWUgPSAnJztcbiAgI3R5cGUgPSAnJztcbiAgI3dlaWdodGluZyA9ICcnO1xuICAjc3R1ZGVudF9yZXNwb25zZSA9ICcnO1xuICAjcmVzdWx0ID0gJyc7XG4gICNsYXRlbmN5ID0gJyc7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2lkLiBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIEpTT04gZXhwb3J0LlxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0IGlkKCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgPyB0aHJvd1dyaXRlT25seUVycm9yKCkgOiB0aGlzLiNpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAgICovXG4gIHNldCBpZChpZCkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQoaWQsIHNjb3JtMTJfcmVnZXguQ01JSWRlbnRpZmllcikpIHtcbiAgICAgIHRoaXMuI2lkID0gaWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3RpbWUuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgSlNPTiBleHBvcnQuXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBnZXQgdGltZSgpIHtcbiAgICByZXR1cm4gKCF0aGlzLmpzb25TdHJpbmcpID8gdGhyb3dXcml0ZU9ubHlFcnJvcigpIDogdGhpcy4jdGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICN0aW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lXG4gICAqL1xuICBzZXQgdGltZSh0aW1lKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdCh0aW1lLCBzY29ybTEyX3JlZ2V4LkNNSVRpbWUpKSB7XG4gICAgICB0aGlzLiN0aW1lID0gdGltZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjdHlwZS4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyBKU09OIGV4cG9ydC5cbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgPyB0aHJvd1dyaXRlT25seUVycm9yKCkgOiB0aGlzLiN0eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3R5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICovXG4gIHNldCB0eXBlKHR5cGUpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHR5cGUsIHNjb3JtMTJfcmVnZXguQ01JVHlwZSkpIHtcbiAgICAgIHRoaXMuI3R5cGUgPSB0eXBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN3ZWlnaHRpbmcuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgSlNPTiBleHBvcnQuXG4gICAqIEByZXR1cm4geyp9XG4gICAqL1xuICBnZXQgd2VpZ2h0aW5nKCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgP1xuICAgICAgICB0aHJvd1dyaXRlT25seUVycm9yKCkgOlxuICAgICAgICB0aGlzLiN3ZWlnaHRpbmc7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjd2VpZ2h0aW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB3ZWlnaHRpbmdcbiAgICovXG4gIHNldCB3ZWlnaHRpbmcod2VpZ2h0aW5nKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdCh3ZWlnaHRpbmcsIHNjb3JtMTJfcmVnZXguQ01JRGVjaW1hbCkgJiZcbiAgICAgICAgY2hlY2sxMlZhbGlkUmFuZ2Uod2VpZ2h0aW5nLCBzY29ybTEyX3JlZ2V4LndlaWdodGluZ19yYW5nZSkpIHtcbiAgICAgIHRoaXMuI3dlaWdodGluZyA9IHdlaWdodGluZztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc3R1ZGVudF9yZXNwb25zZS4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyBKU09OIGV4cG9ydC5cbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldCBzdHVkZW50X3Jlc3BvbnNlKCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgPyB0aHJvd1dyaXRlT25seUVycm9yKCkgOiB0aGlzLiNzdHVkZW50X3Jlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3N0dWRlbnRfcmVzcG9uc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0dWRlbnRfcmVzcG9uc2VcbiAgICovXG4gIHNldCBzdHVkZW50X3Jlc3BvbnNlKHN0dWRlbnRfcmVzcG9uc2UpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHN0dWRlbnRfcmVzcG9uc2UsIHNjb3JtMTJfcmVnZXguQ01JRmVlZGJhY2ssIHRydWUpKSB7XG4gICAgICB0aGlzLiNzdHVkZW50X3Jlc3BvbnNlID0gc3R1ZGVudF9yZXNwb25zZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjcmVzdWx0LiBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIEpTT04gZXhwb3J0LlxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgZ2V0IHJlc3VsdCgpIHtcbiAgICByZXR1cm4gKCF0aGlzLmpzb25TdHJpbmcpID8gdGhyb3dXcml0ZU9ubHlFcnJvcigpIDogdGhpcy4jcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3Jlc3VsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzdWx0XG4gICAqL1xuICBzZXQgcmVzdWx0KHJlc3VsdCkge1xuICAgIGlmIChjaGVjazEyVmFsaWRGb3JtYXQocmVzdWx0LCBzY29ybTEyX3JlZ2V4LkNNSVJlc3VsdCkpIHtcbiAgICAgIHRoaXMuI3Jlc3VsdCA9IHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbGF0ZW5jeS4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyBKU09OIGV4cG9ydC5cbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldCBsYXRlbmN5KCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgPyB0aHJvd1dyaXRlT25seUVycm9yKCkgOiB0aGlzLiNsYXRlbmN5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xhdGVuY3lcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxhdGVuY3lcbiAgICovXG4gIHNldCBsYXRlbmN5KGxhdGVuY3kpIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KGxhdGVuY3ksIHNjb3JtMTJfcmVnZXguQ01JVGltZXNwYW4pKSB7XG4gICAgICB0aGlzLiNsYXRlbmN5ID0gbGF0ZW5jeTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuaW50ZXJhY3Rpb25zLm5cbiAgICpcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBpZDogc3RyaW5nLFxuICAgKiAgICAgIHRpbWU6IHN0cmluZyxcbiAgICogICAgICB0eXBlOiBzdHJpbmcsXG4gICAqICAgICAgd2VpZ2h0aW5nOiBzdHJpbmcsXG4gICAqICAgICAgc3R1ZGVudF9yZXNwb25zZTogc3RyaW5nLFxuICAgKiAgICAgIHJlc3VsdDogc3RyaW5nLFxuICAgKiAgICAgIGxhdGVuY3k6IHN0cmluZyxcbiAgICogICAgICBvYmplY3RpdmVzOiBDTUlBcnJheSxcbiAgICogICAgICBjb3JyZWN0X3Jlc3BvbnNlczogQ01JQXJyYXlcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ2lkJzogdGhpcy5pZCxcbiAgICAgICd0aW1lJzogdGhpcy50aW1lLFxuICAgICAgJ3R5cGUnOiB0aGlzLnR5cGUsXG4gICAgICAnd2VpZ2h0aW5nJzogdGhpcy53ZWlnaHRpbmcsXG4gICAgICAnc3R1ZGVudF9yZXNwb25zZSc6IHRoaXMuc3R1ZGVudF9yZXNwb25zZSxcbiAgICAgICdyZXN1bHQnOiB0aGlzLnJlc3VsdCxcbiAgICAgICdsYXRlbmN5JzogdGhpcy5sYXRlbmN5LFxuICAgICAgJ29iamVjdGl2ZXMnOiB0aGlzLm9iamVjdGl2ZXMsXG4gICAgICAnY29ycmVjdF9yZXNwb25zZXMnOiB0aGlzLmNvcnJlY3RfcmVzcG9uc2VzLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDEuMidzIGNtaS5vYmplY3RpdmVzLm4gb2JqZWN0XG4gKiBAZXh0ZW5kcyBCYXNlQ01JXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlPYmplY3RpdmVzT2JqZWN0IGV4dGVuZHMgQmFzZUNNSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLm9iamVjdGl2ZXMublxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuc2NvcmUgPSBuZXcgQ01JU2NvcmUoXG4gICAgICAgIHtcbiAgICAgICAgICBzY29yZV9jaGlsZHJlbjogc2Nvcm0xMl9jb25zdGFudHMuc2NvcmVfY2hpbGRyZW4sXG4gICAgICAgICAgc2NvcmVfcmFuZ2U6IHNjb3JtMTJfcmVnZXguc2NvcmVfcmFuZ2UsXG4gICAgICAgICAgaW52YWxpZEVycm9yQ29kZTogc2Nvcm0xMl9lcnJvcl9jb2Rlcy5JTlZBTElEX1NFVF9WQUxVRSxcbiAgICAgICAgICBpbnZhbGlkVHlwZUNvZGU6IHNjb3JtMTJfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCxcbiAgICAgICAgICBpbnZhbGlkUmFuZ2VDb2RlOiBzY29ybTEyX2Vycm9yX2NvZGVzLlZBTFVFX09VVF9PRl9SQU5HRSxcbiAgICAgICAgICBlcnJvckNsYXNzOiBTY29ybTEyVmFsaWRhdGlvbkVycm9yLFxuICAgICAgICB9KTtcbiAgfVxuXG4gICNpZCA9ICcnO1xuICAjc3RhdHVzID0gJyc7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2lkXG4gICAqIEByZXR1cm4ge1wiXCJ9XG4gICAqL1xuICBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2lkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuICAgKi9cbiAgc2V0IGlkKGlkKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChpZCwgc2Nvcm0xMl9yZWdleC5DTUlJZGVudGlmaWVyKSkge1xuICAgICAgdGhpcy4jaWQgPSBpZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc3RhdHVzXG4gICAqIEByZXR1cm4ge1wiXCJ9XG4gICAqL1xuICBnZXQgc3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLiNzdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc3RhdHVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0dXNcbiAgICovXG4gIHNldCBzdGF0dXMoc3RhdHVzKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChzdGF0dXMsIHNjb3JtMTJfcmVnZXguQ01JU3RhdHVzMikpIHtcbiAgICAgIHRoaXMuI3N0YXR1cyA9IHN0YXR1cztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkub2JqZWN0aXZlcy5uXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgaWQ6IHN0cmluZyxcbiAgICogICAgICBzdGF0dXM6IHN0cmluZyxcbiAgICogICAgICBzY29yZTogQ01JU2NvcmVcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ2lkJzogdGhpcy5pZCxcbiAgICAgICdzdGF0dXMnOiB0aGlzLnN0YXR1cyxcbiAgICAgICdzY29yZSc6IHRoaXMuc2NvcmUsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMS4yJ3MgY21pLmludGVyYWN0aW9ucy5uLm9iamVjdGl2ZXMubiBvYmplY3RcbiAqIEBleHRlbmRzIEJhc2VDTUlcbiAqL1xuZXhwb3J0IGNsYXNzIENNSUludGVyYWN0aW9uc09iamVjdGl2ZXNPYmplY3QgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkuaW50ZXJhY3Rpb25zLm4ub2JqZWN0aXZlcy5uXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgI2lkID0gJyc7XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2lkXG4gICAqIEByZXR1cm4ge1wiXCJ9XG4gICAqL1xuICBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2lkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuICAgKi9cbiAgc2V0IGlkKGlkKSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChpZCwgc2Nvcm0xMl9yZWdleC5DTUlJZGVudGlmaWVyKSkge1xuICAgICAgdGhpcy4jaWQgPSBpZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuaW50ZXJhY3Rpb25zLm4ub2JqZWN0aXZlcy5uXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgaWQ6IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnaWQnOiB0aGlzLmlkLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDEuMidzIGNtaS5pbnRlcmFjdGlvbnMuY29ycmVjdF9yZXNwb25zZXMubiBvYmplY3RcbiAqIEBleHRlbmRzIEJhc2VDTUlcbiAqL1xuZXhwb3J0IGNsYXNzIENNSUludGVyYWN0aW9uc0NvcnJlY3RSZXNwb25zZXNPYmplY3QgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkuaW50ZXJhY3Rpb25zLmNvcnJlY3RfcmVzcG9uc2VzLm5cbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAjcGF0dGVybiA9ICcnO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNwYXR0ZXJuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBwYXR0ZXJuKCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgPyB0aHJvd1dyaXRlT25seUVycm9yKCkgOiB0aGlzLiNwYXR0ZXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3BhdHRlcm5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm5cbiAgICovXG4gIHNldCBwYXR0ZXJuKHBhdHRlcm4pIHtcbiAgICBpZiAoY2hlY2sxMlZhbGlkRm9ybWF0KHBhdHRlcm4sIHNjb3JtMTJfcmVnZXguQ01JRmVlZGJhY2ssIHRydWUpKSB7XG4gICAgICB0aGlzLiNwYXR0ZXJuID0gcGF0dGVybjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkuaW50ZXJhY3Rpb25zLmNvcnJlY3RfcmVzcG9uc2VzLm5cbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBwYXR0ZXJuOiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ3BhdHRlcm4nOiB0aGlzLnBhdHRlcm4sXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyBmb3IgQUlDQyBOYXZpZ2F0aW9uIG9iamVjdFxuICovXG5leHBvcnQgY2xhc3MgTkFWIGV4dGVuZHMgQmFzZUNNSSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgTkFWIG9iamVjdFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gICNldmVudCA9ICcnO1xuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNldmVudFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZXZlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2V2ZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2V2ZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKi9cbiAgc2V0IGV2ZW50KGV2ZW50KSB7XG4gICAgaWYgKGNoZWNrMTJWYWxpZEZvcm1hdChldmVudCwgc2Nvcm0xMl9yZWdleC5OQVZFdmVudCkpIHtcbiAgICAgIHRoaXMuI2V2ZW50ID0gZXZlbnQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgbmF2IG9iamVjdFxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGV2ZW50OiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ2V2ZW50JzogdGhpcy5ldmVudCxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIiwiLy8gQGZsb3dcblxuY29uc3QgZ2xvYmFsID0ge1xuICBTQ09STV9UUlVFOiAndHJ1ZScsXG4gIFNDT1JNX0ZBTFNFOiAnZmFsc2UnLFxuICBTVEFURV9OT1RfSU5JVElBTElaRUQ6IDAsXG4gIFNUQVRFX0lOSVRJQUxJWkVEOiAxLFxuICBTVEFURV9URVJNSU5BVEVEOiAyLFxuICBMT0dfTEVWRUxfREVCVUc6IDEsXG4gIExPR19MRVZFTF9JTkZPOiAyLFxuICBMT0dfTEVWRUxfV0FSTklORzogMyxcbiAgTE9HX0xFVkVMX0VSUk9SOiA0LFxuICBMT0dfTEVWRUxfTk9ORTogNSxcbn07XG5cbmNvbnN0IHNjb3JtMTIgPSB7XG4gIC8vIENoaWxkcmVuIGxpc3RzXG4gIGNtaV9jaGlsZHJlbjogJ2NvcmUsc3VzcGVuZF9kYXRhLGxhdW5jaF9kYXRhLGNvbW1lbnRzLG9iamVjdGl2ZXMsc3R1ZGVudF9kYXRhLHN0dWRlbnRfcHJlZmVyZW5jZSxpbnRlcmFjdGlvbnMnLFxuICBjb3JlX2NoaWxkcmVuOiAnc3R1ZGVudF9pZCxzdHVkZW50X25hbWUsbGVzc29uX2xvY2F0aW9uLGNyZWRpdCxsZXNzb25fc3RhdHVzLGVudHJ5LHNjb3JlLHRvdGFsX3RpbWUsbGVzc29uX21vZGUsZXhpdCxzZXNzaW9uX3RpbWUnLFxuICBzY29yZV9jaGlsZHJlbjogJ3JhdyxtaW4sbWF4JyxcbiAgY29tbWVudHNfY2hpbGRyZW46ICdjb250ZW50LGxvY2F0aW9uLHRpbWUnLFxuICBvYmplY3RpdmVzX2NoaWxkcmVuOiAnaWQsc2NvcmUsc3RhdHVzJyxcbiAgY29ycmVjdF9yZXNwb25zZXNfY2hpbGRyZW46ICdwYXR0ZXJuJyxcbiAgc3R1ZGVudF9kYXRhX2NoaWxkcmVuOiAnbWFzdGVyeV9zY29yZSxtYXhfdGltZV9hbGxvd2VkLHRpbWVfbGltaXRfYWN0aW9uJyxcbiAgc3R1ZGVudF9wcmVmZXJlbmNlX2NoaWxkcmVuOiAnYXVkaW8sbGFuZ3VhZ2Usc3BlZWQsdGV4dCcsXG4gIGludGVyYWN0aW9uc19jaGlsZHJlbjogJ2lkLG9iamVjdGl2ZXMsdGltZSx0eXBlLGNvcnJlY3RfcmVzcG9uc2VzLHdlaWdodGluZyxzdHVkZW50X3Jlc3BvbnNlLHJlc3VsdCxsYXRlbmN5JyxcblxuICBlcnJvcl9kZXNjcmlwdGlvbnM6IHtcbiAgICAnMTAxJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnR2VuZXJhbCBFeGNlcHRpb24nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ05vIHNwZWNpZmljIGVycm9yIGNvZGUgZXhpc3RzIHRvIGRlc2NyaWJlIHRoZSBlcnJvci4gVXNlIExNU0dldERpYWdub3N0aWMgZm9yIG1vcmUgaW5mb3JtYXRpb24nLFxuICAgIH0sXG4gICAgJzIwMSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0ludmFsaWQgYXJndW1lbnQgZXJyb3InLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0luZGljYXRlcyB0aGF0IGFuIGFyZ3VtZW50IHJlcHJlc2VudHMgYW4gaW52YWxpZCBkYXRhIG1vZGVsIGVsZW1lbnQgb3IgaXMgb3RoZXJ3aXNlIGluY29ycmVjdC4nLFxuICAgIH0sXG4gICAgJzIwMic6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0VsZW1lbnQgY2Fubm90IGhhdmUgY2hpbGRyZW4nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0luZGljYXRlcyB0aGF0IExNU0dldFZhbHVlIHdhcyBjYWxsZWQgd2l0aCBhIGRhdGEgbW9kZWwgZWxlbWVudCBuYW1lIHRoYXQgZW5kcyBpbiBcIl9jaGlsZHJlblwiIGZvciBhIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhlIFwiX2NoaWxkcmVuXCIgc3VmZml4LicsXG4gICAgfSxcbiAgICAnMjAzJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRWxlbWVudCBub3QgYW4gYXJyYXkgLSBjYW5ub3QgaGF2ZSBjb3VudCcsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnSW5kaWNhdGVzIHRoYXQgTE1TR2V0VmFsdWUgd2FzIGNhbGxlZCB3aXRoIGEgZGF0YSBtb2RlbCBlbGVtZW50IG5hbWUgdGhhdCBlbmRzIGluIFwiX2NvdW50XCIgZm9yIGEgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgXCJfY291bnRcIiBzdWZmaXguJyxcbiAgICB9LFxuICAgICczMDEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdOb3QgaW5pdGlhbGl6ZWQnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0luZGljYXRlcyB0aGF0IGFuIEFQSSBjYWxsIHdhcyBtYWRlIGJlZm9yZSB0aGUgY2FsbCB0byBsbXNJbml0aWFsaXplLicsXG4gICAgfSxcbiAgICAnNDAxJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnTm90IGltcGxlbWVudGVkIGVycm9yJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdUaGUgZGF0YSBtb2RlbCBlbGVtZW50IGluZGljYXRlZCBpbiBhIGNhbGwgdG8gTE1TR2V0VmFsdWUgb3IgTE1TU2V0VmFsdWUgaXMgdmFsaWQsIGJ1dCB3YXMgbm90IGltcGxlbWVudGVkIGJ5IHRoaXMgTE1TLiBTQ09STSAxLjIgZGVmaW5lcyBhIHNldCBvZiBkYXRhIG1vZGVsIGVsZW1lbnRzIGFzIGJlaW5nIG9wdGlvbmFsIGZvciBhbiBMTVMgdG8gaW1wbGVtZW50LicsXG4gICAgfSxcbiAgICAnNDAyJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnSW52YWxpZCBzZXQgdmFsdWUsIGVsZW1lbnQgaXMgYSBrZXl3b3JkJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdJbmRpY2F0ZXMgdGhhdCBMTVNTZXRWYWx1ZSB3YXMgY2FsbGVkIG9uIGEgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIGtleXdvcmQgKGVsZW1lbnRzIHRoYXQgZW5kIGluIFwiX2NoaWxkcmVuXCIgYW5kIFwiX2NvdW50XCIpLicsXG4gICAgfSxcbiAgICAnNDAzJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRWxlbWVudCBpcyByZWFkIG9ubHknLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0xNU1NldFZhbHVlIHdhcyBjYWxsZWQgd2l0aCBhIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IGNhbiBvbmx5IGJlIHJlYWQuJyxcbiAgICB9LFxuICAgICc0MDQnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdFbGVtZW50IGlzIHdyaXRlIG9ubHknLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0xNU0dldFZhbHVlIHdhcyBjYWxsZWQgb24gYSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCBjYW4gb25seSBiZSB3cml0dGVuIHRvLicsXG4gICAgfSxcbiAgICAnNDA1Jzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnSW5jb3JyZWN0IERhdGEgVHlwZScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnTE1TU2V0VmFsdWUgd2FzIGNhbGxlZCB3aXRoIGEgdmFsdWUgdGhhdCBpcyBub3QgY29uc2lzdGVudCB3aXRoIHRoZSBkYXRhIGZvcm1hdCBvZiB0aGUgc3VwcGxpZWQgZGF0YSBtb2RlbCBlbGVtZW50LicsXG4gICAgfSxcbiAgICAnNDA3Jzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRWxlbWVudCBWYWx1ZSBPdXQgT2YgUmFuZ2UnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ1RoZSBudW1lcmljIHZhbHVlIHN1cHBsaWVkIHRvIGEgTE1TU2V0VmFsdWUgY2FsbCBpcyBvdXRzaWRlIG9mIHRoZSBudW1lcmljIHJhbmdlIGFsbG93ZWQgZm9yIHRoZSBzdXBwbGllZCBkYXRhIG1vZGVsIGVsZW1lbnQuJyxcbiAgICB9LFxuICAgICc0MDgnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdEYXRhIE1vZGVsIERlcGVuZGVuY3kgTm90IEVzdGFibGlzaGVkJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdTb21lIGRhdGEgbW9kZWwgZWxlbWVudHMgY2Fubm90IGJlIHNldCB1bnRpbCBhbm90aGVyIGRhdGEgbW9kZWwgZWxlbWVudCB3YXMgc2V0LiBUaGlzIGVycm9yIGNvbmRpdGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJlcmVxdWlzaXRlIGVsZW1lbnQgd2FzIG5vdCBzZXQgYmVmb3JlIHRoZSBkZXBlbmRlbnQgZWxlbWVudC4nLFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCBhaWNjID0ge1xuICAuLi5zY29ybTEyLCAuLi57XG4gICAgY21pX2NoaWxkcmVuOiAnY29yZSxzdXNwZW5kX2RhdGEsbGF1bmNoX2RhdGEsY29tbWVudHMsb2JqZWN0aXZlcyxzdHVkZW50X2RhdGEsc3R1ZGVudF9wcmVmZXJlbmNlLGludGVyYWN0aW9ucyxldmFsdWF0aW9uJyxcbiAgICBzdHVkZW50X3ByZWZlcmVuY2VfY2hpbGRyZW46ICdhdWRpbyxsYW5ndWFnZSxsZXNzb25fdHlwZSxzcGVlZCx0ZXh0LHRleHRfY29sb3IsdGV4dF9sb2NhdGlvbix0ZXh0X3NpemUsdmlkZW8sd2luZG93cycsXG4gICAgc3R1ZGVudF9kYXRhX2NoaWxkcmVuOiAnYXR0ZW1wdF9udW1iZXIsdHJpZXMsbWFzdGVyeV9zY29yZSxtYXhfdGltZV9hbGxvd2VkLHRpbWVfbGltaXRfYWN0aW9uJyxcbiAgICBzdHVkZW50X2RlbW9ncmFwaGljc19jaGlsZHJlbjogJ2NpdHksY2xhc3MsY29tcGFueSxjb3VudHJ5LGV4cGVyaWVuY2UsZmFtaWxpYXJfbmFtZSxpbnN0cnVjdG9yX25hbWUsdGl0bGUsbmF0aXZlX2xhbmd1YWdlLHN0YXRlLHN0cmVldF9hZGRyZXNzLHRlbGVwaG9uZSx5ZWFyc19leHBlcmllbmNlJyxcbiAgICB0cmllc19jaGlsZHJlbjogJ3RpbWUsc3RhdHVzLHNjb3JlJyxcbiAgICBhdHRlbXB0X3JlY29yZHNfY2hpbGRyZW46ICdzY29yZSxsZXNzb25fc3RhdHVzJyxcbiAgICBwYXRoc19jaGlsZHJlbjogJ2xvY2F0aW9uX2lkLGRhdGUsdGltZSxzdGF0dXMsd2h5X2xlZnQsdGltZV9pbl9lbGVtZW50JyxcbiAgfSxcbn07XG5cbmNvbnN0IHNjb3JtMjAwNCA9IHtcbiAgLy8gQ2hpbGRyZW4gbGlzdHNcbiAgY21pX2NoaWxkcmVuOiAnX3ZlcnNpb24sY29tbWVudHNfZnJvbV9sZWFybmVyLGNvbW1lbnRzX2Zyb21fbG1zLGNvbXBsZXRpb25fc3RhdHVzLGNyZWRpdCxlbnRyeSxleGl0LGludGVyYWN0aW9ucyxsYXVuY2hfZGF0YSxsZWFybmVyX2lkLGxlYXJuZXJfbmFtZSxsZWFybmVyX3ByZWZlcmVuY2UsbG9jYXRpb24sbWF4X3RpbWVfYWxsb3dlZCxtb2RlLG9iamVjdGl2ZXMscHJvZ3Jlc3NfbWVhc3VyZSxzY2FsZWRfcGFzc2luZ19zY29yZSxzY29yZSxzZXNzaW9uX3RpbWUsc3VjY2Vzc19zdGF0dXMsc3VzcGVuZF9kYXRhLHRpbWVfbGltaXRfYWN0aW9uLHRvdGFsX3RpbWUnLFxuICBjb21tZW50c19jaGlsZHJlbjogJ2NvbW1lbnQsdGltZXN0YW1wLGxvY2F0aW9uJyxcbiAgc2NvcmVfY2hpbGRyZW46ICdtYXgscmF3LHNjYWxlZCxtaW4nLFxuICBvYmplY3RpdmVzX2NoaWxkcmVuOiAncHJvZ3Jlc3NfbWVhc3VyZSxjb21wbGV0aW9uX3N0YXR1cyxzdWNjZXNzX3N0YXR1cyxkZXNjcmlwdGlvbixzY29yZSxpZCcsXG4gIGNvcnJlY3RfcmVzcG9uc2VzX2NoaWxkcmVuOiAncGF0dGVybicsXG4gIHN0dWRlbnRfZGF0YV9jaGlsZHJlbjogJ21hc3Rlcnlfc2NvcmUsbWF4X3RpbWVfYWxsb3dlZCx0aW1lX2xpbWl0X2FjdGlvbicsXG4gIHN0dWRlbnRfcHJlZmVyZW5jZV9jaGlsZHJlbjogJ2F1ZGlvX2xldmVsLGF1ZGlvX2NhcHRpb25pbmcsZGVsaXZlcnlfc3BlZWQsbGFuZ3VhZ2UnLFxuICBpbnRlcmFjdGlvbnNfY2hpbGRyZW46ICdpZCx0eXBlLG9iamVjdGl2ZXMsdGltZXN0YW1wLGNvcnJlY3RfcmVzcG9uc2VzLHdlaWdodGluZyxsZWFybmVyX3Jlc3BvbnNlLHJlc3VsdCxsYXRlbmN5LGRlc2NyaXB0aW9uJyxcblxuICBlcnJvcl9kZXNjcmlwdGlvbnM6IHtcbiAgICAnMCc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ05vIEVycm9yJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdObyBlcnJvciBvY2N1cnJlZCwgdGhlIHByZXZpb3VzIEFQSSBjYWxsIHdhcyBzdWNjZXNzZnVsLicsXG4gICAgfSxcbiAgICAnMTAxJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnR2VuZXJhbCBFeGNlcHRpb24nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ05vIHNwZWNpZmljIGVycm9yIGNvZGUgZXhpc3RzIHRvIGRlc2NyaWJlIHRoZSBlcnJvci4gVXNlIEdldERpYWdub3N0aWMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyxcbiAgICB9LFxuICAgICcxMDInOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdHZW5lcmFsIEluaXRpYWxpemF0aW9uIEZhaWx1cmUnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gSW5pdGlhbGl6ZSBmYWlsZWQgZm9yIGFuIHVua25vd24gcmVhc29uLicsXG4gICAgfSxcbiAgICAnMTAzJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnQWxyZWFkeSBJbml0aWFsaXplZCcsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBJbml0aWFsaXplIGZhaWxlZCBiZWNhdXNlIEluaXRpYWxpemUgd2FzIGFscmVhZHkgY2FsbGVkLicsXG4gICAgfSxcbiAgICAnMTA0Jzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnQ29udGVudCBJbnN0YW5jZSBUZXJtaW5hdGVkJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIEluaXRpYWxpemUgZmFpbGVkIGJlY2F1c2UgVGVybWluYXRlIHdhcyBhbHJlYWR5IGNhbGxlZC4nLFxuICAgIH0sXG4gICAgJzExMSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0dlbmVyYWwgVGVybWluYXRpb24gRmFpbHVyZScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBUZXJtaW5hdGUgZmFpbGVkIGZvciBhbiB1bmtub3duIHJlYXNvbi4nLFxuICAgIH0sXG4gICAgJzExMic6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ1Rlcm1pbmF0aW9uIEJlZm9yZSBJbml0aWFsaXphdGlvbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBUZXJtaW5hdGUgZmFpbGVkIGJlY2F1c2UgaXQgd2FzIG1hZGUgYmVmb3JlIHRoZSBjYWxsIHRvIEluaXRpYWxpemUuJyxcbiAgICB9LFxuICAgICcxMTMnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdUZXJtaW5hdGlvbiBBZnRlciBUZXJtaW5hdGlvbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBUZXJtaW5hdGUgZmFpbGVkIGJlY2F1c2UgVGVybWluYXRlIHdhcyBhbHJlYWR5IGNhbGxlZC4nLFxuICAgIH0sXG4gICAgJzEyMic6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ1JldHJpZXZlIERhdGEgQmVmb3JlIEluaXRpYWxpemF0aW9uJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIEdldFZhbHVlIGZhaWxlZCBiZWNhdXNlIGl0IHdhcyBtYWRlIGJlZm9yZSB0aGUgY2FsbCB0byBJbml0aWFsaXplLicsXG4gICAgfSxcbiAgICAnMTIzJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnUmV0cmlldmUgRGF0YSBBZnRlciBUZXJtaW5hdGlvbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBHZXRWYWx1ZSBmYWlsZWQgYmVjYXVzZSBpdCB3YXMgbWFkZSBhZnRlciB0aGUgY2FsbCB0byBUZXJtaW5hdGUuJyxcbiAgICB9LFxuICAgICcxMzInOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdTdG9yZSBEYXRhIEJlZm9yZSBJbml0aWFsaXphdGlvbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBTZXRWYWx1ZSBmYWlsZWQgYmVjYXVzZSBpdCB3YXMgbWFkZSBiZWZvcmUgdGhlIGNhbGwgdG8gSW5pdGlhbGl6ZS4nLFxuICAgIH0sXG4gICAgJzEzMyc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ1N0b3JlIERhdGEgQWZ0ZXIgVGVybWluYXRpb24nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gU2V0VmFsdWUgZmFpbGVkIGJlY2F1c2UgaXQgd2FzIG1hZGUgYWZ0ZXIgdGhlIGNhbGwgdG8gVGVybWluYXRlLicsXG4gICAgfSxcbiAgICAnMTQyJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnQ29tbWl0IEJlZm9yZSBJbml0aWFsaXphdGlvbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBDb21taXQgZmFpbGVkIGJlY2F1c2UgaXQgd2FzIG1hZGUgYmVmb3JlIHRoZSBjYWxsIHRvIEluaXRpYWxpemUuJyxcbiAgICB9LFxuICAgICcxNDMnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdDb21taXQgQWZ0ZXIgVGVybWluYXRpb24nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gQ29tbWl0IGZhaWxlZCBiZWNhdXNlIGl0IHdhcyBtYWRlIGFmdGVyIHRoZSBjYWxsIHRvIFRlcm1pbmF0ZS4nLFxuICAgIH0sXG4gICAgJzIwMSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0dlbmVyYWwgQXJndW1lbnQgRXJyb3InLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0FuIGludmFsaWQgYXJndW1lbnQgd2FzIHBhc3NlZCB0byBhbiBBUEkgbWV0aG9kICh1c3VhbGx5IGluZGljYXRlcyB0aGF0IEluaXRpYWxpemUsIENvbW1pdCBvciBUZXJtaW5hdGUgZGlkIG5vdCByZWNlaXZlIHRoZSBleHBlY3RlZCBlbXB0eSBzdHJpbmcgYXJndW1lbnQuJyxcbiAgICB9LFxuICAgICczMDEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdHZW5lcmFsIEdldCBGYWlsdXJlJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdJbmRpY2F0ZXMgYSBmYWlsZWQgR2V0VmFsdWUgY2FsbCB3aGVyZSBubyBvdGhlciBzcGVjaWZpYyBlcnJvciBjb2RlIGlzIGFwcGxpY2FibGUuIFVzZSBHZXREaWFnbm9zdGljIGZvciBtb3JlIGluZm9ybWF0aW9uLicsXG4gICAgfSxcbiAgICAnMzUxJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnR2VuZXJhbCBTZXQgRmFpbHVyZScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnSW5kaWNhdGVzIGEgZmFpbGVkIFNldFZhbHVlIGNhbGwgd2hlcmUgbm8gb3RoZXIgc3BlY2lmaWMgZXJyb3IgY29kZSBpcyBhcHBsaWNhYmxlLiBVc2UgR2V0RGlhZ25vc3RpYyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLFxuICAgIH0sXG4gICAgJzM5MSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0dlbmVyYWwgQ29tbWl0IEZhaWx1cmUnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0luZGljYXRlcyBhIGZhaWxlZCBDb21taXQgY2FsbCB3aGVyZSBubyBvdGhlciBzcGVjaWZpYyBlcnJvciBjb2RlIGlzIGFwcGxpY2FibGUuIFVzZSBHZXREaWFnbm9zdGljIGZvciBtb3JlIGluZm9ybWF0aW9uLicsXG4gICAgfSxcbiAgICAnNDAxJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnVW5kZWZpbmVkIERhdGEgTW9kZWwgRWxlbWVudCcsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnVGhlIGRhdGEgbW9kZWwgZWxlbWVudCBuYW1lIHBhc3NlZCB0byBHZXRWYWx1ZSBvciBTZXRWYWx1ZSBpcyBub3QgYSB2YWxpZCBTQ09STSBkYXRhIG1vZGVsIGVsZW1lbnQuJyxcbiAgICB9LFxuICAgICc0MDInOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdVbmltcGxlbWVudGVkIERhdGEgTW9kZWwgRWxlbWVudCcsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnVGhlIGRhdGEgbW9kZWwgZWxlbWVudCBpbmRpY2F0ZWQgaW4gYSBjYWxsIHRvIEdldFZhbHVlIG9yIFNldFZhbHVlIGlzIHZhbGlkLCBidXQgd2FzIG5vdCBpbXBsZW1lbnRlZCBieSB0aGlzIExNUy4gSW4gU0NPUk0gMjAwNCwgdGhpcyBlcnJvciB3b3VsZCBpbmRpY2F0ZSBhbiBMTVMgdGhhdCBpcyBub3QgZnVsbHkgU0NPUk0gY29uZm9ybWFudC4nLFxuICAgIH0sXG4gICAgJzQwMyc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0RhdGEgTW9kZWwgRWxlbWVudCBWYWx1ZSBOb3QgSW5pdGlhbGl6ZWQnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0F0dGVtcHQgdG8gcmVhZCBhIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCBieSB0aGUgTE1TIG9yIHRocm91Z2ggYSBTZXRWYWx1ZSBjYWxsLiBUaGlzIGVycm9yIGNvbmRpdGlvbiBpcyBvZnRlbiByZWFjaGVkIGR1cmluZyBub3JtYWwgZXhlY3V0aW9uIG9mIGEgU0NPLicsXG4gICAgfSxcbiAgICAnNDA0Jzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRGF0YSBNb2RlbCBFbGVtZW50IElzIFJlYWQgT25seScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnU2V0VmFsdWUgd2FzIGNhbGxlZCB3aXRoIGEgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgY2FuIG9ubHkgYmUgcmVhZC4nLFxuICAgIH0sXG4gICAgJzQwNSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0RhdGEgTW9kZWwgRWxlbWVudCBJcyBXcml0ZSBPbmx5JyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdHZXRWYWx1ZSB3YXMgY2FsbGVkIG9uIGEgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgY2FuIG9ubHkgYmUgd3JpdHRlbiB0by4nLFxuICAgIH0sXG4gICAgJzQwNic6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0RhdGEgTW9kZWwgRWxlbWVudCBUeXBlIE1pc21hdGNoJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdTZXRWYWx1ZSB3YXMgY2FsbGVkIHdpdGggYSB2YWx1ZSB0aGF0IGlzIG5vdCBjb25zaXN0ZW50IHdpdGggdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBzdXBwbGllZCBkYXRhIG1vZGVsIGVsZW1lbnQuJyxcbiAgICB9LFxuICAgICc0MDcnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdEYXRhIE1vZGVsIEVsZW1lbnQgVmFsdWUgT3V0IE9mIFJhbmdlJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdUaGUgbnVtZXJpYyB2YWx1ZSBzdXBwbGllZCB0byBhIFNldFZhbHVlIGNhbGwgaXMgb3V0c2lkZSBvZiB0aGUgbnVtZXJpYyByYW5nZSBhbGxvd2VkIGZvciB0aGUgc3VwcGxpZWQgZGF0YSBtb2RlbCBlbGVtZW50LicsXG4gICAgfSxcbiAgICAnNDA4Jzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRGF0YSBNb2RlbCBEZXBlbmRlbmN5IE5vdCBFc3RhYmxpc2hlZCcsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnU29tZSBkYXRhIG1vZGVsIGVsZW1lbnRzIGNhbm5vdCBiZSBzZXQgdW50aWwgYW5vdGhlciBkYXRhIG1vZGVsIGVsZW1lbnQgd2FzIHNldC4gVGhpcyBlcnJvciBjb25kaXRpb24gaW5kaWNhdGVzIHRoYXQgdGhlIHByZXJlcXVpc2l0ZSBlbGVtZW50IHdhcyBub3Qgc2V0IGJlZm9yZSB0aGUgZGVwZW5kZW50IGVsZW1lbnQuJyxcbiAgICB9LFxuICB9LFxufTtcblxuY29uc3QgQVBJQ29uc3RhbnRzID0ge1xuICBnbG9iYWw6IGdsb2JhbCxcbiAgc2Nvcm0xMjogc2Nvcm0xMixcbiAgYWljYzogYWljYyxcbiAgc2Nvcm0yMDA0OiBzY29ybTIwMDQsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBBUElDb25zdGFudHM7XG4iLCIvLyBAZmxvd1xuY29uc3QgZ2xvYmFsID0ge1xuICBHRU5FUkFMOiAxMDEsXG4gIElOSVRJQUxJWkFUSU9OX0ZBSUxFRDogMTAxLFxuICBJTklUSUFMSVpFRDogMTAxLFxuICBURVJNSU5BVEVEOiAxMDEsXG4gIFRFUk1JTkFUSU9OX0ZBSUxVUkU6IDEwMSxcbiAgVEVSTUlOQVRJT05fQkVGT1JFX0lOSVQ6IDEwMSxcbiAgTVVMVElQTEVfVEVSTUlOQVRJT046IDEwMSxcbiAgUkVUUklFVkVfQkVGT1JFX0lOSVQ6IDEwMSxcbiAgUkVUUklFVkVfQUZURVJfVEVSTTogMTAxLFxuICBTVE9SRV9CRUZPUkVfSU5JVDogMTAxLFxuICBTVE9SRV9BRlRFUl9URVJNOiAxMDEsXG4gIENPTU1JVF9CRUZPUkVfSU5JVDogMTAxLFxuICBDT01NSVRfQUZURVJfVEVSTTogMTAxLFxuICBBUkdVTUVOVF9FUlJPUjogMTAxLFxuICBDSElMRFJFTl9FUlJPUjogMTAxLFxuICBDT1VOVF9FUlJPUjogMTAxLFxuICBHRU5FUkFMX0dFVF9GQUlMVVJFOiAxMDEsXG4gIEdFTkVSQUxfU0VUX0ZBSUxVUkU6IDEwMSxcbiAgR0VORVJBTF9DT01NSVRfRkFJTFVSRTogMTAxLFxuICBVTkRFRklORURfREFUQV9NT0RFTDogMTAxLFxuICBVTklNUExFTUVOVEVEX0VMRU1FTlQ6IDEwMSxcbiAgVkFMVUVfTk9UX0lOSVRJQUxJWkVEOiAxMDEsXG4gIElOVkFMSURfU0VUX1ZBTFVFOiAxMDEsXG4gIFJFQURfT05MWV9FTEVNRU5UOiAxMDEsXG4gIFdSSVRFX09OTFlfRUxFTUVOVDogMTAxLFxuICBUWVBFX01JU01BVENIOiAxMDEsXG4gIFZBTFVFX09VVF9PRl9SQU5HRTogMTAxLFxuICBERVBFTkRFTkNZX05PVF9FU1RBQkxJU0hFRDogMTAxLFxufTtcblxuY29uc3Qgc2Nvcm0xMiA9IHtcbiAgLi4uZ2xvYmFsLCAuLi57XG4gICAgUkVUUklFVkVfQkVGT1JFX0lOSVQ6IDMwMSxcbiAgICBTVE9SRV9CRUZPUkVfSU5JVDogMzAxLFxuICAgIENPTU1JVF9CRUZPUkVfSU5JVDogMzAxLFxuICAgIEFSR1VNRU5UX0VSUk9SOiAyMDEsXG4gICAgQ0hJTERSRU5fRVJST1I6IDIwMixcbiAgICBDT1VOVF9FUlJPUjogMjAzLFxuICAgIFVOREVGSU5FRF9EQVRBX01PREVMOiA0MDEsXG4gICAgVU5JTVBMRU1FTlRFRF9FTEVNRU5UOiA0MDEsXG4gICAgVkFMVUVfTk9UX0lOSVRJQUxJWkVEOiAzMDEsXG4gICAgSU5WQUxJRF9TRVRfVkFMVUU6IDQwMixcbiAgICBSRUFEX09OTFlfRUxFTUVOVDogNDAzLFxuICAgIFdSSVRFX09OTFlfRUxFTUVOVDogNDA0LFxuICAgIFRZUEVfTUlTTUFUQ0g6IDQwNSxcbiAgICBWQUxVRV9PVVRfT0ZfUkFOR0U6IDQwNyxcbiAgICBERVBFTkRFTkNZX05PVF9FU1RBQkxJU0hFRDogNDA4LFxuICB9LFxufTtcblxuY29uc3Qgc2Nvcm0yMDA0ID0ge1xuICAuLi5nbG9iYWwsIC4uLntcbiAgICBJTklUSUFMSVpBVElPTl9GQUlMRUQ6IDEwMixcbiAgICBJTklUSUFMSVpFRDogMTAzLFxuICAgIFRFUk1JTkFURUQ6IDEwNCxcbiAgICBURVJNSU5BVElPTl9GQUlMVVJFOiAxMTEsXG4gICAgVEVSTUlOQVRJT05fQkVGT1JFX0lOSVQ6IDExMixcbiAgICBNVUxUSVBMRV9URVJNSU5BVElPTlM6IDExMyxcbiAgICBSRVRSSUVWRV9CRUZPUkVfSU5JVDogMTIyLFxuICAgIFJFVFJJRVZFX0FGVEVSX1RFUk06IDEyMyxcbiAgICBTVE9SRV9CRUZPUkVfSU5JVDogMTMyLFxuICAgIFNUT1JFX0FGVEVSX1RFUk06IDEzMyxcbiAgICBDT01NSVRfQkVGT1JFX0lOSVQ6IDE0MixcbiAgICBDT01NSVRfQUZURVJfVEVSTTogMTQzLFxuICAgIEFSR1VNRU5UX0VSUk9SOiAyMDEsXG4gICAgR0VORVJBTF9HRVRfRkFJTFVSRTogMzAxLFxuICAgIEdFTkVSQUxfU0VUX0ZBSUxVUkU6IDM1MSxcbiAgICBHRU5FUkFMX0NPTU1JVF9GQUlMVVJFOiAzOTEsXG4gICAgVU5ERUZJTkVEX0RBVEFfTU9ERUw6IDQwMSxcbiAgICBVTklNUExFTUVOVEVEX0VMRU1FTlQ6IDQwMixcbiAgICBWQUxVRV9OT1RfSU5JVElBTElaRUQ6IDQwMyxcbiAgICBSRUFEX09OTFlfRUxFTUVOVDogNDA0LFxuICAgIFdSSVRFX09OTFlfRUxFTUVOVDogNDA1LFxuICAgIFRZUEVfTUlTTUFUQ0g6IDQwNixcbiAgICBWQUxVRV9PVVRfT0ZfUkFOR0U6IDQwNyxcbiAgICBERVBFTkRFTkNZX05PVF9FU1RBQkxJU0hFRDogNDA4LFxuICB9LFxufTtcblxuY29uc3QgRXJyb3JDb2RlcyA9IHtcbiAgc2Nvcm0xMjogc2Nvcm0xMixcbiAgc2Nvcm0yMDA0OiBzY29ybTIwMDQsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBFcnJvckNvZGVzO1xuIiwiLy8gQGZsb3dcblxuY29uc3Qgc2Nvcm0xMiA9IHtcbiAgQ01JU3RyaW5nMjU2OiAnXi57MCwyNTV9JCcsXG4gIENNSVN0cmluZzQwOTY6ICdeLnswLDQwOTZ9JCcsXG4gIENNSVRpbWU6ICdeKD86WzAxXVxcXFxkfDJbMDEyM10pOig/OlswMTIzNDVdXFxcXGQpOig/OlswMTIzNDVdXFxcXGQpJCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgQ01JVGltZXNwYW46ICdeKFswLTldezIsfSk6KFswLTldezJ9KTooWzAtOV17Mn0pKFxcLlswLTldezEsMn0pPyQnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIENNSUludGVnZXI6ICdeXFxcXGQrJCcsXG4gIENNSVNJbnRlZ2VyOiAnXi0/KFswLTldKykkJyxcbiAgQ01JRGVjaW1hbDogJ14tPyhbMC05XXswLDN9KShcXC5bMC05XSopPyQnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIENNSUlkZW50aWZpZXI6ICdeW1xcXFx1MDAyMS1cXFxcdTAwN0VcXFxcc117MCwyNTV9JCcsXG4gIENNSUZlZWRiYWNrOiAnXi57MCwyNTV9JCcsIC8vIFRoaXMgbXVzdCBiZSByZWRlZmluZWRcbiAgQ01JSW5kZXg6ICdbLl9dKFxcXFxkKykuJyxcblxuICAvLyBWb2NhYnVsYXJ5IERhdGEgVHlwZSBEZWZpbml0aW9uXG4gIENNSVN0YXR1czogJ14ocGFzc2VkfGNvbXBsZXRlZHxmYWlsZWR8aW5jb21wbGV0ZXxicm93c2VkKSQnLFxuICBDTUlTdGF0dXMyOiAnXihwYXNzZWR8Y29tcGxldGVkfGZhaWxlZHxpbmNvbXBsZXRlfGJyb3dzZWR8bm90IGF0dGVtcHRlZCkkJyxcbiAgQ01JRXhpdDogJ14odGltZS1vdXR8c3VzcGVuZHxsb2dvdXR8KSQnLFxuICBDTUlUeXBlOiAnXih0cnVlLWZhbHNlfGNob2ljZXxmaWxsLWlufG1hdGNoaW5nfHBlcmZvcm1hbmNlfHNlcXVlbmNpbmd8bGlrZXJ0fG51bWVyaWMpJCcsXG4gIENNSVJlc3VsdDogJ14oY29ycmVjdHx3cm9uZ3x1bmFudGljaXBhdGVkfG5ldXRyYWx8KFswLTldezAsM30pPyhcXFxcLlswLTldKik/KSQnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIE5BVkV2ZW50OiAnXihwcmV2aW91c3xjb250aW51ZSkkJyxcblxuICAvLyBEYXRhIHJhbmdlc1xuICBzY29yZV9yYW5nZTogJzAjMTAwJyxcbiAgYXVkaW9fcmFuZ2U6ICctMSMxMDAnLFxuICBzcGVlZF9yYW5nZTogJy0xMDAjMTAwJyxcbiAgd2VpZ2h0aW5nX3JhbmdlOiAnLTEwMCMxMDAnLFxuICB0ZXh0X3JhbmdlOiAnLTEjMScsXG59O1xuXG5jb25zdCBhaWNjID0ge1xuICAuLi5zY29ybTEyLCAuLi57XG4gICAgQ01JSWRlbnRpZmllcjogJ15cXFxcd3sxLDI1NX0kJyxcbiAgfSxcbn07XG5cbmNvbnN0IHNjb3JtMjAwNCA9IHtcbiAgQ01JU3RyaW5nMjAwOiAnXltcXFxcdTAwMDAtXFxcXHVGRkZGXXswLDIwMH0kJyxcbiAgQ01JU3RyaW5nMjUwOiAnXltcXFxcdTAwMDAtXFxcXHVGRkZGXXswLDI1MH0kJyxcbiAgQ01JU3RyaW5nMTAwMDogJ15bXFxcXHUwMDAwLVxcXFx1RkZGRl17MCwxMDAwfSQnLFxuICBDTUlTdHJpbmc0MDAwOiAnXltcXFxcdTAwMDAtXFxcXHVGRkZGXXswLDQwMDB9JCcsXG4gIENNSVN0cmluZzY0MDAwOiAnXltcXFxcdTAwMDAtXFxcXHVGRkZGXXswLDY0MDAwfSQnLFxuICBDTUlMYW5nOiAnXihbYS16QS1aXXsyLDN9fGl8eCkoXFwtW2EtekEtWjAtOVxcLV17Miw4fSk/JHxeJCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgQ01JTGFuZ1N0cmluZzI1MDogJ14oXFx7bGFuZz0oW2EtekEtWl17MiwzfXxpfHgpKFxcLVthLXpBLVowLTlcXC1dezIsOH0pP1xcfSk/KCg/IVxcey4qJCkuezAsMjUwfSQpPyQnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIENNSUxhbmdjcjogJ14oKFxce2xhbmc9KFthLXpBLVpdezIsM318aXx4KT8oXFwtW2EtekEtWjAtOVxcLV17Miw4fSk/XFx9KSkoLio/KSQnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIENNSUxhbmdTdHJpbmcyNTBjcjogJ14oKFxce2xhbmc9KFthLXpBLVpdezIsM318aXx4KT8oXFwtW2EtekEtWjAtOVxcLV17Miw4fSk/XFx9KT8oLnswLDI1MH0pPyk/JCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgQ01JTGFuZ1N0cmluZzQwMDA6ICdeKFxce2xhbmc9KFthLXpBLVpdezIsM318aXx4KShcXC1bYS16QS1aMC05XFwtXXsyLDh9KT9cXH0pPygoPyFcXHsuKiQpLnswLDQwMDB9JCk/JCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgQ01JVGltZTogJ14oMTlbNy05XXsxfVswLTldezF9fDIwWzAtMl17MX1bMC05XXsxfXwyMDNbMC04XXsxfSkoKC0oMFsxLTldezF9fDFbMC0yXXsxfSkpKCgtKDBbMS05XXsxfXxbMS0yXXsxfVswLTldezF9fDNbMC0xXXsxfSkpKFQoWzAtMV17MX1bMC05XXsxfXwyWzAtM117MX0pKCg6WzAtNV17MX1bMC05XXsxfSkoKDpbMC01XXsxfVswLTldezF9KSgoXFxcXC5bMC05XXsxLDJ9KSgoWnwoWyt8LV0oWzAtMV17MX1bMC05XXsxfXwyWzAtM117MX0pKSkoOlswLTVdezF9WzAtOV17MX0pPyk/KT8pPyk/KT8pPyk/JCcsXG4gIENNSVRpbWVzcGFuOiAnXlAoPzooWy4sXFxcXGRdKylZKT8oPzooWy4sXFxcXGRdKylNKT8oPzooWy4sXFxcXGRdKylXKT8oPzooWy4sXFxcXGRdKylEKT8oPzpUPyg/OihbLixcXFxcZF0rKUgpPyg/OihbLixcXFxcZF0rKU0pPyg/OihbLixcXFxcZF0rKVMpPyk/JCcsXG4gIENNSUludGVnZXI6ICdeXFxcXGQrJCcsXG4gIENNSVNJbnRlZ2VyOiAnXi0/KFswLTldKykkJyxcbiAgQ01JRGVjaW1hbDogJ14tPyhbMC05XXsxLDV9KShcXFxcLlswLTldezEsMTh9KT8kJyxcbiAgQ01JSWRlbnRpZmllcjogJ15cXFxcU3sxLDI1MH1bYS16QS1aMC05XSQnLFxuICBDTUlTaG9ydElkZW50aWZpZXI6ICdeW1xcXFx3XFxcXC5cXFxcLVxcXFxfXXsxLDI1MH0kJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBDTUlMb25nSWRlbnRpZmllcjogJ14oPzooPyF1cm46KVxcXFxTezEsNDAwMH18dXJuOltBLVphLXowLTktXXsxLDMxfTpcXFxcU3sxLDQwMDB9fC57MSw0MDAwfSkkJywgLy8gbmVlZCB0byByZS1leGFtaW5lIHRoaXNcbiAgQ01JRmVlZGJhY2s6ICdeLiokJywgLy8gVGhpcyBtdXN0IGJlIHJlZGVmaW5lZFxuICBDTUlJbmRleDogJ1suX10oXFxcXGQrKS4nLFxuICBDTUlJbmRleFN0b3JlOiAnLk4oXFxcXGQrKS4nLFxuXG4gIC8vIFZvY2FidWxhcnkgRGF0YSBUeXBlIERlZmluaXRpb25cbiAgQ01JQ1N0YXR1czogJ14oY29tcGxldGVkfGluY29tcGxldGV8bm90IGF0dGVtcHRlZHx1bmtub3duKSQnLFxuICBDTUlTU3RhdHVzOiAnXihwYXNzZWR8ZmFpbGVkfHVua25vd24pJCcsXG4gIENNSUV4aXQ6ICdeKHRpbWUtb3V0fHN1c3BlbmR8bG9nb3V0fG5vcm1hbCkkJyxcbiAgQ01JVHlwZTogJ14odHJ1ZS1mYWxzZXxjaG9pY2V8ZmlsbC1pbnxsb25nLWZpbGwtaW58bWF0Y2hpbmd8cGVyZm9ybWFuY2V8c2VxdWVuY2luZ3xsaWtlcnR8bnVtZXJpY3xvdGhlcikkJyxcbiAgQ01JUmVzdWx0OiAnXihjb3JyZWN0fGluY29ycmVjdHx1bmFudGljaXBhdGVkfG5ldXRyYWx8LT8oWzAtOV17MSw0fSkoXFxcXC5bMC05XXsxLDE4fSk/KSQnLFxuICBOQVZFdmVudDogJ14ocHJldmlvdXN8Y29udGludWV8ZXhpdHxleGl0QWxsfGFiYW5kb258YWJhbmRvbkFsbHxzdXNwZW5kQWxsfFxce3RhcmdldD1cXFxcU3swLDIwMH1bYS16QS1aMC05XVxcfWNob2ljZXxqdW1wKSQnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIE5BVkJvb2xlYW46ICdeKHVua25vd258dHJ1ZXxmYWxzZSQpJyxcbiAgTkFWVGFyZ2V0OiAnXihwcmV2aW91c3xjb250aW51ZXxjaG9pY2Uue3RhcmdldD1cXFxcU3swLDIwMH1bYS16QS1aMC05XX0pJCcsXG5cbiAgLy8gRGF0YSByYW5nZXNcbiAgc2NhbGVkX3JhbmdlOiAnLTEjMScsXG4gIGF1ZGlvX3JhbmdlOiAnMCMqJyxcbiAgc3BlZWRfcmFuZ2U6ICcwIyonLFxuICB0ZXh0X3JhbmdlOiAnLTEjMScsXG4gIHByb2dyZXNzX3JhbmdlOiAnMCMxJyxcbn07XG5cbmNvbnN0IFJlZ2V4ID0ge1xuICBhaWNjOiBhaWNjLFxuICBzY29ybTEyOiBzY29ybTEyLFxuICBzY29ybTIwMDQ6IHNjb3JtMjAwNCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFJlZ2V4O1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IEFQSUNvbnN0YW50cyBmcm9tICcuL2NvbnN0YW50cy9hcGlfY29uc3RhbnRzJztcblxuY29uc3Qgc2Nvcm0xMl9lcnJvcnMgPSBBUElDb25zdGFudHMuc2Nvcm0xMi5lcnJvcl9kZXNjcmlwdGlvbnM7XG5jb25zdCBhaWNjX2Vycm9ycyA9IEFQSUNvbnN0YW50cy5haWNjLmVycm9yX2Rlc2NyaXB0aW9ucztcbmNvbnN0IHNjb3JtMjAwNF9lcnJvcnMgPSBBUElDb25zdGFudHMuc2Nvcm0yMDA0LmVycm9yX2Rlc2NyaXB0aW9ucztcblxuLyoqXG4gKiBCYXNlIFZhbGlkYXRpb24gRXhjZXB0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciB0byB0YWtlIGluIGFuIGVycm9yIG1lc3NhZ2UgYW5kIGNvZGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGVycm9yQ29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXJyb3JNZXNzYWdlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZXRhaWxlZE1lc3NhZ2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKGVycm9yQ29kZTogbnVtYmVyLCBlcnJvck1lc3NhZ2U6IFN0cmluZywgZGV0YWlsZWRNZXNzYWdlOiBTdHJpbmcpIHtcbiAgICBzdXBlcihlcnJvck1lc3NhZ2UpO1xuICAgIHRoaXMuI2Vycm9yQ29kZSA9IGVycm9yQ29kZTtcbiAgICB0aGlzLiNlcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7XG4gICAgdGhpcy4jZGV0YWlsZWRNZXNzYWdlID0gZGV0YWlsZWRNZXNzYWdlO1xuICB9XG5cbiAgI2Vycm9yQ29kZTtcbiAgI2Vycm9yTWVzc2FnZTtcbiAgI2RldGFpbGVkTWVzc2FnZTtcblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjZXJyb3JDb2RlXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCBlcnJvckNvZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2Vycm9yQ29kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNlcnJvck1lc3NhZ2VcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGVycm9yTWVzc2FnZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jZXJyb3JNZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2RldGFpbGVkTWVzc2FnZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZGV0YWlsZWRNZXNzYWdlKCkge1xuICAgIHJldHVybiB0aGlzLiNkZXRhaWxlZE1lc3NhZ2U7XG4gIH1cbn1cblxuLyoqXG4gKiBTQ09STSAxLjIgVmFsaWRhdGlvbiBFcnJvclxuICovXG5leHBvcnQgY2xhc3MgU2Nvcm0xMlZhbGlkYXRpb25FcnJvciBleHRlbmRzIFZhbGlkYXRpb25FcnJvciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciB0byB0YWtlIGluIGFuIGVycm9yIGNvZGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGVycm9yQ29kZVxuICAgKi9cbiAgY29uc3RydWN0b3IoZXJyb3JDb2RlOiBudW1iZXIpIHtcbiAgICBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChzY29ybTEyX2Vycm9ycywgU3RyaW5nKGVycm9yQ29kZSkpKSB7XG4gICAgICBzdXBlcihlcnJvckNvZGUsIHNjb3JtMTJfZXJyb3JzW1N0cmluZyhlcnJvckNvZGUpXS5iYXNpY01lc3NhZ2UsIHNjb3JtMTJfZXJyb3JzW1N0cmluZyhlcnJvckNvZGUpXS5kZXRhaWxNZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIoMTAxLCBzY29ybTEyX2Vycm9yc1snMTAxJ10uYmFzaWNNZXNzYWdlLCBzY29ybTEyX2Vycm9yc1snMTAxJ10uZGV0YWlsTWVzc2FnZSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQUlDQyBWYWxpZGF0aW9uIEVycm9yXG4gKi9cbmV4cG9ydCBjbGFzcyBBSUNDVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgVmFsaWRhdGlvbkVycm9yIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIHRvIHRha2UgaW4gYW4gZXJyb3IgY29kZVxuICAgKiBAcGFyYW0ge251bWJlcn0gZXJyb3JDb2RlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlcnJvckNvZGU6IG51bWJlcikge1xuICAgIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFpY2NfZXJyb3JzLCBTdHJpbmcoZXJyb3JDb2RlKSkpIHtcbiAgICAgIHN1cGVyKGVycm9yQ29kZSwgYWljY19lcnJvcnNbU3RyaW5nKGVycm9yQ29kZSldLmJhc2ljTWVzc2FnZSwgYWljY19lcnJvcnNbU3RyaW5nKGVycm9yQ29kZSldLmRldGFpbE1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlcigxMDEsIGFpY2NfZXJyb3JzWycxMDEnXS5iYXNpY01lc3NhZ2UsIGFpY2NfZXJyb3JzWycxMDEnXS5kZXRhaWxNZXNzYWdlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTQ09STSAyMDA0IFZhbGlkYXRpb24gRXJyb3JcbiAqL1xuZXhwb3J0IGNsYXNzIFNjb3JtMjAwNFZhbGlkYXRpb25FcnJvciBleHRlbmRzIFZhbGlkYXRpb25FcnJvciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciB0byB0YWtlIGluIGFuIGVycm9yIGNvZGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGVycm9yQ29kZVxuICAgKi9cbiAgY29uc3RydWN0b3IoZXJyb3JDb2RlOiBudW1iZXIpIHtcbiAgICBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChzY29ybTIwMDRfZXJyb3JzLCBTdHJpbmcoZXJyb3JDb2RlKSkpIHtcbiAgICAgIHN1cGVyKGVycm9yQ29kZSwgc2Nvcm0yMDA0X2Vycm9yc1tTdHJpbmcoZXJyb3JDb2RlKV0uYmFzaWNNZXNzYWdlLCBzY29ybTIwMDRfZXJyb3JzW1N0cmluZyhlcnJvckNvZGUpXS5kZXRhaWxNZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIoMTAxLCBzY29ybTIwMDRfZXJyb3JzWycxMDEnXS5iYXNpY01lc3NhZ2UsIHNjb3JtMjAwNF9lcnJvcnNbJzEwMSddLmRldGFpbE1lc3NhZ2UpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IFNjb3JtMTJBUEkgZnJvbSAnLi4vU2Nvcm0xMkFQSSc7XG5cbndpbmRvdy5TY29ybTEyQVBJID0gU2Nvcm0xMkFQSTtcbiIsIi8vIEBmbG93XG5leHBvcnQgY29uc3QgU0VDT05EU19QRVJfU0VDT05EID0gMS4wO1xuZXhwb3J0IGNvbnN0IFNFQ09ORFNfUEVSX01JTlVURSA9IDYwO1xuZXhwb3J0IGNvbnN0IFNFQ09ORFNfUEVSX0hPVVIgPSA2MCAqIFNFQ09ORFNfUEVSX01JTlVURTtcbmV4cG9ydCBjb25zdCBTRUNPTkRTX1BFUl9EQVkgPSAyNCAqIFNFQ09ORFNfUEVSX0hPVVI7XG5cbmNvbnN0IGRlc2lnbmF0aW9ucyA9IFtcbiAgWydEJywgU0VDT05EU19QRVJfREFZXSxcbiAgWydIJywgU0VDT05EU19QRVJfSE9VUl0sXG4gIFsnTScsIFNFQ09ORFNfUEVSX01JTlVURV0sXG4gIFsnUycsIFNFQ09ORFNfUEVSX1NFQ09ORF0sXG5dO1xuXG4vKipcbiAqIENvbnZlcnRzIGEgTnVtYmVyIHRvIGEgU3RyaW5nIG9mIEhIOk1NOlNTXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHRvdGFsU2Vjb25kc1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2Vjb25kc0FzSEhNTVNTKHRvdGFsU2Vjb25kczogTnVtYmVyKSB7XG4gIC8vIFNDT1JNIHNwZWMgZG9lcyBub3QgZGVhbCB3aXRoIG5lZ2F0aXZlIGR1cmF0aW9ucywgZ2l2ZSB6ZXJvIGJhY2tcbiAgaWYgKCF0b3RhbFNlY29uZHMgfHwgdG90YWxTZWNvbmRzIDw9IDApIHtcbiAgICByZXR1cm4gJzAwOjAwOjAwJztcbiAgfVxuXG4gIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcih0b3RhbFNlY29uZHMgLyBTRUNPTkRTX1BFUl9IT1VSKTtcblxuICBjb25zdCBkYXRlT2JqID0gbmV3IERhdGUodG90YWxTZWNvbmRzICogMTAwMCk7XG4gIGNvbnN0IG1pbnV0ZXMgPSBkYXRlT2JqLmdldFVUQ01pbnV0ZXMoKTtcbiAgLy8gbWFrZSBzdXJlIHdlIGFkZCBhbnkgcG9zc2libGUgZGVjaW1hbCB2YWx1ZVxuICBjb25zdCBzZWNvbmRzID0gZGF0ZU9iai5nZXRTZWNvbmRzKCk7XG4gIGNvbnN0IG1zID0gdG90YWxTZWNvbmRzICUgMS4wO1xuICBsZXQgbXNTdHIgPSAnJztcbiAgaWYgKGNvdW50RGVjaW1hbHMobXMpID4gMCkge1xuICAgIGlmIChjb3VudERlY2ltYWxzKG1zKSA+IDIpIHtcbiAgICAgIG1zU3RyID0gbXMudG9GaXhlZCgyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbXNTdHIgPSBTdHJpbmcobXMpO1xuICAgIH1cbiAgICBtc1N0ciA9ICcuJyArIG1zU3RyLnNwbGl0KCcuJylbMV07XG4gIH1cblxuICByZXR1cm4gKGhvdXJzICsgJzonICsgbWludXRlcyArICc6JyArIHNlY29uZHMpLnJlcGxhY2UoL1xcYlxcZFxcYi9nLFxuICAgICAgJzAkJicpICsgbXNTdHI7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBmcm9tIElTTyA4NjAxIER1cmF0aW9uXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHNlY29uZHNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNlY29uZHNBc0lTT0R1cmF0aW9uKHNlY29uZHM6IE51bWJlcikge1xuICAvLyBTQ09STSBzcGVjIGRvZXMgbm90IGRlYWwgd2l0aCBuZWdhdGl2ZSBkdXJhdGlvbnMsIGdpdmUgemVybyBiYWNrXG4gIGlmICghc2Vjb25kcyB8fCBzZWNvbmRzIDw9IDApIHtcbiAgICByZXR1cm4gJ1BUMFMnO1xuICB9XG5cbiAgbGV0IGR1cmF0aW9uID0gJ1AnO1xuICBsZXQgcmVtYWluZGVyID0gc2Vjb25kcztcblxuICBkZXNpZ25hdGlvbnMuZm9yRWFjaCgoW3NpZ24sIGN1cnJlbnRfc2Vjb25kc10pID0+IHtcbiAgICBsZXQgdmFsdWUgPSBNYXRoLmZsb29yKHJlbWFpbmRlciAvIGN1cnJlbnRfc2Vjb25kcyk7XG5cbiAgICByZW1haW5kZXIgPSByZW1haW5kZXIgJSBjdXJyZW50X3NlY29uZHM7XG4gICAgaWYgKGNvdW50RGVjaW1hbHMocmVtYWluZGVyKSA+IDIpIHtcbiAgICAgIHJlbWFpbmRlciA9IE51bWJlcihOdW1iZXIocmVtYWluZGVyKS50b0ZpeGVkKDIpKTtcbiAgICB9XG4gICAgLy8gSWYgd2UgaGF2ZSBhbnl0aGluZyBsZWZ0IGluIHRoZSByZW1haW5kZXIsIGFuZCB3ZSdyZSBjdXJyZW50bHkgYWRkaW5nXG4gICAgLy8gc2Vjb25kcyB0byB0aGUgZHVyYXRpb24sIGdvIGFoZWFkIGFuZCBhZGQgdGhlIGRlY2ltYWwgdG8gdGhlIHNlY29uZHNcbiAgICBpZiAoc2lnbiA9PT0gJ1MnICYmIHJlbWFpbmRlciA+IDApIHtcbiAgICAgIHZhbHVlICs9IHJlbWFpbmRlcjtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGlmICgoZHVyYXRpb24uaW5kZXhPZignRCcpID4gMCB8fFxuICAgICAgICAgIHNpZ24gPT09ICdIJyB8fCBzaWduID09PSAnTScgfHwgc2lnbiA9PT0gJ1MnKSAmJlxuICAgICAgICAgIGR1cmF0aW9uLmluZGV4T2YoJ1QnKSA9PT0gLTEpIHtcbiAgICAgICAgZHVyYXRpb24gKz0gJ1QnO1xuICAgICAgfVxuICAgICAgZHVyYXRpb24gKz0gYCR7dmFsdWV9JHtzaWdufWA7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZHVyYXRpb247XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBmcm9tIEhIOk1NOlNTLkRERERERFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aW1lU3RyaW5nXG4gKiBAcGFyYW0ge1JlZ0V4cH0gdGltZVJlZ2V4XG4gKiBAcmV0dXJuIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaW1lQXNTZWNvbmRzKHRpbWVTdHJpbmc6IFN0cmluZywgdGltZVJlZ2V4OiBSZWdFeHApIHtcbiAgaWYgKCF0aW1lU3RyaW5nIHx8IHR5cGVvZiB0aW1lU3RyaW5nICE9PSAnc3RyaW5nJyB8fFxuICAgICAgIXRpbWVTdHJpbmcubWF0Y2godGltZVJlZ2V4KSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IHBhcnRzID0gdGltZVN0cmluZy5zcGxpdCgnOicpO1xuICBjb25zdCBob3VycyA9IE51bWJlcihwYXJ0c1swXSk7XG4gIGNvbnN0IG1pbnV0ZXMgPSBOdW1iZXIocGFydHNbMV0pO1xuICBjb25zdCBzZWNvbmRzID0gTnVtYmVyKHBhcnRzWzJdKTtcbiAgcmV0dXJuIChob3VycyAqIDM2MDApICsgKG1pbnV0ZXMgKiA2MCkgKyBzZWNvbmRzO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNlY29uZHMgZnJvbSBJU08gODYwMSBEdXJhdGlvblxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkdXJhdGlvblxuICogQHBhcmFtIHtSZWdFeHB9IGR1cmF0aW9uUmVnZXhcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldER1cmF0aW9uQXNTZWNvbmRzKGR1cmF0aW9uOiBTdHJpbmcsIGR1cmF0aW9uUmVnZXg6IFJlZ0V4cCkge1xuICBpZiAoIWR1cmF0aW9uIHx8ICFkdXJhdGlvbi5tYXRjaChkdXJhdGlvblJlZ2V4KSkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgY29uc3QgWywgeWVhcnMsIG1vbnRocywgLCBkYXlzLCBob3VycywgbWludXRlcywgc2Vjb25kc10gPSBuZXcgUmVnRXhwKFxuICAgICAgZHVyYXRpb25SZWdleCkuZXhlYyhkdXJhdGlvbikgfHwgW107XG5cbiAgbGV0IHJlc3VsdCA9IDAuMDtcblxuICByZXN1bHQgKz0gKE51bWJlcihzZWNvbmRzKSAqIDEuMCB8fCAwLjApO1xuICByZXN1bHQgKz0gKE51bWJlcihtaW51dGVzKSAqIDYwLjAgfHwgMC4wKTtcbiAgcmVzdWx0ICs9IChOdW1iZXIoaG91cnMpICogMzYwMC4wIHx8IDAuMCk7XG4gIHJlc3VsdCArPSAoTnVtYmVyKGRheXMpICogKDYwICogNjAgKiAyNC4wKSB8fCAwLjApO1xuICByZXN1bHQgKz0gKE51bWJlcih5ZWFycykgKiAoNjAgKiA2MCAqIDI0ICogMzY1LjApIHx8IDAuMCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBZGRzIHRvZ2V0aGVyIHR3byBJU084NjAxIER1cmF0aW9uIHN0cmluZ3NcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlyc3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWNvbmRcbiAqIEBwYXJhbSB7UmVnRXhwfSBkdXJhdGlvblJlZ2V4XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRUd29EdXJhdGlvbnMoXG4gICAgZmlyc3Q6IFN0cmluZyxcbiAgICBzZWNvbmQ6IFN0cmluZyxcbiAgICBkdXJhdGlvblJlZ2V4OiBSZWdFeHApIHtcbiAgcmV0dXJuIGdldFNlY29uZHNBc0lTT0R1cmF0aW9uKFxuICAgICAgZ2V0RHVyYXRpb25Bc1NlY29uZHMoZmlyc3QsIGR1cmF0aW9uUmVnZXgpICtcbiAgICAgIGdldER1cmF0aW9uQXNTZWNvbmRzKHNlY29uZCwgZHVyYXRpb25SZWdleCksXG4gICk7XG59XG5cbi8qKlxuICogQWRkIHRvZ2V0aGVyIHR3byBISDpNTTpTUy5ERCBzdHJpbmdzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZpcnN0XG4gKiBAcGFyYW0ge3N0cmluZ30gc2Vjb25kXG4gKiBAcGFyYW0ge1JlZ0V4cH0gdGltZVJlZ2V4XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRISE1NU1NUaW1lU3RyaW5ncyhcbiAgICBmaXJzdDogU3RyaW5nLFxuICAgIHNlY29uZDogU3RyaW5nLFxuICAgIHRpbWVSZWdleDogUmVnRXhwKSB7XG4gIHJldHVybiBnZXRTZWNvbmRzQXNISE1NU1MoXG4gICAgICBnZXRUaW1lQXNTZWNvbmRzKGZpcnN0LCB0aW1lUmVnZXgpICtcbiAgICAgIGdldFRpbWVBc1NlY29uZHMoXG4gICAgICAgICAgc2Vjb25kLCB0aW1lUmVnZXgpLFxuICApO1xufVxuXG4vKipcbiAqIEZsYXR0ZW4gYSBKU09OIG9iamVjdCBkb3duIHRvIHN0cmluZyBwYXRocyBmb3IgZWFjaCB2YWx1ZXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBkYXRhXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKGRhdGEpIHtcbiAgY29uc3QgcmVzdWx0ID0ge307XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2UgdGhyb3VnaCB0aGUgb2JqZWN0XG4gICAqIEBwYXJhbSB7Kn0gY3VyXG4gICAqIEBwYXJhbSB7Kn0gcHJvcFxuICAgKi9cbiAgZnVuY3Rpb24gcmVjdXJzZShjdXIsIHByb3ApIHtcbiAgICBpZiAoT2JqZWN0KGN1cikgIT09IGN1cikge1xuICAgICAgcmVzdWx0W3Byb3BdID0gY3VyO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjdXIpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMCwgbCA9IGN1ci5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgcmVjdXJzZShjdXJbaV0sIHByb3AgKyAnWycgKyBpICsgJ10nKTtcbiAgICAgICAgaWYgKGwgPT09IDApIHJlc3VsdFtwcm9wXSA9IFtdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgaXNFbXB0eSA9IHRydWU7XG4gICAgICBmb3IgKGNvbnN0IHAgaW4gY3VyKSB7XG4gICAgICAgIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGN1ciwgcCkpIHtcbiAgICAgICAgICBpc0VtcHR5ID0gZmFsc2U7XG4gICAgICAgICAgcmVjdXJzZShjdXJbcF0sIHByb3AgPyBwcm9wICsgJy4nICsgcCA6IHApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXNFbXB0eSAmJiBwcm9wKSByZXN1bHRbcHJvcF0gPSB7fTtcbiAgICB9XG4gIH1cblxuICByZWN1cnNlKGRhdGEsICcnKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBVbi1mbGF0dGVuIGEgZmxhdCBKU09OIG9iamVjdFxuICogQHBhcmFtIHtvYmplY3R9IGRhdGFcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuZmxhdHRlbihkYXRhKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgaWYgKE9iamVjdChkYXRhKSAhPT0gZGF0YSB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSByZXR1cm4gZGF0YTtcbiAgY29uc3QgcmVnZXggPSAvXFwuPyhbXi5bXFxdXSspfFxcWyhcXGQrKV0vZztcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGZvciAoY29uc3QgcCBpbiBkYXRhKSB7XG4gICAgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwgcCkpIHtcbiAgICAgIGxldCBjdXIgPSByZXN1bHQ7XG4gICAgICBsZXQgcHJvcCA9ICcnO1xuICAgICAgbGV0IG0gPSByZWdleC5leGVjKHApO1xuICAgICAgd2hpbGUgKG0pIHtcbiAgICAgICAgY3VyID0gY3VyW3Byb3BdIHx8IChjdXJbcHJvcF0gPSAobVsyXSA/IFtdIDoge30pKTtcbiAgICAgICAgcHJvcCA9IG1bMl0gfHwgbVsxXTtcbiAgICAgICAgbSA9IHJlZ2V4LmV4ZWMocCk7XG4gICAgICB9XG4gICAgICBjdXJbcHJvcF0gPSBkYXRhW3BdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0WycnXSB8fCByZXN1bHQ7XG59XG5cbi8qKlxuICogQ291bnRzIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXNcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW1cbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50RGVjaW1hbHMobnVtOiBudW1iZXIpIHtcbiAgaWYgKE1hdGguZmxvb3IobnVtKSA9PT0gbnVtIHx8IFN0cmluZyhudW0pLmluZGV4T2YoJy4nKSA8IDApIHJldHVybiAwO1xuICBjb25zdCBwYXJ0cyA9IG51bS50b1N0cmluZygpLnNwbGl0KCcuJylbMV07XG4gIHJldHVybiBwYXJ0cy5sZW5ndGggfHwgMDtcbn1cbiJdfQ==
+/***/ })
+
+/******/ });
+/************************************************************************/
+/******/ // 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] = {
+/******/ // no module.id needed
+/******/ // no module.loaded needed
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/************************************************************************/
+/******/ /* webpack/runtime/compat get default export */
+/******/ !function() {
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function() { return module['default']; } :
+/******/ function() { return module; };
+/******/ __webpack_require__.d(getter, { a: getter });
+/******/ return getter;
+/******/ };
+/******/ }();
+/******/
+/******/ /* webpack/runtime/define property getters */
+/******/ !function() {
+/******/ // define getter functions for harmony exports
+/******/ __webpack_require__.d = function(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/global */
+/******/ !function() {
+/******/ __webpack_require__.g = (function() {
+/******/ if (typeof globalThis === 'object') return globalThis;
+/******/ try {
+/******/ return this || new Function('return this')();
+/******/ } catch (e) {
+/******/ if (typeof window === 'object') return window;
+/******/ }
+/******/ })();
+/******/ }();
+/******/
+/******/ /* webpack/runtime/hasOwnProperty shorthand */
+/******/ !function() {
+/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
+/******/ }();
+/******/
+/******/ /* webpack/runtime/make namespace object */
+/******/ !function() {
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/ }();
+/******/
+/************************************************************************/
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be in strict mode.
+!function() {
+"use strict";
+/*!********************************!*\
+ !*** ./src/exports/scorm12.js ***!
+ \********************************/
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Scorm12API__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Scorm12API */ "./src/Scorm12API.js");
+
+window.Scorm12API = _Scorm12API__WEBPACK_IMPORTED_MODULE_0__["default"];
+}();
+/******/ })()
+;
+//# sourceMappingURL=scorm12.js.map
\ No newline at end of file
diff --git a/dist/scorm12.js.map b/dist/scorm12.js.map
new file mode 100644
index 0000000..c046643
--- /dev/null
+++ b/dist/scorm12.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"scorm12.js","mappings":"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","sources":["webpack://scorm-again/./node_modules/lodash.debounce/index.js","webpack://scorm-again/./src/BaseAPI.js","webpack://scorm-again/./src/Scorm12API.js","webpack://scorm-again/./src/cmi/common.js","webpack://scorm-again/./src/cmi/scorm12_cmi.js","webpack://scorm-again/./src/constants/api_constants.js","webpack://scorm-again/./src/constants/error_codes.js","webpack://scorm-again/./src/constants/regex.js","webpack://scorm-again/./src/exceptions.js","webpack://scorm-again/./src/utilities.js","webpack://scorm-again/webpack/bootstrap","webpack://scorm-again/webpack/runtime/compat get default export","webpack://scorm-again/webpack/runtime/define property getters","webpack://scorm-again/webpack/runtime/global","webpack://scorm-again/webpack/runtime/hasOwnProperty shorthand","webpack://scorm-again/webpack/runtime/make namespace object","webpack://scorm-again/./src/exports/scorm12.js"],"sourcesContent":["/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n","// @flow\nimport {CMIArray} from './cmi/common';\nimport {ValidationError} from './exceptions';\nimport ErrorCodes from './constants/error_codes';\nimport APIConstants from './constants/api_constants';\nimport {unflatten} from './utilities';\nimport debounce from 'lodash.debounce';\n\nconst global_constants = APIConstants.global;\nconst scorm12_error_codes = ErrorCodes.scorm12;\n\n/**\n * Base API class for AICC, SCORM 1.2, and SCORM 2004. Should be considered\n * abstract, and never initialized on it's own.\n */\nexport default class BaseAPI {\n #timeout;\n #error_codes;\n #settings = {\n autocommit: false,\n autocommitSeconds: 10,\n asyncCommit: false,\n sendBeaconCommit: false,\n lmsCommitUrl: false,\n dataCommitFormat: 'json', // valid formats are 'json' or 'flattened', 'params'\n commitRequestDataType: 'application/json;charset=UTF-8',\n autoProgress: false,\n logLevel: global_constants.LOG_LEVEL_ERROR,\n selfReportSessionTime: false,\n alwaysSendTotalTime: false,\n strict_errors: true,\n xhrHeaders: {},\n xhrWithCredentials: false,\n responseHandler: function(xhr) {\n let result;\n if (typeof xhr !== 'undefined') {\n result = JSON.parse(xhr.responseText);\n if (result === null || !{}.hasOwnProperty.call(result, 'result')) {\n result = {};\n if (xhr.status === 200) {\n result.result = global_constants.SCORM_TRUE;\n result.errorCode = 0;\n } else {\n result.result = global_constants.SCORM_FALSE;\n result.errorCode = 101;\n }\n }\n }\n return result;\n },\n requestHandler: function(commitObject) {\n return commitObject;\n },\n onLogMessage: function(messageLevel, logMessage) {\n switch (messageLevel) {\n case global_constants.LOG_LEVEL_ERROR:\n console.error(logMessage);\n break;\n case global_constants.LOG_LEVEL_WARNING:\n console.warn(logMessage);\n break;\n case global_constants.LOG_LEVEL_INFO:\n console.info(logMessage);\n break;\n case global_constants.LOG_LEVEL_DEBUG:\n if (console.debug) {\n console.debug(logMessage);\n } else {\n console.log(logMessage);\n }\n break;\n }\n },\n };\n cmi;\n startingData: {};\n\n /**\n * Constructor for Base API class. Sets some shared API fields, as well as\n * sets up options for the API.\n * @param {object} error_codes\n * @param {object} settings\n */\n constructor(error_codes, settings) {\n if (new.target === BaseAPI) {\n throw new TypeError('Cannot construct BaseAPI instances directly');\n }\n this.currentState = global_constants.STATE_NOT_INITIALIZED;\n this.lastErrorCode = 0;\n this.listenerArray = [];\n\n this.#timeout = null;\n this.#error_codes = error_codes;\n\n this.settings = settings;\n this.apiLogLevel = this.settings.logLevel;\n this.selfReportSessionTime = this.settings.selfReportSessionTime;\n }\n\n /**\n * Initialize the API\n * @param {string} callbackName\n * @param {string} initializeMessage\n * @param {string} terminationMessage\n * @return {string}\n */\n initialize(\n callbackName: String,\n initializeMessage?: String,\n terminationMessage?: String) {\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.isInitialized()) {\n this.throwSCORMError(this.#error_codes.INITIALIZED, initializeMessage);\n } else if (this.isTerminated()) {\n this.throwSCORMError(this.#error_codes.TERMINATED, terminationMessage);\n } else {\n if (this.selfReportSessionTime) {\n this.cmi.setStartTime();\n }\n\n this.currentState = global_constants.STATE_INITIALIZED;\n this.lastErrorCode = 0;\n returnValue = global_constants.SCORM_TRUE;\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Getter for #error_codes\n * @return {object}\n */\n get error_codes() {\n return this.#error_codes;\n }\n\n /**\n * Getter for #settings\n * @return {object}\n */\n get settings() {\n return this.#settings;\n }\n\n /**\n * Setter for #settings\n * @param {object} settings\n */\n set settings(settings: Object) {\n this.#settings = {...this.#settings, ...settings};\n }\n\n /**\n * Terminates the current run of the API\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @return {string}\n */\n terminate(\n callbackName: String,\n checkTerminated: boolean) {\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.checkState(checkTerminated,\n this.#error_codes.TERMINATION_BEFORE_INIT,\n this.#error_codes.MULTIPLE_TERMINATION)) {\n this.currentState = global_constants.STATE_TERMINATED;\n\n const result = this.storeData(true);\n if (!this.settings.sendBeaconCommit && !this.settings.asyncCommit &&\n typeof result.errorCode !== 'undefined' && result.errorCode > 0) {\n this.throwSCORMError(result.errorCode);\n }\n returnValue = (typeof result !== 'undefined' && result.result) ?\n result.result : global_constants.SCORM_FALSE;\n\n if (checkTerminated) this.lastErrorCode = 0;\n\n returnValue = global_constants.SCORM_TRUE;\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Get the value of the CMIElement.\n *\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @param {string} CMIElement\n * @return {string}\n */\n getValue(\n callbackName: String,\n checkTerminated: boolean,\n CMIElement: String) {\n let returnValue;\n\n if (this.checkState(checkTerminated,\n this.#error_codes.RETRIEVE_BEFORE_INIT,\n this.#error_codes.RETRIEVE_AFTER_TERM)) {\n if (checkTerminated) this.lastErrorCode = 0;\n try {\n returnValue = this.getCMIValue(CMIElement);\n } catch (e) {\n if (e instanceof ValidationError) {\n this.lastErrorCode = e.errorCode;\n returnValue = global_constants.SCORM_FALSE;\n } else {\n if (e.message) {\n console.error(e.message);\n } else {\n console.error(e);\n }\n this.throwSCORMError(this.#error_codes.GENERAL);\n }\n }\n this.processListeners(callbackName, CMIElement);\n }\n\n this.apiLog(callbackName, CMIElement, ': returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Sets the value of the CMIElement.\n *\n * @param {string} callbackName\n * @param {string} commitCallback\n * @param {boolean} checkTerminated\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n setValue(\n callbackName: String,\n commitCallback: String,\n checkTerminated: boolean,\n CMIElement,\n value) {\n if (value !== undefined) {\n value = String(value);\n }\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.checkState(checkTerminated, this.#error_codes.STORE_BEFORE_INIT,\n this.#error_codes.STORE_AFTER_TERM)) {\n if (checkTerminated) this.lastErrorCode = 0;\n try {\n returnValue = this.setCMIValue(CMIElement, value);\n } catch (e) {\n if (e instanceof ValidationError) {\n this.lastErrorCode = e.errorCode;\n returnValue = global_constants.SCORM_FALSE;\n } else {\n if (e.message) {\n console.error(e.message);\n } else {\n console.error(e);\n }\n this.throwSCORMError(this.#error_codes.GENERAL);\n }\n }\n this.processListeners(callbackName, CMIElement, value);\n }\n\n if (returnValue === undefined) {\n returnValue = global_constants.SCORM_FALSE;\n }\n\n // If we didn't have any errors while setting the data, go ahead and\n // schedule a commit, if autocommit is turned on\n if (String(this.lastErrorCode) === '0') {\n if (this.settings.autocommit && !this.#timeout) {\n this.scheduleCommit(this.settings.autocommitSeconds * 1000, commitCallback);\n }\n }\n\n this.apiLog(callbackName, CMIElement,\n ': ' + value + ': result: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Orders LMS to store all content parameters\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @return {string}\n */\n commit(\n callbackName: String,\n checkTerminated: boolean) {\n this.clearScheduledCommit();\n\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.checkState(checkTerminated, this.#error_codes.COMMIT_BEFORE_INIT,\n this.#error_codes.COMMIT_AFTER_TERM)) {\n const result = this.storeData(false);\n if (!this.settings.sendBeaconCommit && !this.settings.asyncCommit &&\n result.errorCode && result.errorCode > 0) {\n this.throwSCORMError(result.errorCode);\n }\n returnValue = (typeof result !== 'undefined' && result.result) ?\n result.result : global_constants.SCORM_FALSE;\n\n this.apiLog(callbackName, 'HttpRequest', ' Result: ' + returnValue,\n global_constants.LOG_LEVEL_DEBUG);\n\n if (checkTerminated) this.lastErrorCode = 0;\n\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Returns last error code\n * @param {string} callbackName\n * @return {string}\n */\n getLastError(callbackName: String) {\n const returnValue = String(this.lastErrorCode);\n\n this.processListeners(callbackName);\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Returns the errorNumber error description\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getErrorString(callbackName: String, CMIErrorCode) {\n let returnValue = '';\n\n if (CMIErrorCode !== null && CMIErrorCode !== '') {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Returns a comprehensive description of the errorNumber error.\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getDiagnostic(callbackName: String, CMIErrorCode) {\n let returnValue = '';\n\n if (CMIErrorCode !== null && CMIErrorCode !== '') {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode, true);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Checks the LMS state and ensures it has been initialized.\n *\n * @param {boolean} checkTerminated\n * @param {number} beforeInitError\n * @param {number} afterTermError\n * @return {boolean}\n */\n checkState(\n checkTerminated: boolean,\n beforeInitError: number,\n afterTermError?: number) {\n if (this.isNotInitialized()) {\n this.throwSCORMError(beforeInitError);\n return false;\n } else if (checkTerminated && this.isTerminated()) {\n this.throwSCORMError(afterTermError);\n return false;\n }\n\n return true;\n }\n\n /**\n * Logging for all SCORM actions\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {string} logMessage\n * @param {number}messageLevel\n */\n apiLog(\n functionName: String,\n CMIElement: String,\n logMessage: String,\n messageLevel: number) {\n logMessage = this.formatMessage(functionName, CMIElement, logMessage);\n\n if (messageLevel >= this.apiLogLevel) {\n this.settings.onLogMessage(messageLevel, logMessage);\n }\n }\n\n /**\n * Formats the SCORM messages for easy reading\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {string} message\n * @return {string}\n */\n formatMessage(functionName: String, CMIElement: String, message: String) {\n const baseLength = 20;\n let messageString = '';\n\n messageString += functionName;\n\n let fillChars = baseLength - messageString.length;\n\n for (let i = 0; i < fillChars; i++) {\n messageString += ' ';\n }\n\n messageString += ': ';\n\n if (CMIElement) {\n const CMIElementBaseLength = 70;\n\n messageString += CMIElement;\n\n fillChars = CMIElementBaseLength - messageString.length;\n\n for (let j = 0; j < fillChars; j++) {\n messageString += ' ';\n }\n }\n\n if (message) {\n messageString += message;\n }\n\n return messageString;\n }\n\n /**\n * Checks to see if {str} contains {tester}\n *\n * @param {string} str String to check against\n * @param {string} tester String to check for\n * @return {boolean}\n */\n stringMatches(str: String, tester: String) {\n return str && tester && str.match(tester);\n }\n\n /**\n * Check to see if the specific object has the given property\n * @param {*} refObject\n * @param {string} attribute\n * @return {boolean}\n * @private\n */\n _checkObjectHasProperty(refObject, attribute: String) {\n return Object.hasOwnProperty.call(refObject, attribute) ||\n Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(refObject), attribute) ||\n (attribute in refObject);\n }\n\n /**\n * Returns the message that corresponds to errorNumber\n * APIs that inherit BaseAPI should override this function\n *\n * @param {(string|number)} _errorNumber\n * @param {boolean} _detail\n * @return {string}\n * @abstract\n */\n getLmsErrorMessageDetails(_errorNumber, _detail) {\n throw new Error(\n 'The getLmsErrorMessageDetails method has not been implemented');\n }\n\n /**\n * Gets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @return {string}\n * @abstract\n */\n getCMIValue(_CMIElement) {\n throw new Error('The getCMIValue method has not been implemented');\n }\n\n /**\n * Sets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @param {any} _value\n * @return {string}\n * @abstract\n */\n setCMIValue(_CMIElement, _value) {\n throw new Error('The setCMIValue method has not been implemented');\n }\n\n /**\n * Shared API method to set a valid for a given element.\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n _commonSetCMIValue(\n methodName: String, scorm2004: boolean, CMIElement, value) {\n if (!CMIElement || CMIElement === '') {\n return global_constants.SCORM_FALSE;\n }\n\n const structure = CMIElement.split('.');\n let refObject = this;\n let returnValue = global_constants.SCORM_FALSE;\n let foundFirstIndex = false;\n\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004 ?\n this.#error_codes.UNDEFINED_DATA_MODEL :\n this.#error_codes.GENERAL;\n\n for (let i = 0; i < structure.length; i++) {\n const attribute = structure[i];\n\n if (i === structure.length - 1) {\n if (scorm2004 && (attribute.substr(0, 8) === '{target=') &&\n (typeof refObject._isTargetValid == 'function')) {\n this.throwSCORMError(this.#error_codes.READ_ONLY_ELEMENT);\n } else if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n } else {\n if (this.isInitialized() &&\n this.stringMatches(CMIElement, '\\\\.correct_responses\\\\.\\\\d+')) {\n this.validateCorrectResponse(CMIElement, value);\n }\n\n if (!scorm2004 || this.lastErrorCode === 0) {\n refObject[attribute] = value;\n returnValue = global_constants.SCORM_TRUE;\n }\n }\n } else {\n refObject = refObject[attribute];\n if (!refObject) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[i + 1], 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n foundFirstIndex = true;\n } else {\n const newChild = this.getChildElement(CMIElement, value,\n foundFirstIndex);\n foundFirstIndex = true;\n\n if (!newChild) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n } else {\n if (refObject.initialized) newChild.initialize();\n\n refObject.childArray.push(newChild);\n refObject = newChild;\n }\n }\n\n // Have to update i value to skip the array position\n i++;\n }\n }\n }\n }\n\n if (returnValue === global_constants.SCORM_FALSE) {\n this.apiLog(methodName, null,\n `There was an error setting the value for: ${CMIElement}, value of: ${value}`,\n global_constants.LOG_LEVEL_WARNING);\n }\n\n return returnValue;\n }\n\n /**\n * Abstract method for validating that a response is correct.\n *\n * @param {string} _CMIElement\n * @param {*} _value\n */\n validateCorrectResponse(_CMIElement, _value) {\n // just a stub method\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n * APIs that inherit BaseAPI should override this method.\n *\n * @param {string} _CMIElement - unused\n * @param {*} _value - unused\n * @param {boolean} _foundFirstIndex - unused\n * @return {*}\n * @abstract\n */\n getChildElement(_CMIElement, _value, _foundFirstIndex) {\n throw new Error('The getChildElement method has not been implemented');\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @return {*}\n */\n _commonGetCMIValue(methodName: String, scorm2004: boolean, CMIElement) {\n if (!CMIElement || CMIElement === '') {\n return '';\n }\n\n const structure = CMIElement.split('.');\n let refObject = this;\n let attribute = null;\n\n const uninitializedErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) has not been initialized.`;\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004 ?\n this.#error_codes.UNDEFINED_DATA_MODEL :\n this.#error_codes.GENERAL;\n\n for (let i = 0; i < structure.length; i++) {\n attribute = structure[i];\n\n if (!scorm2004) {\n if (i === structure.length - 1) {\n if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n } else {\n if ((String(attribute).substr(0, 8) === '{target=') &&\n (typeof refObject._isTargetValid == 'function')) {\n const target = String(attribute).substr(8, String(attribute).length - 9);\n return refObject._isTargetValid(target);\n } else if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n\n refObject = refObject[attribute];\n if (refObject === undefined) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[i + 1], 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n } else {\n this.throwSCORMError(this.#error_codes.VALUE_NOT_INITIALIZED,\n uninitializedErrorMessage);\n break;\n }\n\n // Have to update i value to skip the array position\n i++;\n }\n }\n }\n\n if (refObject === null || refObject === undefined) {\n if (!scorm2004) {\n if (attribute === '_children') {\n this.throwSCORMError(scorm12_error_codes.CHILDREN_ERROR);\n } else if (attribute === '_count') {\n this.throwSCORMError(scorm12_error_codes.COUNT_ERROR);\n }\n }\n } else {\n return refObject;\n }\n }\n\n /**\n * Returns true if the API's current state is STATE_INITIALIZED\n *\n * @return {boolean}\n */\n isInitialized() {\n return this.currentState === global_constants.STATE_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_NOT_INITIALIZED\n *\n * @return {boolean}\n */\n isNotInitialized() {\n return this.currentState === global_constants.STATE_NOT_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_TERMINATED\n *\n * @return {boolean}\n */\n isTerminated() {\n return this.currentState === global_constants.STATE_TERMINATED;\n }\n\n /**\n * Provides a mechanism for attaching to a specific SCORM event\n *\n * @param {string} listenerName\n * @param {function} callback\n */\n on(listenerName: String, callback: function) {\n if (!callback) return;\n\n const listenerFunctions = listenerName.split(' ');\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split('.');\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + '.', '');\n }\n\n this.listenerArray.push({\n functionName: functionName,\n CMIElement: CMIElement,\n callback: callback,\n });\n\n this.apiLog('on', functionName, `Added event listener: ${this.listenerArray.length}`, global_constants.LOG_LEVEL_INFO);\n }\n }\n\n /**\n * Provides a mechanism for detaching a specific SCORM event listener\n *\n * @param {string} listenerName\n * @param {function} callback\n */\n off(listenerName: String, callback: function) {\n if (!callback) return;\n\n const listenerFunctions = listenerName.split(' ');\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split('.');\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + '.', '');\n }\n\n const removeIndex = this.listenerArray.findIndex((obj) =>\n obj.functionName === functionName &&\n obj.CMIElement === CMIElement &&\n obj.callback === callback,\n );\n if (removeIndex !== -1) {\n this.listenerArray.splice(removeIndex, 1);\n this.apiLog('off', functionName, `Removed event listener: ${this.listenerArray.length}`, global_constants.LOG_LEVEL_INFO);\n }\n }\n }\n\n /**\n * Provides a mechanism for clearing all listeners from a specific SCORM event\n *\n * @param {string} listenerName\n */\n clear(listenerName: String) {\n const listenerFunctions = listenerName.split(' ');\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split('.');\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + '.', '');\n }\n\n this.listenerArray = this.listenerArray.filter((obj) =>\n obj.functionName !== functionName &&\n obj.CMIElement !== CMIElement,\n );\n }\n }\n\n /**\n * Processes any 'on' listeners that have been created\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {*} value\n */\n processListeners(functionName: String, CMIElement: String, value: any) {\n this.apiLog(functionName, CMIElement, value);\n for (let i = 0; i < this.listenerArray.length; i++) {\n const listener = this.listenerArray[i];\n const functionsMatch = listener.functionName === functionName;\n const listenerHasCMIElement = !!listener.CMIElement;\n let CMIElementsMatch = false;\n if (CMIElement && listener.CMIElement &&\n listener.CMIElement.substring(listener.CMIElement.length - 1) ===\n '*') {\n CMIElementsMatch = CMIElement.indexOf(listener.CMIElement.substring(0,\n listener.CMIElement.length - 1)) === 0;\n } else {\n CMIElementsMatch = listener.CMIElement === CMIElement;\n }\n\n if (functionsMatch && (!listenerHasCMIElement || CMIElementsMatch)) {\n listener.callback(CMIElement, value);\n }\n }\n }\n\n /**\n * Throws a SCORM error\n *\n * @param {number} errorNumber\n * @param {string} message\n */\n throwSCORMError(errorNumber: number, message: String) {\n if (!message) {\n message = this.getLmsErrorMessageDetails(errorNumber);\n }\n\n this.apiLog('throwSCORMError', null, errorNumber + ': ' + message,\n global_constants.LOG_LEVEL_ERROR);\n\n this.lastErrorCode = String(errorNumber);\n }\n\n /**\n * Clears the last SCORM error code on success.\n *\n * @param {string} success\n */\n clearSCORMError(success: String) {\n if (success !== undefined && success !== global_constants.SCORM_FALSE) {\n this.lastErrorCode = 0;\n }\n }\n\n /**\n * Attempts to store the data to the LMS, logs data if no LMS configured\n * APIs that inherit BaseAPI should override this function\n *\n * @param {boolean} _calculateTotalTime\n * @return {string}\n * @abstract\n */\n storeData(_calculateTotalTime) {\n throw new Error(\n 'The storeData method has not been implemented');\n }\n\n /**\n * Load the CMI from a flattened JSON object\n * @param {object} json\n * @param {string} CMIElement\n */\n loadFromFlattenedJSON(json, CMIElement) {\n if (!this.isNotInitialized()) {\n console.error(\n 'loadFromFlattenedJSON can only be called before the call to lmsInitialize.');\n return;\n }\n\n /**\n * Test match pattern.\n *\n * @param {string} a\n * @param {string} c\n * @param {RegExp} a_pattern\n * @return {number}\n */\n function testPattern(a, c, a_pattern) {\n const a_match = a.match(a_pattern);\n\n let c_match;\n if (a_match !== null && (c_match = c.match(a_pattern)) !== null) {\n const a_num = Number(a_match[2]);\n const c_num = Number(c_match[2]);\n if (a_num === c_num) {\n if (a_match[3] === 'id') {\n return -1;\n } else if (a_match[3] === 'type') {\n if (c_match[3] === 'id') {\n return 1;\n } else {\n return -1;\n }\n } else {\n return 1;\n }\n }\n return a_num - c_num;\n }\n\n return null;\n }\n\n const int_pattern = /^(cmi\\.interactions\\.)(\\d+)\\.(.*)$/;\n const obj_pattern = /^(cmi\\.objectives\\.)(\\d+)\\.(.*)$/;\n\n const result = Object.keys(json).map(function(key) {\n return [String(key), json[key]];\n });\n\n // CMI interactions need to have id and type loaded before any other fields\n result.sort(function([a, b], [c, d]) {\n let test;\n if ((test = testPattern(a, c, int_pattern)) !== null) {\n return test;\n }\n if ((test = testPattern(a, c, obj_pattern)) !== null) {\n return test;\n }\n\n if (a < c) {\n return -1;\n }\n if (a > c) {\n return 1;\n }\n return 0;\n });\n\n let obj;\n result.forEach((element) => {\n obj = {};\n obj[element[0]] = element[1];\n this.loadFromJSON(unflatten(obj), CMIElement);\n });\n }\n\n /**\n * Loads CMI data from a JSON object.\n *\n * @param {object} json\n * @param {string} CMIElement\n */\n loadFromJSON(json, CMIElement) {\n if (!this.isNotInitialized()) {\n console.error(\n 'loadFromJSON can only be called before the call to lmsInitialize.');\n return;\n }\n\n CMIElement = CMIElement !== undefined ? CMIElement : 'cmi';\n\n this.startingData = json;\n\n // could this be refactored down to flatten(json) then setCMIValue on each?\n for (const key in json) {\n if ({}.hasOwnProperty.call(json, key) && json[key]) {\n const currentCMIElement = (CMIElement ? CMIElement + '.' : '') + key;\n const value = json[key];\n\n if (value['childArray']) {\n for (let i = 0; i < value['childArray'].length; i++) {\n this.loadFromJSON(value['childArray'][i],\n currentCMIElement + '.' + i);\n }\n } else if (value.constructor === Object) {\n this.loadFromJSON(value, currentCMIElement);\n } else {\n this.setCMIValue(currentCMIElement, value);\n }\n }\n }\n }\n\n /**\n * Render the CMI object to JSON for sending to an LMS.\n *\n * @return {string}\n */\n renderCMIToJSONString() {\n const cmi = this.cmi;\n // Do we want/need to return fields that have no set value?\n // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);\n return JSON.stringify({cmi});\n }\n\n /**\n * Returns a JS object representing the current cmi\n * @return {object}\n */\n renderCMIToJSONObject() {\n // Do we want/need to return fields that have no set value?\n // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);\n return JSON.parse(this.renderCMIToJSONString());\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n * APIs that inherit BaseAPI should override this function\n *\n * @param {boolean} _terminateCommit\n * @return {*}\n * @abstract\n */\n renderCommitCMI(_terminateCommit) {\n throw new Error(\n 'The storeData method has not been implemented');\n }\n\n /**\n * Send the request to the LMS\n * @param {string} url\n * @param {object|Array} params\n * @param {boolean} immediate\n * @return {object}\n */\n processHttpRequest(url: String, params, immediate = false) {\n const api = this;\n const process = function(url, params, settings, error_codes) {\n const genericError = {\n 'result': global_constants.SCORM_FALSE,\n 'errorCode': error_codes.GENERAL,\n };\n\n let result;\n if (!settings.sendBeaconCommit) {\n const httpReq = new XMLHttpRequest();\n httpReq.open('POST', url, settings.asyncCommit);\n\n if (Object.keys(settings.xhrHeaders).length) {\n Object.keys(settings.xhrHeaders).forEach((header) => {\n httpReq.setRequestHeader(header, settings.xhrHeaders[header]);\n });\n }\n\n httpReq.withCredentials = settings.xhrWithCredentials;\n\n if (settings.asyncCommit) {\n httpReq.onload = function(e) {\n if (typeof settings.responseHandler === 'function') {\n result = settings.responseHandler(httpReq);\n } else {\n result = JSON.parse(httpReq.responseText);\n }\n };\n }\n try {\n params = settings.requestHandler(params);\n if (params instanceof Array) {\n httpReq.setRequestHeader('Content-Type',\n 'application/x-www-form-urlencoded');\n httpReq.send(params.join('&'));\n } else {\n httpReq.setRequestHeader('Content-Type',\n settings.commitRequestDataType);\n httpReq.send(JSON.stringify(params));\n }\n\n if (!settings.asyncCommit) {\n if (typeof settings.responseHandler === 'function') {\n result = settings.responseHandler(httpReq);\n } else {\n result = JSON.parse(httpReq.responseText);\n }\n } else {\n result = {};\n result.result = global_constants.SCORM_TRUE;\n result.errorCode = 0;\n api.processListeners('CommitSuccess');\n return result;\n }\n } catch (e) {\n console.error(e);\n api.processListeners('CommitError');\n return genericError;\n }\n } else {\n try {\n const headers = {\n type: settings.commitRequestDataType,\n };\n let blob;\n if (params instanceof Array) {\n blob = new Blob([params.join('&')], headers);\n } else {\n blob = new Blob([JSON.stringify(params)], headers);\n }\n\n result = {};\n if (navigator.sendBeacon(url, blob)) {\n result.result = global_constants.SCORM_TRUE;\n result.errorCode = 0;\n } else {\n result.result = global_constants.SCORM_FALSE;\n result.errorCode = 101;\n }\n } catch (e) {\n console.error(e);\n api.processListeners('CommitError');\n return genericError;\n }\n }\n\n if (typeof result === 'undefined') {\n api.processListeners('CommitError');\n return genericError;\n }\n\n if (result.result === true ||\n result.result === global_constants.SCORM_TRUE) {\n api.processListeners('CommitSuccess');\n } else {\n api.processListeners('CommitError');\n }\n\n return result;\n };\n\n if (typeof debounce !== 'undefined') {\n const debounced = debounce(process, 500);\n debounced(url, params, this.settings, this.error_codes);\n\n // if we're terminating, go ahead and commit immediately\n if (immediate) {\n debounced.flush();\n }\n\n return {\n result: global_constants.SCORM_TRUE,\n errorCode: 0,\n };\n } else {\n return process(url, params, this.settings, this.error_codes);\n }\n }\n\n /**\n * Throws a SCORM error\n *\n * @param {number} when - the number of milliseconds to wait before committing\n * @param {string} callback - the name of the commit event callback\n */\n scheduleCommit(when: number, callback: string) {\n this.#timeout = new ScheduledCommit(this, when, callback);\n this.apiLog('scheduleCommit', '', 'scheduled',\n global_constants.LOG_LEVEL_DEBUG);\n }\n\n /**\n * Clears and cancels any currently scheduled commits\n */\n clearScheduledCommit() {\n if (this.#timeout) {\n this.#timeout.cancel();\n this.#timeout = null;\n this.apiLog('clearScheduledCommit', '', 'cleared',\n global_constants.LOG_LEVEL_DEBUG);\n }\n }\n}\n\n/**\n * Private class that wraps a timeout call to the commit() function\n */\nclass ScheduledCommit {\n #API;\n #cancelled = false;\n #timeout;\n #callback;\n\n /**\n * Constructor for ScheduledCommit\n * @param {BaseAPI} API\n * @param {number} when\n * @param {string} callback\n */\n constructor(API: any, when: number, callback: string) {\n this.#API = API;\n this.#timeout = setTimeout(this.wrapper.bind(this), when);\n this.#callback = callback;\n }\n\n /**\n * Cancel any currently scheduled commit\n */\n cancel() {\n this.#cancelled = true;\n if (this.#timeout) {\n clearTimeout(this.#timeout);\n }\n }\n\n /**\n * Wrap the API commit call to check if the call has already been cancelled\n */\n wrapper() {\n if (!this.#cancelled) {\n this.#API.commit(this.#callback);\n }\n }\n}\n","// @flow\nimport BaseAPI from './BaseAPI';\nimport {\n CMI,\n CMIInteractionsCorrectResponsesObject,\n CMIInteractionsObject,\n CMIInteractionsObjectivesObject,\n CMIObjectivesObject, NAV,\n} from './cmi/scorm12_cmi';\nimport * as Utilities from './utilities';\nimport APIConstants from './constants/api_constants';\nimport ErrorCodes from './constants/error_codes';\n\nconst scorm12_constants = APIConstants.scorm12;\nconst global_constants = APIConstants.global;\nconst scorm12_error_codes = ErrorCodes.scorm12;\n\n/**\n * API class for SCORM 1.2\n */\nexport default class Scorm12API extends BaseAPI {\n /**\n * Constructor for SCORM 1.2 API\n * @param {object} settings\n */\n constructor(settings: {}) {\n const finalSettings = {\n ...{\n mastery_override: false,\n }, ...settings,\n };\n\n super(scorm12_error_codes, finalSettings);\n\n this.cmi = new CMI();\n this.nav = new NAV();\n\n // Rename functions to match 1.2 Spec and expose to modules\n this.LMSInitialize = this.lmsInitialize;\n this.LMSFinish = this.lmsFinish;\n this.LMSGetValue = this.lmsGetValue;\n this.LMSSetValue = this.lmsSetValue;\n this.LMSCommit = this.lmsCommit;\n this.LMSGetLastError = this.lmsGetLastError;\n this.LMSGetErrorString = this.lmsGetErrorString;\n this.LMSGetDiagnostic = this.lmsGetDiagnostic;\n }\n\n /**\n * lmsInitialize function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsInitialize() {\n this.cmi.initialize();\n return this.initialize('LMSInitialize', 'LMS was already initialized!',\n 'LMS is already finished!');\n }\n\n /**\n * LMSFinish function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsFinish() {\n const result = this.terminate('LMSFinish', true);\n\n if (result === global_constants.SCORM_TRUE) {\n if (this.nav.event !== '') {\n if (this.nav.event === 'continue') {\n this.processListeners('SequenceNext');\n } else {\n this.processListeners('SequencePrevious');\n }\n } else if (this.settings.autoProgress) {\n this.processListeners('SequenceNext');\n }\n }\n\n return result;\n }\n\n /**\n * LMSGetValue function from SCORM 1.2 Spec\n *\n * @param {string} CMIElement\n * @return {string}\n */\n lmsGetValue(CMIElement) {\n return this.getValue('LMSGetValue', false, CMIElement);\n }\n\n /**\n * LMSSetValue function from SCORM 1.2 Spec\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n lmsSetValue(CMIElement, value) {\n return this.setValue('LMSSetValue', 'LMSCommit', false, CMIElement, value);\n }\n\n /**\n * LMSCommit function from SCORM 1.2 Spec\n *\n * @return {string} bool\n */\n lmsCommit() {\n return this.commit('LMSCommit', false);\n }\n\n /**\n * LMSGetLastError function from SCORM 1.2 Spec\n *\n * @return {string}\n */\n lmsGetLastError() {\n return this.getLastError('LMSGetLastError');\n }\n\n /**\n * LMSGetErrorString function from SCORM 1.2 Spec\n *\n * @param {string} CMIErrorCode\n * @return {string}\n */\n lmsGetErrorString(CMIErrorCode) {\n return this.getErrorString('LMSGetErrorString', CMIErrorCode);\n }\n\n /**\n * LMSGetDiagnostic function from SCORM 1.2 Spec\n *\n * @param {string} CMIErrorCode\n * @return {string}\n */\n lmsGetDiagnostic(CMIErrorCode) {\n return this.getDiagnostic('LMSGetDiagnostic', CMIErrorCode);\n }\n\n /**\n * Sets a value on the CMI Object\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n setCMIValue(CMIElement, value) {\n return this._commonSetCMIValue('LMSSetValue', false, CMIElement, value);\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} CMIElement\n * @return {*}\n */\n getCMIValue(CMIElement) {\n return this._commonGetCMIValue('getCMIValue', false, CMIElement);\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n *\n * @param {string} CMIElement\n * @param {*} value\n * @param {boolean} foundFirstIndex\n * @return {object}\n */\n getChildElement(CMIElement, value, foundFirstIndex) {\n let newChild;\n\n if (this.stringMatches(CMIElement, 'cmi\\\\.objectives\\\\.\\\\d+')) {\n newChild = new CMIObjectivesObject();\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d+\\\\.correct_responses\\\\.\\\\d+')) {\n newChild = new CMIInteractionsCorrectResponsesObject();\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d+\\\\.objectives\\\\.\\\\d+')) {\n newChild = new CMIInteractionsObjectivesObject();\n } else if (!foundFirstIndex &&\n this.stringMatches(CMIElement, 'cmi\\\\.interactions\\\\.\\\\d+')) {\n newChild = new CMIInteractionsObject();\n }\n\n return newChild;\n }\n\n /**\n * Validates Correct Response values\n *\n * @param {string} CMIElement\n * @param {*} value\n * @return {boolean}\n */\n validateCorrectResponse(CMIElement, value) {\n return true;\n }\n\n /**\n * Returns the message that corresponds to errorNumber.\n *\n * @param {*} errorNumber\n * @param {boolean} detail\n * @return {string}\n */\n getLmsErrorMessageDetails(errorNumber, detail) {\n let basicMessage = 'No Error';\n let detailMessage = 'No Error';\n\n // Set error number to string since inconsistent from modules if string or number\n errorNumber = String(errorNumber);\n if (scorm12_constants.error_descriptions[errorNumber]) {\n basicMessage = scorm12_constants.error_descriptions[errorNumber].basicMessage;\n detailMessage = scorm12_constants.error_descriptions[errorNumber].detailMessage;\n }\n\n return detail ? detailMessage : basicMessage;\n }\n\n /**\n * Replace the whole API with another\n *\n * @param {Scorm12API} newAPI\n */\n replaceWithAnotherScormAPI(newAPI) {\n // Data Model\n this.cmi = newAPI.cmi;\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n *\n * @param {boolean} terminateCommit\n * @return {object|Array}\n */\n renderCommitCMI(terminateCommit: boolean) {\n const cmiExport = this.renderCMIToJSONObject();\n\n if (terminateCommit) {\n cmiExport.cmi.core.total_time = this.cmi.getCurrentTotalTime();\n }\n\n const result = [];\n const flattened = Utilities.flatten(cmiExport);\n switch (this.settings.dataCommitFormat) {\n case 'flattened':\n return Utilities.flatten(cmiExport);\n case 'params':\n for (const item in flattened) {\n if ({}.hasOwnProperty.call(flattened, item)) {\n result.push(`${item}=${flattened[item]}`);\n }\n }\n return result;\n case 'json':\n default:\n return cmiExport;\n }\n }\n\n /**\n * Attempts to store the data to the LMS\n *\n * @param {boolean} terminateCommit\n * @return {string}\n */\n storeData(terminateCommit: boolean) {\n if (terminateCommit) {\n const originalStatus = this.cmi.core.lesson_status;\n if (originalStatus === 'not attempted') {\n this.cmi.core.lesson_status = 'completed';\n }\n\n if (this.cmi.core.lesson_mode === 'normal') {\n if (this.cmi.core.credit === 'credit') {\n if (this.settings.mastery_override &&\n this.cmi.student_data.mastery_score !== '' &&\n this.cmi.core.score.raw !== '') {\n if (parseFloat(this.cmi.core.score.raw) >= parseFloat(this.cmi.student_data.mastery_score)) {\n this.cmi.core.lesson_status = 'passed';\n } else {\n this.cmi.core.lesson_status = 'failed';\n }\n }\n }\n } else if (this.cmi.core.lesson_mode === 'browse') {\n if ((this.startingData?.cmi?.core?.lesson_status || '') === '' && originalStatus === 'not attempted') {\n this.cmi.core.lesson_status = 'browsed';\n }\n }\n }\n\n const commitObject = this.renderCommitCMI(terminateCommit ||\n this.settings.alwaysSendTotalTime);\n\n if (this.apiLogLevel === global_constants.LOG_LEVEL_DEBUG) {\n console.debug('Commit (terminated: ' + (terminateCommit ? 'yes' : 'no') + '): ');\n console.debug(commitObject);\n }\n if (this.settings.lmsCommitUrl) {\n return this.processHttpRequest(this.settings.lmsCommitUrl, commitObject, terminateCommit);\n } else {\n return global_constants.SCORM_TRUE;\n }\n }\n}\n","// @flow\nimport APIConstants from '../constants/api_constants';\nimport ErrorCodes from '../constants/error_codes';\nimport Regex from '../constants/regex';\n\nconst scorm12_constants = APIConstants.scorm12;\nconst scorm12_regex = Regex.scorm12;\nconst scorm12_error_codes = ErrorCodes.scorm12;\n\n/**\n * Check if the value matches the proper format. If not, throw proper error code.\n *\n * @param {string} value\n * @param {string} regexPattern\n * @param {number} errorCode\n * @param {class} errorClass\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function checkValidFormat(\n value: String,\n regexPattern: String,\n errorCode: number,\n errorClass: function,\n allowEmptyString?: boolean) {\n const formatRegex = new RegExp(regexPattern);\n const matches = value.match(formatRegex);\n if (allowEmptyString && value === '') {\n return true;\n }\n if (value === undefined || !matches || matches[0] === '') {\n throw new errorClass.prototype.constructor(errorCode);\n }\n return true;\n}\n\n/**\n * Check if the value matches the proper range. If not, throw proper error code.\n *\n * @param {*} value\n * @param {string} rangePattern\n * @param {number} errorCode\n * @param {class} errorClass\n * @return {boolean}\n */\nexport function checkValidRange(\n value: any,\n rangePattern: String,\n errorCode: number,\n errorClass: function) {\n const ranges = rangePattern.split('#');\n value = value * 1.0;\n if (value >= ranges[0]) {\n if ((ranges[1] === '*') || (value <= ranges[1])) {\n return true;\n } else {\n throw new errorClass.prototype.constructor(errorCode);\n }\n } else {\n throw new errorClass.prototype.constructor(errorCode);\n }\n}\n\n/**\n * Base class for API cmi objects\n */\nexport class BaseCMI {\n jsonString = false;\n #initialized = false;\n #start_time;\n\n /**\n * Constructor for BaseCMI, just marks the class as abstract\n */\n constructor() {\n if (new.target === BaseCMI) {\n throw new TypeError('Cannot construct BaseCMI instances directly');\n }\n }\n\n /**\n * Getter for #initialized\n * @return {boolean}\n */\n get initialized() {\n return this.#initialized;\n }\n\n /**\n * Getter for #start_time\n * @return {Number}\n */\n get start_time() {\n return this.#start_time;\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n this.#initialized = true;\n }\n\n /**\n * Called when the player should override the 'session_time' provided by\n * the module\n */\n setStartTime() {\n this.#start_time = new Date().getTime();\n }\n}\n\n/**\n * Base class for cmi *.score objects\n */\nexport class CMIScore extends BaseCMI {\n /**\n * Constructor for *.score\n * @param {string} score_children\n * @param {string} score_range\n * @param {string} max\n * @param {number} invalidErrorCode\n * @param {number} invalidTypeCode\n * @param {number} invalidRangeCode\n * @param {string} decimalRegex\n * @param {class} errorClass\n */\n constructor(\n {\n score_children,\n score_range,\n max,\n invalidErrorCode,\n invalidTypeCode,\n invalidRangeCode,\n decimalRegex,\n errorClass,\n }) {\n super();\n\n this.#_children = score_children ||\n scorm12_constants.score_children;\n this.#_score_range = !score_range ? false : scorm12_regex.score_range;\n this.#max = (max || max === '') ? max : '100';\n this.#_invalid_error_code = invalidErrorCode ||\n scorm12_error_codes.INVALID_SET_VALUE;\n this.#_invalid_type_code = invalidTypeCode ||\n scorm12_error_codes.TYPE_MISMATCH;\n this.#_invalid_range_code = invalidRangeCode ||\n scorm12_error_codes.VALUE_OUT_OF_RANGE;\n this.#_decimal_regex = decimalRegex ||\n scorm12_regex.CMIDecimal;\n this.#_error_class = errorClass;\n }\n\n #_children;\n #_score_range;\n #_invalid_error_code;\n #_invalid_type_code;\n #_invalid_range_code;\n #_decimal_regex;\n #_error_class;\n #raw = '';\n #min = '';\n #max;\n\n /**\n * Getter for _children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throw new this.#_error_class.prototype.constructor(this.#_invalid_error_code);\n }\n\n /**\n * Getter for #raw\n * @return {string}\n */\n get raw() {\n return this.#raw;\n }\n\n /**\n * Setter for #raw\n * @param {string} raw\n */\n set raw(raw) {\n if (checkValidFormat(raw, this.#_decimal_regex, this.#_invalid_type_code, this.#_error_class) &&\n (!this.#_score_range ||\n checkValidRange(raw, this.#_score_range, this.#_invalid_range_code, this.#_error_class))) {\n this.#raw = raw;\n }\n }\n\n /**\n * Getter for #min\n * @return {string}\n */\n get min() {\n return this.#min;\n }\n\n /**\n * Setter for #min\n * @param {string} min\n */\n set min(min) {\n if (checkValidFormat(min, this.#_decimal_regex, this.#_invalid_type_code, this.#_error_class) &&\n (!this.#_score_range ||\n checkValidRange(min, this.#_score_range, this.#_invalid_range_code, this.#_error_class))) {\n this.#min = min;\n }\n }\n\n /**\n * Getter for #max\n * @return {string}\n */\n get max() {\n return this.#max;\n }\n\n /**\n * Setter for #max\n * @param {string} max\n */\n set max(max) {\n if (checkValidFormat(max, this.#_decimal_regex, this.#_invalid_type_code, this.#_error_class) &&\n (!this.#_score_range ||\n checkValidRange(max, this.#_score_range, this.#_invalid_range_code, this.#_error_class))) {\n this.#max = max;\n }\n }\n\n /**\n * toJSON for *.score\n * @return {{min: string, max: string, raw: string}}\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'raw': this.raw,\n 'min': this.min,\n 'max': this.max,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Base class for cmi *.n objects\n */\nexport class CMIArray extends BaseCMI {\n /**\n * Constructor cmi *.n arrays\n * @param {string} children\n * @param {number} errorCode\n * @param {class} errorClass\n */\n constructor({children, errorCode, errorClass}) {\n super();\n this.#_children = children;\n this.#errorCode = errorCode;\n this.#errorClass = errorClass;\n this.childArray = [];\n }\n\n #errorCode;\n #errorClass;\n #_children;\n\n /**\n * Getter for _children\n * @return {*}\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n */\n set _children(_children) {\n throw new this.#errorClass.prototype.constructor(this.#errorCode);\n }\n\n /**\n * Getter for _count\n * @return {number}\n */\n get _count() {\n return this.childArray.length;\n }\n\n /**\n * Setter for _count. Just throws an error.\n * @param {number} _count\n */\n set _count(_count) {\n throw new this.#errorClass.prototype.constructor(this.#errorCode);\n }\n\n /**\n * toJSON for *.n arrays\n * @return {object}\n */\n toJSON() {\n this.jsonString = true;\n const result = {};\n for (let i = 0; i < this.childArray.length; i++) {\n result[i + ''] = this.childArray[i];\n }\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\nimport {\n BaseCMI,\n checkValidFormat,\n checkValidRange,\n CMIArray,\n CMIScore,\n} from './common';\nimport APIConstants from '../constants/api_constants';\nimport ErrorCodes from '../constants/error_codes';\nimport Regex from '../constants/regex';\nimport {Scorm12ValidationError} from '../exceptions';\nimport * as Utilities from '../utilities';\nimport * as Util from '../utilities';\n\nconst scorm12_constants = APIConstants.scorm12;\nconst scorm12_regex = Regex.scorm12;\nconst scorm12_error_codes = ErrorCodes.scorm12;\n\n/**\n * Helper method for throwing Read Only error\n */\nexport function throwReadOnlyError() {\n throw new Scorm12ValidationError(scorm12_error_codes.READ_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Write Only error\n */\nexport function throwWriteOnlyError() {\n throw new Scorm12ValidationError(scorm12_error_codes.WRITE_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Invalid Set error\n */\nfunction throwInvalidValueError() {\n throw new Scorm12ValidationError(scorm12_error_codes.INVALID_SET_VALUE);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} regexPattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function check12ValidFormat(\n value: String,\n regexPattern: String,\n allowEmptyString?: boolean) {\n return checkValidFormat(\n value,\n regexPattern,\n scorm12_error_codes.TYPE_MISMATCH,\n Scorm12ValidationError,\n allowEmptyString\n );\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} rangePattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function check12ValidRange(\n value: any,\n rangePattern: String,\n allowEmptyString?: boolean) {\n return checkValidRange(\n value,\n rangePattern,\n scorm12_error_codes.VALUE_OUT_OF_RANGE,\n Scorm12ValidationError,\n allowEmptyString\n );\n}\n\n/**\n * Class representing the cmi object for SCORM 1.2\n */\nexport class CMI extends BaseCMI {\n #_children = '';\n #_version = '3.4';\n #launch_data = '';\n #comments = '';\n #comments_from_lms = '';\n\n student_data = null;\n\n /**\n * Constructor for the SCORM 1.2 cmi object\n * @param {string} cmi_children\n * @param {(CMIStudentData|AICCCMIStudentData)} student_data\n * @param {boolean} initialized\n */\n constructor(cmi_children, student_data, initialized: boolean) {\n super();\n\n if (initialized) this.initialize();\n\n this.#_children = cmi_children ?\n cmi_children :\n scorm12_constants.cmi_children;\n this.core = new CMICore();\n this.objectives = new CMIObjectives();\n this.student_data = student_data ? student_data : new CMIStudentData();\n this.student_preference = new CMIStudentPreference();\n this.interactions = new CMIInteractions();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.core?.initialize();\n this.objectives?.initialize();\n this.student_data?.initialize();\n this.student_preference?.initialize();\n this.interactions?.initialize();\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * suspend_data: string,\n * launch_data: string,\n * comments: string,\n * comments_from_lms: string,\n * core: CMICore,\n * objectives: CMIObjectives,\n * student_data: CMIStudentData,\n * student_preference: CMIStudentPreference,\n * interactions: CMIInteractions\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'suspend_data': this.suspend_data,\n 'launch_data': this.launch_data,\n 'comments': this.comments,\n 'comments_from_lms': this.comments_from_lms,\n 'core': this.core,\n 'objectives': this.objectives,\n 'student_data': this.student_data,\n 'student_preference': this.student_preference,\n 'interactions': this.interactions,\n };\n delete this.jsonString;\n return result;\n }\n\n /**\n * Getter for #_version\n * @return {string}\n */\n get _version() {\n return this.#_version;\n }\n\n /**\n * Setter for #_version. Just throws an error.\n * @param {string} _version\n */\n set _version(_version) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #_children\n * @return {string}\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_version. Just throws an error.\n * @param {string} _children\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #suspend_data\n * @return {string}\n */\n get suspend_data() {\n return this.core?.suspend_data;\n }\n\n /**\n * Setter for #suspend_data\n * @param {string} suspend_data\n */\n set suspend_data(suspend_data) {\n if (this.core) {\n this.core.suspend_data = suspend_data;\n }\n }\n\n /**\n * Getter for #launch_data\n * @return {string}\n */\n get launch_data() {\n return this.#launch_data;\n }\n\n /**\n * Setter for #launch_data. Can only be called before initialization.\n * @param {string} launch_data\n */\n set launch_data(launch_data) {\n !this.initialized ? this.#launch_data = launch_data : throwReadOnlyError();\n }\n\n /**\n * Getter for #comments\n * @return {string}\n */\n get comments() {\n return this.#comments;\n }\n\n /**\n * Setter for #comments\n * @param {string} comments\n */\n set comments(comments) {\n if (check12ValidFormat(comments, scorm12_regex.CMIString4096, true)) {\n this.#comments = comments;\n }\n }\n\n /**\n * Getter for #comments_from_lms\n * @return {string}\n */\n get comments_from_lms() {\n return this.#comments_from_lms;\n }\n\n /**\n * Setter for #comments_from_lms. Can only be called before initialization.\n * @param {string} comments_from_lms\n */\n set comments_from_lms(comments_from_lms) {\n !this.initialized ?\n this.#comments_from_lms = comments_from_lms :\n throwReadOnlyError();\n }\n\n /**\n * Adds the current session time to the existing total time.\n *\n * @return {string}\n */\n getCurrentTotalTime() {\n return this.core.getCurrentTotalTime(this.start_time);\n }\n}\n\n/**\n * Class representing the cmi.core object\n * @extends BaseCMI\n */\nclass CMICore extends BaseCMI {\n /**\n * Constructor for cmi.core\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: scorm12_constants.score_children,\n score_range: scorm12_regex.score_range,\n invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,\n errorClass: Scorm12ValidationError,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n #_children = scorm12_constants.core_children;\n #student_id = '';\n #student_name = '';\n #lesson_location = '';\n #credit = '';\n #lesson_status = 'not attempted';\n #entry = '';\n #total_time = '';\n #lesson_mode = 'normal';\n #exit = '';\n #session_time = '00:00:00';\n #suspend_data = '';\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #student_id\n * @return {string}\n */\n get student_id() {\n return this.#student_id;\n }\n\n /**\n * Setter for #student_id. Can only be called before initialization.\n * @param {string} student_id\n */\n set student_id(student_id) {\n !this.initialized ? this.#student_id = student_id : throwReadOnlyError();\n }\n\n /**\n * Getter for #student_name\n * @return {string}\n */\n get student_name() {\n return this.#student_name;\n }\n\n /**\n * Setter for #student_name. Can only be called before initialization.\n * @param {string} student_name\n */\n set student_name(student_name) {\n !this.initialized ?\n this.#student_name = student_name :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #lesson_location\n * @return {string}\n */\n get lesson_location() {\n return this.#lesson_location;\n }\n\n /**\n * Setter for #lesson_location\n * @param {string} lesson_location\n */\n set lesson_location(lesson_location) {\n if (check12ValidFormat(lesson_location, scorm12_regex.CMIString256, true)) {\n this.#lesson_location = lesson_location;\n }\n }\n\n /**\n * Getter for #credit\n * @return {string}\n */\n get credit() {\n return this.#credit;\n }\n\n /**\n * Setter for #credit. Can only be called before initialization.\n * @param {string} credit\n */\n set credit(credit) {\n !this.initialized ? this.#credit = credit : throwReadOnlyError();\n }\n\n /**\n * Getter for #lesson_status\n * @return {string}\n */\n get lesson_status() {\n return this.#lesson_status;\n }\n\n /**\n * Setter for #lesson_status\n * @param {string} lesson_status\n */\n set lesson_status(lesson_status) {\n if (this.initialized) {\n if (check12ValidFormat(lesson_status, scorm12_regex.CMIStatus)) {\n this.#lesson_status = lesson_status;\n }\n } else {\n if (check12ValidFormat(lesson_status, scorm12_regex.CMIStatus2)) {\n this.#lesson_status = lesson_status;\n }\n }\n }\n\n /**\n * Getter for #entry\n * @return {string}\n */\n get entry() {\n return this.#entry;\n }\n\n /**\n * Setter for #entry. Can only be called before initialization.\n * @param {string} entry\n */\n set entry(entry) {\n !this.initialized ? this.#entry = entry : throwReadOnlyError();\n }\n\n /**\n * Getter for #total_time\n * @return {string}\n */\n get total_time() {\n return this.#total_time;\n }\n\n /**\n * Setter for #total_time. Can only be called before initialization.\n * @param {string} total_time\n */\n set total_time(total_time) {\n !this.initialized ? this.#total_time = total_time : throwReadOnlyError();\n }\n\n /**\n * Getter for #lesson_mode\n * @return {string}\n */\n get lesson_mode() {\n return this.#lesson_mode;\n }\n\n /**\n * Setter for #lesson_mode. Can only be called before initialization.\n * @param {string} lesson_mode\n */\n set lesson_mode(lesson_mode) {\n !this.initialized ? this.#lesson_mode = lesson_mode : throwReadOnlyError();\n }\n\n /**\n * Getter for #exit. Should only be called during JSON export.\n * @return {*}\n */\n get exit() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#exit;\n }\n\n /**\n * Setter for #exit\n * @param {string} exit\n */\n set exit(exit) {\n if (check12ValidFormat(exit, scorm12_regex.CMIExit, true)) {\n this.#exit = exit;\n }\n }\n\n /**\n * Getter for #session_time. Should only be called during JSON export.\n * @return {*}\n */\n get session_time() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#session_time;\n }\n\n /**\n * Setter for #session_time\n * @param {string} session_time\n */\n set session_time(session_time) {\n if (check12ValidFormat(session_time, scorm12_regex.CMITimespan)) {\n this.#session_time = session_time;\n }\n }\n\n /**\n * Getter for #suspend_data\n * @return {string}\n */\n get suspend_data() {\n return this.#suspend_data;\n }\n\n /**\n * Setter for #suspend_data\n * @param {string} suspend_data\n */\n set suspend_data(suspend_data) {\n if (check12ValidFormat(suspend_data, scorm12_regex.CMIString4096, true)) {\n this.#suspend_data = suspend_data;\n }\n }\n\n /**\n * Adds the current session time to the existing total time.\n * @param {Number} start_time\n * @return {string}\n */\n getCurrentTotalTime(start_time: Number) {\n let sessionTime = this.#session_time;\n const startTime = start_time;\n\n if (typeof startTime !== 'undefined' && startTime !== null) {\n const seconds = new Date().getTime() - startTime;\n sessionTime = Util.getSecondsAsHHMMSS(seconds / 1000);\n }\n\n return Utilities.addHHMMSSTimeStrings(\n this.#total_time,\n sessionTime,\n new RegExp(scorm12_regex.CMITimespan),\n );\n }\n\n /**\n * toJSON for cmi.core\n *\n * @return {\n * {\n * student_name: string,\n * entry: string,\n * exit: string,\n * score: CMIScore,\n * student_id: string,\n * lesson_mode: string,\n * lesson_location: string,\n * lesson_status: string,\n * credit: string,\n * session_time: *\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'student_id': this.student_id,\n 'student_name': this.student_name,\n 'lesson_location': this.lesson_location,\n 'credit': this.credit,\n 'lesson_status': this.lesson_status,\n 'entry': this.entry,\n 'lesson_mode': this.lesson_mode,\n 'exit': this.exit,\n 'session_time': this.session_time,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.objectives object\n * @extends CMIArray\n */\nclass CMIObjectives extends CMIArray {\n /**\n * Constructor for cmi.objectives\n */\n constructor() {\n super({\n children: scorm12_constants.objectives_children,\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n errorClass: Scorm12ValidationError,\n });\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.student_data object\n * @extends BaseCMI\n */\nexport class CMIStudentData extends BaseCMI {\n #_children;\n #mastery_score = '';\n #max_time_allowed = '';\n #time_limit_action = '';\n\n /**\n * Constructor for cmi.student_data\n * @param {string} student_data_children\n */\n constructor(student_data_children) {\n super();\n\n this.#_children = student_data_children ?\n student_data_children :\n scorm12_constants.student_data_children;\n }\n\n /**\n * Getter for #_children\n * @return {*}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #master_score\n * @return {string}\n */\n get mastery_score() {\n return this.#mastery_score;\n }\n\n /**\n * Setter for #master_score. Can only be called before initialization.\n * @param {string} mastery_score\n */\n set mastery_score(mastery_score) {\n !this.initialized ?\n this.#mastery_score = mastery_score :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #max_time_allowed\n * @return {string}\n */\n get max_time_allowed() {\n return this.#max_time_allowed;\n }\n\n /**\n * Setter for #max_time_allowed. Can only be called before initialization.\n * @param {string} max_time_allowed\n */\n set max_time_allowed(max_time_allowed) {\n !this.initialized ?\n this.#max_time_allowed = max_time_allowed :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #time_limit_action\n * @return {string}\n */\n get time_limit_action() {\n return this.#time_limit_action;\n }\n\n /**\n * Setter for #time_limit_action. Can only be called before initialization.\n * @param {string} time_limit_action\n */\n set time_limit_action(time_limit_action) {\n !this.initialized ?\n this.#time_limit_action = time_limit_action :\n throwReadOnlyError();\n }\n\n /**\n * toJSON for cmi.student_data\n *\n * @return {\n * {\n * max_time_allowed: string,\n * time_limit_action: string,\n * mastery_score: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'mastery_score': this.mastery_score,\n 'max_time_allowed': this.max_time_allowed,\n 'time_limit_action': this.time_limit_action,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.student_preference object\n * @extends BaseCMI\n */\nexport class CMIStudentPreference extends BaseCMI {\n #_children;\n\n /**\n * Constructor for cmi.student_preference\n * @param {string} student_preference_children\n */\n constructor(student_preference_children) {\n super();\n\n this.#_children = student_preference_children ?\n student_preference_children :\n scorm12_constants.student_preference_children;\n }\n\n #audio = '';\n #language = '';\n #speed = '';\n #text = '';\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwInvalidValueError();\n }\n\n /**\n * Getter for #audio\n * @return {string}\n */\n get audio() {\n return this.#audio;\n }\n\n /**\n * Setter for #audio\n * @param {string} audio\n */\n set audio(audio) {\n if (check12ValidFormat(audio, scorm12_regex.CMISInteger) &&\n check12ValidRange(audio, scorm12_regex.audio_range)) {\n this.#audio = audio;\n }\n }\n\n /**\n * Getter for #language\n * @return {string}\n */\n get language() {\n return this.#language;\n }\n\n /**\n * Setter for #language\n * @param {string} language\n */\n set language(language) {\n if (check12ValidFormat(language, scorm12_regex.CMIString256)) {\n this.#language = language;\n }\n }\n\n /**\n * Getter for #speed\n * @return {string}\n */\n get speed() {\n return this.#speed;\n }\n\n /**\n * Setter for #speed\n * @param {string} speed\n */\n set speed(speed) {\n if (check12ValidFormat(speed, scorm12_regex.CMISInteger) &&\n check12ValidRange(speed, scorm12_regex.speed_range)) {\n this.#speed = speed;\n }\n }\n\n /**\n * Getter for #text\n * @return {string}\n */\n get text() {\n return this.#text;\n }\n\n /**\n * Setter for #text\n * @param {string} text\n */\n set text(text) {\n if (check12ValidFormat(text, scorm12_regex.CMISInteger) &&\n check12ValidRange(text, scorm12_regex.text_range)) {\n this.#text = text;\n }\n }\n\n /**\n * toJSON for cmi.student_preference\n *\n * @return {\n * {\n * audio: string,\n * language: string,\n * speed: string,\n * text: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'audio': this.audio,\n 'language': this.language,\n 'speed': this.speed,\n 'text': this.text,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions object\n * @extends BaseCMI\n */\nclass CMIInteractions extends CMIArray {\n /**\n * Constructor for cmi.interactions\n */\n constructor() {\n super({\n children: scorm12_constants.interactions_children,\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n errorClass: Scorm12ValidationError,\n });\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.n object\n */\n constructor() {\n super();\n\n this.objectives = new CMIArray({\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n errorClass: Scorm12ValidationError,\n children: scorm12_constants.objectives_children,\n });\n this.correct_responses = new CMIArray({\n errorCode: scorm12_error_codes.INVALID_SET_VALUE,\n errorClass: Scorm12ValidationError,\n children: scorm12_constants.correct_responses_children,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.objectives?.initialize();\n this.correct_responses?.initialize();\n }\n\n #id = '';\n #time = '';\n #type = '';\n #weighting = '';\n #student_response = '';\n #result = '';\n #latency = '';\n\n /**\n * Getter for #id. Should only be called during JSON export.\n * @return {*}\n */\n get id() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check12ValidFormat(id, scorm12_regex.CMIIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #time. Should only be called during JSON export.\n * @return {*}\n */\n get time() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#time;\n }\n\n /**\n * Setter for #time\n * @param {string} time\n */\n set time(time) {\n if (check12ValidFormat(time, scorm12_regex.CMITime)) {\n this.#time = time;\n }\n }\n\n /**\n * Getter for #type. Should only be called during JSON export.\n * @return {*}\n */\n get type() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#type;\n }\n\n /**\n * Setter for #type\n * @param {string} type\n */\n set type(type) {\n if (check12ValidFormat(type, scorm12_regex.CMIType)) {\n this.#type = type;\n }\n }\n\n /**\n * Getter for #weighting. Should only be called during JSON export.\n * @return {*}\n */\n get weighting() {\n return (!this.jsonString) ?\n throwWriteOnlyError() :\n this.#weighting;\n }\n\n /**\n * Setter for #weighting\n * @param {string} weighting\n */\n set weighting(weighting) {\n if (check12ValidFormat(weighting, scorm12_regex.CMIDecimal) &&\n check12ValidRange(weighting, scorm12_regex.weighting_range)) {\n this.#weighting = weighting;\n }\n }\n\n /**\n * Getter for #student_response. Should only be called during JSON export.\n * @return {*}\n */\n get student_response() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#student_response;\n }\n\n /**\n * Setter for #student_response\n * @param {string} student_response\n */\n set student_response(student_response) {\n if (check12ValidFormat(student_response, scorm12_regex.CMIFeedback, true)) {\n this.#student_response = student_response;\n }\n }\n\n /**\n * Getter for #result. Should only be called during JSON export.\n * @return {*}\n */\n get result() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#result;\n }\n\n /**\n * Setter for #result\n * @param {string} result\n */\n set result(result) {\n if (check12ValidFormat(result, scorm12_regex.CMIResult)) {\n this.#result = result;\n }\n }\n\n /**\n * Getter for #latency. Should only be called during JSON export.\n * @return {*}\n */\n get latency() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#latency;\n }\n\n /**\n * Setter for #latency\n * @param {string} latency\n */\n set latency(latency) {\n if (check12ValidFormat(latency, scorm12_regex.CMITimespan)) {\n this.#latency = latency;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n\n *\n * @return {\n * {\n * id: string,\n * time: string,\n * type: string,\n * weighting: string,\n * student_response: string,\n * result: string,\n * latency: string,\n * objectives: CMIArray,\n * correct_responses: CMIArray\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'time': this.time,\n 'type': this.type,\n 'weighting': this.weighting,\n 'student_response': this.student_response,\n 'result': this.result,\n 'latency': this.latency,\n 'objectives': this.objectives,\n 'correct_responses': this.correct_responses,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.objectives.n object\n * @extends BaseCMI\n */\nexport class CMIObjectivesObject extends BaseCMI {\n /**\n * Constructor for cmi.objectives.n\n */\n constructor() {\n super();\n\n this.score = new CMIScore(\n {\n score_children: scorm12_constants.score_children,\n score_range: scorm12_regex.score_range,\n invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,\n invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,\n errorClass: Scorm12ValidationError,\n });\n }\n\n #id = '';\n #status = '';\n\n /**\n * Getter for #id\n * @return {\"\"}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check12ValidFormat(id, scorm12_regex.CMIIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #status\n * @return {\"\"}\n */\n get status() {\n return this.#status;\n }\n\n /**\n * Setter for #status\n * @param {string} status\n */\n set status(status) {\n if (check12ValidFormat(status, scorm12_regex.CMIStatus2)) {\n this.#status = status;\n }\n }\n\n /**\n * toJSON for cmi.objectives.n\n * @return {\n * {\n * id: string,\n * status: string,\n * score: CMIScore\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'status': this.status,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.n.objectives.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsObjectivesObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.n.objectives.n\n */\n constructor() {\n super();\n }\n\n #id = '';\n\n /**\n * Getter for #id\n * @return {\"\"}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check12ValidFormat(id, scorm12_regex.CMIIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n.objectives.n\n * @return {\n * {\n * id: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 1.2's cmi.interactions.correct_responses.n object\n * @extends BaseCMI\n */\nexport class CMIInteractionsCorrectResponsesObject extends BaseCMI {\n /**\n * Constructor for cmi.interactions.correct_responses.n\n */\n constructor() {\n super();\n }\n\n #pattern = '';\n\n /**\n * Getter for #pattern\n * @return {string}\n */\n get pattern() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#pattern;\n }\n\n /**\n * Setter for #pattern\n * @param {string} pattern\n */\n set pattern(pattern) {\n if (check12ValidFormat(pattern, scorm12_regex.CMIFeedback, true)) {\n this.#pattern = pattern;\n }\n }\n\n /**\n * toJSON for cmi.interactions.correct_responses.n\n * @return {\n * {\n * pattern: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'pattern': this.pattern,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for AICC Navigation object\n */\nexport class NAV extends BaseCMI {\n /**\n * Constructor for NAV object\n */\n constructor() {\n super();\n }\n\n #event = '';\n\n /**\n * Getter for #event\n * @return {string}\n */\n get event() {\n return this.#event;\n }\n\n /**\n * Setter for #event\n * @param {string} event\n */\n set event(event) {\n if (check12ValidFormat(event, scorm12_regex.NAVEvent)) {\n this.#event = event;\n }\n }\n\n /**\n * toJSON for nav object\n * @return {\n * {\n * event: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'event': this.event,\n };\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\n\nconst global = {\n SCORM_TRUE: 'true',\n SCORM_FALSE: 'false',\n STATE_NOT_INITIALIZED: 0,\n STATE_INITIALIZED: 1,\n STATE_TERMINATED: 2,\n LOG_LEVEL_DEBUG: 1,\n LOG_LEVEL_INFO: 2,\n LOG_LEVEL_WARNING: 3,\n LOG_LEVEL_ERROR: 4,\n LOG_LEVEL_NONE: 5,\n};\n\nconst scorm12 = {\n // Children lists\n cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions',\n core_children: 'student_id,student_name,lesson_location,credit,lesson_status,entry,score,total_time,lesson_mode,exit,session_time',\n score_children: 'raw,min,max',\n comments_children: 'content,location,time',\n objectives_children: 'id,score,status',\n correct_responses_children: 'pattern',\n student_data_children: 'mastery_score,max_time_allowed,time_limit_action',\n student_preference_children: 'audio,language,speed,text',\n interactions_children: 'id,objectives,time,type,correct_responses,weighting,student_response,result,latency',\n\n error_descriptions: {\n '101': {\n basicMessage: 'General Exception',\n detailMessage: 'No specific error code exists to describe the error. Use LMSGetDiagnostic for more information',\n },\n '201': {\n basicMessage: 'Invalid argument error',\n detailMessage: 'Indicates that an argument represents an invalid data model element or is otherwise incorrect.',\n },\n '202': {\n basicMessage: 'Element cannot have children',\n detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in \"_children\" for a data model element that does not support the \"_children\" suffix.',\n },\n '203': {\n basicMessage: 'Element not an array - cannot have count',\n detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in \"_count\" for a data model element that does not support the \"_count\" suffix.',\n },\n '301': {\n basicMessage: 'Not initialized',\n detailMessage: 'Indicates that an API call was made before the call to lmsInitialize.',\n },\n '401': {\n basicMessage: 'Not implemented error',\n detailMessage: 'The data model element indicated in a call to LMSGetValue or LMSSetValue is valid, but was not implemented by this LMS. SCORM 1.2 defines a set of data model elements as being optional for an LMS to implement.',\n },\n '402': {\n basicMessage: 'Invalid set value, element is a keyword',\n detailMessage: 'Indicates that LMSSetValue was called on a data model element that represents a keyword (elements that end in \"_children\" and \"_count\").',\n },\n '403': {\n basicMessage: 'Element is read only',\n detailMessage: 'LMSSetValue was called with a data model element that can only be read.',\n },\n '404': {\n basicMessage: 'Element is write only',\n detailMessage: 'LMSGetValue was called on a data model element that can only be written to.',\n },\n '405': {\n basicMessage: 'Incorrect Data Type',\n detailMessage: 'LMSSetValue was called with a value that is not consistent with the data format of the supplied data model element.',\n },\n '407': {\n basicMessage: 'Element Value Out Of Range',\n detailMessage: 'The numeric value supplied to a LMSSetValue call is outside of the numeric range allowed for the supplied data model element.',\n },\n '408': {\n basicMessage: 'Data Model Dependency Not Established',\n detailMessage: 'Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.',\n },\n },\n};\n\nconst aicc = {\n ...scorm12, ...{\n cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions,evaluation',\n student_preference_children: 'audio,language,lesson_type,speed,text,text_color,text_location,text_size,video,windows',\n student_data_children: 'attempt_number,tries,mastery_score,max_time_allowed,time_limit_action',\n student_demographics_children: 'city,class,company,country,experience,familiar_name,instructor_name,title,native_language,state,street_address,telephone,years_experience',\n tries_children: 'time,status,score',\n attempt_records_children: 'score,lesson_status',\n paths_children: 'location_id,date,time,status,why_left,time_in_element',\n },\n};\n\nconst scorm2004 = {\n // Children lists\n cmi_children: '_version,comments_from_learner,comments_from_lms,completion_status,credit,entry,exit,interactions,launch_data,learner_id,learner_name,learner_preference,location,max_time_allowed,mode,objectives,progress_measure,scaled_passing_score,score,session_time,success_status,suspend_data,time_limit_action,total_time',\n comments_children: 'comment,timestamp,location',\n score_children: 'max,raw,scaled,min',\n objectives_children: 'progress_measure,completion_status,success_status,description,score,id',\n correct_responses_children: 'pattern',\n student_data_children: 'mastery_score,max_time_allowed,time_limit_action',\n student_preference_children: 'audio_level,audio_captioning,delivery_speed,language',\n interactions_children: 'id,type,objectives,timestamp,correct_responses,weighting,learner_response,result,latency,description',\n\n error_descriptions: {\n '0': {\n basicMessage: 'No Error',\n detailMessage: 'No error occurred, the previous API call was successful.',\n },\n '101': {\n basicMessage: 'General Exception',\n detailMessage: 'No specific error code exists to describe the error. Use GetDiagnostic for more information.',\n },\n '102': {\n basicMessage: 'General Initialization Failure',\n detailMessage: 'Call to Initialize failed for an unknown reason.',\n },\n '103': {\n basicMessage: 'Already Initialized',\n detailMessage: 'Call to Initialize failed because Initialize was already called.',\n },\n '104': {\n basicMessage: 'Content Instance Terminated',\n detailMessage: 'Call to Initialize failed because Terminate was already called.',\n },\n '111': {\n basicMessage: 'General Termination Failure',\n detailMessage: 'Call to Terminate failed for an unknown reason.',\n },\n '112': {\n basicMessage: 'Termination Before Initialization',\n detailMessage: 'Call to Terminate failed because it was made before the call to Initialize.',\n },\n '113': {\n basicMessage: 'Termination After Termination',\n detailMessage: 'Call to Terminate failed because Terminate was already called.',\n },\n '122': {\n basicMessage: 'Retrieve Data Before Initialization',\n detailMessage: 'Call to GetValue failed because it was made before the call to Initialize.',\n },\n '123': {\n basicMessage: 'Retrieve Data After Termination',\n detailMessage: 'Call to GetValue failed because it was made after the call to Terminate.',\n },\n '132': {\n basicMessage: 'Store Data Before Initialization',\n detailMessage: 'Call to SetValue failed because it was made before the call to Initialize.',\n },\n '133': {\n basicMessage: 'Store Data After Termination',\n detailMessage: 'Call to SetValue failed because it was made after the call to Terminate.',\n },\n '142': {\n basicMessage: 'Commit Before Initialization',\n detailMessage: 'Call to Commit failed because it was made before the call to Initialize.',\n },\n '143': {\n basicMessage: 'Commit After Termination',\n detailMessage: 'Call to Commit failed because it was made after the call to Terminate.',\n },\n '201': {\n basicMessage: 'General Argument Error',\n detailMessage: 'An invalid argument was passed to an API method (usually indicates that Initialize, Commit or Terminate did not receive the expected empty string argument.',\n },\n '301': {\n basicMessage: 'General Get Failure',\n detailMessage: 'Indicates a failed GetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '351': {\n basicMessage: 'General Set Failure',\n detailMessage: 'Indicates a failed SetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '391': {\n basicMessage: 'General Commit Failure',\n detailMessage: 'Indicates a failed Commit call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '401': {\n basicMessage: 'Undefined Data Model Element',\n detailMessage: 'The data model element name passed to GetValue or SetValue is not a valid SCORM data model element.',\n },\n '402': {\n basicMessage: 'Unimplemented Data Model Element',\n detailMessage: 'The data model element indicated in a call to GetValue or SetValue is valid, but was not implemented by this LMS. In SCORM 2004, this error would indicate an LMS that is not fully SCORM conformant.',\n },\n '403': {\n basicMessage: 'Data Model Element Value Not Initialized',\n detailMessage: 'Attempt to read a data model element that has not been initialized by the LMS or through a SetValue call. This error condition is often reached during normal execution of a SCO.',\n },\n '404': {\n basicMessage: 'Data Model Element Is Read Only',\n detailMessage: 'SetValue was called with a data model element that can only be read.',\n },\n '405': {\n basicMessage: 'Data Model Element Is Write Only',\n detailMessage: 'GetValue was called on a data model element that can only be written to.',\n },\n '406': {\n basicMessage: 'Data Model Element Type Mismatch',\n detailMessage: 'SetValue was called with a value that is not consistent with the data format of the supplied data model element.',\n },\n '407': {\n basicMessage: 'Data Model Element Value Out Of Range',\n detailMessage: 'The numeric value supplied to a SetValue call is outside of the numeric range allowed for the supplied data model element.',\n },\n '408': {\n basicMessage: 'Data Model Dependency Not Established',\n detailMessage: 'Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.',\n },\n },\n};\n\nconst APIConstants = {\n global: global,\n scorm12: scorm12,\n aicc: aicc,\n scorm2004: scorm2004,\n};\n\nexport default APIConstants;\n","// @flow\nconst global = {\n GENERAL: 101,\n INITIALIZATION_FAILED: 101,\n INITIALIZED: 101,\n TERMINATED: 101,\n TERMINATION_FAILURE: 101,\n TERMINATION_BEFORE_INIT: 101,\n MULTIPLE_TERMINATION: 101,\n RETRIEVE_BEFORE_INIT: 101,\n RETRIEVE_AFTER_TERM: 101,\n STORE_BEFORE_INIT: 101,\n STORE_AFTER_TERM: 101,\n COMMIT_BEFORE_INIT: 101,\n COMMIT_AFTER_TERM: 101,\n ARGUMENT_ERROR: 101,\n CHILDREN_ERROR: 101,\n COUNT_ERROR: 101,\n GENERAL_GET_FAILURE: 101,\n GENERAL_SET_FAILURE: 101,\n GENERAL_COMMIT_FAILURE: 101,\n UNDEFINED_DATA_MODEL: 101,\n UNIMPLEMENTED_ELEMENT: 101,\n VALUE_NOT_INITIALIZED: 101,\n INVALID_SET_VALUE: 101,\n READ_ONLY_ELEMENT: 101,\n WRITE_ONLY_ELEMENT: 101,\n TYPE_MISMATCH: 101,\n VALUE_OUT_OF_RANGE: 101,\n DEPENDENCY_NOT_ESTABLISHED: 101,\n};\n\nconst scorm12 = {\n ...global, ...{\n RETRIEVE_BEFORE_INIT: 301,\n STORE_BEFORE_INIT: 301,\n COMMIT_BEFORE_INIT: 301,\n ARGUMENT_ERROR: 201,\n CHILDREN_ERROR: 202,\n COUNT_ERROR: 203,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 401,\n VALUE_NOT_INITIALIZED: 301,\n INVALID_SET_VALUE: 402,\n READ_ONLY_ELEMENT: 403,\n WRITE_ONLY_ELEMENT: 404,\n TYPE_MISMATCH: 405,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n },\n};\n\nconst scorm2004 = {\n ...global, ...{\n INITIALIZATION_FAILED: 102,\n INITIALIZED: 103,\n TERMINATED: 104,\n TERMINATION_FAILURE: 111,\n TERMINATION_BEFORE_INIT: 112,\n MULTIPLE_TERMINATIONS: 113,\n RETRIEVE_BEFORE_INIT: 122,\n RETRIEVE_AFTER_TERM: 123,\n STORE_BEFORE_INIT: 132,\n STORE_AFTER_TERM: 133,\n COMMIT_BEFORE_INIT: 142,\n COMMIT_AFTER_TERM: 143,\n ARGUMENT_ERROR: 201,\n GENERAL_GET_FAILURE: 301,\n GENERAL_SET_FAILURE: 351,\n GENERAL_COMMIT_FAILURE: 391,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 402,\n VALUE_NOT_INITIALIZED: 403,\n READ_ONLY_ELEMENT: 404,\n WRITE_ONLY_ELEMENT: 405,\n TYPE_MISMATCH: 406,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n },\n};\n\nconst ErrorCodes = {\n scorm12: scorm12,\n scorm2004: scorm2004,\n};\n\nexport default ErrorCodes;\n","// @flow\n\nconst scorm12 = {\n CMIString256: '^.{0,255}$',\n CMIString4096: '^.{0,4096}$',\n CMITime: '^(?:[01]\\\\d|2[0123]):(?:[012345]\\\\d):(?:[012345]\\\\d)$', // eslint-disable-line\n CMITimespan: '^([0-9]{2,}):([0-9]{2}):([0-9]{2})(\\.[0-9]{1,2})?$', // eslint-disable-line\n CMIInteger: '^\\\\d+$',\n CMISInteger: '^-?([0-9]+)$',\n CMIDecimal: '^-?([0-9]{0,3})(\\.[0-9]*)?$', // eslint-disable-line\n CMIIdentifier: '^[\\\\u0021-\\\\u007E\\\\s]{0,255}$',\n CMIFeedback: '^.{0,255}$', // This must be redefined\n CMIIndex: '[._](\\\\d+).',\n\n // Vocabulary Data Type Definition\n CMIStatus: '^(passed|completed|failed|incomplete|browsed)$',\n CMIStatus2: '^(passed|completed|failed|incomplete|browsed|not attempted)$',\n CMIExit: '^(time-out|suspend|logout|)$',\n CMIType: '^(true-false|choice|fill-in|matching|performance|sequencing|likert|numeric)$',\n CMIResult: '^(correct|wrong|unanticipated|neutral|([0-9]{0,3})?(\\\\.[0-9]*)?)$', // eslint-disable-line\n NAVEvent: '^(previous|continue)$',\n\n // Data ranges\n score_range: '0#100',\n audio_range: '-1#100',\n speed_range: '-100#100',\n weighting_range: '-100#100',\n text_range: '-1#1',\n};\n\nconst aicc = {\n ...scorm12, ...{\n CMIIdentifier: '^\\\\w{1,255}$',\n },\n};\n\nconst scorm2004 = {\n CMIString200: '^[\\\\u0000-\\\\uFFFF]{0,200}$',\n CMIString250: '^[\\\\u0000-\\\\uFFFF]{0,250}$',\n CMIString1000: '^[\\\\u0000-\\\\uFFFF]{0,1000}$',\n CMIString4000: '^[\\\\u0000-\\\\uFFFF]{0,4000}$',\n CMIString64000: '^[\\\\u0000-\\\\uFFFF]{0,64000}$',\n CMILang: '^([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?$|^$', // eslint-disable-line\n CMILangString250: '^(\\{lang=([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?\\})?((?!\\{.*$).{0,250}$)?$', // eslint-disable-line\n CMILangcr: '^((\\{lang=([a-zA-Z]{2,3}|i|x)?(\\-[a-zA-Z0-9\\-]{2,8})?\\}))(.*?)$', // eslint-disable-line\n CMILangString250cr: '^((\\{lang=([a-zA-Z]{2,3}|i|x)?(\\-[a-zA-Z0-9\\-]{2,8})?\\})?(.{0,250})?)?$', // eslint-disable-line\n CMILangString4000: '^(\\{lang=([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?\\})?((?!\\{.*$).{0,4000}$)?$', // eslint-disable-line\n CMITime: '^(19[7-9]{1}[0-9]{1}|20[0-2]{1}[0-9]{1}|203[0-8]{1})((-(0[1-9]{1}|1[0-2]{1}))((-(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1}))(T([0-1]{1}[0-9]{1}|2[0-3]{1})((:[0-5]{1}[0-9]{1})((:[0-5]{1}[0-9]{1})((\\\\.[0-9]{1,2})((Z|([+|-]([0-1]{1}[0-9]{1}|2[0-3]{1})))(:[0-5]{1}[0-9]{1})?)?)?)?)?)?)?)?$',\n CMITimespan: '^P(?:([.,\\\\d]+)Y)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)W)?(?:([.,\\\\d]+)D)?(?:T?(?:([.,\\\\d]+)H)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)S)?)?$',\n CMIInteger: '^\\\\d+$',\n CMISInteger: '^-?([0-9]+)$',\n CMIDecimal: '^-?([0-9]{1,5})(\\\\.[0-9]{1,18})?$',\n CMIIdentifier: '^\\\\S{1,250}[a-zA-Z0-9]$',\n CMIShortIdentifier: '^[\\\\w\\\\.\\\\-\\\\_]{1,250}$', // eslint-disable-line\n CMILongIdentifier: '^(?:(?!urn:)\\\\S{1,4000}|urn:[A-Za-z0-9-]{1,31}:\\\\S{1,4000}|.{1,4000})$', // need to re-examine this\n CMIFeedback: '^.*$', // This must be redefined\n CMIIndex: '[._](\\\\d+).',\n CMIIndexStore: '.N(\\\\d+).',\n\n // Vocabulary Data Type Definition\n CMICStatus: '^(completed|incomplete|not attempted|unknown)$',\n CMISStatus: '^(passed|failed|unknown)$',\n CMIExit: '^(time-out|suspend|logout|normal)$',\n CMIType: '^(true-false|choice|fill-in|long-fill-in|matching|performance|sequencing|likert|numeric|other)$',\n CMIResult: '^(correct|incorrect|unanticipated|neutral|-?([0-9]{1,4})(\\\\.[0-9]{1,18})?)$',\n NAVEvent: '^(previous|continue|exit|exitAll|abandon|abandonAll|suspendAll|\\{target=\\\\S{0,200}[a-zA-Z0-9]\\}choice|jump)$', // eslint-disable-line\n NAVBoolean: '^(unknown|true|false$)',\n NAVTarget: '^(previous|continue|choice.{target=\\\\S{0,200}[a-zA-Z0-9]})$',\n\n // Data ranges\n scaled_range: '-1#1',\n audio_range: '0#*',\n speed_range: '0#*',\n text_range: '-1#1',\n progress_range: '0#1',\n};\n\nconst Regex = {\n aicc: aicc,\n scorm12: scorm12,\n scorm2004: scorm2004,\n};\n\nexport default Regex;\n","// @flow\n\nimport APIConstants from './constants/api_constants';\n\nconst scorm12_errors = APIConstants.scorm12.error_descriptions;\nconst aicc_errors = APIConstants.aicc.error_descriptions;\nconst scorm2004_errors = APIConstants.scorm2004.error_descriptions;\n\n/**\n * Base Validation Exception\n */\nexport class ValidationError extends Error {\n /**\n * Constructor to take in an error message and code\n * @param {number} errorCode\n * @param {string} errorMessage\n * @param {string} detailedMessage\n */\n constructor(errorCode: number, errorMessage: String, detailedMessage: String) {\n super(errorMessage);\n this.#errorCode = errorCode;\n this.#errorMessage = errorMessage;\n this.#detailedMessage = detailedMessage;\n }\n\n #errorCode;\n #errorMessage;\n #detailedMessage;\n\n /**\n * Getter for #errorCode\n * @return {number}\n */\n get errorCode() {\n return this.#errorCode;\n }\n\n /**\n * Getter for #errorMessage\n * @return {string}\n */\n get errorMessage() {\n return this.#errorMessage;\n }\n\n /**\n * Getter for #detailedMessage\n * @return {string}\n */\n get detailedMessage() {\n return this.#detailedMessage;\n }\n}\n\n/**\n * SCORM 1.2 Validation Error\n */\nexport class Scorm12ValidationError extends ValidationError {\n /**\n * Constructor to take in an error code\n * @param {number} errorCode\n */\n constructor(errorCode: number) {\n if ({}.hasOwnProperty.call(scorm12_errors, String(errorCode))) {\n super(errorCode, scorm12_errors[String(errorCode)].basicMessage, scorm12_errors[String(errorCode)].detailMessage);\n } else {\n super(101, scorm12_errors['101'].basicMessage, scorm12_errors['101'].detailMessage);\n }\n }\n}\n\n/**\n * AICC Validation Error\n */\nexport class AICCValidationError extends ValidationError {\n /**\n * Constructor to take in an error code\n * @param {number} errorCode\n */\n constructor(errorCode: number) {\n if ({}.hasOwnProperty.call(aicc_errors, String(errorCode))) {\n super(errorCode, aicc_errors[String(errorCode)].basicMessage, aicc_errors[String(errorCode)].detailMessage);\n } else {\n super(101, aicc_errors['101'].basicMessage, aicc_errors['101'].detailMessage);\n }\n }\n}\n\n/**\n * SCORM 2004 Validation Error\n */\nexport class Scorm2004ValidationError extends ValidationError {\n /**\n * Constructor to take in an error code\n * @param {number} errorCode\n */\n constructor(errorCode: number) {\n if ({}.hasOwnProperty.call(scorm2004_errors, String(errorCode))) {\n super(errorCode, scorm2004_errors[String(errorCode)].basicMessage, scorm2004_errors[String(errorCode)].detailMessage);\n } else {\n super(101, scorm2004_errors['101'].basicMessage, scorm2004_errors['101'].detailMessage);\n }\n }\n}\n","// @flow\nexport const SECONDS_PER_SECOND = 1.0;\nexport const SECONDS_PER_MINUTE = 60;\nexport const SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE;\nexport const SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;\n\nconst designations = [\n ['D', SECONDS_PER_DAY],\n ['H', SECONDS_PER_HOUR],\n ['M', SECONDS_PER_MINUTE],\n ['S', SECONDS_PER_SECOND],\n];\n\n/**\n * Converts a Number to a String of HH:MM:SS\n *\n * @param {Number} totalSeconds\n * @return {string}\n */\nexport function getSecondsAsHHMMSS(totalSeconds: Number) {\n // SCORM spec does not deal with negative durations, give zero back\n if (!totalSeconds || totalSeconds <= 0) {\n return '00:00:00';\n }\n\n const hours = Math.floor(totalSeconds / SECONDS_PER_HOUR);\n\n const dateObj = new Date(totalSeconds * 1000);\n const minutes = dateObj.getUTCMinutes();\n // make sure we add any possible decimal value\n const seconds = dateObj.getSeconds();\n const ms = totalSeconds % 1.0;\n let msStr = '';\n if (countDecimals(ms) > 0) {\n if (countDecimals(ms) > 2) {\n msStr = ms.toFixed(2);\n } else {\n msStr = String(ms);\n }\n msStr = '.' + msStr.split('.')[1];\n }\n\n return (hours + ':' + minutes + ':' + seconds).replace(/\\b\\d\\b/g,\n '0$&') + msStr;\n}\n\n/**\n * Calculate the number of seconds from ISO 8601 Duration\n *\n * @param {Number} seconds\n * @return {String}\n */\nexport function getSecondsAsISODuration(seconds: Number) {\n // SCORM spec does not deal with negative durations, give zero back\n if (!seconds || seconds <= 0) {\n return 'PT0S';\n }\n\n let duration = 'P';\n let remainder = seconds;\n\n designations.forEach(([sign, current_seconds]) => {\n let value = Math.floor(remainder / current_seconds);\n\n remainder = remainder % current_seconds;\n if (countDecimals(remainder) > 2) {\n remainder = Number(Number(remainder).toFixed(2));\n }\n // If we have anything left in the remainder, and we're currently adding\n // seconds to the duration, go ahead and add the decimal to the seconds\n if (sign === 'S' && remainder > 0) {\n value += remainder;\n }\n\n if (value) {\n if ((duration.indexOf('D') > 0 ||\n sign === 'H' || sign === 'M' || sign === 'S') &&\n duration.indexOf('T') === -1) {\n duration += 'T';\n }\n duration += `${value}${sign}`;\n }\n });\n\n return duration;\n}\n\n/**\n * Calculate the number of seconds from HH:MM:SS.DDDDDD\n *\n * @param {string} timeString\n * @param {RegExp} timeRegex\n * @return {number}\n */\nexport function getTimeAsSeconds(timeString: String, timeRegex: RegExp) {\n if (!timeString || typeof timeString !== 'string' ||\n !timeString.match(timeRegex)) {\n return 0;\n }\n const parts = timeString.split(':');\n const hours = Number(parts[0]);\n const minutes = Number(parts[1]);\n const seconds = Number(parts[2]);\n return (hours * 3600) + (minutes * 60) + seconds;\n}\n\n/**\n * Calculate the number of seconds from ISO 8601 Duration\n *\n * @param {string} duration\n * @param {RegExp} durationRegex\n * @return {number}\n */\nexport function getDurationAsSeconds(duration: String, durationRegex: RegExp) {\n if (!duration || !duration.match(durationRegex)) {\n return 0;\n }\n\n const [, years, months, , days, hours, minutes, seconds] = new RegExp(\n durationRegex).exec(duration) || [];\n\n let result = 0.0;\n\n result += (Number(seconds) * 1.0 || 0.0);\n result += (Number(minutes) * 60.0 || 0.0);\n result += (Number(hours) * 3600.0 || 0.0);\n result += (Number(days) * (60 * 60 * 24.0) || 0.0);\n result += (Number(years) * (60 * 60 * 24 * 365.0) || 0.0);\n\n return result;\n}\n\n/**\n * Adds together two ISO8601 Duration strings\n *\n * @param {string} first\n * @param {string} second\n * @param {RegExp} durationRegex\n * @return {string}\n */\nexport function addTwoDurations(\n first: String,\n second: String,\n durationRegex: RegExp) {\n return getSecondsAsISODuration(\n getDurationAsSeconds(first, durationRegex) +\n getDurationAsSeconds(second, durationRegex),\n );\n}\n\n/**\n * Add together two HH:MM:SS.DD strings\n *\n * @param {string} first\n * @param {string} second\n * @param {RegExp} timeRegex\n * @return {string}\n */\nexport function addHHMMSSTimeStrings(\n first: String,\n second: String,\n timeRegex: RegExp) {\n return getSecondsAsHHMMSS(\n getTimeAsSeconds(first, timeRegex) +\n getTimeAsSeconds(\n second, timeRegex),\n );\n}\n\n/**\n * Flatten a JSON object down to string paths for each values\n * @param {object} data\n * @return {object}\n */\nexport function flatten(data) {\n const result = {};\n\n /**\n * Recurse through the object\n * @param {*} cur\n * @param {*} prop\n */\n function recurse(cur, prop) {\n if (Object(cur) !== cur) {\n result[prop] = cur;\n } else if (Array.isArray(cur)) {\n for (let i = 0, l = cur.length; i < l; i++) {\n recurse(cur[i], prop + '[' + i + ']');\n if (l === 0) result[prop] = [];\n }\n } else {\n let isEmpty = true;\n for (const p in cur) {\n if ({}.hasOwnProperty.call(cur, p)) {\n isEmpty = false;\n recurse(cur[p], prop ? prop + '.' + p : p);\n }\n }\n if (isEmpty && prop) result[prop] = {};\n }\n }\n\n recurse(data, '');\n return result;\n}\n\n/**\n * Un-flatten a flat JSON object\n * @param {object} data\n * @return {object}\n */\nexport function unflatten(data) {\n 'use strict';\n if (Object(data) !== data || Array.isArray(data)) return data;\n const regex = /\\.?([^.[\\]]+)|\\[(\\d+)]/g;\n const result = {};\n for (const p in data) {\n if ({}.hasOwnProperty.call(data, p)) {\n let cur = result;\n let prop = '';\n let m = regex.exec(p);\n while (m) {\n cur = cur[prop] || (cur[prop] = (m[2] ? [] : {}));\n prop = m[2] || m[1];\n m = regex.exec(p);\n }\n cur[prop] = data[p];\n }\n }\n return result[''] || result;\n}\n\n/**\n * Counts the number of decimal places\n * @param {number} num\n * @return {number}\n */\nexport function countDecimals(num: number) {\n if (Math.floor(num) === num || String(num).indexOf('.') < 0) return 0;\n const parts = num.toString().split('.')[1];\n return parts.length || 0;\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import Scorm12API from '../Scorm12API';\n\nwindow.Scorm12API = Scorm12API;\n"],"names":["FUNC_ERROR_TEXT","NAN","symbolTag","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","parseInt","freeGlobal","global","Object","freeSelf","self","root","Function","objectProto","prototype","objectToString","toString","nativeMax","Math","max","nativeMin","min","now","Date","debounce","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","TypeError","toNumber","isObject","invokeFunc","time","args","thisArg","undefined","apply","leadingEdge","setTimeout","timerExpired","remainingWait","timeSinceLastCall","timeSinceLastInvoke","shouldInvoke","trailingEdge","cancel","clearTimeout","flush","debounced","isInvoking","arguments","value","type","isObjectLike","isSymbol","call","other","valueOf","replace","isBinary","test","slice","module","exports","CMIArray","ValidationError","ErrorCodes","APIConstants","unflatten","global_constants","scorm12_error_codes","scorm12","BaseAPI","error_codes","settings","autocommit","autocommitSeconds","asyncCommit","sendBeaconCommit","lmsCommitUrl","dataCommitFormat","commitRequestDataType","autoProgress","logLevel","LOG_LEVEL_ERROR","selfReportSessionTime","alwaysSendTotalTime","strict_errors","xhrHeaders","xhrWithCredentials","responseHandler","xhr","JSON","parse","responseText","hasOwnProperty","status","SCORM_TRUE","errorCode","SCORM_FALSE","requestHandler","commitObject","onLogMessage","messageLevel","logMessage","console","error","LOG_LEVEL_WARNING","warn","LOG_LEVEL_INFO","info","LOG_LEVEL_DEBUG","debug","log","currentState","STATE_NOT_INITIALIZED","lastErrorCode","listenerArray","apiLogLevel","callbackName","initializeMessage","terminationMessage","returnValue","isInitialized","throwSCORMError","INITIALIZED","isTerminated","TERMINATED","cmi","setStartTime","STATE_INITIALIZED","processListeners","apiLog","clearSCORMError","checkTerminated","checkState","TERMINATION_BEFORE_INIT","MULTIPLE_TERMINATION","STATE_TERMINATED","storeData","CMIElement","RETRIEVE_BEFORE_INIT","RETRIEVE_AFTER_TERM","getCMIValue","e","message","GENERAL","commitCallback","String","STORE_BEFORE_INIT","STORE_AFTER_TERM","setCMIValue","scheduleCommit","clearScheduledCommit","COMMIT_BEFORE_INIT","COMMIT_AFTER_TERM","CMIErrorCode","getLmsErrorMessageDetails","beforeInitError","afterTermError","isNotInitialized","functionName","formatMessage","baseLength","messageString","fillChars","length","i","CMIElementBaseLength","j","str","tester","match","refObject","attribute","getOwnPropertyDescriptor","getPrototypeOf","_errorNumber","_detail","Error","_CMIElement","_value","methodName","scorm2004","structure","split","foundFirstIndex","invalidErrorMessage","invalidErrorCode","UNDEFINED_DATA_MODEL","substr","_isTargetValid","READ_ONLY_ELEMENT","_checkObjectHasProperty","stringMatches","validateCorrectResponse","index","isNaN","item","childArray","newChild","getChildElement","initialized","initialize","push","_foundFirstIndex","uninitializedErrorMessage","target","VALUE_NOT_INITIALIZED","CHILDREN_ERROR","COUNT_ERROR","listenerName","callback","listenerFunctions","listenerSplit","removeIndex","findIndex","obj","splice","filter","listener","functionsMatch","listenerHasCMIElement","CMIElementsMatch","substring","indexOf","errorNumber","success","_calculateTotalTime","json","testPattern","a","c","a_pattern","a_match","c_match","a_num","Number","c_num","int_pattern","obj_pattern","keys","map","key","sort","b","d","forEach","element","loadFromJSON","startingData","currentCMIElement","constructor","stringify","renderCMIToJSONString","_terminateCommit","url","params","immediate","api","process","genericError","httpReq","XMLHttpRequest","open","header","setRequestHeader","withCredentials","onload","Array","send","join","headers","blob","Blob","navigator","sendBeacon","when","ScheduledCommit","API","wrapper","bind","commit","CMI","CMIInteractionsCorrectResponsesObject","CMIInteractionsObject","CMIInteractionsObjectivesObject","CMIObjectivesObject","NAV","Utilities","scorm12_constants","Scorm12API","finalSettings","mastery_override","nav","LMSInitialize","lmsInitialize","LMSFinish","lmsFinish","LMSGetValue","lmsGetValue","LMSSetValue","lmsSetValue","LMSCommit","lmsCommit","LMSGetLastError","lmsGetLastError","LMSGetErrorString","lmsGetErrorString","LMSGetDiagnostic","lmsGetDiagnostic","terminate","event","getValue","setValue","getLastError","getErrorString","getDiagnostic","_commonSetCMIValue","_commonGetCMIValue","detail","basicMessage","detailMessage","error_descriptions","newAPI","terminateCommit","cmiExport","renderCMIToJSONObject","core","total_time","getCurrentTotalTime","flattened","flatten","originalStatus","lesson_status","lesson_mode","credit","student_data","mastery_score","score","raw","parseFloat","renderCommitCMI","processHttpRequest","Regex","scorm12_regex","checkValidFormat","regexPattern","errorClass","allowEmptyString","formatRegex","RegExp","matches","checkValidRange","rangePattern","ranges","BaseCMI","getTime","CMIScore","score_children","score_range","invalidTypeCode","invalidRangeCode","decimalRegex","INVALID_SET_VALUE","TYPE_MISMATCH","VALUE_OUT_OF_RANGE","CMIDecimal","_children","jsonString","children","_count","Scorm12ValidationError","Util","throwReadOnlyError","throwWriteOnlyError","WRITE_ONLY_ELEMENT","throwInvalidValueError","check12ValidFormat","check12ValidRange","cmi_children","CMICore","objectives","CMIObjectives","CMIStudentData","student_preference","CMIStudentPreference","interactions","CMIInteractions","suspend_data","launch_data","comments","comments_from_lms","_version","CMIString4096","start_time","core_children","student_id","student_name","lesson_location","CMIString256","CMIStatus","CMIStatus2","entry","exit","CMIExit","session_time","CMITimespan","sessionTime","startTime","seconds","getSecondsAsHHMMSS","addHHMMSSTimeStrings","objectives_children","student_data_children","max_time_allowed","time_limit_action","student_preference_children","audio","CMISInteger","audio_range","language","speed","speed_range","text","text_range","interactions_children","correct_responses","correct_responses_children","id","CMIIdentifier","CMITime","CMIType","weighting","weighting_range","student_response","CMIFeedback","CMIResult","latency","pattern","NAVEvent","LOG_LEVEL_NONE","comments_children","aicc","student_demographics_children","tries_children","attempt_records_children","paths_children","INITIALIZATION_FAILED","TERMINATION_FAILURE","ARGUMENT_ERROR","GENERAL_GET_FAILURE","GENERAL_SET_FAILURE","GENERAL_COMMIT_FAILURE","UNIMPLEMENTED_ELEMENT","DEPENDENCY_NOT_ESTABLISHED","MULTIPLE_TERMINATIONS","CMIInteger","CMIIndex","CMIString200","CMIString250","CMIString1000","CMIString4000","CMIString64000","CMILang","CMILangString250","CMILangcr","CMILangString250cr","CMILangString4000","CMIShortIdentifier","CMILongIdentifier","CMIIndexStore","CMICStatus","CMISStatus","NAVBoolean","NAVTarget","scaled_range","progress_range","scorm12_errors","aicc_errors","scorm2004_errors","errorMessage","detailedMessage","AICCValidationError","Scorm2004ValidationError","SECONDS_PER_SECOND","SECONDS_PER_MINUTE","SECONDS_PER_HOUR","SECONDS_PER_DAY","designations","totalSeconds","hours","floor","dateObj","minutes","getUTCMinutes","getSeconds","ms","msStr","countDecimals","toFixed","getSecondsAsISODuration","duration","remainder","sign","current_seconds","getTimeAsSeconds","timeString","timeRegex","parts","getDurationAsSeconds","durationRegex","exec","years","months","days","addTwoDurations","first","second","data","recurse","cur","prop","isArray","l","isEmpty","p","regex","m","num","window"],"sourceRoot":""}
\ No newline at end of file
diff --git a/dist/scorm12.min.js b/dist/scorm12.min.js
index 1183e39..866a56d 100644
--- a/dist/scorm12.min.js
+++ b/dist/scorm12.min.js
@@ -1,5529 +1,34 @@
-(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i
- * Build: `lodash modularize exports="npm" -o ./`
- * Copyright jQuery Foundation and other contributors
- * Released under MIT license
- * Based on Underscore.js 1.8.3
- * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- */
-
-/** Used as the `TypeError` message for "Functions" methods. */
-var FUNC_ERROR_TEXT = 'Expected a function';
-
-/** Used as references for various `Number` constants. */
-var NAN = 0 / 0;
-
-/** `Object#toString` result references. */
-var symbolTag = '[object Symbol]';
-
-/** Used to match leading and trailing whitespace. */
-var reTrim = /^\s+|\s+$/g;
-
-/** Used to detect bad signed hexadecimal string values. */
-var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
-
-/** Used to detect binary string values. */
-var reIsBinary = /^0b[01]+$/i;
-
-/** Used to detect octal string values. */
-var reIsOctal = /^0o[0-7]+$/i;
-
-/** Built-in method references without a dependency on `root`. */
-var freeParseInt = parseInt;
-
-/** Detect free variable `global` from Node.js. */
-var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
-
-/** Detect free variable `self`. */
-var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
-
-/** Used as a reference to the global object. */
-var root = freeGlobal || freeSelf || Function('return this')();
-
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objectToString = objectProto.toString;
-
-/* Built-in method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max,
- nativeMin = Math.min;
-
-/**
- * Gets the timestamp of the number of milliseconds that have elapsed since
- * the Unix epoch (1 January 1970 00:00:00 UTC).
- *
- * @static
- * @memberOf _
- * @since 2.4.0
- * @category Date
- * @returns {number} Returns the timestamp.
- * @example
- *
- * _.defer(function(stamp) {
- * console.log(_.now() - stamp);
- * }, _.now());
- * // => Logs the number of milliseconds it took for the deferred invocation.
- */
-var now = function() {
- return root.Date.now();
-};
-
-/**
- * Creates a debounced function that delays invoking `func` until after `wait`
- * milliseconds have elapsed since the last time the debounced function was
- * invoked. The debounced function comes with a `cancel` method to cancel
- * delayed `func` invocations and a `flush` method to immediately invoke them.
- * Provide `options` to indicate whether `func` should be invoked on the
- * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
- * with the last arguments provided to the debounced function. Subsequent
- * calls to the debounced function return the result of the last `func`
- * invocation.
- *
- * **Note:** If `leading` and `trailing` options are `true`, `func` is
- * invoked on the trailing edge of the timeout only if the debounced function
- * is invoked more than once during the `wait` timeout.
- *
- * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
- * until to the next tick, similar to `setTimeout` with a timeout of `0`.
- *
- * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
- * for details over the differences between `_.debounce` and `_.throttle`.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Function
- * @param {Function} func The function to debounce.
- * @param {number} [wait=0] The number of milliseconds to delay.
- * @param {Object} [options={}] The options object.
- * @param {boolean} [options.leading=false]
- * Specify invoking on the leading edge of the timeout.
- * @param {number} [options.maxWait]
- * The maximum time `func` is allowed to be delayed before it's invoked.
- * @param {boolean} [options.trailing=true]
- * Specify invoking on the trailing edge of the timeout.
- * @returns {Function} Returns the new debounced function.
- * @example
- *
- * // Avoid costly calculations while the window size is in flux.
- * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
- *
- * // Invoke `sendMail` when clicked, debouncing subsequent calls.
- * jQuery(element).on('click', _.debounce(sendMail, 300, {
- * 'leading': true,
- * 'trailing': false
- * }));
- *
- * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
- * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
- * var source = new EventSource('/stream');
- * jQuery(source).on('message', debounced);
- *
- * // Cancel the trailing debounced invocation.
- * jQuery(window).on('popstate', debounced.cancel);
- */
-function debounce(func, wait, options) {
- var lastArgs,
- lastThis,
- maxWait,
- result,
- timerId,
- lastCallTime,
- lastInvokeTime = 0,
- leading = false,
- maxing = false,
- trailing = true;
-
- if (typeof func != 'function') {
- throw new TypeError(FUNC_ERROR_TEXT);
- }
- wait = toNumber(wait) || 0;
- if (isObject(options)) {
- leading = !!options.leading;
- maxing = 'maxWait' in options;
- maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
- trailing = 'trailing' in options ? !!options.trailing : trailing;
- }
-
- function invokeFunc(time) {
- var args = lastArgs,
- thisArg = lastThis;
-
- lastArgs = lastThis = undefined;
- lastInvokeTime = time;
- result = func.apply(thisArg, args);
- return result;
- }
-
- function leadingEdge(time) {
- // Reset any `maxWait` timer.
- lastInvokeTime = time;
- // Start the timer for the trailing edge.
- timerId = setTimeout(timerExpired, wait);
- // Invoke the leading edge.
- return leading ? invokeFunc(time) : result;
- }
-
- function remainingWait(time) {
- var timeSinceLastCall = time - lastCallTime,
- timeSinceLastInvoke = time - lastInvokeTime,
- result = wait - timeSinceLastCall;
-
- return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
- }
-
- function shouldInvoke(time) {
- var timeSinceLastCall = time - lastCallTime,
- timeSinceLastInvoke = time - lastInvokeTime;
-
- // Either this is the first call, activity has stopped and we're at the
- // trailing edge, the system time has gone backwards and we're treating
- // it as the trailing edge, or we've hit the `maxWait` limit.
- return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
- (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
- }
-
- function timerExpired() {
- var time = now();
- if (shouldInvoke(time)) {
- return trailingEdge(time);
- }
- // Restart the timer.
- timerId = setTimeout(timerExpired, remainingWait(time));
- }
-
- function trailingEdge(time) {
- timerId = undefined;
-
- // Only invoke if we have `lastArgs` which means `func` has been
- // debounced at least once.
- if (trailing && lastArgs) {
- return invokeFunc(time);
- }
- lastArgs = lastThis = undefined;
- return result;
- }
-
- function cancel() {
- if (timerId !== undefined) {
- clearTimeout(timerId);
- }
- lastInvokeTime = 0;
- lastArgs = lastCallTime = lastThis = timerId = undefined;
- }
-
- function flush() {
- return timerId === undefined ? result : trailingEdge(now());
- }
-
- function debounced() {
- var time = now(),
- isInvoking = shouldInvoke(time);
-
- lastArgs = arguments;
- lastThis = this;
- lastCallTime = time;
-
- if (isInvoking) {
- if (timerId === undefined) {
- return leadingEdge(lastCallTime);
- }
- if (maxing) {
- // Handle invocations in a tight loop.
- timerId = setTimeout(timerExpired, wait);
- return invokeFunc(lastCallTime);
- }
- }
- if (timerId === undefined) {
- timerId = setTimeout(timerExpired, wait);
- }
- return result;
- }
- debounced.cancel = cancel;
- debounced.flush = flush;
- return debounced;
-}
-
-/**
- * Checks if `value` is the
- * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
- * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(_.noop);
- * // => true
- *
- * _.isObject(null);
- * // => false
- */
-function isObject(value) {
- var type = typeof value;
- return !!value && (type == 'object' || type == 'function');
-}
-
-/**
- * Checks if `value` is object-like. A value is object-like if it's not `null`
- * and has a `typeof` result of "object".
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- * @example
- *
- * _.isObjectLike({});
- * // => true
- *
- * _.isObjectLike([1, 2, 3]);
- * // => true
- *
- * _.isObjectLike(_.noop);
- * // => false
- *
- * _.isObjectLike(null);
- * // => false
- */
-function isObjectLike(value) {
- return !!value && typeof value == 'object';
-}
-
-/**
- * Checks if `value` is classified as a `Symbol` primitive or object.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
- * @example
- *
- * _.isSymbol(Symbol.iterator);
- * // => true
- *
- * _.isSymbol('abc');
- * // => false
- */
-function isSymbol(value) {
- return typeof value == 'symbol' ||
- (isObjectLike(value) && objectToString.call(value) == symbolTag);
-}
-
-/**
- * Converts `value` to a number.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to process.
- * @returns {number} Returns the number.
- * @example
- *
- * _.toNumber(3.2);
- * // => 3.2
- *
- * _.toNumber(Number.MIN_VALUE);
- * // => 5e-324
- *
- * _.toNumber(Infinity);
- * // => Infinity
- *
- * _.toNumber('3.2');
- * // => 3.2
- */
-function toNumber(value) {
- if (typeof value == 'number') {
- return value;
- }
- if (isSymbol(value)) {
- return NAN;
- }
- if (isObject(value)) {
- var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
- value = isObject(other) ? (other + '') : other;
- }
- if (typeof value != 'string') {
- return value === 0 ? value : +value;
- }
- value = value.replace(reTrim, '');
- var isBinary = reIsBinary.test(value);
- return (isBinary || reIsOctal.test(value))
- ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
- : (reIsBadHex.test(value) ? NAN : +value);
-}
-
-module.exports = debounce;
-
-}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{}],2:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _common = require("./cmi/common");
-
-var _exceptions = require("./exceptions");
-
-var _error_codes2 = _interopRequireDefault(require("./constants/error_codes"));
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-var _utilities = require("./utilities");
-
-var _lodash = _interopRequireDefault(require("lodash.debounce"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
-
-function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
-
-function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
-
-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; }
-
-function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
-
-function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
-
-function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
-
-function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
-
-function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-
-function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
-
-function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
-
-function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-
-var global_constants = _api_constants["default"].global;
-var scorm12_error_codes = _error_codes2["default"].scorm12;
-/**
- * Base API class for AICC, SCORM 1.2, and SCORM 2004. Should be considered
- * abstract, and never initialized on it's own.
- */
-
-var _timeout = /*#__PURE__*/new WeakMap();
-
-var _error_codes = /*#__PURE__*/new WeakMap();
-
-var _settings = /*#__PURE__*/new WeakMap();
-
-var BaseAPI = /*#__PURE__*/function () {
- /**
- * Constructor for Base API class. Sets some shared API fields, as well as
- * sets up options for the API.
- * @param {object} error_codes
- * @param {object} settings
- */
- function BaseAPI(error_codes, settings) {
- _classCallCheck(this, BaseAPI);
-
- _classPrivateFieldInitSpec(this, _timeout, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(this, _error_codes, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(this, _settings, {
- writable: true,
- value: {
- autocommit: false,
- autocommitSeconds: 10,
- asyncCommit: false,
- sendBeaconCommit: false,
- lmsCommitUrl: false,
- dataCommitFormat: 'json',
- // valid formats are 'json' or 'flattened', 'params'
- commitRequestDataType: 'application/json;charset=UTF-8',
- autoProgress: false,
- logLevel: global_constants.LOG_LEVEL_ERROR,
- selfReportSessionTime: false,
- alwaysSendTotalTime: false,
- strict_errors: true,
- xhrHeaders: {},
- xhrWithCredentials: false,
- responseHandler: function responseHandler(xhr) {
- var result;
-
- if (typeof xhr !== 'undefined') {
- result = JSON.parse(xhr.responseText);
-
- if (result === null || !{}.hasOwnProperty.call(result, 'result')) {
- result = {};
-
- if (xhr.status === 200) {
- result.result = global_constants.SCORM_TRUE;
- result.errorCode = 0;
- } else {
- result.result = global_constants.SCORM_FALSE;
- result.errorCode = 101;
- }
- }
- }
-
- return result;
- },
- onLogMessage: function onLogMessage(messageLevel, logMessage) {
- switch (messageLevel) {
- case global_constants.LOG_LEVEL_ERROR:
- console.error(logMessage);
- break;
-
- case global_constants.LOG_LEVEL_WARNING:
- console.warn(logMessage);
- break;
-
- case global_constants.LOG_LEVEL_INFO:
- console.info(logMessage);
- break;
-
- case global_constants.LOG_LEVEL_DEBUG:
- if (console.debug) {
- console.debug(logMessage);
- } else {
- console.log(logMessage);
- }
-
- break;
- }
- }
- }
- });
-
- _defineProperty(this, "cmi", void 0);
-
- _defineProperty(this, "startingData", void 0);
-
- if ((this instanceof BaseAPI ? this.constructor : void 0) === BaseAPI) {
- throw new TypeError('Cannot construct BaseAPI instances directly');
- }
-
- this.currentState = global_constants.STATE_NOT_INITIALIZED;
- this.lastErrorCode = 0;
- this.listenerArray = [];
-
- _classPrivateFieldSet(this, _timeout, null);
-
- _classPrivateFieldSet(this, _error_codes, error_codes);
-
- this.settings = settings;
- this.apiLogLevel = this.settings.logLevel;
- this.selfReportSessionTime = this.settings.selfReportSessionTime;
- }
- /**
- * Initialize the API
- * @param {string} callbackName
- * @param {string} initializeMessage
- * @param {string} terminationMessage
- * @return {string}
- */
-
-
- _createClass(BaseAPI, [{
- key: "initialize",
- value: function initialize(callbackName, initializeMessage, terminationMessage) {
- var returnValue = global_constants.SCORM_FALSE;
-
- if (this.isInitialized()) {
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).INITIALIZED, initializeMessage);
- } else if (this.isTerminated()) {
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).TERMINATED, terminationMessage);
- } else {
- if (this.selfReportSessionTime) {
- this.cmi.setStartTime();
- }
-
- this.currentState = global_constants.STATE_INITIALIZED;
- this.lastErrorCode = 0;
- returnValue = global_constants.SCORM_TRUE;
- this.processListeners(callbackName);
- }
-
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- this.clearSCORMError(returnValue);
- return returnValue;
- }
- /**
- * Getter for #error_codes
- * @return {object}
- */
-
- }, {
- key: "error_codes",
- get: function get() {
- return _classPrivateFieldGet(this, _error_codes);
- }
- /**
- * Getter for #settings
- * @return {object}
- */
-
- }, {
- key: "settings",
- get: function get() {
- return _classPrivateFieldGet(this, _settings);
- }
- /**
- * Setter for #settings
- * @param {object} settings
- */
- ,
- set: function set(settings) {
- _classPrivateFieldSet(this, _settings, _objectSpread(_objectSpread({}, _classPrivateFieldGet(this, _settings)), settings));
- }
- /**
- * Terminates the current run of the API
- * @param {string} callbackName
- * @param {boolean} checkTerminated
- * @return {string}
- */
-
- }, {
- key: "terminate",
- value: function terminate(callbackName, checkTerminated) {
- var returnValue = global_constants.SCORM_FALSE;
-
- if (this.checkState(checkTerminated, _classPrivateFieldGet(this, _error_codes).TERMINATION_BEFORE_INIT, _classPrivateFieldGet(this, _error_codes).MULTIPLE_TERMINATION)) {
- this.currentState = global_constants.STATE_TERMINATED;
- var result = this.storeData(true);
-
- if (!this.settings.sendBeaconCommit && !this.settings.asyncCommit && typeof result.errorCode !== 'undefined' && result.errorCode > 0) {
- this.throwSCORMError(result.errorCode);
- }
-
- returnValue = typeof result !== 'undefined' && result.result ? result.result : global_constants.SCORM_FALSE;
- if (checkTerminated) this.lastErrorCode = 0;
- returnValue = global_constants.SCORM_TRUE;
- this.processListeners(callbackName);
- }
-
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- this.clearSCORMError(returnValue);
- return returnValue;
- }
- /**
- * Get the value of the CMIElement.
- *
- * @param {string} callbackName
- * @param {boolean} checkTerminated
- * @param {string} CMIElement
- * @return {string}
- */
-
- }, {
- key: "getValue",
- value: function getValue(callbackName, checkTerminated, CMIElement) {
- var returnValue;
-
- if (this.checkState(checkTerminated, _classPrivateFieldGet(this, _error_codes).RETRIEVE_BEFORE_INIT, _classPrivateFieldGet(this, _error_codes).RETRIEVE_AFTER_TERM)) {
- if (checkTerminated) this.lastErrorCode = 0;
-
- try {
- returnValue = this.getCMIValue(CMIElement);
- } catch (e) {
- if (e instanceof _exceptions.ValidationError) {
- this.lastErrorCode = e.errorCode;
- returnValue = global_constants.SCORM_FALSE;
- } else {
- if (e.message) {
- console.error(e.message);
- } else {
- console.error(e);
- }
-
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).GENERAL);
- }
- }
-
- this.processListeners(callbackName, CMIElement);
- }
-
- this.apiLog(callbackName, CMIElement, ': returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- this.clearSCORMError(returnValue);
- return returnValue;
- }
- /**
- * Sets the value of the CMIElement.
- *
- * @param {string} callbackName
- * @param {string} commitCallback
- * @param {boolean} checkTerminated
- * @param {string} CMIElement
- * @param {*} value
- * @return {string}
- */
-
- }, {
- key: "setValue",
- value: function setValue(callbackName, commitCallback, checkTerminated, CMIElement, value) {
- if (value !== undefined) {
- value = String(value);
- }
-
- var returnValue = global_constants.SCORM_FALSE;
-
- if (this.checkState(checkTerminated, _classPrivateFieldGet(this, _error_codes).STORE_BEFORE_INIT, _classPrivateFieldGet(this, _error_codes).STORE_AFTER_TERM)) {
- if (checkTerminated) this.lastErrorCode = 0;
-
- try {
- returnValue = this.setCMIValue(CMIElement, value);
- } catch (e) {
- if (e instanceof _exceptions.ValidationError) {
- this.lastErrorCode = e.errorCode;
- returnValue = global_constants.SCORM_FALSE;
- } else {
- if (e.message) {
- console.error(e.message);
- } else {
- console.error(e);
- }
-
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).GENERAL);
- }
- }
-
- this.processListeners(callbackName, CMIElement, value);
- }
-
- if (returnValue === undefined) {
- returnValue = global_constants.SCORM_FALSE;
- } // If we didn't have any errors while setting the data, go ahead and
- // schedule a commit, if autocommit is turned on
-
-
- if (String(this.lastErrorCode) === '0') {
- if (this.settings.autocommit && !_classPrivateFieldGet(this, _timeout)) {
- this.scheduleCommit(this.settings.autocommitSeconds * 1000, commitCallback);
- }
- }
-
- this.apiLog(callbackName, CMIElement, ': ' + value + ': result: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- this.clearSCORMError(returnValue);
- return returnValue;
- }
- /**
- * Orders LMS to store all content parameters
- * @param {string} callbackName
- * @param {boolean} checkTerminated
- * @return {string}
- */
-
- }, {
- key: "commit",
- value: function commit(callbackName, checkTerminated) {
- this.clearScheduledCommit();
- var returnValue = global_constants.SCORM_FALSE;
-
- if (this.checkState(checkTerminated, _classPrivateFieldGet(this, _error_codes).COMMIT_BEFORE_INIT, _classPrivateFieldGet(this, _error_codes).COMMIT_AFTER_TERM)) {
- var result = this.storeData(false);
-
- if (!this.settings.sendBeaconCommit && !this.settings.asyncCommit && result.errorCode && result.errorCode > 0) {
- this.throwSCORMError(result.errorCode);
- }
-
- returnValue = typeof result !== 'undefined' && result.result ? result.result : global_constants.SCORM_FALSE;
- this.apiLog(callbackName, 'HttpRequest', ' Result: ' + returnValue, global_constants.LOG_LEVEL_DEBUG);
- if (checkTerminated) this.lastErrorCode = 0;
- this.processListeners(callbackName);
- }
-
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- this.clearSCORMError(returnValue);
- return returnValue;
- }
- /**
- * Returns last error code
- * @param {string} callbackName
- * @return {string}
- */
-
- }, {
- key: "getLastError",
- value: function getLastError(callbackName) {
- var returnValue = String(this.lastErrorCode);
- this.processListeners(callbackName);
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- return returnValue;
- }
- /**
- * Returns the errorNumber error description
- *
- * @param {string} callbackName
- * @param {(string|number)} CMIErrorCode
- * @return {string}
- */
-
- }, {
- key: "getErrorString",
- value: function getErrorString(callbackName, CMIErrorCode) {
- var returnValue = '';
-
- if (CMIErrorCode !== null && CMIErrorCode !== '') {
- returnValue = this.getLmsErrorMessageDetails(CMIErrorCode);
- this.processListeners(callbackName);
- }
-
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- return returnValue;
- }
- /**
- * Returns a comprehensive description of the errorNumber error.
- *
- * @param {string} callbackName
- * @param {(string|number)} CMIErrorCode
- * @return {string}
- */
-
- }, {
- key: "getDiagnostic",
- value: function getDiagnostic(callbackName, CMIErrorCode) {
- var returnValue = '';
-
- if (CMIErrorCode !== null && CMIErrorCode !== '') {
- returnValue = this.getLmsErrorMessageDetails(CMIErrorCode, true);
- this.processListeners(callbackName);
- }
-
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- return returnValue;
- }
- /**
- * Checks the LMS state and ensures it has been initialized.
- *
- * @param {boolean} checkTerminated
- * @param {number} beforeInitError
- * @param {number} afterTermError
- * @return {boolean}
- */
-
- }, {
- key: "checkState",
- value: function checkState(checkTerminated, beforeInitError, afterTermError) {
- if (this.isNotInitialized()) {
- this.throwSCORMError(beforeInitError);
- return false;
- } else if (checkTerminated && this.isTerminated()) {
- this.throwSCORMError(afterTermError);
- return false;
- }
-
- return true;
- }
- /**
- * Logging for all SCORM actions
- *
- * @param {string} functionName
- * @param {string} CMIElement
- * @param {string} logMessage
- * @param {number}messageLevel
- */
-
- }, {
- key: "apiLog",
- value: function apiLog(functionName, CMIElement, logMessage, messageLevel) {
- logMessage = this.formatMessage(functionName, CMIElement, logMessage);
-
- if (messageLevel >= this.apiLogLevel) {
- this.settings.onLogMessage(messageLevel, logMessage);
- }
- }
- /**
- * Formats the SCORM messages for easy reading
- *
- * @param {string} functionName
- * @param {string} CMIElement
- * @param {string} message
- * @return {string}
- */
-
- }, {
- key: "formatMessage",
- value: function formatMessage(functionName, CMIElement, message) {
- var baseLength = 20;
- var messageString = '';
- messageString += functionName;
- var fillChars = baseLength - messageString.length;
-
- for (var i = 0; i < fillChars; i++) {
- messageString += ' ';
- }
-
- messageString += ': ';
-
- if (CMIElement) {
- var CMIElementBaseLength = 70;
- messageString += CMIElement;
- fillChars = CMIElementBaseLength - messageString.length;
-
- for (var j = 0; j < fillChars; j++) {
- messageString += ' ';
- }
- }
-
- if (message) {
- messageString += message;
- }
-
- return messageString;
- }
- /**
- * Checks to see if {str} contains {tester}
- *
- * @param {string} str String to check against
- * @param {string} tester String to check for
- * @return {boolean}
- */
-
- }, {
- key: "stringMatches",
- value: function stringMatches(str, tester) {
- return str && tester && str.match(tester);
- }
- /**
- * Check to see if the specific object has the given property
- * @param {*} refObject
- * @param {string} attribute
- * @return {boolean}
- * @private
- */
-
- }, {
- key: "_checkObjectHasProperty",
- value: function _checkObjectHasProperty(refObject, attribute) {
- return Object.hasOwnProperty.call(refObject, attribute) || Object.getOwnPropertyDescriptor(Object.getPrototypeOf(refObject), attribute) || attribute in refObject;
- }
- /**
- * Returns the message that corresponds to errorNumber
- * APIs that inherit BaseAPI should override this function
- *
- * @param {(string|number)} _errorNumber
- * @param {boolean} _detail
- * @return {string}
- * @abstract
- */
-
- }, {
- key: "getLmsErrorMessageDetails",
- value: function getLmsErrorMessageDetails(_errorNumber, _detail) {
- throw new Error('The getLmsErrorMessageDetails method has not been implemented');
- }
- /**
- * Gets the value for the specific element.
- * APIs that inherit BaseAPI should override this function
- *
- * @param {string} _CMIElement
- * @return {string}
- * @abstract
- */
-
- }, {
- key: "getCMIValue",
- value: function getCMIValue(_CMIElement) {
- throw new Error('The getCMIValue method has not been implemented');
- }
- /**
- * Sets the value for the specific element.
- * APIs that inherit BaseAPI should override this function
- *
- * @param {string} _CMIElement
- * @param {any} _value
- * @return {string}
- * @abstract
- */
-
- }, {
- key: "setCMIValue",
- value: function setCMIValue(_CMIElement, _value) {
- throw new Error('The setCMIValue method has not been implemented');
- }
- /**
- * Shared API method to set a valid for a given element.
- *
- * @param {string} methodName
- * @param {boolean} scorm2004
- * @param {string} CMIElement
- * @param {*} value
- * @return {string}
- */
-
- }, {
- key: "_commonSetCMIValue",
- value: function _commonSetCMIValue(methodName, scorm2004, CMIElement, value) {
- if (!CMIElement || CMIElement === '') {
- return global_constants.SCORM_FALSE;
- }
-
- var structure = CMIElement.split('.');
- var refObject = this;
- var returnValue = global_constants.SCORM_FALSE;
- var foundFirstIndex = false;
- var invalidErrorMessage = "The data model element passed to ".concat(methodName, " (").concat(CMIElement, ") is not a valid SCORM data model element.");
- var invalidErrorCode = scorm2004 ? _classPrivateFieldGet(this, _error_codes).UNDEFINED_DATA_MODEL : _classPrivateFieldGet(this, _error_codes).GENERAL;
-
- for (var i = 0; i < structure.length; i++) {
- var attribute = structure[i];
-
- if (i === structure.length - 1) {
- if (scorm2004 && attribute.substr(0, 8) === '{target=' && typeof refObject._isTargetValid == 'function') {
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).READ_ONLY_ELEMENT);
- } else if (!this._checkObjectHasProperty(refObject, attribute)) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- } else {
- if (this.isInitialized() && this.stringMatches(CMIElement, '\\.correct_responses\\.\\d+')) {
- this.validateCorrectResponse(CMIElement, value);
- }
-
- if (!scorm2004 || this.lastErrorCode === 0) {
- refObject[attribute] = value;
- returnValue = global_constants.SCORM_TRUE;
- }
- }
- } else {
- refObject = refObject[attribute];
-
- if (!refObject) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- break;
- }
-
- if (refObject instanceof _common.CMIArray) {
- var index = parseInt(structure[i + 1], 10); // SCO is trying to set an item on an array
-
- if (!isNaN(index)) {
- var item = refObject.childArray[index];
-
- if (item) {
- refObject = item;
- foundFirstIndex = true;
- } else {
- var newChild = this.getChildElement(CMIElement, value, foundFirstIndex);
- foundFirstIndex = true;
-
- if (!newChild) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- } else {
- if (refObject.initialized) newChild.initialize();
- refObject.childArray.push(newChild);
- refObject = newChild;
- }
- } // Have to update i value to skip the array position
-
-
- i++;
- }
- }
- }
- }
-
- if (returnValue === global_constants.SCORM_FALSE) {
- this.apiLog(methodName, null, "There was an error setting the value for: ".concat(CMIElement, ", value of: ").concat(value), global_constants.LOG_LEVEL_WARNING);
- }
-
- return returnValue;
- }
- /**
- * Abstract method for validating that a response is correct.
- *
- * @param {string} _CMIElement
- * @param {*} _value
- */
-
- }, {
- key: "validateCorrectResponse",
- value: function validateCorrectResponse(_CMIElement, _value) {// just a stub method
- }
- /**
- * Gets or builds a new child element to add to the array.
- * APIs that inherit BaseAPI should override this method.
- *
- * @param {string} _CMIElement - unused
- * @param {*} _value - unused
- * @param {boolean} _foundFirstIndex - unused
- * @return {*}
- * @abstract
- */
-
- }, {
- key: "getChildElement",
- value: function getChildElement(_CMIElement, _value, _foundFirstIndex) {
- throw new Error('The getChildElement method has not been implemented');
- }
- /**
- * Gets a value from the CMI Object
- *
- * @param {string} methodName
- * @param {boolean} scorm2004
- * @param {string} CMIElement
- * @return {*}
- */
-
- }, {
- key: "_commonGetCMIValue",
- value: function _commonGetCMIValue(methodName, scorm2004, CMIElement) {
- if (!CMIElement || CMIElement === '') {
- return '';
- }
-
- var structure = CMIElement.split('.');
- var refObject = this;
- var attribute = null;
- var uninitializedErrorMessage = "The data model element passed to ".concat(methodName, " (").concat(CMIElement, ") has not been initialized.");
- var invalidErrorMessage = "The data model element passed to ".concat(methodName, " (").concat(CMIElement, ") is not a valid SCORM data model element.");
- var invalidErrorCode = scorm2004 ? _classPrivateFieldGet(this, _error_codes).UNDEFINED_DATA_MODEL : _classPrivateFieldGet(this, _error_codes).GENERAL;
-
- for (var i = 0; i < structure.length; i++) {
- attribute = structure[i];
-
- if (!scorm2004) {
- if (i === structure.length - 1) {
- if (!this._checkObjectHasProperty(refObject, attribute)) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- return;
- }
- }
- } else {
- if (String(attribute).substr(0, 8) === '{target=' && typeof refObject._isTargetValid == 'function') {
- var target = String(attribute).substr(8, String(attribute).length - 9);
- return refObject._isTargetValid(target);
- } else if (!this._checkObjectHasProperty(refObject, attribute)) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- return;
- }
- }
-
- refObject = refObject[attribute];
-
- if (refObject === undefined) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- break;
- }
-
- if (refObject instanceof _common.CMIArray) {
- var index = parseInt(structure[i + 1], 10); // SCO is trying to set an item on an array
-
- if (!isNaN(index)) {
- var item = refObject.childArray[index];
-
- if (item) {
- refObject = item;
- } else {
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).VALUE_NOT_INITIALIZED, uninitializedErrorMessage);
- break;
- } // Have to update i value to skip the array position
-
-
- i++;
- }
- }
- }
-
- if (refObject === null || refObject === undefined) {
- if (!scorm2004) {
- if (attribute === '_children') {
- this.throwSCORMError(scorm12_error_codes.CHILDREN_ERROR);
- } else if (attribute === '_count') {
- this.throwSCORMError(scorm12_error_codes.COUNT_ERROR);
- }
- }
- } else {
- return refObject;
- }
- }
- /**
- * Returns true if the API's current state is STATE_INITIALIZED
- *
- * @return {boolean}
- */
-
- }, {
- key: "isInitialized",
- value: function isInitialized() {
- return this.currentState === global_constants.STATE_INITIALIZED;
- }
- /**
- * Returns true if the API's current state is STATE_NOT_INITIALIZED
- *
- * @return {boolean}
- */
-
- }, {
- key: "isNotInitialized",
- value: function isNotInitialized() {
- return this.currentState === global_constants.STATE_NOT_INITIALIZED;
- }
- /**
- * Returns true if the API's current state is STATE_TERMINATED
- *
- * @return {boolean}
- */
-
- }, {
- key: "isTerminated",
- value: function isTerminated() {
- return this.currentState === global_constants.STATE_TERMINATED;
- }
- /**
- * Provides a mechanism for attaching to a specific SCORM event
- *
- * @param {string} listenerName
- * @param {function} callback
- */
-
- }, {
- key: "on",
- value: function on(listenerName, callback) {
- if (!callback) return;
- var listenerFunctions = listenerName.split(' ');
-
- for (var i = 0; i < listenerFunctions.length; i++) {
- var listenerSplit = listenerFunctions[i].split('.');
- if (listenerSplit.length === 0) return;
- var functionName = listenerSplit[0];
- var CMIElement = null;
-
- if (listenerSplit.length > 1) {
- CMIElement = listenerName.replace(functionName + '.', '');
- }
-
- this.listenerArray.push({
- functionName: functionName,
- CMIElement: CMIElement,
- callback: callback
- });
- this.apiLog('on', functionName, "Added event listener: ".concat(this.listenerArray.length), global_constants.LOG_LEVEL_INFO);
- }
- }
- /**
- * Provides a mechanism for detaching a specific SCORM event listener
- *
- * @param {string} listenerName
- * @param {function} callback
- */
-
- }, {
- key: "off",
- value: function off(listenerName, callback) {
- var _this = this;
-
- if (!callback) return;
- var listenerFunctions = listenerName.split(' ');
-
- var _loop = function _loop(i) {
- var listenerSplit = listenerFunctions[i].split('.');
- if (listenerSplit.length === 0) return {
- v: void 0
- };
- var functionName = listenerSplit[0];
- var CMIElement = null;
-
- if (listenerSplit.length > 1) {
- CMIElement = listenerName.replace(functionName + '.', '');
- }
-
- var removeIndex = _this.listenerArray.findIndex(function (obj) {
- return obj.functionName === functionName && obj.CMIElement === CMIElement && obj.callback === callback;
- });
-
- if (removeIndex !== -1) {
- _this.listenerArray.splice(removeIndex, 1);
-
- _this.apiLog('off', functionName, "Removed event listener: ".concat(_this.listenerArray.length), global_constants.LOG_LEVEL_INFO);
- }
- };
-
- for (var i = 0; i < listenerFunctions.length; i++) {
- var _ret = _loop(i);
-
- if (_typeof(_ret) === "object") return _ret.v;
- }
- }
- /**
- * Provides a mechanism for clearing all listeners from a specific SCORM event
- *
- * @param {string} listenerName
- */
-
- }, {
- key: "clear",
- value: function clear(listenerName) {
- var _this2 = this;
-
- var listenerFunctions = listenerName.split(' ');
-
- var _loop2 = function _loop2(i) {
- var listenerSplit = listenerFunctions[i].split('.');
- if (listenerSplit.length === 0) return {
- v: void 0
- };
- var functionName = listenerSplit[0];
- var CMIElement = null;
-
- if (listenerSplit.length > 1) {
- CMIElement = listenerName.replace(functionName + '.', '');
- }
-
- _this2.listenerArray = _this2.listenerArray.filter(function (obj) {
- return obj.functionName !== functionName && obj.CMIElement !== CMIElement;
- });
- };
-
- for (var i = 0; i < listenerFunctions.length; i++) {
- var _ret2 = _loop2(i);
-
- if (_typeof(_ret2) === "object") return _ret2.v;
- }
- }
- /**
- * Processes any 'on' listeners that have been created
- *
- * @param {string} functionName
- * @param {string} CMIElement
- * @param {*} value
- */
-
- }, {
- key: "processListeners",
- value: function processListeners(functionName, CMIElement, value) {
- this.apiLog(functionName, CMIElement, value);
-
- for (var i = 0; i < this.listenerArray.length; i++) {
- var listener = this.listenerArray[i];
- var functionsMatch = listener.functionName === functionName;
- var listenerHasCMIElement = !!listener.CMIElement;
- var CMIElementsMatch = false;
-
- if (CMIElement && listener.CMIElement && listener.CMIElement.substring(listener.CMIElement.length - 1) === '*') {
- CMIElementsMatch = CMIElement.indexOf(listener.CMIElement.substring(0, listener.CMIElement.length - 1)) === 0;
- } else {
- CMIElementsMatch = listener.CMIElement === CMIElement;
- }
-
- if (functionsMatch && (!listenerHasCMIElement || CMIElementsMatch)) {
- listener.callback(CMIElement, value);
- }
- }
- }
- /**
- * Throws a SCORM error
- *
- * @param {number} errorNumber
- * @param {string} message
- */
-
- }, {
- key: "throwSCORMError",
- value: function throwSCORMError(errorNumber, message) {
- if (!message) {
- message = this.getLmsErrorMessageDetails(errorNumber);
- }
-
- this.apiLog('throwSCORMError', null, errorNumber + ': ' + message, global_constants.LOG_LEVEL_ERROR);
- this.lastErrorCode = String(errorNumber);
- }
- /**
- * Clears the last SCORM error code on success.
- *
- * @param {string} success
- */
-
- }, {
- key: "clearSCORMError",
- value: function clearSCORMError(success) {
- if (success !== undefined && success !== global_constants.SCORM_FALSE) {
- this.lastErrorCode = 0;
- }
- }
- /**
- * Attempts to store the data to the LMS, logs data if no LMS configured
- * APIs that inherit BaseAPI should override this function
- *
- * @param {boolean} _calculateTotalTime
- * @return {string}
- * @abstract
- */
-
- }, {
- key: "storeData",
- value: function storeData(_calculateTotalTime) {
- throw new Error('The storeData method has not been implemented');
- }
- /**
- * Load the CMI from a flattened JSON object
- * @param {object} json
- * @param {string} CMIElement
- */
-
- }, {
- key: "loadFromFlattenedJSON",
- value: function loadFromFlattenedJSON(json, CMIElement) {
- var _this3 = this;
-
- if (!this.isNotInitialized()) {
- console.error('loadFromFlattenedJSON can only be called before the call to lmsInitialize.');
- return;
- }
- /**
- * Test match pattern.
- *
- * @param {string} a
- * @param {string} c
- * @param {RegExp} a_pattern
- * @return {number}
- */
-
-
- function testPattern(a, c, a_pattern) {
- var a_match = a.match(a_pattern);
- var c_match;
-
- if (a_match !== null && (c_match = c.match(a_pattern)) !== null) {
- var a_num = Number(a_match[2]);
- var c_num = Number(c_match[2]);
-
- if (a_num === c_num) {
- if (a_match[3] === 'id') {
- return -1;
- } else if (a_match[3] === 'type') {
- if (c_match[3] === 'id') {
- return 1;
- } else {
- return -1;
- }
- } else {
- return 1;
- }
- }
-
- return a_num - c_num;
- }
-
- return null;
- }
-
- var int_pattern = /^(cmi\.interactions\.)(\d+)\.(.*)$/;
- var obj_pattern = /^(cmi\.objectives\.)(\d+)\.(.*)$/;
- var result = Object.keys(json).map(function (key) {
- return [String(key), json[key]];
- }); // CMI interactions need to have id and type loaded before any other fields
-
- result.sort(function (_ref, _ref2) {
- var _ref3 = _slicedToArray(_ref, 2),
- a = _ref3[0],
- b = _ref3[1];
-
- var _ref4 = _slicedToArray(_ref2, 2),
- c = _ref4[0],
- d = _ref4[1];
-
- var test;
-
- if ((test = testPattern(a, c, int_pattern)) !== null) {
- return test;
- }
-
- if ((test = testPattern(a, c, obj_pattern)) !== null) {
- return test;
- }
-
- if (a < c) {
- return -1;
- }
-
- if (a > c) {
- return 1;
- }
-
- return 0;
- });
- var obj;
- result.forEach(function (element) {
- obj = {};
- obj[element[0]] = element[1];
-
- _this3.loadFromJSON((0, _utilities.unflatten)(obj), CMIElement);
- });
- }
- /**
- * Loads CMI data from a JSON object.
- *
- * @param {object} json
- * @param {string} CMIElement
- */
-
- }, {
- key: "loadFromJSON",
- value: function loadFromJSON(json, CMIElement) {
- if (!this.isNotInitialized()) {
- console.error('loadFromJSON can only be called before the call to lmsInitialize.');
- return;
- }
-
- CMIElement = CMIElement !== undefined ? CMIElement : 'cmi';
- this.startingData = json; // could this be refactored down to flatten(json) then setCMIValue on each?
-
- for (var key in json) {
- if ({}.hasOwnProperty.call(json, key) && json[key]) {
- var currentCMIElement = (CMIElement ? CMIElement + '.' : '') + key;
- var value = json[key];
-
- if (value['childArray']) {
- for (var i = 0; i < value['childArray'].length; i++) {
- this.loadFromJSON(value['childArray'][i], currentCMIElement + '.' + i);
- }
- } else if (value.constructor === Object) {
- this.loadFromJSON(value, currentCMIElement);
- } else {
- this.setCMIValue(currentCMIElement, value);
- }
- }
- }
- }
- /**
- * Render the CMI object to JSON for sending to an LMS.
- *
- * @return {string}
- */
-
- }, {
- key: "renderCMIToJSONString",
- value: function renderCMIToJSONString() {
- var cmi = this.cmi; // Do we want/need to return fields that have no set value?
- // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);
-
- return JSON.stringify({
- cmi: cmi
- });
- }
- /**
- * Returns a JS object representing the current cmi
- * @return {object}
- */
-
- }, {
- key: "renderCMIToJSONObject",
- value: function renderCMIToJSONObject() {
- // Do we want/need to return fields that have no set value?
- // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);
- return JSON.parse(this.renderCMIToJSONString());
- }
- /**
- * Render the cmi object to the proper format for LMS commit
- * APIs that inherit BaseAPI should override this function
- *
- * @param {boolean} _terminateCommit
- * @return {*}
- * @abstract
- */
-
- }, {
- key: "renderCommitCMI",
- value: function renderCommitCMI(_terminateCommit) {
- throw new Error('The storeData method has not been implemented');
- }
- /**
- * Send the request to the LMS
- * @param {string} url
- * @param {object|Array} params
- * @param {boolean} immediate
- * @return {object}
- */
-
- }, {
- key: "processHttpRequest",
- value: function processHttpRequest(url, params) {
- var immediate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
- var api = this;
-
- var process = function process(url, params, settings, error_codes) {
- var genericError = {
- 'result': global_constants.SCORM_FALSE,
- 'errorCode': error_codes.GENERAL
- };
- var result;
-
- if (!settings.sendBeaconCommit) {
- var httpReq = new XMLHttpRequest();
- httpReq.open('POST', url, settings.asyncCommit);
-
- if (Object.keys(settings.xhrHeaders).length) {
- Object.keys(settings.xhrHeaders).forEach(function (header) {
- httpReq.setRequestHeader(header, settings.xhrHeaders[header]);
- });
- }
-
- httpReq.withCredentials = settings.xhrWithCredentials;
-
- if (settings.asyncCommit) {
- httpReq.onload = function (e) {
- if (typeof settings.responseHandler === 'function') {
- result = settings.responseHandler(httpReq);
- } else {
- result = JSON.parse(httpReq.responseText);
- }
- };
- }
-
- try {
- if (params instanceof Array) {
- httpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
- httpReq.send(params.join('&'));
- } else {
- httpReq.setRequestHeader('Content-Type', settings.commitRequestDataType);
- httpReq.send(JSON.stringify(params));
- }
-
- if (!settings.asyncCommit) {
- if (typeof settings.responseHandler === 'function') {
- result = settings.responseHandler(httpReq);
- } else {
- result = JSON.parse(httpReq.responseText);
- }
- } else {
- result = {};
- result.result = global_constants.SCORM_TRUE;
- result.errorCode = 0;
- api.processListeners('CommitSuccess');
- return result;
- }
- } catch (e) {
- console.error(e);
- api.processListeners('CommitError');
- return genericError;
- }
- } else {
- try {
- var headers = {
- type: settings.commitRequestDataType
- };
- var blob;
-
- if (params instanceof Array) {
- blob = new Blob([params.join('&')], headers);
- } else {
- blob = new Blob([JSON.stringify(params)], headers);
- }
-
- result = {};
-
- if (navigator.sendBeacon(url, blob)) {
- result.result = global_constants.SCORM_TRUE;
- result.errorCode = 0;
- } else {
- result.result = global_constants.SCORM_FALSE;
- result.errorCode = 101;
- }
- } catch (e) {
- console.error(e);
- api.processListeners('CommitError');
- return genericError;
- }
- }
-
- if (typeof result === 'undefined') {
- api.processListeners('CommitError');
- return genericError;
- }
-
- if (result.result === true || result.result === global_constants.SCORM_TRUE) {
- api.processListeners('CommitSuccess');
- } else {
- api.processListeners('CommitError');
- }
-
- return result;
- };
-
- if (typeof _lodash["default"] !== 'undefined') {
- var debounced = (0, _lodash["default"])(process, 500);
- debounced(url, params, this.settings, this.error_codes); // if we're terminating, go ahead and commit immediately
-
- if (immediate) {
- debounced.flush();
- }
-
- return {
- result: global_constants.SCORM_TRUE,
- errorCode: 0
- };
- } else {
- return process(url, params, this.settings, this.error_codes);
- }
- }
- /**
- * Throws a SCORM error
- *
- * @param {number} when - the number of milliseconds to wait before committing
- * @param {string} callback - the name of the commit event callback
- */
-
- }, {
- key: "scheduleCommit",
- value: function scheduleCommit(when, callback) {
- _classPrivateFieldSet(this, _timeout, new ScheduledCommit(this, when, callback));
-
- this.apiLog('scheduleCommit', '', 'scheduled', global_constants.LOG_LEVEL_DEBUG);
- }
- /**
- * Clears and cancels any currently scheduled commits
- */
-
- }, {
- key: "clearScheduledCommit",
- value: function clearScheduledCommit() {
- if (_classPrivateFieldGet(this, _timeout)) {
- _classPrivateFieldGet(this, _timeout).cancel();
-
- _classPrivateFieldSet(this, _timeout, null);
-
- this.apiLog('clearScheduledCommit', '', 'cleared', global_constants.LOG_LEVEL_DEBUG);
- }
- }
- }]);
-
- return BaseAPI;
-}();
-/**
- * Private class that wraps a timeout call to the commit() function
- */
-
-
-exports["default"] = BaseAPI;
-
-var _API = /*#__PURE__*/new WeakMap();
-
-var _cancelled = /*#__PURE__*/new WeakMap();
-
-var _timeout2 = /*#__PURE__*/new WeakMap();
-
-var _callback = /*#__PURE__*/new WeakMap();
-
-var ScheduledCommit = /*#__PURE__*/function () {
- /**
- * Constructor for ScheduledCommit
- * @param {BaseAPI} API
- * @param {number} when
- * @param {string} callback
- */
- function ScheduledCommit(API, when, callback) {
- _classCallCheck(this, ScheduledCommit);
-
- _classPrivateFieldInitSpec(this, _API, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(this, _cancelled, {
- writable: true,
- value: false
- });
-
- _classPrivateFieldInitSpec(this, _timeout2, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(this, _callback, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldSet(this, _API, API);
-
- _classPrivateFieldSet(this, _timeout2, setTimeout(this.wrapper.bind(this), when));
-
- _classPrivateFieldSet(this, _callback, callback);
- }
- /**
- * Cancel any currently scheduled commit
- */
-
-
- _createClass(ScheduledCommit, [{
- key: "cancel",
- value: function cancel() {
- _classPrivateFieldSet(this, _cancelled, true);
-
- if (_classPrivateFieldGet(this, _timeout2)) {
- clearTimeout(_classPrivateFieldGet(this, _timeout2));
- }
- }
- /**
- * Wrap the API commit call to check if the call has already been cancelled
- */
-
- }, {
- key: "wrapper",
- value: function wrapper() {
- if (!_classPrivateFieldGet(this, _cancelled)) {
- _classPrivateFieldGet(this, _API).commit(_classPrivateFieldGet(this, _callback));
- }
- }
- }]);
-
- return ScheduledCommit;
-}();
-
-},{"./cmi/common":4,"./constants/api_constants":6,"./constants/error_codes":7,"./exceptions":9,"./utilities":11,"lodash.debounce":1}],3:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _BaseAPI2 = _interopRequireDefault(require("./BaseAPI"));
-
-var _scorm12_cmi = require("./cmi/scorm12_cmi");
-
-var Utilities = _interopRequireWildcard(require("./utilities"));
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("./constants/error_codes"));
-
-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; }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-var scorm12_constants = _api_constants["default"].scorm12;
-var global_constants = _api_constants["default"].global;
-var scorm12_error_codes = _error_codes["default"].scorm12;
-/**
- * API class for SCORM 1.2
- */
-
-var Scorm12API = /*#__PURE__*/function (_BaseAPI) {
- _inherits(Scorm12API, _BaseAPI);
-
- var _super = _createSuper(Scorm12API);
-
- /**
- * Constructor for SCORM 1.2 API
- * @param {object} settings
- */
- function Scorm12API(settings) {
- var _this;
-
- _classCallCheck(this, Scorm12API);
-
- var finalSettings = _objectSpread(_objectSpread({}, {
- mastery_override: false
- }), settings);
-
- _this = _super.call(this, scorm12_error_codes, finalSettings);
- _this.cmi = new _scorm12_cmi.CMI();
- _this.nav = new _scorm12_cmi.NAV(); // Rename functions to match 1.2 Spec and expose to modules
-
- _this.LMSInitialize = _this.lmsInitialize;
- _this.LMSFinish = _this.lmsFinish;
- _this.LMSGetValue = _this.lmsGetValue;
- _this.LMSSetValue = _this.lmsSetValue;
- _this.LMSCommit = _this.lmsCommit;
- _this.LMSGetLastError = _this.lmsGetLastError;
- _this.LMSGetErrorString = _this.lmsGetErrorString;
- _this.LMSGetDiagnostic = _this.lmsGetDiagnostic;
- return _this;
- }
- /**
- * lmsInitialize function from SCORM 1.2 Spec
- *
- * @return {string} bool
- */
-
-
- _createClass(Scorm12API, [{
- key: "lmsInitialize",
- value: function lmsInitialize() {
- this.cmi.initialize();
- return this.initialize('LMSInitialize', 'LMS was already initialized!', 'LMS is already finished!');
- }
- /**
- * LMSFinish function from SCORM 1.2 Spec
- *
- * @return {string} bool
- */
-
- }, {
- key: "lmsFinish",
- value: function lmsFinish() {
- var result = this.terminate('LMSFinish', true);
-
- if (result === global_constants.SCORM_TRUE) {
- if (this.nav.event !== '') {
- if (this.nav.event === 'continue') {
- this.processListeners('SequenceNext');
- } else {
- this.processListeners('SequencePrevious');
- }
- } else if (this.settings.autoProgress) {
- this.processListeners('SequenceNext');
- }
- }
-
- return result;
- }
- /**
- * LMSGetValue function from SCORM 1.2 Spec
- *
- * @param {string} CMIElement
- * @return {string}
- */
-
- }, {
- key: "lmsGetValue",
- value: function lmsGetValue(CMIElement) {
- return this.getValue('LMSGetValue', false, CMIElement);
- }
- /**
- * LMSSetValue function from SCORM 1.2 Spec
- *
- * @param {string} CMIElement
- * @param {*} value
- * @return {string}
- */
-
- }, {
- key: "lmsSetValue",
- value: function lmsSetValue(CMIElement, value) {
- return this.setValue('LMSSetValue', 'LMSCommit', false, CMIElement, value);
- }
- /**
- * LMSCommit function from SCORM 1.2 Spec
- *
- * @return {string} bool
- */
-
- }, {
- key: "lmsCommit",
- value: function lmsCommit() {
- return this.commit('LMSCommit', false);
- }
- /**
- * LMSGetLastError function from SCORM 1.2 Spec
- *
- * @return {string}
- */
-
- }, {
- key: "lmsGetLastError",
- value: function lmsGetLastError() {
- return this.getLastError('LMSGetLastError');
- }
- /**
- * LMSGetErrorString function from SCORM 1.2 Spec
- *
- * @param {string} CMIErrorCode
- * @return {string}
- */
-
- }, {
- key: "lmsGetErrorString",
- value: function lmsGetErrorString(CMIErrorCode) {
- return this.getErrorString('LMSGetErrorString', CMIErrorCode);
- }
- /**
- * LMSGetDiagnostic function from SCORM 1.2 Spec
- *
- * @param {string} CMIErrorCode
- * @return {string}
- */
-
- }, {
- key: "lmsGetDiagnostic",
- value: function lmsGetDiagnostic(CMIErrorCode) {
- return this.getDiagnostic('LMSGetDiagnostic', CMIErrorCode);
- }
- /**
- * Sets a value on the CMI Object
- *
- * @param {string} CMIElement
- * @param {*} value
- * @return {string}
- */
-
- }, {
- key: "setCMIValue",
- value: function setCMIValue(CMIElement, value) {
- return this._commonSetCMIValue('LMSSetValue', false, CMIElement, value);
- }
- /**
- * Gets a value from the CMI Object
- *
- * @param {string} CMIElement
- * @return {*}
- */
-
- }, {
- key: "getCMIValue",
- value: function getCMIValue(CMIElement) {
- return this._commonGetCMIValue('getCMIValue', false, CMIElement);
- }
- /**
- * Gets or builds a new child element to add to the array.
- *
- * @param {string} CMIElement
- * @param {*} value
- * @param {boolean} foundFirstIndex
- * @return {object}
- */
-
- }, {
- key: "getChildElement",
- value: function getChildElement(CMIElement, value, foundFirstIndex) {
- var newChild;
-
- if (this.stringMatches(CMIElement, 'cmi\\.objectives\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIObjectivesObject();
- } else if (foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+\\.correct_responses\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIInteractionsCorrectResponsesObject();
- } else if (foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+\\.objectives\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIInteractionsObjectivesObject();
- } else if (!foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+')) {
- newChild = new _scorm12_cmi.CMIInteractionsObject();
- }
-
- return newChild;
- }
- /**
- * Validates Correct Response values
- *
- * @param {string} CMIElement
- * @param {*} value
- * @return {boolean}
- */
-
- }, {
- key: "validateCorrectResponse",
- value: function validateCorrectResponse(CMIElement, value) {
- return true;
- }
- /**
- * Returns the message that corresponds to errorNumber.
- *
- * @param {*} errorNumber
- * @param {boolean} detail
- * @return {string}
- */
-
- }, {
- key: "getLmsErrorMessageDetails",
- value: function getLmsErrorMessageDetails(errorNumber, detail) {
- var basicMessage = 'No Error';
- var detailMessage = 'No Error'; // Set error number to string since inconsistent from modules if string or number
-
- errorNumber = String(errorNumber);
-
- if (scorm12_constants.error_descriptions[errorNumber]) {
- basicMessage = scorm12_constants.error_descriptions[errorNumber].basicMessage;
- detailMessage = scorm12_constants.error_descriptions[errorNumber].detailMessage;
- }
-
- return detail ? detailMessage : basicMessage;
- }
- /**
- * Replace the whole API with another
- *
- * @param {Scorm12API} newAPI
- */
-
- }, {
- key: "replaceWithAnotherScormAPI",
- value: function replaceWithAnotherScormAPI(newAPI) {
- // Data Model
- this.cmi = newAPI.cmi;
- }
- /**
- * Render the cmi object to the proper format for LMS commit
- *
- * @param {boolean} terminateCommit
- * @return {object|Array}
- */
-
- }, {
- key: "renderCommitCMI",
- value: function renderCommitCMI(terminateCommit) {
- var cmiExport = this.renderCMIToJSONObject();
-
- if (terminateCommit) {
- cmiExport.cmi.core.total_time = this.cmi.getCurrentTotalTime();
- }
-
- var result = [];
- var flattened = Utilities.flatten(cmiExport);
-
- switch (this.settings.dataCommitFormat) {
- case 'flattened':
- return Utilities.flatten(cmiExport);
-
- case 'params':
- for (var item in flattened) {
- if ({}.hasOwnProperty.call(flattened, item)) {
- result.push("".concat(item, "=").concat(flattened[item]));
- }
- }
-
- return result;
-
- case 'json':
- default:
- return cmiExport;
- }
- }
- /**
- * Attempts to store the data to the LMS
- *
- * @param {boolean} terminateCommit
- * @return {string}
- */
-
- }, {
- key: "storeData",
- value: function storeData(terminateCommit) {
- if (terminateCommit) {
- var originalStatus = this.cmi.core.lesson_status;
-
- if (originalStatus === 'not attempted') {
- this.cmi.core.lesson_status = 'completed';
- }
-
- if (this.cmi.core.lesson_mode === 'normal') {
- if (this.cmi.core.credit === 'credit') {
- if (this.settings.mastery_override && this.cmi.student_data.mastery_score !== '' && this.cmi.core.score.raw !== '') {
- if (parseFloat(this.cmi.core.score.raw) >= parseFloat(this.cmi.student_data.mastery_score)) {
- this.cmi.core.lesson_status = 'passed';
- } else {
- this.cmi.core.lesson_status = 'failed';
- }
- }
- }
- } else if (this.cmi.core.lesson_mode === 'browse') {
- var _this$startingData, _this$startingData$cm, _this$startingData$cm2;
-
- if ((((_this$startingData = this.startingData) === null || _this$startingData === void 0 ? void 0 : (_this$startingData$cm = _this$startingData.cmi) === null || _this$startingData$cm === void 0 ? void 0 : (_this$startingData$cm2 = _this$startingData$cm.core) === null || _this$startingData$cm2 === void 0 ? void 0 : _this$startingData$cm2.lesson_status) || '') === '' && originalStatus === 'not attempted') {
- this.cmi.core.lesson_status = 'browsed';
- }
- }
- }
-
- var commitObject = this.renderCommitCMI(terminateCommit || this.settings.alwaysSendTotalTime);
-
- if (this.apiLogLevel === global_constants.LOG_LEVEL_DEBUG) {
- console.debug('Commit (terminated: ' + (terminateCommit ? 'yes' : 'no') + '): ');
- console.debug(commitObject);
- }
-
- if (this.settings.lmsCommitUrl) {
- return this.processHttpRequest(this.settings.lmsCommitUrl, commitObject, terminateCommit);
- } else {
- return global_constants.SCORM_TRUE;
- }
- }
- }]);
-
- return Scorm12API;
-}(_BaseAPI2["default"]);
-
-exports["default"] = Scorm12API;
-
-},{"./BaseAPI":2,"./cmi/scorm12_cmi":5,"./constants/api_constants":6,"./constants/error_codes":7,"./utilities":11}],4:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.CMIScore = exports.CMIArray = exports.BaseCMI = void 0;
-exports.checkValidFormat = checkValidFormat;
-exports.checkValidRange = checkValidRange;
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
-
-function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
-
-function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-
-function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
-
-function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
-
-function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-
-var scorm12_constants = _api_constants["default"].scorm12;
-var scorm12_regex = _regex["default"].scorm12;
-var scorm12_error_codes = _error_codes["default"].scorm12;
-/**
- * Check if the value matches the proper format. If not, throw proper error code.
- *
- * @param {string} value
- * @param {string} regexPattern
- * @param {number} errorCode
- * @param {class} errorClass
- * @param {boolean} allowEmptyString
- * @return {boolean}
- */
-
-function checkValidFormat(value, regexPattern, errorCode, errorClass, allowEmptyString) {
- var formatRegex = new RegExp(regexPattern);
- var matches = value.match(formatRegex);
-
- if (allowEmptyString && value === '') {
- return true;
- }
-
- if (value === undefined || !matches || matches[0] === '') {
- throw new errorClass.prototype.constructor(errorCode);
- }
-
- return true;
-}
-/**
- * Check if the value matches the proper range. If not, throw proper error code.
- *
- * @param {*} value
- * @param {string} rangePattern
- * @param {number} errorCode
- * @param {class} errorClass
- * @return {boolean}
- */
-
-
-function checkValidRange(value, rangePattern, errorCode, errorClass) {
- var ranges = rangePattern.split('#');
- value = value * 1.0;
-
- if (value >= ranges[0]) {
- if (ranges[1] === '*' || value <= ranges[1]) {
- return true;
- } else {
- throw new errorClass.prototype.constructor(errorCode);
- }
- } else {
- throw new errorClass.prototype.constructor(errorCode);
- }
-}
-/**
- * Base class for API cmi objects
- */
-
-
-var _initialized = /*#__PURE__*/new WeakMap();
-
-var _start_time = /*#__PURE__*/new WeakMap();
-
-var BaseCMI = /*#__PURE__*/function () {
- /**
- * Constructor for BaseCMI, just marks the class as abstract
- */
- function BaseCMI() {
- _classCallCheck(this, BaseCMI);
-
- _defineProperty(this, "jsonString", false);
-
- _classPrivateFieldInitSpec(this, _initialized, {
- writable: true,
- value: false
- });
-
- _classPrivateFieldInitSpec(this, _start_time, {
- writable: true,
- value: void 0
- });
-
- if ((this instanceof BaseCMI ? this.constructor : void 0) === BaseCMI) {
- throw new TypeError('Cannot construct BaseCMI instances directly');
- }
- }
- /**
- * Getter for #initialized
- * @return {boolean}
- */
-
-
- _createClass(BaseCMI, [{
- key: "initialized",
- get: function get() {
- return _classPrivateFieldGet(this, _initialized);
- }
- /**
- * Getter for #start_time
- * @return {Number}
- */
-
- }, {
- key: "start_time",
- get: function get() {
- return _classPrivateFieldGet(this, _start_time);
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
- }, {
- key: "initialize",
- value: function initialize() {
- _classPrivateFieldSet(this, _initialized, true);
- }
- /**
- * Called when the player should override the 'session_time' provided by
- * the module
- */
-
- }, {
- key: "setStartTime",
- value: function setStartTime() {
- _classPrivateFieldSet(this, _start_time, new Date().getTime());
- }
- }]);
-
- return BaseCMI;
-}();
-/**
- * Base class for cmi *.score objects
- */
-
-
-exports.BaseCMI = BaseCMI;
-
-var _children2 = /*#__PURE__*/new WeakMap();
-
-var _score_range = /*#__PURE__*/new WeakMap();
-
-var _invalid_error_code = /*#__PURE__*/new WeakMap();
-
-var _invalid_type_code = /*#__PURE__*/new WeakMap();
-
-var _invalid_range_code = /*#__PURE__*/new WeakMap();
-
-var _decimal_regex = /*#__PURE__*/new WeakMap();
-
-var _error_class = /*#__PURE__*/new WeakMap();
-
-var _raw = /*#__PURE__*/new WeakMap();
-
-var _min = /*#__PURE__*/new WeakMap();
-
-var _max = /*#__PURE__*/new WeakMap();
-
-var CMIScore = /*#__PURE__*/function (_BaseCMI) {
- _inherits(CMIScore, _BaseCMI);
-
- var _super = _createSuper(CMIScore);
-
- /**
- * Constructor for *.score
- * @param {string} score_children
- * @param {string} score_range
- * @param {string} max
- * @param {number} invalidErrorCode
- * @param {number} invalidTypeCode
- * @param {number} invalidRangeCode
- * @param {string} decimalRegex
- * @param {class} errorClass
- */
- function CMIScore(_ref) {
- var _this;
-
- var score_children = _ref.score_children,
- score_range = _ref.score_range,
- max = _ref.max,
- invalidErrorCode = _ref.invalidErrorCode,
- invalidTypeCode = _ref.invalidTypeCode,
- invalidRangeCode = _ref.invalidRangeCode,
- decimalRegex = _ref.decimalRegex,
- errorClass = _ref.errorClass;
-
- _classCallCheck(this, CMIScore);
-
- _this = _super.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _children2, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _score_range, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _invalid_error_code, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _invalid_type_code, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _invalid_range_code, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _decimal_regex, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _error_class, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _raw, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _min, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _max, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _children2, score_children || scorm12_constants.score_children);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _score_range, !score_range ? false : scorm12_regex.score_range);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _max, max || max === '' ? max : '100');
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _invalid_error_code, invalidErrorCode || scorm12_error_codes.INVALID_SET_VALUE);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _invalid_type_code, invalidTypeCode || scorm12_error_codes.TYPE_MISMATCH);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _invalid_range_code, invalidRangeCode || scorm12_error_codes.VALUE_OUT_OF_RANGE);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _decimal_regex, decimalRegex || scorm12_regex.CMIDecimal);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _error_class, errorClass);
-
- return _this;
- }
-
- _createClass(CMIScore, [{
- key: "_children",
- get:
- /**
- * Getter for _children
- * @return {string}
- * @private
- */
- function get() {
- return _classPrivateFieldGet(this, _children2);
- }
- /**
- * Setter for _children. Just throws an error.
- * @param {string} _children
- * @private
- */
- ,
- set: function set(_children) {
- throw new (_classPrivateFieldGet(this, _error_class).prototype.constructor)(_classPrivateFieldGet(this, _invalid_error_code));
- }
- /**
- * Getter for #raw
- * @return {string}
- */
-
- }, {
- key: "raw",
- get: function get() {
- return _classPrivateFieldGet(this, _raw);
- }
- /**
- * Setter for #raw
- * @param {string} raw
- */
- ,
- set: function set(raw) {
- if (checkValidFormat(raw, _classPrivateFieldGet(this, _decimal_regex), _classPrivateFieldGet(this, _invalid_type_code), _classPrivateFieldGet(this, _error_class)) && (!_classPrivateFieldGet(this, _score_range) || checkValidRange(raw, _classPrivateFieldGet(this, _score_range), _classPrivateFieldGet(this, _invalid_range_code), _classPrivateFieldGet(this, _error_class)))) {
- _classPrivateFieldSet(this, _raw, raw);
- }
- }
- /**
- * Getter for #min
- * @return {string}
- */
-
- }, {
- key: "min",
- get: function get() {
- return _classPrivateFieldGet(this, _min);
- }
- /**
- * Setter for #min
- * @param {string} min
- */
- ,
- set: function set(min) {
- if (checkValidFormat(min, _classPrivateFieldGet(this, _decimal_regex), _classPrivateFieldGet(this, _invalid_type_code), _classPrivateFieldGet(this, _error_class)) && (!_classPrivateFieldGet(this, _score_range) || checkValidRange(min, _classPrivateFieldGet(this, _score_range), _classPrivateFieldGet(this, _invalid_range_code), _classPrivateFieldGet(this, _error_class)))) {
- _classPrivateFieldSet(this, _min, min);
- }
- }
- /**
- * Getter for #max
- * @return {string}
- */
-
- }, {
- key: "max",
- get: function get() {
- return _classPrivateFieldGet(this, _max);
- }
- /**
- * Setter for #max
- * @param {string} max
- */
- ,
- set: function set(max) {
- if (checkValidFormat(max, _classPrivateFieldGet(this, _decimal_regex), _classPrivateFieldGet(this, _invalid_type_code), _classPrivateFieldGet(this, _error_class)) && (!_classPrivateFieldGet(this, _score_range) || checkValidRange(max, _classPrivateFieldGet(this, _score_range), _classPrivateFieldGet(this, _invalid_range_code), _classPrivateFieldGet(this, _error_class)))) {
- _classPrivateFieldSet(this, _max, max);
- }
- }
- /**
- * toJSON for *.score
- * @return {{min: string, max: string, raw: string}}
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'raw': this.raw,
- 'min': this.min,
- 'max': this.max
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIScore;
-}(BaseCMI);
-/**
- * Base class for cmi *.n objects
- */
-
-
-exports.CMIScore = CMIScore;
-
-var _errorCode = /*#__PURE__*/new WeakMap();
-
-var _errorClass = /*#__PURE__*/new WeakMap();
-
-var _children3 = /*#__PURE__*/new WeakMap();
-
-var CMIArray = /*#__PURE__*/function (_BaseCMI2) {
- _inherits(CMIArray, _BaseCMI2);
-
- var _super2 = _createSuper(CMIArray);
-
- /**
- * Constructor cmi *.n arrays
- * @param {string} children
- * @param {number} errorCode
- * @param {class} errorClass
- */
- function CMIArray(_ref2) {
- var _this2;
-
- var children = _ref2.children,
- errorCode = _ref2.errorCode,
- errorClass = _ref2.errorClass;
-
- _classCallCheck(this, CMIArray);
-
- _this2 = _super2.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _errorCode, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _errorClass, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _children3, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldSet(_assertThisInitialized(_this2), _children3, children);
-
- _classPrivateFieldSet(_assertThisInitialized(_this2), _errorCode, errorCode);
-
- _classPrivateFieldSet(_assertThisInitialized(_this2), _errorClass, errorClass);
-
- _this2.childArray = [];
- return _this2;
- }
-
- _createClass(CMIArray, [{
- key: "_children",
- get:
- /**
- * Getter for _children
- * @return {*}
- */
- function get() {
- return _classPrivateFieldGet(this, _children3);
- }
- /**
- * Setter for _children. Just throws an error.
- * @param {string} _children
- */
- ,
- set: function set(_children) {
- throw new (_classPrivateFieldGet(this, _errorClass).prototype.constructor)(_classPrivateFieldGet(this, _errorCode));
- }
- /**
- * Getter for _count
- * @return {number}
- */
-
- }, {
- key: "_count",
- get: function get() {
- return this.childArray.length;
- }
- /**
- * Setter for _count. Just throws an error.
- * @param {number} _count
- */
- ,
- set: function set(_count) {
- throw new (_classPrivateFieldGet(this, _errorClass).prototype.constructor)(_classPrivateFieldGet(this, _errorCode));
- }
- /**
- * toJSON for *.n arrays
- * @return {object}
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {};
-
- for (var i = 0; i < this.childArray.length; i++) {
- result[i + ''] = this.childArray[i];
- }
-
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIArray;
-}(BaseCMI);
-
-exports.CMIArray = CMIArray;
-
-},{"../constants/api_constants":6,"../constants/error_codes":7,"../constants/regex":8}],5:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.NAV = exports.CMIStudentPreference = exports.CMIStudentData = exports.CMIObjectivesObject = exports.CMIInteractionsObjectivesObject = exports.CMIInteractionsObject = exports.CMIInteractionsCorrectResponsesObject = exports.CMI = void 0;
-exports.check12ValidFormat = check12ValidFormat;
-exports.check12ValidRange = check12ValidRange;
-exports.throwReadOnlyError = throwReadOnlyError;
-exports.throwWriteOnlyError = throwWriteOnlyError;
-
-var _common = require("./common");
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-var _exceptions = require("../exceptions");
-
-var Utilities = _interopRequireWildcard(require("../utilities"));
-
-var Util = Utilities;
-
-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; }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); }
-
-function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
-
-function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
-
-function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
-
-function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-
-function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
-
-function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
-
-function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-
-var scorm12_constants = _api_constants["default"].scorm12;
-var scorm12_regex = _regex["default"].scorm12;
-var scorm12_error_codes = _error_codes["default"].scorm12;
-/**
- * Helper method for throwing Read Only error
- */
-
-function throwReadOnlyError() {
- throw new _exceptions.Scorm12ValidationError(scorm12_error_codes.READ_ONLY_ELEMENT);
-}
-/**
- * Helper method for throwing Write Only error
- */
-
-
-function throwWriteOnlyError() {
- throw new _exceptions.Scorm12ValidationError(scorm12_error_codes.WRITE_ONLY_ELEMENT);
-}
-/**
- * Helper method for throwing Invalid Set error
- */
-
-
-function throwInvalidValueError() {
- throw new _exceptions.Scorm12ValidationError(scorm12_error_codes.INVALID_SET_VALUE);
-}
-/**
- * Helper method, no reason to have to pass the same error codes every time
- * @param {*} value
- * @param {string} regexPattern
- * @param {boolean} allowEmptyString
- * @return {boolean}
- */
-
-
-function check12ValidFormat(value, regexPattern, allowEmptyString) {
- return (0, _common.checkValidFormat)(value, regexPattern, scorm12_error_codes.TYPE_MISMATCH, _exceptions.Scorm12ValidationError, allowEmptyString);
-}
-/**
- * Helper method, no reason to have to pass the same error codes every time
- * @param {*} value
- * @param {string} rangePattern
- * @param {boolean} allowEmptyString
- * @return {boolean}
- */
-
-
-function check12ValidRange(value, rangePattern, allowEmptyString) {
- return (0, _common.checkValidRange)(value, rangePattern, scorm12_error_codes.VALUE_OUT_OF_RANGE, _exceptions.Scorm12ValidationError, allowEmptyString);
-}
-/**
- * Class representing the cmi object for SCORM 1.2
- */
-
-
-var _children2 = /*#__PURE__*/new WeakMap();
-
-var _version2 = /*#__PURE__*/new WeakMap();
-
-var _launch_data = /*#__PURE__*/new WeakMap();
-
-var _comments = /*#__PURE__*/new WeakMap();
-
-var _comments_from_lms = /*#__PURE__*/new WeakMap();
-
-var CMI = /*#__PURE__*/function (_BaseCMI) {
- _inherits(CMI, _BaseCMI);
-
- var _super = _createSuper(CMI);
-
- /**
- * Constructor for the SCORM 1.2 cmi object
- * @param {string} cmi_children
- * @param {(CMIStudentData|AICCCMIStudentData)} student_data
- * @param {boolean} initialized
- */
- function CMI(cmi_children, student_data, initialized) {
- var _this;
-
- _classCallCheck(this, CMI);
-
- _this = _super.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _children2, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _version2, {
- writable: true,
- value: '3.4'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _launch_data, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _comments, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _comments_from_lms, {
- writable: true,
- value: ''
- });
-
- _defineProperty(_assertThisInitialized(_this), "student_data", null);
-
- if (initialized) _this.initialize();
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _children2, cmi_children ? cmi_children : scorm12_constants.cmi_children);
-
- _this.core = new CMICore();
- _this.objectives = new CMIObjectives();
- _this.student_data = student_data ? student_data : new CMIStudentData();
- _this.student_preference = new CMIStudentPreference();
- _this.interactions = new CMIInteractions();
- return _this;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(CMI, [{
- key: "initialize",
- value: function initialize() {
- var _this$core, _this$objectives, _this$student_data, _this$student_prefere, _this$interactions;
-
- _get(_getPrototypeOf(CMI.prototype), "initialize", this).call(this);
-
- (_this$core = this.core) === null || _this$core === void 0 ? void 0 : _this$core.initialize();
- (_this$objectives = this.objectives) === null || _this$objectives === void 0 ? void 0 : _this$objectives.initialize();
- (_this$student_data = this.student_data) === null || _this$student_data === void 0 ? void 0 : _this$student_data.initialize();
- (_this$student_prefere = this.student_preference) === null || _this$student_prefere === void 0 ? void 0 : _this$student_prefere.initialize();
- (_this$interactions = this.interactions) === null || _this$interactions === void 0 ? void 0 : _this$interactions.initialize();
- }
- /**
- * toJSON for cmi
- *
- * @return {
- * {
- * suspend_data: string,
- * launch_data: string,
- * comments: string,
- * comments_from_lms: string,
- * core: CMICore,
- * objectives: CMIObjectives,
- * student_data: CMIStudentData,
- * student_preference: CMIStudentPreference,
- * interactions: CMIInteractions
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'suspend_data': this.suspend_data,
- 'launch_data': this.launch_data,
- 'comments': this.comments,
- 'comments_from_lms': this.comments_from_lms,
- 'core': this.core,
- 'objectives': this.objectives,
- 'student_data': this.student_data,
- 'student_preference': this.student_preference,
- 'interactions': this.interactions
- };
- delete this.jsonString;
- return result;
- }
- /**
- * Getter for #_version
- * @return {string}
- */
-
- }, {
- key: "_version",
- get: function get() {
- return _classPrivateFieldGet(this, _version2);
- }
- /**
- * Setter for #_version. Just throws an error.
- * @param {string} _version
- */
- ,
- set: function set(_version) {
- throwInvalidValueError();
- }
- /**
- * Getter for #_children
- * @return {string}
- */
-
- }, {
- key: "_children",
- get: function get() {
- return _classPrivateFieldGet(this, _children2);
- }
- /**
- * Setter for #_version. Just throws an error.
- * @param {string} _children
- */
- ,
- set: function set(_children) {
- throwInvalidValueError();
- }
- /**
- * Getter for #suspend_data
- * @return {string}
- */
-
- }, {
- key: "suspend_data",
- get: function get() {
- var _this$core2;
-
- return (_this$core2 = this.core) === null || _this$core2 === void 0 ? void 0 : _this$core2.suspend_data;
- }
- /**
- * Setter for #suspend_data
- * @param {string} suspend_data
- */
- ,
- set: function set(suspend_data) {
- if (this.core) {
- this.core.suspend_data = suspend_data;
- }
- }
- /**
- * Getter for #launch_data
- * @return {string}
- */
-
- }, {
- key: "launch_data",
- get: function get() {
- return _classPrivateFieldGet(this, _launch_data);
- }
- /**
- * Setter for #launch_data. Can only be called before initialization.
- * @param {string} launch_data
- */
- ,
- set: function set(launch_data) {
- !this.initialized ? _classPrivateFieldSet(this, _launch_data, launch_data) : throwReadOnlyError();
- }
- /**
- * Getter for #comments
- * @return {string}
- */
-
- }, {
- key: "comments",
- get: function get() {
- return _classPrivateFieldGet(this, _comments);
- }
- /**
- * Setter for #comments
- * @param {string} comments
- */
- ,
- set: function set(comments) {
- if (check12ValidFormat(comments, scorm12_regex.CMIString4096, true)) {
- _classPrivateFieldSet(this, _comments, comments);
- }
- }
- /**
- * Getter for #comments_from_lms
- * @return {string}
- */
-
- }, {
- key: "comments_from_lms",
- get: function get() {
- return _classPrivateFieldGet(this, _comments_from_lms);
- }
- /**
- * Setter for #comments_from_lms. Can only be called before initialization.
- * @param {string} comments_from_lms
- */
- ,
- set: function set(comments_from_lms) {
- !this.initialized ? _classPrivateFieldSet(this, _comments_from_lms, comments_from_lms) : throwReadOnlyError();
- }
- /**
- * Adds the current session time to the existing total time.
- *
- * @return {string}
- */
-
- }, {
- key: "getCurrentTotalTime",
- value: function getCurrentTotalTime() {
- return this.core.getCurrentTotalTime(this.start_time);
- }
- }]);
-
- return CMI;
-}(_common.BaseCMI);
-/**
- * Class representing the cmi.core object
- * @extends BaseCMI
- */
-
-
-exports.CMI = CMI;
-
-var _children3 = /*#__PURE__*/new WeakMap();
-
-var _student_id = /*#__PURE__*/new WeakMap();
-
-var _student_name = /*#__PURE__*/new WeakMap();
-
-var _lesson_location = /*#__PURE__*/new WeakMap();
-
-var _credit = /*#__PURE__*/new WeakMap();
-
-var _lesson_status = /*#__PURE__*/new WeakMap();
-
-var _entry = /*#__PURE__*/new WeakMap();
-
-var _total_time = /*#__PURE__*/new WeakMap();
-
-var _lesson_mode = /*#__PURE__*/new WeakMap();
-
-var _exit = /*#__PURE__*/new WeakMap();
-
-var _session_time = /*#__PURE__*/new WeakMap();
-
-var _suspend_data = /*#__PURE__*/new WeakMap();
-
-var CMICore = /*#__PURE__*/function (_BaseCMI2) {
- _inherits(CMICore, _BaseCMI2);
-
- var _super2 = _createSuper(CMICore);
-
- /**
- * Constructor for cmi.core
- */
- function CMICore() {
- var _this2;
-
- _classCallCheck(this, CMICore);
-
- _this2 = _super2.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _children3, {
- writable: true,
- value: scorm12_constants.core_children
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _student_id, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _student_name, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _lesson_location, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _credit, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _lesson_status, {
- writable: true,
- value: 'not attempted'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _entry, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _total_time, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _lesson_mode, {
- writable: true,
- value: 'normal'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _exit, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _session_time, {
- writable: true,
- value: '00:00:00'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _suspend_data, {
- writable: true,
- value: ''
- });
-
- _this2.score = new _common.CMIScore({
- score_children: scorm12_constants.score_children,
- score_range: scorm12_regex.score_range,
- invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,
- invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,
- invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,
- errorClass: _exceptions.Scorm12ValidationError
- });
- return _this2;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(CMICore, [{
- key: "initialize",
- value: function initialize() {
- var _this$score;
-
- _get(_getPrototypeOf(CMICore.prototype), "initialize", this).call(this);
-
- (_this$score = this.score) === null || _this$score === void 0 ? void 0 : _this$score.initialize();
- }
- }, {
- key: "_children",
- get:
- /**
- * Getter for #_children
- * @return {string}
- * @private
- */
- function get() {
- return _classPrivateFieldGet(this, _children3);
- }
- /**
- * Setter for #_children. Just throws an error.
- * @param {string} _children
- * @private
- */
- ,
- set: function set(_children) {
- throwInvalidValueError();
- }
- /**
- * Getter for #student_id
- * @return {string}
- */
-
- }, {
- key: "student_id",
- get: function get() {
- return _classPrivateFieldGet(this, _student_id);
- }
- /**
- * Setter for #student_id. Can only be called before initialization.
- * @param {string} student_id
- */
- ,
- set: function set(student_id) {
- !this.initialized ? _classPrivateFieldSet(this, _student_id, student_id) : throwReadOnlyError();
- }
- /**
- * Getter for #student_name
- * @return {string}
- */
-
- }, {
- key: "student_name",
- get: function get() {
- return _classPrivateFieldGet(this, _student_name);
- }
- /**
- * Setter for #student_name. Can only be called before initialization.
- * @param {string} student_name
- */
- ,
- set: function set(student_name) {
- !this.initialized ? _classPrivateFieldSet(this, _student_name, student_name) : throwReadOnlyError();
- }
- /**
- * Getter for #lesson_location
- * @return {string}
- */
-
- }, {
- key: "lesson_location",
- get: function get() {
- return _classPrivateFieldGet(this, _lesson_location);
- }
- /**
- * Setter for #lesson_location
- * @param {string} lesson_location
- */
- ,
- set: function set(lesson_location) {
- if (check12ValidFormat(lesson_location, scorm12_regex.CMIString256, true)) {
- _classPrivateFieldSet(this, _lesson_location, lesson_location);
- }
- }
- /**
- * Getter for #credit
- * @return {string}
- */
-
- }, {
- key: "credit",
- get: function get() {
- return _classPrivateFieldGet(this, _credit);
- }
- /**
- * Setter for #credit. Can only be called before initialization.
- * @param {string} credit
- */
- ,
- set: function set(credit) {
- !this.initialized ? _classPrivateFieldSet(this, _credit, credit) : throwReadOnlyError();
- }
- /**
- * Getter for #lesson_status
- * @return {string}
- */
-
- }, {
- key: "lesson_status",
- get: function get() {
- return _classPrivateFieldGet(this, _lesson_status);
- }
- /**
- * Setter for #lesson_status
- * @param {string} lesson_status
- */
- ,
- set: function set(lesson_status) {
- if (this.initialized) {
- if (check12ValidFormat(lesson_status, scorm12_regex.CMIStatus)) {
- _classPrivateFieldSet(this, _lesson_status, lesson_status);
- }
- } else {
- if (check12ValidFormat(lesson_status, scorm12_regex.CMIStatus2)) {
- _classPrivateFieldSet(this, _lesson_status, lesson_status);
- }
- }
- }
- /**
- * Getter for #entry
- * @return {string}
- */
-
- }, {
- key: "entry",
- get: function get() {
- return _classPrivateFieldGet(this, _entry);
- }
- /**
- * Setter for #entry. Can only be called before initialization.
- * @param {string} entry
- */
- ,
- set: function set(entry) {
- !this.initialized ? _classPrivateFieldSet(this, _entry, entry) : throwReadOnlyError();
- }
- /**
- * Getter for #total_time
- * @return {string}
- */
-
- }, {
- key: "total_time",
- get: function get() {
- return _classPrivateFieldGet(this, _total_time);
- }
- /**
- * Setter for #total_time. Can only be called before initialization.
- * @param {string} total_time
- */
- ,
- set: function set(total_time) {
- !this.initialized ? _classPrivateFieldSet(this, _total_time, total_time) : throwReadOnlyError();
- }
- /**
- * Getter for #lesson_mode
- * @return {string}
- */
-
- }, {
- key: "lesson_mode",
- get: function get() {
- return _classPrivateFieldGet(this, _lesson_mode);
- }
- /**
- * Setter for #lesson_mode. Can only be called before initialization.
- * @param {string} lesson_mode
- */
- ,
- set: function set(lesson_mode) {
- !this.initialized ? _classPrivateFieldSet(this, _lesson_mode, lesson_mode) : throwReadOnlyError();
- }
- /**
- * Getter for #exit. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "exit",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _exit);
- }
- /**
- * Setter for #exit
- * @param {string} exit
- */
- ,
- set: function set(exit) {
- if (check12ValidFormat(exit, scorm12_regex.CMIExit, true)) {
- _classPrivateFieldSet(this, _exit, exit);
- }
- }
- /**
- * Getter for #session_time. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "session_time",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _session_time);
- }
- /**
- * Setter for #session_time
- * @param {string} session_time
- */
- ,
- set: function set(session_time) {
- if (check12ValidFormat(session_time, scorm12_regex.CMITimespan)) {
- _classPrivateFieldSet(this, _session_time, session_time);
- }
- }
- /**
- * Getter for #suspend_data
- * @return {string}
- */
-
- }, {
- key: "suspend_data",
- get: function get() {
- return _classPrivateFieldGet(this, _suspend_data);
- }
- /**
- * Setter for #suspend_data
- * @param {string} suspend_data
- */
- ,
- set: function set(suspend_data) {
- if (check12ValidFormat(suspend_data, scorm12_regex.CMIString4096, true)) {
- _classPrivateFieldSet(this, _suspend_data, suspend_data);
- }
- }
- /**
- * Adds the current session time to the existing total time.
- * @param {Number} start_time
- * @return {string}
- */
-
- }, {
- key: "getCurrentTotalTime",
- value: function getCurrentTotalTime(start_time) {
- var sessionTime = _classPrivateFieldGet(this, _session_time);
-
- var startTime = start_time;
-
- if (typeof startTime !== 'undefined' && startTime !== null) {
- var seconds = new Date().getTime() - startTime;
- sessionTime = Util.getSecondsAsHHMMSS(seconds / 1000);
- }
-
- return Utilities.addHHMMSSTimeStrings(_classPrivateFieldGet(this, _total_time), sessionTime, new RegExp(scorm12_regex.CMITimespan));
- }
- /**
- * toJSON for cmi.core
- *
- * @return {
- * {
- * student_name: string,
- * entry: string,
- * exit: string,
- * score: CMIScore,
- * student_id: string,
- * lesson_mode: string,
- * lesson_location: string,
- * lesson_status: string,
- * credit: string,
- * session_time: *
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'student_id': this.student_id,
- 'student_name': this.student_name,
- 'lesson_location': this.lesson_location,
- 'credit': this.credit,
- 'lesson_status': this.lesson_status,
- 'entry': this.entry,
- 'lesson_mode': this.lesson_mode,
- 'exit': this.exit,
- 'session_time': this.session_time,
- 'score': this.score
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMICore;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 1.2's cmi.objectives object
- * @extends CMIArray
- */
-
-
-var CMIObjectives = /*#__PURE__*/function (_CMIArray) {
- _inherits(CMIObjectives, _CMIArray);
-
- var _super3 = _createSuper(CMIObjectives);
-
- /**
- * Constructor for cmi.objectives
- */
- function CMIObjectives() {
- _classCallCheck(this, CMIObjectives);
-
- return _super3.call(this, {
- children: scorm12_constants.objectives_children,
- errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError
- });
- }
-
- return _createClass(CMIObjectives);
-}(_common.CMIArray);
-/**
- * Class representing SCORM 1.2's cmi.student_data object
- * @extends BaseCMI
- */
-
-
-var _children4 = /*#__PURE__*/new WeakMap();
-
-var _mastery_score = /*#__PURE__*/new WeakMap();
-
-var _max_time_allowed = /*#__PURE__*/new WeakMap();
-
-var _time_limit_action = /*#__PURE__*/new WeakMap();
-
-var CMIStudentData = /*#__PURE__*/function (_BaseCMI3) {
- _inherits(CMIStudentData, _BaseCMI3);
-
- var _super4 = _createSuper(CMIStudentData);
-
- /**
- * Constructor for cmi.student_data
- * @param {string} student_data_children
- */
- function CMIStudentData(student_data_children) {
- var _this3;
-
- _classCallCheck(this, CMIStudentData);
-
- _this3 = _super4.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _children4, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _mastery_score, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _max_time_allowed, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _time_limit_action, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldSet(_assertThisInitialized(_this3), _children4, student_data_children ? student_data_children : scorm12_constants.student_data_children);
-
- return _this3;
- }
- /**
- * Getter for #_children
- * @return {*}
- * @private
- */
-
-
- _createClass(CMIStudentData, [{
- key: "_children",
- get: function get() {
- return _classPrivateFieldGet(this, _children4);
- }
- /**
- * Setter for #_children. Just throws an error.
- * @param {string} _children
- * @private
- */
- ,
- set: function set(_children) {
- throwInvalidValueError();
- }
- /**
- * Getter for #master_score
- * @return {string}
- */
-
- }, {
- key: "mastery_score",
- get: function get() {
- return _classPrivateFieldGet(this, _mastery_score);
- }
- /**
- * Setter for #master_score. Can only be called before initialization.
- * @param {string} mastery_score
- */
- ,
- set: function set(mastery_score) {
- !this.initialized ? _classPrivateFieldSet(this, _mastery_score, mastery_score) : throwReadOnlyError();
- }
- /**
- * Getter for #max_time_allowed
- * @return {string}
- */
-
- }, {
- key: "max_time_allowed",
- get: function get() {
- return _classPrivateFieldGet(this, _max_time_allowed);
- }
- /**
- * Setter for #max_time_allowed. Can only be called before initialization.
- * @param {string} max_time_allowed
- */
- ,
- set: function set(max_time_allowed) {
- !this.initialized ? _classPrivateFieldSet(this, _max_time_allowed, max_time_allowed) : throwReadOnlyError();
- }
- /**
- * Getter for #time_limit_action
- * @return {string}
- */
-
- }, {
- key: "time_limit_action",
- get: function get() {
- return _classPrivateFieldGet(this, _time_limit_action);
- }
- /**
- * Setter for #time_limit_action. Can only be called before initialization.
- * @param {string} time_limit_action
- */
- ,
- set: function set(time_limit_action) {
- !this.initialized ? _classPrivateFieldSet(this, _time_limit_action, time_limit_action) : throwReadOnlyError();
- }
- /**
- * toJSON for cmi.student_data
- *
- * @return {
- * {
- * max_time_allowed: string,
- * time_limit_action: string,
- * mastery_score: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'mastery_score': this.mastery_score,
- 'max_time_allowed': this.max_time_allowed,
- 'time_limit_action': this.time_limit_action
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIStudentData;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 1.2's cmi.student_preference object
- * @extends BaseCMI
- */
-
-
-exports.CMIStudentData = CMIStudentData;
-
-var _children5 = /*#__PURE__*/new WeakMap();
-
-var _audio = /*#__PURE__*/new WeakMap();
-
-var _language = /*#__PURE__*/new WeakMap();
-
-var _speed = /*#__PURE__*/new WeakMap();
-
-var _text = /*#__PURE__*/new WeakMap();
-
-var CMIStudentPreference = /*#__PURE__*/function (_BaseCMI4) {
- _inherits(CMIStudentPreference, _BaseCMI4);
-
- var _super5 = _createSuper(CMIStudentPreference);
-
- /**
- * Constructor for cmi.student_preference
- * @param {string} student_preference_children
- */
- function CMIStudentPreference(student_preference_children) {
- var _this4;
-
- _classCallCheck(this, CMIStudentPreference);
-
- _this4 = _super5.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _children5, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _audio, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _language, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _speed, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _text, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldSet(_assertThisInitialized(_this4), _children5, student_preference_children ? student_preference_children : scorm12_constants.student_preference_children);
-
- return _this4;
- }
-
- _createClass(CMIStudentPreference, [{
- key: "_children",
- get:
- /**
- * Getter for #_children
- * @return {string}
- * @private
- */
- function get() {
- return _classPrivateFieldGet(this, _children5);
- }
- /**
- * Setter for #_children. Just throws an error.
- * @param {string} _children
- * @private
- */
- ,
- set: function set(_children) {
- throwInvalidValueError();
- }
- /**
- * Getter for #audio
- * @return {string}
- */
-
- }, {
- key: "audio",
- get: function get() {
- return _classPrivateFieldGet(this, _audio);
- }
- /**
- * Setter for #audio
- * @param {string} audio
- */
- ,
- set: function set(audio) {
- if (check12ValidFormat(audio, scorm12_regex.CMISInteger) && check12ValidRange(audio, scorm12_regex.audio_range)) {
- _classPrivateFieldSet(this, _audio, audio);
- }
- }
- /**
- * Getter for #language
- * @return {string}
- */
-
- }, {
- key: "language",
- get: function get() {
- return _classPrivateFieldGet(this, _language);
- }
- /**
- * Setter for #language
- * @param {string} language
- */
- ,
- set: function set(language) {
- if (check12ValidFormat(language, scorm12_regex.CMIString256)) {
- _classPrivateFieldSet(this, _language, language);
- }
- }
- /**
- * Getter for #speed
- * @return {string}
- */
-
- }, {
- key: "speed",
- get: function get() {
- return _classPrivateFieldGet(this, _speed);
- }
- /**
- * Setter for #speed
- * @param {string} speed
- */
- ,
- set: function set(speed) {
- if (check12ValidFormat(speed, scorm12_regex.CMISInteger) && check12ValidRange(speed, scorm12_regex.speed_range)) {
- _classPrivateFieldSet(this, _speed, speed);
- }
- }
- /**
- * Getter for #text
- * @return {string}
- */
-
- }, {
- key: "text",
- get: function get() {
- return _classPrivateFieldGet(this, _text);
- }
- /**
- * Setter for #text
- * @param {string} text
- */
- ,
- set: function set(text) {
- if (check12ValidFormat(text, scorm12_regex.CMISInteger) && check12ValidRange(text, scorm12_regex.text_range)) {
- _classPrivateFieldSet(this, _text, text);
- }
- }
- /**
- * toJSON for cmi.student_preference
- *
- * @return {
- * {
- * audio: string,
- * language: string,
- * speed: string,
- * text: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'audio': this.audio,
- 'language': this.language,
- 'speed': this.speed,
- 'text': this.text
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIStudentPreference;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 1.2's cmi.interactions object
- * @extends BaseCMI
- */
-
-
-exports.CMIStudentPreference = CMIStudentPreference;
-
-var CMIInteractions = /*#__PURE__*/function (_CMIArray2) {
- _inherits(CMIInteractions, _CMIArray2);
-
- var _super6 = _createSuper(CMIInteractions);
-
- /**
- * Constructor for cmi.interactions
- */
- function CMIInteractions() {
- _classCallCheck(this, CMIInteractions);
-
- return _super6.call(this, {
- children: scorm12_constants.interactions_children,
- errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError
- });
- }
-
- return _createClass(CMIInteractions);
-}(_common.CMIArray);
-/**
- * Class representing SCORM 1.2's cmi.interactions.n object
- * @extends BaseCMI
- */
-
-
-var _id = /*#__PURE__*/new WeakMap();
-
-var _time = /*#__PURE__*/new WeakMap();
-
-var _type = /*#__PURE__*/new WeakMap();
-
-var _weighting = /*#__PURE__*/new WeakMap();
-
-var _student_response = /*#__PURE__*/new WeakMap();
-
-var _result = /*#__PURE__*/new WeakMap();
-
-var _latency = /*#__PURE__*/new WeakMap();
-
-var CMIInteractionsObject = /*#__PURE__*/function (_BaseCMI5) {
- _inherits(CMIInteractionsObject, _BaseCMI5);
-
- var _super7 = _createSuper(CMIInteractionsObject);
-
- /**
- * Constructor for cmi.interactions.n object
- */
- function CMIInteractionsObject() {
- var _this5;
-
- _classCallCheck(this, CMIInteractionsObject);
-
- _this5 = _super7.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _id, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _time, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _type, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _weighting, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _student_response, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _result, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _latency, {
- writable: true,
- value: ''
- });
-
- _this5.objectives = new _common.CMIArray({
- errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError,
- children: scorm12_constants.objectives_children
- });
- _this5.correct_responses = new _common.CMIArray({
- errorCode: scorm12_error_codes.INVALID_SET_VALUE,
- errorClass: _exceptions.Scorm12ValidationError,
- children: scorm12_constants.correct_responses_children
- });
- return _this5;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(CMIInteractionsObject, [{
- key: "initialize",
- value: function initialize() {
- var _this$objectives2, _this$correct_respons;
-
- _get(_getPrototypeOf(CMIInteractionsObject.prototype), "initialize", this).call(this);
-
- (_this$objectives2 = this.objectives) === null || _this$objectives2 === void 0 ? void 0 : _this$objectives2.initialize();
- (_this$correct_respons = this.correct_responses) === null || _this$correct_respons === void 0 ? void 0 : _this$correct_respons.initialize();
- }
- }, {
- key: "id",
- get:
- /**
- * Getter for #id. Should only be called during JSON export.
- * @return {*}
- */
- function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _id);
- }
- /**
- * Setter for #id
- * @param {string} id
- */
- ,
- set: function set(id) {
- if (check12ValidFormat(id, scorm12_regex.CMIIdentifier)) {
- _classPrivateFieldSet(this, _id, id);
- }
- }
- /**
- * Getter for #time. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "time",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _time);
- }
- /**
- * Setter for #time
- * @param {string} time
- */
- ,
- set: function set(time) {
- if (check12ValidFormat(time, scorm12_regex.CMITime)) {
- _classPrivateFieldSet(this, _time, time);
- }
- }
- /**
- * Getter for #type. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "type",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _type);
- }
- /**
- * Setter for #type
- * @param {string} type
- */
- ,
- set: function set(type) {
- if (check12ValidFormat(type, scorm12_regex.CMIType)) {
- _classPrivateFieldSet(this, _type, type);
- }
- }
- /**
- * Getter for #weighting. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "weighting",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _weighting);
- }
- /**
- * Setter for #weighting
- * @param {string} weighting
- */
- ,
- set: function set(weighting) {
- if (check12ValidFormat(weighting, scorm12_regex.CMIDecimal) && check12ValidRange(weighting, scorm12_regex.weighting_range)) {
- _classPrivateFieldSet(this, _weighting, weighting);
- }
- }
- /**
- * Getter for #student_response. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "student_response",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _student_response);
- }
- /**
- * Setter for #student_response
- * @param {string} student_response
- */
- ,
- set: function set(student_response) {
- if (check12ValidFormat(student_response, scorm12_regex.CMIFeedback, true)) {
- _classPrivateFieldSet(this, _student_response, student_response);
- }
- }
- /**
- * Getter for #result. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "result",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _result);
- }
- /**
- * Setter for #result
- * @param {string} result
- */
- ,
- set: function set(result) {
- if (check12ValidFormat(result, scorm12_regex.CMIResult)) {
- _classPrivateFieldSet(this, _result, result);
- }
- }
- /**
- * Getter for #latency. Should only be called during JSON export.
- * @return {*}
- */
-
- }, {
- key: "latency",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _latency);
- }
- /**
- * Setter for #latency
- * @param {string} latency
- */
- ,
- set: function set(latency) {
- if (check12ValidFormat(latency, scorm12_regex.CMITimespan)) {
- _classPrivateFieldSet(this, _latency, latency);
- }
- }
- /**
- * toJSON for cmi.interactions.n
- *
- * @return {
- * {
- * id: string,
- * time: string,
- * type: string,
- * weighting: string,
- * student_response: string,
- * result: string,
- * latency: string,
- * objectives: CMIArray,
- * correct_responses: CMIArray
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'id': this.id,
- 'time': this.time,
- 'type': this.type,
- 'weighting': this.weighting,
- 'student_response': this.student_response,
- 'result': this.result,
- 'latency': this.latency,
- 'objectives': this.objectives,
- 'correct_responses': this.correct_responses
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIInteractionsObject;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 1.2's cmi.objectives.n object
- * @extends BaseCMI
- */
-
-
-exports.CMIInteractionsObject = CMIInteractionsObject;
-
-var _id2 = /*#__PURE__*/new WeakMap();
-
-var _status = /*#__PURE__*/new WeakMap();
-
-var CMIObjectivesObject = /*#__PURE__*/function (_BaseCMI6) {
- _inherits(CMIObjectivesObject, _BaseCMI6);
-
- var _super8 = _createSuper(CMIObjectivesObject);
-
- /**
- * Constructor for cmi.objectives.n
- */
- function CMIObjectivesObject() {
- var _this6;
-
- _classCallCheck(this, CMIObjectivesObject);
-
- _this6 = _super8.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _id2, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _status, {
- writable: true,
- value: ''
- });
-
- _this6.score = new _common.CMIScore({
- score_children: scorm12_constants.score_children,
- score_range: scorm12_regex.score_range,
- invalidErrorCode: scorm12_error_codes.INVALID_SET_VALUE,
- invalidTypeCode: scorm12_error_codes.TYPE_MISMATCH,
- invalidRangeCode: scorm12_error_codes.VALUE_OUT_OF_RANGE,
- errorClass: _exceptions.Scorm12ValidationError
- });
- return _this6;
- }
-
- _createClass(CMIObjectivesObject, [{
- key: "id",
- get:
- /**
- * Getter for #id
- * @return {""}
- */
- function get() {
- return _classPrivateFieldGet(this, _id2);
- }
- /**
- * Setter for #id
- * @param {string} id
- */
- ,
- set: function set(id) {
- if (check12ValidFormat(id, scorm12_regex.CMIIdentifier)) {
- _classPrivateFieldSet(this, _id2, id);
- }
- }
- /**
- * Getter for #status
- * @return {""}
- */
-
- }, {
- key: "status",
- get: function get() {
- return _classPrivateFieldGet(this, _status);
- }
- /**
- * Setter for #status
- * @param {string} status
- */
- ,
- set: function set(status) {
- if (check12ValidFormat(status, scorm12_regex.CMIStatus2)) {
- _classPrivateFieldSet(this, _status, status);
- }
- }
- /**
- * toJSON for cmi.objectives.n
- * @return {
- * {
- * id: string,
- * status: string,
- * score: CMIScore
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'id': this.id,
- 'status': this.status,
- 'score': this.score
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIObjectivesObject;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 1.2's cmi.interactions.n.objectives.n object
- * @extends BaseCMI
- */
-
-
-exports.CMIObjectivesObject = CMIObjectivesObject;
-
-var _id3 = /*#__PURE__*/new WeakMap();
-
-var CMIInteractionsObjectivesObject = /*#__PURE__*/function (_BaseCMI7) {
- _inherits(CMIInteractionsObjectivesObject, _BaseCMI7);
-
- var _super9 = _createSuper(CMIInteractionsObjectivesObject);
-
- /**
- * Constructor for cmi.interactions.n.objectives.n
- */
- function CMIInteractionsObjectivesObject() {
- var _this7;
-
- _classCallCheck(this, CMIInteractionsObjectivesObject);
-
- _this7 = _super9.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this7), _id3, {
- writable: true,
- value: ''
- });
-
- return _this7;
- }
-
- _createClass(CMIInteractionsObjectivesObject, [{
- key: "id",
- get:
- /**
- * Getter for #id
- * @return {""}
- */
- function get() {
- return _classPrivateFieldGet(this, _id3);
- }
- /**
- * Setter for #id
- * @param {string} id
- */
- ,
- set: function set(id) {
- if (check12ValidFormat(id, scorm12_regex.CMIIdentifier)) {
- _classPrivateFieldSet(this, _id3, id);
- }
- }
- /**
- * toJSON for cmi.interactions.n.objectives.n
- * @return {
- * {
- * id: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'id': this.id
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIInteractionsObjectivesObject;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 1.2's cmi.interactions.correct_responses.n object
- * @extends BaseCMI
- */
-
-
-exports.CMIInteractionsObjectivesObject = CMIInteractionsObjectivesObject;
-
-var _pattern = /*#__PURE__*/new WeakMap();
-
-var CMIInteractionsCorrectResponsesObject = /*#__PURE__*/function (_BaseCMI8) {
- _inherits(CMIInteractionsCorrectResponsesObject, _BaseCMI8);
-
- var _super10 = _createSuper(CMIInteractionsCorrectResponsesObject);
-
- /**
- * Constructor for cmi.interactions.correct_responses.n
- */
- function CMIInteractionsCorrectResponsesObject() {
- var _this8;
-
- _classCallCheck(this, CMIInteractionsCorrectResponsesObject);
-
- _this8 = _super10.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this8), _pattern, {
- writable: true,
- value: ''
- });
-
- return _this8;
- }
-
- _createClass(CMIInteractionsCorrectResponsesObject, [{
- key: "pattern",
- get:
- /**
- * Getter for #pattern
- * @return {string}
- */
- function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _pattern);
- }
- /**
- * Setter for #pattern
- * @param {string} pattern
- */
- ,
- set: function set(pattern) {
- if (check12ValidFormat(pattern, scorm12_regex.CMIFeedback, true)) {
- _classPrivateFieldSet(this, _pattern, pattern);
- }
- }
- /**
- * toJSON for cmi.interactions.correct_responses.n
- * @return {
- * {
- * pattern: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'pattern': this.pattern
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIInteractionsCorrectResponsesObject;
-}(_common.BaseCMI);
-/**
- * Class for AICC Navigation object
- */
-
-
-exports.CMIInteractionsCorrectResponsesObject = CMIInteractionsCorrectResponsesObject;
-
-var _event = /*#__PURE__*/new WeakMap();
-
-var NAV = /*#__PURE__*/function (_BaseCMI9) {
- _inherits(NAV, _BaseCMI9);
-
- var _super11 = _createSuper(NAV);
-
- /**
- * Constructor for NAV object
- */
- function NAV() {
- var _this9;
-
- _classCallCheck(this, NAV);
-
- _this9 = _super11.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this9), _event, {
- writable: true,
- value: ''
- });
-
- return _this9;
- }
-
- _createClass(NAV, [{
- key: "event",
- get:
- /**
- * Getter for #event
- * @return {string}
- */
- function get() {
- return _classPrivateFieldGet(this, _event);
- }
- /**
- * Setter for #event
- * @param {string} event
- */
- ,
- set: function set(event) {
- if (check12ValidFormat(event, scorm12_regex.NAVEvent)) {
- _classPrivateFieldSet(this, _event, event);
- }
- }
- /**
- * toJSON for nav object
- * @return {
- * {
- * event: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'event': this.event
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return NAV;
-}(_common.BaseCMI);
-
-exports.NAV = NAV;
-
-},{"../constants/api_constants":6,"../constants/error_codes":7,"../constants/regex":8,"../exceptions":9,"../utilities":11,"./common":4}],6:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-var global = {
- SCORM_TRUE: 'true',
- SCORM_FALSE: 'false',
- STATE_NOT_INITIALIZED: 0,
- STATE_INITIALIZED: 1,
- STATE_TERMINATED: 2,
- LOG_LEVEL_DEBUG: 1,
- LOG_LEVEL_INFO: 2,
- LOG_LEVEL_WARNING: 3,
- LOG_LEVEL_ERROR: 4,
- LOG_LEVEL_NONE: 5
-};
-var scorm12 = {
- // Children lists
- cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions',
- core_children: 'student_id,student_name,lesson_location,credit,lesson_status,entry,score,total_time,lesson_mode,exit,session_time',
- score_children: 'raw,min,max',
- comments_children: 'content,location,time',
- objectives_children: 'id,score,status',
- correct_responses_children: 'pattern',
- student_data_children: 'mastery_score,max_time_allowed,time_limit_action',
- student_preference_children: 'audio,language,speed,text',
- interactions_children: 'id,objectives,time,type,correct_responses,weighting,student_response,result,latency',
- error_descriptions: {
- '101': {
- basicMessage: 'General Exception',
- detailMessage: 'No specific error code exists to describe the error. Use LMSGetDiagnostic for more information'
- },
- '201': {
- basicMessage: 'Invalid argument error',
- detailMessage: 'Indicates that an argument represents an invalid data model element or is otherwise incorrect.'
- },
- '202': {
- basicMessage: 'Element cannot have children',
- detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in "_children" for a data model element that does not support the "_children" suffix.'
- },
- '203': {
- basicMessage: 'Element not an array - cannot have count',
- detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in "_count" for a data model element that does not support the "_count" suffix.'
- },
- '301': {
- basicMessage: 'Not initialized',
- detailMessage: 'Indicates that an API call was made before the call to lmsInitialize.'
- },
- '401': {
- basicMessage: 'Not implemented error',
- detailMessage: 'The data model element indicated in a call to LMSGetValue or LMSSetValue is valid, but was not implemented by this LMS. SCORM 1.2 defines a set of data model elements as being optional for an LMS to implement.'
- },
- '402': {
- basicMessage: 'Invalid set value, element is a keyword',
- detailMessage: 'Indicates that LMSSetValue was called on a data model element that represents a keyword (elements that end in "_children" and "_count").'
- },
- '403': {
- basicMessage: 'Element is read only',
- detailMessage: 'LMSSetValue was called with a data model element that can only be read.'
- },
- '404': {
- basicMessage: 'Element is write only',
- detailMessage: 'LMSGetValue was called on a data model element that can only be written to.'
- },
- '405': {
- basicMessage: 'Incorrect Data Type',
- detailMessage: 'LMSSetValue was called with a value that is not consistent with the data format of the supplied data model element.'
- },
- '407': {
- basicMessage: 'Element Value Out Of Range',
- detailMessage: 'The numeric value supplied to a LMSSetValue call is outside of the numeric range allowed for the supplied data model element.'
- },
- '408': {
- basicMessage: 'Data Model Dependency Not Established',
- detailMessage: 'Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.'
- }
- }
-};
-
-var aicc = _objectSpread(_objectSpread({}, scorm12), {
- cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions,evaluation',
- student_preference_children: 'audio,language,lesson_type,speed,text,text_color,text_location,text_size,video,windows',
- student_data_children: 'attempt_number,tries,mastery_score,max_time_allowed,time_limit_action',
- student_demographics_children: 'city,class,company,country,experience,familiar_name,instructor_name,title,native_language,state,street_address,telephone,years_experience',
- tries_children: 'time,status,score',
- attempt_records_children: 'score,lesson_status',
- paths_children: 'location_id,date,time,status,why_left,time_in_element'
-});
-
-var scorm2004 = {
- // Children lists
- cmi_children: '_version,comments_from_learner,comments_from_lms,completion_status,credit,entry,exit,interactions,launch_data,learner_id,learner_name,learner_preference,location,max_time_allowed,mode,objectives,progress_measure,scaled_passing_score,score,session_time,success_status,suspend_data,time_limit_action,total_time',
- comments_children: 'comment,timestamp,location',
- score_children: 'max,raw,scaled,min',
- objectives_children: 'progress_measure,completion_status,success_status,description,score,id',
- correct_responses_children: 'pattern',
- student_data_children: 'mastery_score,max_time_allowed,time_limit_action',
- student_preference_children: 'audio_level,audio_captioning,delivery_speed,language',
- interactions_children: 'id,type,objectives,timestamp,correct_responses,weighting,learner_response,result,latency,description',
- error_descriptions: {
- '0': {
- basicMessage: 'No Error',
- detailMessage: 'No error occurred, the previous API call was successful.'
- },
- '101': {
- basicMessage: 'General Exception',
- detailMessage: 'No specific error code exists to describe the error. Use GetDiagnostic for more information.'
- },
- '102': {
- basicMessage: 'General Initialization Failure',
- detailMessage: 'Call to Initialize failed for an unknown reason.'
- },
- '103': {
- basicMessage: 'Already Initialized',
- detailMessage: 'Call to Initialize failed because Initialize was already called.'
- },
- '104': {
- basicMessage: 'Content Instance Terminated',
- detailMessage: 'Call to Initialize failed because Terminate was already called.'
- },
- '111': {
- basicMessage: 'General Termination Failure',
- detailMessage: 'Call to Terminate failed for an unknown reason.'
- },
- '112': {
- basicMessage: 'Termination Before Initialization',
- detailMessage: 'Call to Terminate failed because it was made before the call to Initialize.'
- },
- '113': {
- basicMessage: 'Termination After Termination',
- detailMessage: 'Call to Terminate failed because Terminate was already called.'
- },
- '122': {
- basicMessage: 'Retrieve Data Before Initialization',
- detailMessage: 'Call to GetValue failed because it was made before the call to Initialize.'
- },
- '123': {
- basicMessage: 'Retrieve Data After Termination',
- detailMessage: 'Call to GetValue failed because it was made after the call to Terminate.'
- },
- '132': {
- basicMessage: 'Store Data Before Initialization',
- detailMessage: 'Call to SetValue failed because it was made before the call to Initialize.'
- },
- '133': {
- basicMessage: 'Store Data After Termination',
- detailMessage: 'Call to SetValue failed because it was made after the call to Terminate.'
- },
- '142': {
- basicMessage: 'Commit Before Initialization',
- detailMessage: 'Call to Commit failed because it was made before the call to Initialize.'
- },
- '143': {
- basicMessage: 'Commit After Termination',
- detailMessage: 'Call to Commit failed because it was made after the call to Terminate.'
- },
- '201': {
- basicMessage: 'General Argument Error',
- detailMessage: 'An invalid argument was passed to an API method (usually indicates that Initialize, Commit or Terminate did not receive the expected empty string argument.'
- },
- '301': {
- basicMessage: 'General Get Failure',
- detailMessage: 'Indicates a failed GetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.'
- },
- '351': {
- basicMessage: 'General Set Failure',
- detailMessage: 'Indicates a failed SetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.'
- },
- '391': {
- basicMessage: 'General Commit Failure',
- detailMessage: 'Indicates a failed Commit call where no other specific error code is applicable. Use GetDiagnostic for more information.'
- },
- '401': {
- basicMessage: 'Undefined Data Model Element',
- detailMessage: 'The data model element name passed to GetValue or SetValue is not a valid SCORM data model element.'
- },
- '402': {
- basicMessage: 'Unimplemented Data Model Element',
- detailMessage: 'The data model element indicated in a call to GetValue or SetValue is valid, but was not implemented by this LMS. In SCORM 2004, this error would indicate an LMS that is not fully SCORM conformant.'
- },
- '403': {
- basicMessage: 'Data Model Element Value Not Initialized',
- detailMessage: 'Attempt to read a data model element that has not been initialized by the LMS or through a SetValue call. This error condition is often reached during normal execution of a SCO.'
- },
- '404': {
- basicMessage: 'Data Model Element Is Read Only',
- detailMessage: 'SetValue was called with a data model element that can only be read.'
- },
- '405': {
- basicMessage: 'Data Model Element Is Write Only',
- detailMessage: 'GetValue was called on a data model element that can only be written to.'
- },
- '406': {
- basicMessage: 'Data Model Element Type Mismatch',
- detailMessage: 'SetValue was called with a value that is not consistent with the data format of the supplied data model element.'
- },
- '407': {
- basicMessage: 'Data Model Element Value Out Of Range',
- detailMessage: 'The numeric value supplied to a SetValue call is outside of the numeric range allowed for the supplied data model element.'
- },
- '408': {
- basicMessage: 'Data Model Dependency Not Established',
- detailMessage: 'Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.'
- }
- }
-};
-var APIConstants = {
- global: global,
- scorm12: scorm12,
- aicc: aicc,
- scorm2004: scorm2004
-};
-var _default = APIConstants;
-exports["default"] = _default;
-
-},{}],7:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-var global = {
- GENERAL: 101,
- INITIALIZATION_FAILED: 101,
- INITIALIZED: 101,
- TERMINATED: 101,
- TERMINATION_FAILURE: 101,
- TERMINATION_BEFORE_INIT: 101,
- MULTIPLE_TERMINATION: 101,
- RETRIEVE_BEFORE_INIT: 101,
- RETRIEVE_AFTER_TERM: 101,
- STORE_BEFORE_INIT: 101,
- STORE_AFTER_TERM: 101,
- COMMIT_BEFORE_INIT: 101,
- COMMIT_AFTER_TERM: 101,
- ARGUMENT_ERROR: 101,
- CHILDREN_ERROR: 101,
- COUNT_ERROR: 101,
- GENERAL_GET_FAILURE: 101,
- GENERAL_SET_FAILURE: 101,
- GENERAL_COMMIT_FAILURE: 101,
- UNDEFINED_DATA_MODEL: 101,
- UNIMPLEMENTED_ELEMENT: 101,
- VALUE_NOT_INITIALIZED: 101,
- INVALID_SET_VALUE: 101,
- READ_ONLY_ELEMENT: 101,
- WRITE_ONLY_ELEMENT: 101,
- TYPE_MISMATCH: 101,
- VALUE_OUT_OF_RANGE: 101,
- DEPENDENCY_NOT_ESTABLISHED: 101
-};
-
-var scorm12 = _objectSpread(_objectSpread({}, global), {
- RETRIEVE_BEFORE_INIT: 301,
- STORE_BEFORE_INIT: 301,
- COMMIT_BEFORE_INIT: 301,
- ARGUMENT_ERROR: 201,
- CHILDREN_ERROR: 202,
- COUNT_ERROR: 203,
- UNDEFINED_DATA_MODEL: 401,
- UNIMPLEMENTED_ELEMENT: 401,
- VALUE_NOT_INITIALIZED: 301,
- INVALID_SET_VALUE: 402,
- READ_ONLY_ELEMENT: 403,
- WRITE_ONLY_ELEMENT: 404,
- TYPE_MISMATCH: 405,
- VALUE_OUT_OF_RANGE: 407,
- DEPENDENCY_NOT_ESTABLISHED: 408
-});
-
-var scorm2004 = _objectSpread(_objectSpread({}, global), {
- INITIALIZATION_FAILED: 102,
- INITIALIZED: 103,
- TERMINATED: 104,
- TERMINATION_FAILURE: 111,
- TERMINATION_BEFORE_INIT: 112,
- MULTIPLE_TERMINATIONS: 113,
- RETRIEVE_BEFORE_INIT: 122,
- RETRIEVE_AFTER_TERM: 123,
- STORE_BEFORE_INIT: 132,
- STORE_AFTER_TERM: 133,
- COMMIT_BEFORE_INIT: 142,
- COMMIT_AFTER_TERM: 143,
- ARGUMENT_ERROR: 201,
- GENERAL_GET_FAILURE: 301,
- GENERAL_SET_FAILURE: 351,
- GENERAL_COMMIT_FAILURE: 391,
- UNDEFINED_DATA_MODEL: 401,
- UNIMPLEMENTED_ELEMENT: 402,
- VALUE_NOT_INITIALIZED: 403,
- READ_ONLY_ELEMENT: 404,
- WRITE_ONLY_ELEMENT: 405,
- TYPE_MISMATCH: 406,
- VALUE_OUT_OF_RANGE: 407,
- DEPENDENCY_NOT_ESTABLISHED: 408
-});
-
-var ErrorCodes = {
- scorm12: scorm12,
- scorm2004: scorm2004
-};
-var _default = ErrorCodes;
-exports["default"] = _default;
-
-},{}],8:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-var scorm12 = {
- CMIString256: '^.{0,255}$',
- CMIString4096: '^.{0,4096}$',
- CMITime: '^(?:[01]\\d|2[0123]):(?:[012345]\\d):(?:[012345]\\d)$',
- // eslint-disable-line
- CMITimespan: '^([0-9]{2,}):([0-9]{2}):([0-9]{2})(\.[0-9]{1,2})?$',
- // eslint-disable-line
- CMIInteger: '^\\d+$',
- CMISInteger: '^-?([0-9]+)$',
- CMIDecimal: '^-?([0-9]{0,3})(\.[0-9]*)?$',
- // eslint-disable-line
- CMIIdentifier: "^[\\u0021-\\u007E\\s]{0,255}$",
- CMIFeedback: '^.{0,255}$',
- // This must be redefined
- CMIIndex: '[._](\\d+).',
- // Vocabulary Data Type Definition
- CMIStatus: '^(passed|completed|failed|incomplete|browsed)$',
- CMIStatus2: '^(passed|completed|failed|incomplete|browsed|not attempted)$',
- CMIExit: '^(time-out|suspend|logout|)$',
- CMIType: '^(true-false|choice|fill-in|matching|performance|sequencing|likert|numeric)$',
- CMIResult: '^(correct|wrong|unanticipated|neutral|([0-9]{0,3})?(\\.[0-9]*)?)$',
- // eslint-disable-line
- NAVEvent: '^(previous|continue)$',
- // Data ranges
- score_range: '0#100',
- audio_range: '-1#100',
- speed_range: '-100#100',
- weighting_range: '-100#100',
- text_range: '-1#1'
-};
-
-var aicc = _objectSpread(_objectSpread({}, scorm12), {
- CMIIdentifier: '^\\w{1,255}$'
-});
-
-var scorm2004 = {
- CMIString200: "^[\\u0000-\\uFFFF]{0,200}$",
- CMIString250: "^[\\u0000-\\uFFFF]{0,250}$",
- CMIString1000: "^[\\u0000-\\uFFFF]{0,1000}$",
- CMIString4000: "^[\\u0000-\\uFFFF]{0,4000}$",
- CMIString64000: "^[\\u0000-\\uFFFF]{0,64000}$",
- CMILang: '^([a-zA-Z]{2,3}|i|x)(\-[a-zA-Z0-9\-]{2,8})?$|^$',
- // eslint-disable-line
- CMILangString250: '^(\{lang=([a-zA-Z]{2,3}|i|x)(\-[a-zA-Z0-9\-]{2,8})?\})?((?!\{.*$).{0,250}$)?$',
- // eslint-disable-line
- CMILangcr: '^((\{lang=([a-zA-Z]{2,3}|i|x)?(\-[a-zA-Z0-9\-]{2,8})?\}))(.*?)$',
- // eslint-disable-line
- CMILangString250cr: '^((\{lang=([a-zA-Z]{2,3}|i|x)?(\-[a-zA-Z0-9\-]{2,8})?\})?(.{0,250})?)?$',
- // eslint-disable-line
- CMILangString4000: '^(\{lang=([a-zA-Z]{2,3}|i|x)(\-[a-zA-Z0-9\-]{2,8})?\})?((?!\{.*$).{0,4000}$)?$',
- // eslint-disable-line
- CMITime: '^(19[7-9]{1}[0-9]{1}|20[0-2]{1}[0-9]{1}|203[0-8]{1})((-(0[1-9]{1}|1[0-2]{1}))((-(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1}))(T([0-1]{1}[0-9]{1}|2[0-3]{1})((:[0-5]{1}[0-9]{1})((:[0-5]{1}[0-9]{1})((\\.[0-9]{1,2})((Z|([+|-]([0-1]{1}[0-9]{1}|2[0-3]{1})))(:[0-5]{1}[0-9]{1})?)?)?)?)?)?)?)?$',
- CMITimespan: '^P(?:([.,\\d]+)Y)?(?:([.,\\d]+)M)?(?:([.,\\d]+)W)?(?:([.,\\d]+)D)?(?:T?(?:([.,\\d]+)H)?(?:([.,\\d]+)M)?(?:([.,\\d]+)S)?)?$',
- CMIInteger: '^\\d+$',
- CMISInteger: '^-?([0-9]+)$',
- CMIDecimal: '^-?([0-9]{1,5})(\\.[0-9]{1,18})?$',
- CMIIdentifier: '^\\S{1,250}[a-zA-Z0-9]$',
- CMIShortIdentifier: '^[\\w\\.\\-\\_]{1,250}$',
- // eslint-disable-line
- CMILongIdentifier: '^(?:(?!urn:)\\S{1,4000}|urn:[A-Za-z0-9-]{1,31}:\\S{1,4000}|.{1,4000})$',
- // need to re-examine this
- CMIFeedback: '^.*$',
- // This must be redefined
- CMIIndex: '[._](\\d+).',
- CMIIndexStore: '.N(\\d+).',
- // Vocabulary Data Type Definition
- CMICStatus: '^(completed|incomplete|not attempted|unknown)$',
- CMISStatus: '^(passed|failed|unknown)$',
- CMIExit: '^(time-out|suspend|logout|normal)$',
- CMIType: '^(true-false|choice|fill-in|long-fill-in|matching|performance|sequencing|likert|numeric|other)$',
- CMIResult: '^(correct|incorrect|unanticipated|neutral|-?([0-9]{1,4})(\\.[0-9]{1,18})?)$',
- NAVEvent: '^(previous|continue|exit|exitAll|abandon|abandonAll|suspendAll|\{target=\\S{0,200}[a-zA-Z0-9]\}choice|jump)$',
- // eslint-disable-line
- NAVBoolean: '^(unknown|true|false$)',
- NAVTarget: '^(previous|continue|choice.{target=\\S{0,200}[a-zA-Z0-9]})$',
- // Data ranges
- scaled_range: '-1#1',
- audio_range: '0#*',
- speed_range: '0#*',
- text_range: '-1#1',
- progress_range: '0#1'
-};
-var Regex = {
- aicc: aicc,
- scorm12: scorm12,
- scorm2004: scorm2004
-};
-var _default = Regex;
-exports["default"] = _default;
-
-},{}],9:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.ValidationError = exports.Scorm2004ValidationError = exports.Scorm12ValidationError = exports.AICCValidationError = void 0;
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); }
-
-function _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
-
-function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
-
-function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
-
-function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-
-function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
-
-function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
-
-function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-
-var scorm12_errors = _api_constants["default"].scorm12.error_descriptions;
-var aicc_errors = _api_constants["default"].aicc.error_descriptions;
-var scorm2004_errors = _api_constants["default"].scorm2004.error_descriptions;
-/**
- * Base Validation Exception
- */
-
-var _errorCode = /*#__PURE__*/new WeakMap();
-
-var _errorMessage = /*#__PURE__*/new WeakMap();
-
-var _detailedMessage = /*#__PURE__*/new WeakMap();
-
-var ValidationError = /*#__PURE__*/function (_Error) {
- _inherits(ValidationError, _Error);
-
- var _super = _createSuper(ValidationError);
-
- /**
- * Constructor to take in an error message and code
- * @param {number} errorCode
- * @param {string} errorMessage
- * @param {string} detailedMessage
- */
- function ValidationError(errorCode, errorMessage, detailedMessage) {
- var _this;
-
- _classCallCheck(this, ValidationError);
-
- _this = _super.call(this, errorMessage);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _errorCode, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _errorMessage, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _detailedMessage, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _errorCode, errorCode);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _errorMessage, errorMessage);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _detailedMessage, detailedMessage);
-
- return _this;
- }
-
- _createClass(ValidationError, [{
- key: "errorCode",
- get:
- /**
- * Getter for #errorCode
- * @return {number}
- */
- function get() {
- return _classPrivateFieldGet(this, _errorCode);
- }
- /**
- * Getter for #errorMessage
- * @return {string}
- */
-
- }, {
- key: "errorMessage",
- get: function get() {
- return _classPrivateFieldGet(this, _errorMessage);
- }
- /**
- * Getter for #detailedMessage
- * @return {string}
- */
-
- }, {
- key: "detailedMessage",
- get: function get() {
- return _classPrivateFieldGet(this, _detailedMessage);
- }
- }]);
-
- return ValidationError;
-}( /*#__PURE__*/_wrapNativeSuper(Error));
-/**
- * SCORM 1.2 Validation Error
- */
-
-
-exports.ValidationError = ValidationError;
-
-var Scorm12ValidationError = /*#__PURE__*/function (_ValidationError) {
- _inherits(Scorm12ValidationError, _ValidationError);
-
- var _super2 = _createSuper(Scorm12ValidationError);
-
- /**
- * Constructor to take in an error code
- * @param {number} errorCode
- */
- function Scorm12ValidationError(errorCode) {
- var _this2;
-
- _classCallCheck(this, Scorm12ValidationError);
-
- if ({}.hasOwnProperty.call(scorm12_errors, String(errorCode))) {
- _this2 = _super2.call(this, errorCode, scorm12_errors[String(errorCode)].basicMessage, scorm12_errors[String(errorCode)].detailMessage);
- } else {
- _this2 = _super2.call(this, 101, scorm12_errors['101'].basicMessage, scorm12_errors['101'].detailMessage);
- }
-
- return _possibleConstructorReturn(_this2);
- }
-
- return _createClass(Scorm12ValidationError);
-}(ValidationError);
-/**
- * AICC Validation Error
- */
-
-
-exports.Scorm12ValidationError = Scorm12ValidationError;
-
-var AICCValidationError = /*#__PURE__*/function (_ValidationError2) {
- _inherits(AICCValidationError, _ValidationError2);
-
- var _super3 = _createSuper(AICCValidationError);
-
- /**
- * Constructor to take in an error code
- * @param {number} errorCode
- */
- function AICCValidationError(errorCode) {
- var _this3;
-
- _classCallCheck(this, AICCValidationError);
-
- if ({}.hasOwnProperty.call(aicc_errors, String(errorCode))) {
- _this3 = _super3.call(this, errorCode, aicc_errors[String(errorCode)].basicMessage, aicc_errors[String(errorCode)].detailMessage);
- } else {
- _this3 = _super3.call(this, 101, aicc_errors['101'].basicMessage, aicc_errors['101'].detailMessage);
- }
-
- return _possibleConstructorReturn(_this3);
- }
-
- return _createClass(AICCValidationError);
-}(ValidationError);
-/**
- * SCORM 2004 Validation Error
- */
-
-
-exports.AICCValidationError = AICCValidationError;
-
-var Scorm2004ValidationError = /*#__PURE__*/function (_ValidationError3) {
- _inherits(Scorm2004ValidationError, _ValidationError3);
-
- var _super4 = _createSuper(Scorm2004ValidationError);
-
- /**
- * Constructor to take in an error code
- * @param {number} errorCode
- */
- function Scorm2004ValidationError(errorCode) {
- var _this4;
-
- _classCallCheck(this, Scorm2004ValidationError);
-
- if ({}.hasOwnProperty.call(scorm2004_errors, String(errorCode))) {
- _this4 = _super4.call(this, errorCode, scorm2004_errors[String(errorCode)].basicMessage, scorm2004_errors[String(errorCode)].detailMessage);
- } else {
- _this4 = _super4.call(this, 101, scorm2004_errors['101'].basicMessage, scorm2004_errors['101'].detailMessage);
- }
-
- return _possibleConstructorReturn(_this4);
- }
-
- return _createClass(Scorm2004ValidationError);
-}(ValidationError);
-
-exports.Scorm2004ValidationError = Scorm2004ValidationError;
-
-},{"./constants/api_constants":6}],10:[function(require,module,exports){
-"use strict";
-
-var _Scorm12API = _interopRequireDefault(require("../Scorm12API"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-window.Scorm12API = _Scorm12API["default"];
-
-},{"../Scorm12API":3}],11:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.SECONDS_PER_SECOND = exports.SECONDS_PER_MINUTE = exports.SECONDS_PER_HOUR = exports.SECONDS_PER_DAY = void 0;
-exports.addHHMMSSTimeStrings = addHHMMSSTimeStrings;
-exports.addTwoDurations = addTwoDurations;
-exports.countDecimals = countDecimals;
-exports.flatten = flatten;
-exports.getDurationAsSeconds = getDurationAsSeconds;
-exports.getSecondsAsHHMMSS = getSecondsAsHHMMSS;
-exports.getSecondsAsISODuration = getSecondsAsISODuration;
-exports.getTimeAsSeconds = getTimeAsSeconds;
-exports.unflatten = unflatten;
-
-function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
-
-function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
-
-function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
-
-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; }
-
-function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
-
-function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
-
-var SECONDS_PER_SECOND = 1.0;
-exports.SECONDS_PER_SECOND = SECONDS_PER_SECOND;
-var SECONDS_PER_MINUTE = 60;
-exports.SECONDS_PER_MINUTE = SECONDS_PER_MINUTE;
-var SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE;
-exports.SECONDS_PER_HOUR = SECONDS_PER_HOUR;
-var SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;
-exports.SECONDS_PER_DAY = SECONDS_PER_DAY;
-var designations = [['D', SECONDS_PER_DAY], ['H', SECONDS_PER_HOUR], ['M', SECONDS_PER_MINUTE], ['S', SECONDS_PER_SECOND]];
-/**
- * Converts a Number to a String of HH:MM:SS
- *
- * @param {Number} totalSeconds
- * @return {string}
- */
-
-function getSecondsAsHHMMSS(totalSeconds) {
- // SCORM spec does not deal with negative durations, give zero back
- if (!totalSeconds || totalSeconds <= 0) {
- return '00:00:00';
- }
-
- var hours = Math.floor(totalSeconds / SECONDS_PER_HOUR);
- var dateObj = new Date(totalSeconds * 1000);
- var minutes = dateObj.getUTCMinutes(); // make sure we add any possible decimal value
-
- var seconds = dateObj.getSeconds();
- var ms = totalSeconds % 1.0;
- var msStr = '';
-
- if (countDecimals(ms) > 0) {
- if (countDecimals(ms) > 2) {
- msStr = ms.toFixed(2);
- } else {
- msStr = String(ms);
- }
-
- msStr = '.' + msStr.split('.')[1];
- }
-
- return (hours + ':' + minutes + ':' + seconds).replace(/\b\d\b/g, '0$&') + msStr;
-}
-/**
- * Calculate the number of seconds from ISO 8601 Duration
- *
- * @param {Number} seconds
- * @return {String}
- */
-
-
-function getSecondsAsISODuration(seconds) {
- // SCORM spec does not deal with negative durations, give zero back
- if (!seconds || seconds <= 0) {
- return 'PT0S';
- }
-
- var duration = 'P';
- var remainder = seconds;
- designations.forEach(function (_ref) {
- var _ref2 = _slicedToArray(_ref, 2),
- sign = _ref2[0],
- current_seconds = _ref2[1];
-
- var value = Math.floor(remainder / current_seconds);
- remainder = remainder % current_seconds;
-
- if (countDecimals(remainder) > 2) {
- remainder = Number(Number(remainder).toFixed(2));
- } // If we have anything left in the remainder, and we're currently adding
- // seconds to the duration, go ahead and add the decimal to the seconds
-
-
- if (sign === 'S' && remainder > 0) {
- value += remainder;
- }
-
- if (value) {
- if ((duration.indexOf('D') > 0 || sign === 'H' || sign === 'M' || sign === 'S') && duration.indexOf('T') === -1) {
- duration += 'T';
- }
-
- duration += "".concat(value).concat(sign);
- }
- });
- return duration;
-}
-/**
- * Calculate the number of seconds from HH:MM:SS.DDDDDD
- *
- * @param {string} timeString
- * @param {RegExp} timeRegex
- * @return {number}
- */
-
-
-function getTimeAsSeconds(timeString, timeRegex) {
- if (!timeString || typeof timeString !== 'string' || !timeString.match(timeRegex)) {
- return 0;
- }
-
- var parts = timeString.split(':');
- var hours = Number(parts[0]);
- var minutes = Number(parts[1]);
- var seconds = Number(parts[2]);
- return hours * 3600 + minutes * 60 + seconds;
-}
-/**
- * Calculate the number of seconds from ISO 8601 Duration
- *
- * @param {string} duration
- * @param {RegExp} durationRegex
- * @return {number}
- */
-
-
-function getDurationAsSeconds(duration, durationRegex) {
- if (!duration || !duration.match(durationRegex)) {
- return 0;
- }
-
- var _ref3 = new RegExp(durationRegex).exec(duration) || [],
- _ref4 = _slicedToArray(_ref3, 8),
- years = _ref4[1],
- months = _ref4[2],
- days = _ref4[4],
- hours = _ref4[5],
- minutes = _ref4[6],
- seconds = _ref4[7];
-
- var result = 0.0;
- result += Number(seconds) * 1.0 || 0.0;
- result += Number(minutes) * 60.0 || 0.0;
- result += Number(hours) * 3600.0 || 0.0;
- result += Number(days) * (60 * 60 * 24.0) || 0.0;
- result += Number(years) * (60 * 60 * 24 * 365.0) || 0.0;
- return result;
-}
-/**
- * Adds together two ISO8601 Duration strings
- *
- * @param {string} first
- * @param {string} second
- * @param {RegExp} durationRegex
- * @return {string}
- */
-
-
-function addTwoDurations(first, second, durationRegex) {
- return getSecondsAsISODuration(getDurationAsSeconds(first, durationRegex) + getDurationAsSeconds(second, durationRegex));
-}
-/**
- * Add together two HH:MM:SS.DD strings
- *
- * @param {string} first
- * @param {string} second
- * @param {RegExp} timeRegex
- * @return {string}
- */
-
-
-function addHHMMSSTimeStrings(first, second, timeRegex) {
- return getSecondsAsHHMMSS(getTimeAsSeconds(first, timeRegex) + getTimeAsSeconds(second, timeRegex));
-}
-/**
- * Flatten a JSON object down to string paths for each values
- * @param {object} data
- * @return {object}
- */
-
-
-function flatten(data) {
- var result = {};
- /**
- * Recurse through the object
- * @param {*} cur
- * @param {*} prop
- */
-
- function recurse(cur, prop) {
- if (Object(cur) !== cur) {
- result[prop] = cur;
- } else if (Array.isArray(cur)) {
- for (var i = 0, l = cur.length; i < l; i++) {
- recurse(cur[i], prop + '[' + i + ']');
- if (l === 0) result[prop] = [];
- }
- } else {
- var isEmpty = true;
-
- for (var p in cur) {
- if ({}.hasOwnProperty.call(cur, p)) {
- isEmpty = false;
- recurse(cur[p], prop ? prop + '.' + p : p);
- }
- }
-
- if (isEmpty && prop) result[prop] = {};
- }
- }
-
- recurse(data, '');
- return result;
-}
-/**
- * Un-flatten a flat JSON object
- * @param {object} data
- * @return {object}
- */
-
-
-function unflatten(data) {
- 'use strict';
-
- if (Object(data) !== data || Array.isArray(data)) return data;
- var regex = /\.?([^.[\]]+)|\[(\d+)]/g;
- var result = {};
-
- for (var p in data) {
- if ({}.hasOwnProperty.call(data, p)) {
- var cur = result;
- var prop = '';
- var m = regex.exec(p);
-
- while (m) {
- cur = cur[prop] || (cur[prop] = m[2] ? [] : {});
- prop = m[2] || m[1];
- m = regex.exec(p);
- }
-
- cur[prop] = data[p];
- }
- }
-
- return result[''] || result;
-}
-/**
- * Counts the number of decimal places
- * @param {number} num
- * @return {number}
- */
-
-
-function countDecimals(num) {
- if (Math.floor(num) === num || String(num).indexOf('.') < 0) return 0;
- var parts = num.toString().split('.')[1];
- return parts.length || 0;
-}
-
-},{}]},{},[10]);
+!function(){var r={"./node_modules/lodash.debounce/index.js":
+/*!***********************************************!*\
+ !*** ./node_modules/lodash.debounce/index.js ***!
+ \***********************************************/function(e,s,t){function r(e){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _(){return d.Date.now()}var n=NaN,i="[object Symbol]",o=/^\s+|\s+$/g,a=/^[-+]0x[0-9a-f]+$/i,c=/^0b[01]+$/i,l=/^0o[0-7]+$/i,u=parseInt,t="object"==(void 0===t.g?"undefined":r(t.g))&&t.g&&t.g.Object===Object&&t.g,f="object"==("undefined"==typeof self?"undefined":r(self))&&self&&self.Object===Object&&self,d=t||f||Function("return this")(),h=Object.prototype.toString,b=Math.max,M=Math.min;function E(e){var t=r(e);return e&&("object"==t||"function"==t)}function m(e){return"symbol"==r(e)||!!(t=e)&&"object"==r(t)&&h.call(e)==i;var t}function v(e){if("number"==typeof e)return e;if(m(e))return n;if("string"!=typeof(e=E(e)?E(t="function"==typeof e.valueOf?e.valueOf():e)?t+"":t:e))return 0===e?e:+e;e=e.replace(o,"");var t=c.test(e);return t||l.test(e)?u(e.slice(2),t?2:8):a.test(e)?n:+e}e.exports=function(f,r,e){var n,i,o,a,s,c,l=0,d=!1,u=!1,t=!0;if("function"!=typeof f)throw new TypeError("Expected a function");function h(e){var t=n,r=i;return n=i=void 0,l=e,a=f.apply(r,t)}function m(e){var t=e-c;return void 0===c||r<=t||t<0||u&&o<=e-l}function p(){var e,t=_();if(m(t))return y(t);s=setTimeout(p,(e=r-((t=t)-c),u?M(e,o-(t-l)):e))}function y(e){return s=void 0,t&&n?h(e):(n=i=void 0,a)}function g(){var e=_(),t=m(e);if(n=arguments,i=this,c=e,t){if(void 0===s)return l=e=c,s=setTimeout(p,r),d?h(e):a;if(u)return s=setTimeout(p,r),h(c)}return void 0===s&&(s=setTimeout(p,r)),a}return r=v(r)||0,E(e)&&(d=!!e.leading,u="maxWait"in e,o=u?b(v(e.maxWait)||0,r):o,t="trailing"in e?!!e.trailing:t),g.cancel=function(){void 0!==s&&clearTimeout(s),n=c=i=s=void(l=0)},g.flush=function(){return void 0===s?a:y(_())},g}},"./src/BaseAPI.js":
+/*!************************!*\
+ !*** ./src/BaseAPI.js ***!
+ \************************/function(r,e,t){"use strict";t.r(e),t.d(e,{default:function(){return T}});var p=t(/*! ./cmi/common */"./src/cmi/common.js"),c=t(/*! ./exceptions */"./src/exceptions.js"),e=t(/*! ./constants/error_codes */"./src/constants/error_codes.js"),l=t(/*! ./constants/api_constants */"./src/constants/api_constants.js"),u=t(/*! ./utilities */"./src/utilities.js"),f=t(/*! lodash.debounce */"./node_modules/lodash.debounce/index.js"),y=t.n(f);function g(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,i,o=[],a=!0,s=!1;try{for(r=r.call(e);!(a=(n=r.next()).done)&&(o.push(n.value),!t||o.length!==t);a=!0);}catch(e){s=!0,i=e}finally{try{a||null==r.return||r.return()}finally{if(s)throw i}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return _(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Map"===(r="Object"===r&&e.constructor?e.constructor.name:r)||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?_(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function _(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r=this.apiLogLevel&&this.settings.onLogMessage(n,r)}},{key:"formatMessage",value:function(e,t,r){for(var n="",i=20-(n+=e).length,o=0;o=parseFloat(this.cmi.student_data.mastery_score)?this.cmi.core.lesson_status="passed":this.cmi.core.lesson_status="failed"):"browse"===this.cmi.core.lesson_mode&&""===((null===(i=this.startingData)||void 0===i||null===(r=i.cmi)||void 0===r||null===(n=r.core)||void 0===n?void 0:n.lesson_status)||"")&&"not attempted"===t&&(this.cmi.core.lesson_status="browsed"));var t,r,n,i=this.renderCommitCMI(e||this.settings.alwaysSendTotalTime);return this.apiLogLevel===u.LOG_LEVEL_DEBUG&&(console.debug("Commit (terminated: "+(e?"yes":"no")+"): "),console.debug(i)),this.settings.lmsCommitUrl?this.processHttpRequest(this.settings.lmsCommitUrl,i,e):u.SCORM_TRUE}}])&&d(t.prototype,e),r&&d(t,r),Object.defineProperty(t,"prototype",{writable:!1}),i}(e.default)},"./src/cmi/common.js":
+/*!***************************!*\
+ !*** ./src/cmi/common.js ***!
+ \***************************/function(r,n,e){"use strict";e.r(n),e.d(n,{checkValidFormat:function(){return O},checkValidRange:function(){return I},BaseCMI:function(){return L},CMIScore:function(){return D},CMIArray:function(){return x}});var n=e(/*! ../constants/api_constants */"./src/constants/api_constants.js"),i=e(/*! ../constants/error_codes */"./src/constants/error_codes.js"),e=e(/*! ../constants/regex */"./src/constants/regex.js");function o(e){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}function s(e,t){return(s=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function c(r){var n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}();return function(){var e,t=l(r),t=(e=n?(e=l(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments),this);if(e&&("object"===o(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return f(t)}}function f(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function E(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){for(var r=0;r=t[0]){if("*"===t[1]||e<=t[1])return!0;throw new n.prototype.constructor(r)}throw new n.prototype.constructor(r)}var C=new WeakMap,T=new WeakMap,L=function(){function n(){var e,t,r;if(E(this,n),r=!(t="jsonString"),t in(e=this)?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,d(this,C,{writable:!0,value:!1}),d(this,T,{writable:!0,value:void 0}),(this instanceof n?this.constructor:void 0)===n)throw new TypeError("Cannot construct BaseCMI instances directly")}return v(n,[{key:"initialized",get:function(){return t(this,C)}},{key:"start_time",get:function(){return t(this,T)}},{key:"initialize",value:function(){h(this,C,!0)}},{key:"setStartTime",value:function(){h(this,T,(new Date).getTime())}}]),n}(),R=new WeakMap,m=new WeakMap,A=new WeakMap,p=new WeakMap,y=new WeakMap,g=new WeakMap,_=new WeakMap,j=new WeakMap,N=new WeakMap,k=new WeakMap,D=function(){a(u,L);var l=c(u);function u(e){var t,r=e.score_children,n=e.score_range,i=e.max,o=e.invalidErrorCode,a=e.invalidTypeCode,s=e.invalidRangeCode,c=e.decimalRegex,e=e.errorClass;return E(this,u),d(f(t=l.call(this)),R,{writable:!0,value:void 0}),d(f(t),m,{writable:!0,value:void 0}),d(f(t),A,{writable:!0,value:void 0}),d(f(t),p,{writable:!0,value:void 0}),d(f(t),y,{writable:!0,value:void 0}),d(f(t),g,{writable:!0,value:void 0}),d(f(t),_,{writable:!0,value:void 0}),d(f(t),j,{writable:!0,value:""}),d(f(t),N,{writable:!0,value:""}),d(f(t),k,{writable:!0,value:void 0}),h(f(t),R,r||M.score_children),h(f(t),m,!!n&&w.score_range),h(f(t),k,i||""===i?i:"100"),h(f(t),A,o||S.INVALID_SET_VALUE),h(f(t),p,a||S.TYPE_MISMATCH),h(f(t),y,s||S.VALUE_OUT_OF_RANGE),h(f(t),g,c||w.CMIDecimal),h(f(t),_,e),t}return v(u,[{key:"_children",get:function(){return t(this,R)},set:function(e){throw new(t(this,_).prototype.constructor)(t(this,A))}},{key:"raw",get:function(){return t(this,j)},set:function(e){!O(e,t(this,g),t(this,p),t(this,_))||t(this,m)&&!I(e,t(this,m),t(this,y),t(this,_))||h(this,j,e)}},{key:"min",get:function(){return t(this,N)},set:function(e){!O(e,t(this,g),t(this,p),t(this,_))||t(this,m)&&!I(e,t(this,m),t(this,y),t(this,_))||h(this,N,e)}},{key:"max",get:function(){return t(this,k)},set:function(e){!O(e,t(this,g),t(this,p),t(this,_))||t(this,m)&&!I(e,t(this,m),t(this,y),t(this,_))||h(this,k,e)}},{key:"toJSON",value:function(){this.jsonString=!0;var e={raw:this.raw,min:this.min,max:this.max};return delete this.jsonString,e}}]),u}(),V=new WeakMap,P=new WeakMap,F=new WeakMap,x=function(){a(o,L);var i=c(o);function o(e){var t,r=e.children,n=e.errorCode,e=e.errorClass;return E(this,o),d(f(t=i.call(this)),V,{writable:!0,value:void 0}),d(f(t),P,{writable:!0,value:void 0}),d(f(t),F,{writable:!0,value:void 0}),h(f(t),F,r),h(f(t),V,n),h(f(t),P,e),t.childArray=[],t}return v(o,[{key:"_children",get:function(){return t(this,F)},set:function(e){throw new(t(this,P).prototype.constructor)(t(this,V))}},{key:"_count",get:function(){return this.childArray.length},set:function(e){throw new(t(this,P).prototype.constructor)(t(this,V))}},{key:"toJSON",value:function(){this.jsonString=!0;for(var e={},t=0;te.length)&&(t=e.length);for(var r=0,n=new Array(t);r
* Build: `lodash modularize exports="npm" -o ./`
@@ -11,51 +20,50 @@
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = 'Expected a function';
-
/** Used as references for various `Number` constants. */
+
var NAN = 0 / 0;
-
/** `Object#toString` result references. */
+
var symbolTag = '[object Symbol]';
-
/** Used to match leading and trailing whitespace. */
+
var reTrim = /^\s+|\s+$/g;
-
/** Used to detect bad signed hexadecimal string values. */
+
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
-
/** Used to detect binary string values. */
+
var reIsBinary = /^0b[01]+$/i;
-
/** Used to detect octal string values. */
+
var reIsOctal = /^0o[0-7]+$/i;
-
/** Built-in method references without a dependency on `root`. */
+
var freeParseInt = parseInt;
-
/** Detect free variable `global` from Node.js. */
-var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
+var freeGlobal = (typeof __webpack_require__.g === "undefined" ? "undefined" : _typeof(__webpack_require__.g)) == 'object' && __webpack_require__.g && __webpack_require__.g.Object === Object && __webpack_require__.g;
/** Detect free variable `self`. */
-var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
+var freeSelf = (typeof self === "undefined" ? "undefined" : _typeof(self)) == 'object' && self && self.Object === Object && self;
/** Used as a reference to the global object. */
+
var root = freeGlobal || freeSelf || Function('return this')();
-
/** Used for built-in method references. */
-var objectProto = Object.prototype;
+var objectProto = Object.prototype;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
* of values.
*/
-var objectToString = objectProto.toString;
+var objectToString = objectProto.toString;
/* Built-in method references for those with the same name as other `lodash` methods. */
+
var nativeMax = Math.max,
nativeMin = Math.min;
-
/**
* Gets the timestamp of the number of milliseconds that have elapsed since
* the Unix epoch (1 January 1970 00:00:00 UTC).
@@ -72,10 +80,10 @@ var nativeMax = Math.max,
* }, _.now());
* // => Logs the number of milliseconds it took for the deferred invocation.
*/
-var now = function() {
+
+var now = function now() {
return root.Date.now();
};
-
/**
* Creates a debounced function that delays invoking `func` until after `wait`
* milliseconds have elapsed since the last time the debounced function was
@@ -130,6 +138,8 @@ var now = function() {
* // Cancel the trailing debounced invocation.
* jQuery(window).on('popstate', debounced.cancel);
*/
+
+
function debounce(func, wait, options) {
var lastArgs,
lastThis,
@@ -145,7 +155,9 @@ function debounce(func, wait, options) {
if (typeof func != 'function') {
throw new TypeError(FUNC_ERROR_TEXT);
}
+
wait = toNumber(wait) || 0;
+
if (isObject(options)) {
leading = !!options.leading;
maxing = 'maxWait' in options;
@@ -156,7 +168,6 @@ function debounce(func, wait, options) {
function invokeFunc(time) {
var args = lastArgs,
thisArg = lastThis;
-
lastArgs = lastThis = undefined;
lastInvokeTime = time;
result = func.apply(thisArg, args);
@@ -165,10 +176,10 @@ function debounce(func, wait, options) {
function leadingEdge(time) {
// Reset any `maxWait` timer.
- lastInvokeTime = time;
- // Start the timer for the trailing edge.
- timerId = setTimeout(timerExpired, wait);
- // Invoke the leading edge.
+ lastInvokeTime = time; // Start the timer for the trailing edge.
+
+ timerId = setTimeout(timerExpired, wait); // Invoke the leading edge.
+
return leading ? invokeFunc(time) : result;
}
@@ -176,38 +187,37 @@ function debounce(func, wait, options) {
var timeSinceLastCall = time - lastCallTime,
timeSinceLastInvoke = time - lastInvokeTime,
result = wait - timeSinceLastCall;
-
return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
}
function shouldInvoke(time) {
var timeSinceLastCall = time - lastCallTime,
- timeSinceLastInvoke = time - lastInvokeTime;
-
- // Either this is the first call, activity has stopped and we're at the
+ timeSinceLastInvoke = time - lastInvokeTime; // Either this is the first call, activity has stopped and we're at the
// trailing edge, the system time has gone backwards and we're treating
// it as the trailing edge, or we've hit the `maxWait` limit.
- return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
- (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
+
+ return lastCallTime === undefined || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
}
function timerExpired() {
var time = now();
+
if (shouldInvoke(time)) {
return trailingEdge(time);
- }
- // Restart the timer.
+ } // Restart the timer.
+
+
timerId = setTimeout(timerExpired, remainingWait(time));
}
function trailingEdge(time) {
- timerId = undefined;
-
- // Only invoke if we have `lastArgs` which means `func` has been
+ timerId = undefined; // Only invoke if we have `lastArgs` which means `func` has been
// debounced at least once.
+
if (trailing && lastArgs) {
return invokeFunc(time);
}
+
lastArgs = lastThis = undefined;
return result;
}
@@ -216,6 +226,7 @@ function debounce(func, wait, options) {
if (timerId !== undefined) {
clearTimeout(timerId);
}
+
lastInvokeTime = 0;
lastArgs = lastCallTime = lastThis = timerId = undefined;
}
@@ -227,7 +238,6 @@ function debounce(func, wait, options) {
function debounced() {
var time = now(),
isInvoking = shouldInvoke(time);
-
lastArgs = arguments;
lastThis = this;
lastCallTime = time;
@@ -236,22 +246,25 @@ function debounce(func, wait, options) {
if (timerId === undefined) {
return leadingEdge(lastCallTime);
}
+
if (maxing) {
// Handle invocations in a tight loop.
timerId = setTimeout(timerExpired, wait);
return invokeFunc(lastCallTime);
}
}
+
if (timerId === undefined) {
timerId = setTimeout(timerExpired, wait);
}
+
return result;
}
+
debounced.cancel = cancel;
debounced.flush = flush;
return debounced;
}
-
/**
* Checks if `value` is the
* [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
@@ -277,11 +290,13 @@ function debounce(func, wait, options) {
* _.isObject(null);
* // => false
*/
+
+
function isObject(value) {
- var type = typeof value;
+ var type = _typeof(value);
+
return !!value && (type == 'object' || type == 'function');
}
-
/**
* Checks if `value` is object-like. A value is object-like if it's not `null`
* and has a `typeof` result of "object".
@@ -306,10 +321,11 @@ function isObject(value) {
* _.isObjectLike(null);
* // => false
*/
-function isObjectLike(value) {
- return !!value && typeof value == 'object';
-}
+
+function isObjectLike(value) {
+ return !!value && _typeof(value) == 'object';
+}
/**
* Checks if `value` is classified as a `Symbol` primitive or object.
*
@@ -327,11 +343,11 @@ function isObjectLike(value) {
* _.isSymbol('abc');
* // => false
*/
-function isSymbol(value) {
- return typeof value == 'symbol' ||
- (isObjectLike(value) && objectToString.call(value) == symbolTag);
-}
+
+function isSymbol(value) {
+ return _typeof(value) == 'symbol' || isObjectLike(value) && objectToString.call(value) == symbolTag;
+}
/**
* Converts `value` to a number.
*
@@ -355,53 +371,53 @@ function isSymbol(value) {
* _.toNumber('3.2');
* // => 3.2
*/
+
+
function toNumber(value) {
if (typeof value == 'number') {
return value;
}
+
if (isSymbol(value)) {
return NAN;
}
+
if (isObject(value)) {
var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
- value = isObject(other) ? (other + '') : other;
+ value = isObject(other) ? other + '' : other;
}
+
if (typeof value != 'string') {
return value === 0 ? value : +value;
}
+
value = value.replace(reTrim, '');
var isBinary = reIsBinary.test(value);
- return (isBinary || reIsOctal.test(value))
- ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
- : (reIsBadHex.test(value) ? NAN : +value);
+ return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
}
module.exports = debounce;
-}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+/***/ }),
+
+/***/ "./src/BaseAPI.js":
+/*!************************!*\
+ !*** ./src/BaseAPI.js ***!
+ \************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{}],2:[function(require,module,exports){
"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _common = require("./cmi/common");
-
-var _exceptions = require("./exceptions");
-
-var _error_codes2 = _interopRequireDefault(require("./constants/error_codes"));
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-var _utilities = require("./utilities");
-
-var _lodash = _interopRequireDefault(require("lodash.debounce"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ BaseAPI; }
+/* harmony export */ });
+/* harmony import */ var _cmi_common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cmi/common */ "./src/cmi/common.js");
+/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./exceptions */ "./src/exceptions.js");
+/* harmony import */ var _constants_error_codes__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants/error_codes */ "./src/constants/error_codes.js");
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants/api_constants */ "./src/constants/api_constants.js");
+/* harmony import */ var _utilities__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utilities */ "./src/utilities.js");
+/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! lodash.debounce */ "./node_modules/lodash.debounce/index.js");
+/* harmony import */ var lodash_debounce__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash_debounce__WEBPACK_IMPORTED_MODULE_5__);
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -442,8 +458,14 @@ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!priva
function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-var global_constants = _api_constants["default"].global;
-var scorm12_error_codes = _error_codes2["default"].scorm12;
+
+
+
+
+
+
+var global_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__["default"].global;
+var scorm12_error_codes = _constants_error_codes__WEBPACK_IMPORTED_MODULE_2__["default"].scorm12;
/**
* Base API class for AICC, SCORM 1.2, and SCORM 2004. Should be considered
* abstract, and never initialized on it's own.
@@ -514,6 +536,9 @@ var BaseAPI = /*#__PURE__*/function () {
return result;
},
+ requestHandler: function requestHandler(commitObject) {
+ return commitObject;
+ },
onLogMessage: function onLogMessage(messageLevel, logMessage) {
switch (messageLevel) {
case global_constants.LOG_LEVEL_ERROR:
@@ -672,7 +697,7 @@ var BaseAPI = /*#__PURE__*/function () {
try {
returnValue = this.getCMIValue(CMIElement);
} catch (e) {
- if (e instanceof _exceptions.ValidationError) {
+ if (e instanceof _exceptions__WEBPACK_IMPORTED_MODULE_1__.ValidationError) {
this.lastErrorCode = e.errorCode;
returnValue = global_constants.SCORM_FALSE;
} else {
@@ -719,7 +744,7 @@ var BaseAPI = /*#__PURE__*/function () {
try {
returnValue = this.setCMIValue(CMIElement, value);
} catch (e) {
- if (e instanceof _exceptions.ValidationError) {
+ if (e instanceof _exceptions__WEBPACK_IMPORTED_MODULE_1__.ValidationError) {
this.lastErrorCode = e.errorCode;
returnValue = global_constants.SCORM_FALSE;
} else {
@@ -1037,7 +1062,7 @@ var BaseAPI = /*#__PURE__*/function () {
break;
}
- if (refObject instanceof _common.CMIArray) {
+ if (refObject instanceof _cmi_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray) {
var index = parseInt(structure[i + 1], 10); // SCO is trying to set an item on an array
if (!isNaN(index)) {
@@ -1149,7 +1174,7 @@ var BaseAPI = /*#__PURE__*/function () {
break;
}
- if (refObject instanceof _common.CMIArray) {
+ if (refObject instanceof _cmi_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray) {
var index = parseInt(structure[i + 1], 10); // SCO is trying to set an item on an array
if (!isNaN(index)) {
@@ -1491,7 +1516,7 @@ var BaseAPI = /*#__PURE__*/function () {
obj = {};
obj[element[0]] = element[1];
- _this3.loadFromJSON((0, _utilities.unflatten)(obj), CMIElement);
+ _this3.loadFromJSON((0,_utilities__WEBPACK_IMPORTED_MODULE_4__.unflatten)(obj), CMIElement);
});
}
/**
@@ -1615,6 +1640,8 @@ var BaseAPI = /*#__PURE__*/function () {
}
try {
+ params = settings.requestHandler(params);
+
if (params instanceof Array) {
httpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
httpReq.send(params.join('&'));
@@ -1684,8 +1711,8 @@ var BaseAPI = /*#__PURE__*/function () {
return result;
};
- if (typeof _lodash["default"] !== 'undefined') {
- var debounced = (0, _lodash["default"])(process, 500);
+ if (typeof (lodash_debounce__WEBPACK_IMPORTED_MODULE_5___default()) !== 'undefined') {
+ var debounced = lodash_debounce__WEBPACK_IMPORTED_MODULE_5___default()(process, 500);
debounced(url, params, this.settings, this.error_codes); // if we're terminating, go ahead and commit immediately
if (immediate) {
@@ -1738,7 +1765,7 @@ var BaseAPI = /*#__PURE__*/function () {
*/
-exports["default"] = BaseAPI;
+
var _API = /*#__PURE__*/new WeakMap();
@@ -1814,38 +1841,29 @@ var ScheduledCommit = /*#__PURE__*/function () {
return ScheduledCommit;
}();
-},{"./cmi/common":4,"./constants/api_constants":6,"./constants/error_codes":7,"./exceptions":11,"./utilities":13,"lodash.debounce":1}],3:[function(require,module,exports){
+/***/ }),
+
+/***/ "./src/Scorm2004API.js":
+/*!*****************************!*\
+ !*** ./src/Scorm2004API.js ***!
+ \*****************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "default": function() { return /* binding */ Scorm2004API; }
+/* harmony export */ });
+/* harmony import */ var _BaseAPI__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BaseAPI */ "./src/BaseAPI.js");
+/* harmony import */ var _cmi_scorm2004_cmi__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cmi/scorm2004_cmi */ "./src/cmi/scorm2004_cmi.js");
+/* harmony import */ var _utilities__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utilities */ "./src/utilities.js");
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./constants/api_constants */ "./src/constants/api_constants.js");
+/* harmony import */ var _constants_error_codes__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./constants/error_codes */ "./src/constants/error_codes.js");
+/* harmony import */ var _constants_response_constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./constants/response_constants */ "./src/constants/response_constants.js");
+/* harmony import */ var _constants_language_constants__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./constants/language_constants */ "./src/constants/language_constants.js");
+/* harmony import */ var _constants_regex__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./constants/regex */ "./src/constants/regex.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _BaseAPI2 = _interopRequireDefault(require("./BaseAPI"));
-
-var _scorm2004_cmi = require("./cmi/scorm2004_cmi");
-
-var Utilities = _interopRequireWildcard(require("./utilities"));
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("./constants/error_codes"));
-
-var _response_constants = _interopRequireDefault(require("./constants/response_constants"));
-
-var _language_constants = _interopRequireDefault(require("./constants/language_constants"));
-
-var _regex = _interopRequireDefault(require("./constants/regex"));
-
-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; }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -1882,11 +1900,19 @@ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!priva
function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-var scorm2004_constants = _api_constants["default"].scorm2004;
-var global_constants = _api_constants["default"].global;
-var scorm2004_error_codes = _error_codes["default"].scorm2004;
-var correct_responses = _response_constants["default"].correct;
-var scorm2004_regex = _regex["default"].scorm2004;
+
+
+
+
+
+
+
+
+var scorm2004_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__["default"].scorm2004;
+var global_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_3__["default"].global;
+var scorm2004_error_codes = _constants_error_codes__WEBPACK_IMPORTED_MODULE_4__["default"].scorm2004;
+var correct_responses = _constants_response_constants__WEBPACK_IMPORTED_MODULE_5__["default"].correct;
+var scorm2004_regex = _constants_regex__WEBPACK_IMPORTED_MODULE_7__["default"].scorm2004;
/**
* API class for SCORM 2004
*/
@@ -1931,8 +1957,8 @@ var Scorm2004API = /*#__PURE__*/function (_BaseAPI) {
return found;
});
- _this.cmi = new _scorm2004_cmi.CMI();
- _this.adl = new _scorm2004_cmi.ADL(); // Rename functions to match 2004 Spec and expose to modules
+ _this.cmi = new _cmi_scorm2004_cmi__WEBPACK_IMPORTED_MODULE_1__.CMI();
+ _this.adl = new _cmi_scorm2004_cmi__WEBPACK_IMPORTED_MODULE_1__.ADL(); // Rename functions to match 2004 Spec and expose to modules
_this.Initialize = _this.lmsInitialize;
_this.Terminate = _this.lmsTerminate;
@@ -2107,7 +2133,7 @@ var Scorm2004API = /*#__PURE__*/function (_BaseAPI) {
var newChild;
if (this.stringMatches(CMIElement, 'cmi\\.objectives\\.\\d+')) {
- newChild = new _scorm2004_cmi.CMIObjectivesObject();
+ newChild = new _cmi_scorm2004_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIObjectivesObject();
} else if (foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+\\.correct_responses\\.\\d+')) {
var parts = CMIElement.split('.');
var index = Number(parts[2]);
@@ -2129,16 +2155,16 @@ var Scorm2004API = /*#__PURE__*/function (_BaseAPI) {
}
if (this.lastErrorCode === 0) {
- newChild = new _scorm2004_cmi.CMIInteractionsCorrectResponsesObject();
+ newChild = new _cmi_scorm2004_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIInteractionsCorrectResponsesObject();
}
} else if (foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+\\.objectives\\.\\d+')) {
- newChild = new _scorm2004_cmi.CMIInteractionsObjectivesObject();
+ newChild = new _cmi_scorm2004_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIInteractionsObjectivesObject();
} else if (!foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+')) {
- newChild = new _scorm2004_cmi.CMIInteractionsObject();
+ newChild = new _cmi_scorm2004_cmi__WEBPACK_IMPORTED_MODULE_1__.CMIInteractionsObject();
} else if (this.stringMatches(CMIElement, 'cmi\\.comments_from_learner\\.\\d+')) {
- newChild = new _scorm2004_cmi.CMICommentsObject();
+ newChild = new _cmi_scorm2004_cmi__WEBPACK_IMPORTED_MODULE_1__.CMICommentsObject();
} else if (this.stringMatches(CMIElement, 'cmi\\.comments_from_lms\\.\\d+')) {
- newChild = new _scorm2004_cmi.CMICommentsObject(true);
+ newChild = new _cmi_scorm2004_cmi__WEBPACK_IMPORTED_MODULE_1__.CMICommentsObject(true);
}
return newChild;
@@ -2343,7 +2369,7 @@ var Scorm2004API = /*#__PURE__*/function (_BaseAPI) {
var lang = langMatches[3];
if (lang !== undefined && lang.length > 0) {
- if (_language_constants["default"][lang.toLowerCase()] === undefined) {
+ if (_constants_language_constants__WEBPACK_IMPORTED_MODULE_6__["default"][lang.toLowerCase()] === undefined) {
this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);
}
}
@@ -2411,11 +2437,11 @@ var Scorm2004API = /*#__PURE__*/function (_BaseAPI) {
}
var result = [];
- var flattened = Utilities.flatten(cmiExport);
+ var flattened = _utilities__WEBPACK_IMPORTED_MODULE_2__.flatten(cmiExport);
switch (this.settings.dataCommitFormat) {
case 'flattened':
- return Utilities.flatten(cmiExport);
+ return _utilities__WEBPACK_IMPORTED_MODULE_2__.flatten(cmiExport);
case 'params':
for (var item in flattened) {
@@ -2499,30 +2525,32 @@ var Scorm2004API = /*#__PURE__*/function (_BaseAPI) {
}]);
return Scorm2004API;
-}(_BaseAPI2["default"]);
+}(_BaseAPI__WEBPACK_IMPORTED_MODULE_0__["default"]);
-exports["default"] = Scorm2004API;
-},{"./BaseAPI":2,"./cmi/scorm2004_cmi":5,"./constants/api_constants":6,"./constants/error_codes":7,"./constants/language_constants":8,"./constants/regex":9,"./constants/response_constants":10,"./utilities":13}],4:[function(require,module,exports){
+
+/***/ }),
+
+/***/ "./src/cmi/common.js":
+/*!***************************!*\
+ !*** ./src/cmi/common.js ***!
+ \***************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
+
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "checkValidFormat": function() { return /* binding */ checkValidFormat; },
+/* harmony export */ "checkValidRange": function() { return /* binding */ checkValidRange; },
+/* harmony export */ "BaseCMI": function() { return /* binding */ BaseCMI; },
+/* harmony export */ "CMIScore": function() { return /* binding */ CMIScore; },
+/* harmony export */ "CMIArray": function() { return /* binding */ CMIArray; }
+/* harmony export */ });
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants/api_constants */ "./src/constants/api_constants.js");
+/* harmony import */ var _constants_error_codes__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants/error_codes */ "./src/constants/error_codes.js");
+/* harmony import */ var _constants_regex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants/regex */ "./src/constants/regex.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.CMIScore = exports.CMIArray = exports.BaseCMI = void 0;
-exports.checkValidFormat = checkValidFormat;
-exports.checkValidRange = checkValidRange;
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
@@ -2559,9 +2587,12 @@ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!priva
function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-var scorm12_constants = _api_constants["default"].scorm12;
-var scorm12_regex = _regex["default"].scorm12;
-var scorm12_error_codes = _error_codes["default"].scorm12;
+
+
+
+var scorm12_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__["default"].scorm12;
+var scorm12_regex = _constants_regex__WEBPACK_IMPORTED_MODULE_2__["default"].scorm12;
+var scorm12_error_codes = _constants_error_codes__WEBPACK_IMPORTED_MODULE_1__["default"].scorm12;
/**
* Check if the value matches the proper format. If not, throw proper error code.
*
@@ -2597,7 +2628,6 @@ function checkValidFormat(value, regexPattern, errorCode, errorClass, allowEmpty
* @return {boolean}
*/
-
function checkValidRange(value, rangePattern, errorCode, errorClass) {
var ranges = rangePattern.split('#');
value = value * 1.0;
@@ -2616,7 +2646,6 @@ function checkValidRange(value, rangePattern, errorCode, errorClass) {
* Base class for API cmi objects
*/
-
var _initialized = /*#__PURE__*/new WeakMap();
var _start_time = /*#__PURE__*/new WeakMap();
@@ -2692,9 +2721,6 @@ var BaseCMI = /*#__PURE__*/function () {
* Base class for cmi *.score objects
*/
-
-exports.BaseCMI = BaseCMI;
-
var _children2 = /*#__PURE__*/new WeakMap();
var _score_range = /*#__PURE__*/new WeakMap();
@@ -2921,9 +2947,6 @@ var CMIScore = /*#__PURE__*/function (_BaseCMI) {
* Base class for cmi *.n objects
*/
-
-exports.CMIScore = CMIScore;
-
var _errorCode = /*#__PURE__*/new WeakMap();
var _errorClass = /*#__PURE__*/new WeakMap();
@@ -3036,38 +3059,34 @@ var CMIArray = /*#__PURE__*/function (_BaseCMI2) {
return CMIArray;
}(BaseCMI);
-exports.CMIArray = CMIArray;
+/***/ }),
+
+/***/ "./src/cmi/scorm2004_cmi.js":
+/*!**********************************!*\
+ !*** ./src/cmi/scorm2004_cmi.js ***!
+ \**********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{"../constants/api_constants":6,"../constants/error_codes":7,"../constants/regex":9}],5:[function(require,module,exports){
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "CMI": function() { return /* binding */ CMI; },
+/* harmony export */ "CMIInteractionsObject": function() { return /* binding */ CMIInteractionsObject; },
+/* harmony export */ "CMIObjectivesObject": function() { return /* binding */ CMIObjectivesObject; },
+/* harmony export */ "CMICommentsObject": function() { return /* binding */ CMICommentsObject; },
+/* harmony export */ "CMIInteractionsObjectivesObject": function() { return /* binding */ CMIInteractionsObjectivesObject; },
+/* harmony export */ "CMIInteractionsCorrectResponsesObject": function() { return /* binding */ CMIInteractionsCorrectResponsesObject; },
+/* harmony export */ "ADL": function() { return /* binding */ ADL; }
+/* harmony export */ });
+/* harmony import */ var _common__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./common */ "./src/cmi/common.js");
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants/api_constants */ "./src/constants/api_constants.js");
+/* harmony import */ var _constants_regex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants/regex */ "./src/constants/regex.js");
+/* harmony import */ var _constants_error_codes__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../constants/error_codes */ "./src/constants/error_codes.js");
+/* harmony import */ var _constants_response_constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants/response_constants */ "./src/constants/response_constants.js");
+/* harmony import */ var _exceptions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../exceptions */ "./src/exceptions.js");
+/* harmony import */ var _utilities__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utilities */ "./src/utilities.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.CMIObjectivesObject = exports.CMIInteractionsObjectivesObject = exports.CMIInteractionsObject = exports.CMIInteractionsCorrectResponsesObject = exports.CMICommentsObject = exports.CMI = exports.ADL = void 0;
-
-var _common = require("./common");
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _response_constants = _interopRequireDefault(require("../constants/response_constants"));
-
-var _exceptions = require("../exceptions");
-
-var Util = _interopRequireWildcard(require("../utilities"));
-
-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; }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
@@ -3108,16 +3127,23 @@ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!priva
function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-var scorm2004_constants = _api_constants["default"].scorm2004;
-var scorm2004_error_codes = _error_codes["default"].scorm2004;
-var learner_responses = _response_constants["default"].learner;
-var scorm2004_regex = _regex["default"].scorm2004;
+
+
+
+
+
+
+
+var scorm2004_constants = _constants_api_constants__WEBPACK_IMPORTED_MODULE_1__["default"].scorm2004;
+var scorm2004_error_codes = _constants_error_codes__WEBPACK_IMPORTED_MODULE_3__["default"].scorm2004;
+var learner_responses = _constants_response_constants__WEBPACK_IMPORTED_MODULE_4__["default"].learner;
+var scorm2004_regex = _constants_regex__WEBPACK_IMPORTED_MODULE_2__["default"].scorm2004;
/**
* Helper method for throwing Read Only error
*/
function throwReadOnlyError() {
- throw new _exceptions.Scorm2004ValidationError(scorm2004_error_codes.READ_ONLY_ELEMENT);
+ throw new _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError(scorm2004_error_codes.READ_ONLY_ELEMENT);
}
/**
* Helper method for throwing Write Only error
@@ -3125,7 +3151,7 @@ function throwReadOnlyError() {
function throwWriteOnlyError() {
- throw new _exceptions.Scorm2004ValidationError(scorm2004_error_codes.WRITE_ONLY_ELEMENT);
+ throw new _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError(scorm2004_error_codes.WRITE_ONLY_ELEMENT);
}
/**
* Helper method for throwing Type Mismatch error
@@ -3133,7 +3159,7 @@ function throwWriteOnlyError() {
function throwTypeMismatchError() {
- throw new _exceptions.Scorm2004ValidationError(scorm2004_error_codes.TYPE_MISMATCH);
+ throw new _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError(scorm2004_error_codes.TYPE_MISMATCH);
}
/**
* Helper method for throwing Dependency Not Established error
@@ -3141,7 +3167,7 @@ function throwTypeMismatchError() {
function throwDependencyNotEstablishedError() {
- throw new _exceptions.Scorm2004ValidationError(scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);
+ throw new _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError(scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);
}
/**
* Helper method for throwing Dependency Not Established error
@@ -3149,7 +3175,7 @@ function throwDependencyNotEstablishedError() {
function throwGeneralSetError() {
- throw new _exceptions.Scorm2004ValidationError(scorm2004_error_codes.GENERAL_SET_FAILURE);
+ throw new _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError(scorm2004_error_codes.GENERAL_SET_FAILURE);
}
/**
* Helper method, no reason to have to pass the same error codes every time
@@ -3161,7 +3187,7 @@ function throwGeneralSetError() {
function check2004ValidFormat(value, regexPattern, allowEmptyString) {
- return (0, _common.checkValidFormat)(value, regexPattern, scorm2004_error_codes.TYPE_MISMATCH, _exceptions.Scorm2004ValidationError, allowEmptyString);
+ return (0,_common__WEBPACK_IMPORTED_MODULE_0__.checkValidFormat)(value, regexPattern, scorm2004_error_codes.TYPE_MISMATCH, _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError, allowEmptyString);
}
/**
* Helper method, no reason to have to pass the same error codes every time
@@ -3172,7 +3198,7 @@ function check2004ValidFormat(value, regexPattern, allowEmptyString) {
function check2004ValidRange(value, rangePattern) {
- return (0, _common.checkValidRange)(value, rangePattern, scorm2004_error_codes.VALUE_OUT_OF_RANGE, _exceptions.Scorm2004ValidationError);
+ return (0,_common__WEBPACK_IMPORTED_MODULE_0__.checkValidRange)(value, rangePattern, scorm2004_error_codes.VALUE_OUT_OF_RANGE, _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError);
}
/**
* Class representing cmi object for SCORM 2004
@@ -3756,10 +3782,10 @@ var CMI = /*#__PURE__*/function (_BaseCMI) {
if (typeof startTime !== 'undefined' && startTime !== null) {
var seconds = new Date().getTime() - startTime;
- sessionTime = Util.getSecondsAsISODuration(seconds / 1000);
+ sessionTime = _utilities__WEBPACK_IMPORTED_MODULE_6__.getSecondsAsISODuration(seconds / 1000);
}
- return Util.addTwoDurations(_classPrivateFieldGet(this, _total_time), sessionTime, scorm2004_regex.CMITimespan);
+ return _utilities__WEBPACK_IMPORTED_MODULE_6__.addTwoDurations(_classPrivateFieldGet(this, _total_time), sessionTime, scorm2004_regex.CMITimespan);
}
/**
* toJSON for cmi
@@ -3828,14 +3854,11 @@ var CMI = /*#__PURE__*/function (_BaseCMI) {
}]);
return CMI;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class for SCORM 2004's cmi.learner_preference object
*/
-
-exports.CMI = CMI;
-
var _children3 = /*#__PURE__*/new WeakMap();
var _audio_level = /*#__PURE__*/new WeakMap();
@@ -4018,7 +4041,7 @@ var CMILearnerPreference = /*#__PURE__*/function (_BaseCMI2) {
}]);
return CMILearnerPreference;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 2004's cmi.interactions object
*/
@@ -4038,12 +4061,12 @@ var CMIInteractions = /*#__PURE__*/function (_CMIArray) {
return _super3.call(this, {
children: scorm2004_constants.interactions_children,
errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError
});
}
return _createClass(CMIInteractions);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray);
/**
* Class representing SCORM 2004's cmi.objectives object
*/
@@ -4063,12 +4086,12 @@ var CMIObjectives = /*#__PURE__*/function (_CMIArray2) {
return _super4.call(this, {
children: scorm2004_constants.objectives_children,
errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError
});
}
return _createClass(CMIObjectives);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray);
/**
* Class representing SCORM 2004's cmi.comments_from_lms object
*/
@@ -4088,12 +4111,12 @@ var CMICommentsFromLMS = /*#__PURE__*/function (_CMIArray3) {
return _super5.call(this, {
children: scorm2004_constants.comments_children,
errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError
});
}
return _createClass(CMICommentsFromLMS);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray);
/**
* Class representing SCORM 2004's cmi.comments_from_learner object
*/
@@ -4113,12 +4136,12 @@ var CMICommentsFromLearner = /*#__PURE__*/function (_CMIArray4) {
return _super6.call(this, {
children: scorm2004_constants.comments_children,
errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError
});
}
return _createClass(CMICommentsFromLearner);
-}(_common.CMIArray);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.CMIArray);
/**
* Class for SCORM 2004's cmi.interaction.n object
*/
@@ -4195,14 +4218,14 @@ var CMIInteractionsObject = /*#__PURE__*/function (_BaseCMI3) {
value: ''
});
- _this3.objectives = new _common.CMIArray({
+ _this3.objectives = new _common__WEBPACK_IMPORTED_MODULE_0__.CMIArray({
errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError,
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError,
children: scorm2004_constants.objectives_children
});
- _this3.correct_responses = new _common.CMIArray({
+ _this3.correct_responses = new _common__WEBPACK_IMPORTED_MODULE_0__.CMIArray({
errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError,
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError,
children: scorm2004_constants.correct_responses_children
});
return _this3;
@@ -4495,14 +4518,11 @@ var CMIInteractionsObject = /*#__PURE__*/function (_BaseCMI3) {
}]);
return CMIInteractionsObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class for SCORM 2004's cmi.objectives.n object
*/
-
-exports.CMIInteractionsObject = CMIInteractionsObject;
-
var _id2 = /*#__PURE__*/new WeakMap();
var _success_status2 = /*#__PURE__*/new WeakMap();
@@ -4719,14 +4739,11 @@ var CMIObjectivesObject = /*#__PURE__*/function (_BaseCMI4) {
}]);
return CMIObjectivesObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class for SCORM 2004's cmi *.score object
*/
-
-exports.CMIObjectivesObject = CMIObjectivesObject;
-
var _scaled = /*#__PURE__*/new WeakMap();
var Scorm2004CMIScore = /*#__PURE__*/function (_CMIScore) {
@@ -4749,7 +4766,7 @@ var Scorm2004CMIScore = /*#__PURE__*/function (_CMIScore) {
invalidTypeCode: scorm2004_error_codes.TYPE_MISMATCH,
invalidRangeCode: scorm2004_error_codes.VALUE_OUT_OF_RANGE,
decimalRegex: scorm2004_regex.CMIDecimal,
- errorClass: _exceptions.Scorm2004ValidationError
+ errorClass: _exceptions__WEBPACK_IMPORTED_MODULE_5__.Scorm2004ValidationError
});
_classPrivateFieldInitSpec(_assertThisInitialized(_this5), _scaled, {
@@ -4809,7 +4826,7 @@ var Scorm2004CMIScore = /*#__PURE__*/function (_CMIScore) {
}]);
return Scorm2004CMIScore;
-}(_common.CMIScore);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.CMIScore);
/**
* Class representing SCORM 2004's cmi.comments_from_learner.n and cmi.comments_from_lms.n object
*/
@@ -4970,14 +4987,11 @@ var CMICommentsObject = /*#__PURE__*/function (_BaseCMI5) {
}]);
return CMICommentsObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 2004's cmi.interactions.n.objectives.n object
*/
-
-exports.CMICommentsObject = CMICommentsObject;
-
var _id3 = /*#__PURE__*/new WeakMap();
var CMIInteractionsObjectivesObject = /*#__PURE__*/function (_BaseCMI6) {
@@ -5045,14 +5059,11 @@ var CMIInteractionsObjectivesObject = /*#__PURE__*/function (_BaseCMI6) {
}]);
return CMIInteractionsObjectivesObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 2004's cmi.interactions.n.correct_responses.n object
*/
-
-exports.CMIInteractionsObjectivesObject = CMIInteractionsObjectivesObject;
-
var _pattern = /*#__PURE__*/new WeakMap();
var CMIInteractionsCorrectResponsesObject = /*#__PURE__*/function (_BaseCMI7) {
@@ -5120,14 +5131,11 @@ var CMIInteractionsCorrectResponsesObject = /*#__PURE__*/function (_BaseCMI7) {
}]);
return CMIInteractionsCorrectResponsesObject;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 2004's adl object
*/
-
-exports.CMIInteractionsCorrectResponsesObject = CMIInteractionsCorrectResponsesObject;
-
var ADL = /*#__PURE__*/function (_BaseCMI8) {
_inherits(ADL, _BaseCMI8);
@@ -5183,14 +5191,11 @@ var ADL = /*#__PURE__*/function (_BaseCMI8) {
}]);
return ADL;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 2004's adl.nav object
*/
-
-exports.ADL = ADL;
-
var _request = /*#__PURE__*/new WeakMap();
var ADLNav = /*#__PURE__*/function (_BaseCMI9) {
@@ -5273,7 +5278,7 @@ var ADLNav = /*#__PURE__*/function (_BaseCMI9) {
}]);
return ADLNav;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
/**
* Class representing SCORM 2004's adl.nav.request_valid object
*/
@@ -5388,7 +5393,7 @@ var ADLNavRequestValid = /*#__PURE__*/function (_BaseCMI10) {
this.jsonString = true;
var result = {
'previous': this.previous,
- 'continue': this["continue"]
+ 'continue': this.continue
};
delete this.jsonString;
return result;
@@ -5396,16 +5401,18 @@ var ADLNavRequestValid = /*#__PURE__*/function (_BaseCMI10) {
}]);
return ADLNavRequestValid;
-}(_common.BaseCMI);
+}(_common__WEBPACK_IMPORTED_MODULE_0__.BaseCMI);
+
+/***/ }),
+
+/***/ "./src/constants/api_constants.js":
+/*!****************************************!*\
+ !*** ./src/constants/api_constants.js ***!
+ \****************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{"../constants/api_constants":6,"../constants/error_codes":7,"../constants/regex":9,"../constants/response_constants":10,"../exceptions":11,"../utilities":13,"./common":4}],6:[function(require,module,exports){
"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
+__webpack_require__.r(__webpack_exports__);
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -5620,17 +5627,18 @@ var APIConstants = {
aicc: aicc,
scorm2004: scorm2004
};
-var _default = APIConstants;
-exports["default"] = _default;
+/* harmony default export */ __webpack_exports__["default"] = (APIConstants);
+
+/***/ }),
+
+/***/ "./src/constants/error_codes.js":
+/*!**************************************!*\
+ !*** ./src/constants/error_codes.js ***!
+ \**************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{}],7:[function(require,module,exports){
"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
+__webpack_require__.r(__webpack_exports__);
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -5717,16 +5725,18 @@ var ErrorCodes = {
scorm12: scorm12,
scorm2004: scorm2004
};
-var _default = ErrorCodes;
-exports["default"] = _default;
+/* harmony default export */ __webpack_exports__["default"] = (ErrorCodes);
+
+/***/ }),
+
+/***/ "./src/constants/language_constants.js":
+/*!*********************************************!*\
+ !*** ./src/constants/language_constants.js ***!
+ \*********************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{}],8:[function(require,module,exports){
"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
+__webpack_require__.r(__webpack_exports__);
var ValidLanguages = {
'aa': 'aa',
'ab': 'ab',
@@ -6120,17 +6130,18 @@ var ValidLanguages = {
'zho': 'zho',
'zul': 'zul'
};
-var _default = ValidLanguages;
-exports["default"] = _default;
+/* harmony default export */ __webpack_exports__["default"] = (ValidLanguages);
+
+/***/ }),
+
+/***/ "./src/constants/regex.js":
+/*!********************************!*\
+ !*** ./src/constants/regex.js ***!
+ \********************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{}],9:[function(require,module,exports){
"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
+__webpack_require__.r(__webpack_exports__);
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -6224,22 +6235,21 @@ var Regex = {
scorm12: scorm12,
scorm2004: scorm2004
};
-var _default = Regex;
-exports["default"] = _default;
+/* harmony default export */ __webpack_exports__["default"] = (Regex);
+
+/***/ }),
+
+/***/ "./src/constants/response_constants.js":
+/*!*********************************************!*\
+ !*** ./src/constants/response_constants.js ***!
+ \*********************************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{}],10:[function(require,module,exports){
"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _regex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./regex */ "./src/constants/regex.js");
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _regex = _interopRequireDefault(require("./regex"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-var scorm2004_regex = _regex["default"].scorm2004;
+var scorm2004_regex = _regex__WEBPACK_IMPORTED_MODULE_0__["default"].scorm2004;
var learner = {
'true-false': {
format: '^true$|^false$',
@@ -6390,23 +6400,27 @@ var Responses = {
learner: learner,
correct: correct
};
-var _default = Responses;
-exports["default"] = _default;
+/* harmony default export */ __webpack_exports__["default"] = (Responses);
+
+/***/ }),
+
+/***/ "./src/exceptions.js":
+/*!***************************!*\
+ !*** ./src/exceptions.js ***!
+ \***************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{"./regex":9}],11:[function(require,module,exports){
"use strict";
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "ValidationError": function() { return /* binding */ ValidationError; },
+/* harmony export */ "Scorm12ValidationError": function() { return /* binding */ Scorm12ValidationError; },
+/* harmony export */ "AICCValidationError": function() { return /* binding */ AICCValidationError; },
+/* harmony export */ "Scorm2004ValidationError": function() { return /* binding */ Scorm2004ValidationError; }
+/* harmony export */ });
+/* harmony import */ var _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants/api_constants */ "./src/constants/api_constants.js");
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.ValidationError = exports.Scorm2004ValidationError = exports.Scorm12ValidationError = exports.AICCValidationError = void 0;
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
@@ -6447,9 +6461,10 @@ function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!priva
function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-var scorm12_errors = _api_constants["default"].scorm12.error_descriptions;
-var aicc_errors = _api_constants["default"].aicc.error_descriptions;
-var scorm2004_errors = _api_constants["default"].scorm2004.error_descriptions;
+
+var scorm12_errors = _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__["default"].scorm12.error_descriptions;
+var aicc_errors = _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__["default"].aicc.error_descriptions;
+var scorm2004_errors = _constants_api_constants__WEBPACK_IMPORTED_MODULE_0__["default"].scorm2004.error_descriptions;
/**
* Base Validation Exception
*/
@@ -6540,9 +6555,6 @@ var ValidationError = /*#__PURE__*/function (_Error) {
* SCORM 1.2 Validation Error
*/
-
-exports.ValidationError = ValidationError;
-
var Scorm12ValidationError = /*#__PURE__*/function (_ValidationError) {
_inherits(Scorm12ValidationError, _ValidationError);
@@ -6572,9 +6584,6 @@ var Scorm12ValidationError = /*#__PURE__*/function (_ValidationError) {
* AICC Validation Error
*/
-
-exports.Scorm12ValidationError = Scorm12ValidationError;
-
var AICCValidationError = /*#__PURE__*/function (_ValidationError2) {
_inherits(AICCValidationError, _ValidationError2);
@@ -6604,9 +6613,6 @@ var AICCValidationError = /*#__PURE__*/function (_ValidationError2) {
* SCORM 2004 Validation Error
*/
-
-exports.AICCValidationError = AICCValidationError;
-
var Scorm2004ValidationError = /*#__PURE__*/function (_ValidationError3) {
_inherits(Scorm2004ValidationError, _ValidationError3);
@@ -6633,34 +6639,31 @@ var Scorm2004ValidationError = /*#__PURE__*/function (_ValidationError3) {
return _createClass(Scorm2004ValidationError);
}(ValidationError);
-exports.Scorm2004ValidationError = Scorm2004ValidationError;
+/***/ }),
+
+/***/ "./src/utilities.js":
+/*!**************************!*\
+ !*** ./src/utilities.js ***!
+ \**************************/
+/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
-},{"./constants/api_constants":6}],12:[function(require,module,exports){
"use strict";
-
-var _Scorm2004API = _interopRequireDefault(require("../Scorm2004API"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-window.Scorm2004API = _Scorm2004API["default"];
-
-},{"../Scorm2004API":3}],13:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.SECONDS_PER_SECOND = exports.SECONDS_PER_MINUTE = exports.SECONDS_PER_HOUR = exports.SECONDS_PER_DAY = void 0;
-exports.addHHMMSSTimeStrings = addHHMMSSTimeStrings;
-exports.addTwoDurations = addTwoDurations;
-exports.countDecimals = countDecimals;
-exports.flatten = flatten;
-exports.getDurationAsSeconds = getDurationAsSeconds;
-exports.getSecondsAsHHMMSS = getSecondsAsHHMMSS;
-exports.getSecondsAsISODuration = getSecondsAsISODuration;
-exports.getTimeAsSeconds = getTimeAsSeconds;
-exports.unflatten = unflatten;
-
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "SECONDS_PER_SECOND": function() { return /* binding */ SECONDS_PER_SECOND; },
+/* harmony export */ "SECONDS_PER_MINUTE": function() { return /* binding */ SECONDS_PER_MINUTE; },
+/* harmony export */ "SECONDS_PER_HOUR": function() { return /* binding */ SECONDS_PER_HOUR; },
+/* harmony export */ "SECONDS_PER_DAY": function() { return /* binding */ SECONDS_PER_DAY; },
+/* harmony export */ "getSecondsAsHHMMSS": function() { return /* binding */ getSecondsAsHHMMSS; },
+/* harmony export */ "getSecondsAsISODuration": function() { return /* binding */ getSecondsAsISODuration; },
+/* harmony export */ "getTimeAsSeconds": function() { return /* binding */ getTimeAsSeconds; },
+/* harmony export */ "getDurationAsSeconds": function() { return /* binding */ getDurationAsSeconds; },
+/* harmony export */ "addTwoDurations": function() { return /* binding */ addTwoDurations; },
+/* harmony export */ "addHHMMSSTimeStrings": function() { return /* binding */ addHHMMSSTimeStrings; },
+/* harmony export */ "flatten": function() { return /* binding */ flatten; },
+/* harmony export */ "unflatten": function() { return /* binding */ unflatten; },
+/* harmony export */ "countDecimals": function() { return /* binding */ countDecimals; }
+/* harmony export */ });
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -6674,13 +6677,9 @@ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Sy
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
var SECONDS_PER_SECOND = 1.0;
-exports.SECONDS_PER_SECOND = SECONDS_PER_SECOND;
var SECONDS_PER_MINUTE = 60;
-exports.SECONDS_PER_MINUTE = SECONDS_PER_MINUTE;
var SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE;
-exports.SECONDS_PER_HOUR = SECONDS_PER_HOUR;
var SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;
-exports.SECONDS_PER_DAY = SECONDS_PER_DAY;
var designations = [['D', SECONDS_PER_DAY], ['H', SECONDS_PER_HOUR], ['M', SECONDS_PER_MINUTE], ['S', SECONDS_PER_SECOND]];
/**
* Converts a Number to a String of HH:MM:SS
@@ -6722,7 +6721,6 @@ function getSecondsAsHHMMSS(totalSeconds) {
* @return {String}
*/
-
function getSecondsAsISODuration(seconds) {
// SCORM spec does not deal with negative durations, give zero back
if (!seconds || seconds <= 0) {
@@ -6767,7 +6765,6 @@ function getSecondsAsISODuration(seconds) {
* @return {number}
*/
-
function getTimeAsSeconds(timeString, timeRegex) {
if (!timeString || typeof timeString !== 'string' || !timeString.match(timeRegex)) {
return 0;
@@ -6787,7 +6784,6 @@ function getTimeAsSeconds(timeString, timeRegex) {
* @return {number}
*/
-
function getDurationAsSeconds(duration, durationRegex) {
if (!duration || !duration.match(durationRegex)) {
return 0;
@@ -6819,7 +6815,6 @@ function getDurationAsSeconds(duration, durationRegex) {
* @return {string}
*/
-
function addTwoDurations(first, second, durationRegex) {
return getSecondsAsISODuration(getDurationAsSeconds(first, durationRegex) + getDurationAsSeconds(second, durationRegex));
}
@@ -6832,7 +6827,6 @@ function addTwoDurations(first, second, durationRegex) {
* @return {string}
*/
-
function addHHMMSSTimeStrings(first, second, timeRegex) {
return getSecondsAsHHMMSS(getTimeAsSeconds(first, timeRegex) + getTimeAsSeconds(second, timeRegex));
}
@@ -6842,7 +6836,6 @@ function addHHMMSSTimeStrings(first, second, timeRegex) {
* @return {object}
*/
-
function flatten(data) {
var result = {};
/**
@@ -6882,7 +6875,6 @@ function flatten(data) {
* @return {object}
*/
-
function unflatten(data) {
'use strict';
@@ -6914,12 +6906,106 @@ function unflatten(data) {
* @return {number}
*/
-
function countDecimals(num) {
if (Math.floor(num) === num || String(num).indexOf('.') < 0) return 0;
var parts = num.toString().split('.')[1];
return parts.length || 0;
}
-},{}]},{},[12])
-//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoLmRlYm91bmNlL2luZGV4LmpzIiwic3JjL0Jhc2VBUEkuanMiLCJzcmMvU2Nvcm0yMDA0QVBJLmpzIiwic3JjL2NtaS9jb21tb24uanMiLCJzcmMvY21pL3Njb3JtMjAwNF9jbWkuanMiLCJzcmMvY29uc3RhbnRzL2FwaV9jb25zdGFudHMuanMiLCJzcmMvY29uc3RhbnRzL2Vycm9yX2NvZGVzLmpzIiwic3JjL2NvbnN0YW50cy9sYW5ndWFnZV9jb25zdGFudHMuanMiLCJzcmMvY29uc3RhbnRzL3JlZ2V4LmpzIiwic3JjL2NvbnN0YW50cy9yZXNwb25zZV9jb25zdGFudHMuanMiLCJzcmMvZXhjZXB0aW9ucy5qcyIsInNyYy9leHBvcnRzL3Njb3JtMjAwNC5qcyIsInNyYy91dGlsaXRpZXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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ckRXO0FBeURsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsd0JBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBekRXO0FBNkRsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUscUJBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBN0RXO0FBaUVsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUscUJBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBakVXO0FBcUVsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsd0JBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBckVXO0FBeUVsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsOEJBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBekVXO0FBNkVsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsa0NBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBN0VXO0FBaUZsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsMENBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBakZXO0FBcUZsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsaUNBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBckZXO0FBeUZsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsa0NBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBekZXO0FBNkZsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsa0NBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBN0ZXO0FBaUdsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsdUNBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWLEtBakdXO0FBcUdsQixXQUFPO0FBQ0wsTUFBQSxZQUFZLEVBQUUsdUNBRFQ7QUFFTCxNQUFBLGFBQWEsRUFBRTtBQUZWO0FBckdXO0FBWEosQ0FBbEI7QUF1SEEsSUFBTSxZQUFZLEdBQUc7QUFDbkIsRUFBQSxNQUFNLEVBQUUsTUFEVztBQUVuQixFQUFB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Q0Q7O0FBQ0QsTUFBQSxHQUFHLENBQUMsSUFBRCxDQUFILEdBQVksSUFBSSxDQUFDLENBQUQsQ0FBaEI7QUFDRDtBQUNGOztBQUNELFNBQU8sTUFBTSxDQUFDLEVBQUQsQ0FBTixJQUFjLE1BQXJCO0FBQ0Q7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxTQUFTLGFBQVQsQ0FBdUIsR0FBdkIsRUFBb0M7QUFDekMsTUFBSSxJQUFJLENBQUMsS0FBTCxDQUFXLEdBQVgsTUFBb0IsR0FBcEIsSUFBMkIsTUFBTSxDQUFDLEdBQUQsQ0FBTixDQUFZLE9BQVosQ0FBb0IsR0FBcEIsSUFBMkIsQ0FBMUQsRUFBNkQsT0FBTyxDQUFQO0FBQzdELE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxRQUFKLEdBQWUsS0FBZixDQUFxQixHQUFyQixFQUEwQixDQUExQixDQUFkO0FBQ0EsU0FBTyxLQUFLLENBQUMsTUFBTixJQUFnQixDQUF2QjtBQUNEIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiLyoqXG4gKiBsb2Rhc2ggKEN1c3RvbSBCdWlsZCkgPGh0dHBzOi8vbG9kYXNoLmNvbS8+XG4gKiBCdWlsZDogYGxvZGFzaCBtb2R1bGFyaXplIGV4cG9ydHM9XCJucG1cIiAtbyAuL2BcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIDxodHRwczovL2pxdWVyeS5vcmcvPlxuICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCBKZXJlbXkgQXNoa2VuYXMsIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICovXG5cbi8qKiBVc2VkIGFzIHRoZSBgVHlwZUVycm9yYCBtZXNzYWdlIGZvciBcIkZ1bmN0aW9uc1wiIG1ldGhvZHMuICovXG52YXIgRlVOQ19FUlJPUl9URVhUID0gJ0V4cGVjdGVkIGEgZnVuY3Rpb24nO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBOQU4gPSAwIC8gMDtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN5bWJvbFRhZyA9ICdbb2JqZWN0IFN5bWJvbF0nO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqL1xudmFyIHJlVHJpbSA9IC9eXFxzK3xcXHMrJC9nO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmFkIHNpZ25lZCBoZXhhZGVjaW1hbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCYWRIZXggPSAvXlstK10weFswLTlhLWZdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJpbmFyeSBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNCaW5hcnkgPSAvXjBiWzAxXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqL1xudmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7XG5cbi8qKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB3aXRob3V0IGEgZGVwZW5kZW5jeSBvbiBgcm9vdGAuICovXG52YXIgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVNYXggPSBNYXRoLm1heCxcbiAgICBuYXRpdmVNaW4gPSBNYXRoLm1pbjtcblxuLyoqXG4gKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2VcbiAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMi40LjBcbiAqIEBjYXRlZ29yeSBEYXRlXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHtcbiAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTtcbiAqIH0sIF8ubm93KCkpO1xuICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi5cbiAqL1xudmFyIG5vdyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gcm9vdC5EYXRlLm5vdygpO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVib3VuY2VkIGZ1bmN0aW9uIHRoYXQgZGVsYXlzIGludm9raW5nIGBmdW5jYCB1bnRpbCBhZnRlciBgd2FpdGBcbiAqIG1pbGxpc2Vjb25kcyBoYXZlIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uIHdhc1xuICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbFxuICogZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8gaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uXG4gKiBQcm92aWRlIGBvcHRpb25zYCB0byBpbmRpY2F0ZSB3aGV0aGVyIGBmdW5jYCBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGVcbiAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWRcbiAqIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnRcbiAqIGNhbGxzIHRvIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgXG4gKiBpbnZvY2F0aW9uLlxuICpcbiAqICoqTm90ZToqKiBJZiBgbGVhZGluZ2AgYW5kIGB0cmFpbGluZ2Agb3B0aW9ucyBhcmUgYHRydWVgLCBgZnVuY2AgaXNcbiAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uXG4gKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuXG4gKlxuICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkXG4gKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuXG4gKlxuICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pXG4gKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLmRlYm91bmNlYCBhbmQgYF8udGhyb3R0bGVgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBGdW5jdGlvblxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVib3VuY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gW3dhaXQ9MF0gVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz1mYWxzZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF1cbiAqICBUaGUgbWF4aW11bSB0aW1lIGBmdW5jYCBpcyBhbGxvd2VkIHRvIGJlIGRlbGF5ZWQgYmVmb3JlIGl0J3MgaW52b2tlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMudHJhaWxpbmc9dHJ1ZV1cbiAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZGVib3VuY2VkIGZ1bmN0aW9uLlxuICogQGV4YW1wbGVcbiAqXG4gKiAvLyBBdm9pZCBjb3N0bHkgY2FsY3VsYXRpb25zIHdoaWxlIHRoZSB3aW5kb3cgc2l6ZSBpcyBpbiBmbHV4LlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3Jlc2l6ZScsIF8uZGVib3VuY2UoY2FsY3VsYXRlTGF5b3V0LCAxNTApKTtcbiAqXG4gKiAvLyBJbnZva2UgYHNlbmRNYWlsYCB3aGVuIGNsaWNrZWQsIGRlYm91bmNpbmcgc3Vic2VxdWVudCBjYWxscy5cbiAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmRlYm91bmNlKHNlbmRNYWlsLCAzMDAsIHtcbiAqICAgJ2xlYWRpbmcnOiB0cnVlLFxuICogICAndHJhaWxpbmcnOiBmYWxzZVxuICogfSkpO1xuICpcbiAqIC8vIEVuc3VyZSBgYmF0Y2hMb2dgIGlzIGludm9rZWQgb25jZSBhZnRlciAxIHNlY29uZCBvZiBkZWJvdW5jZWQgY2FsbHMuXG4gKiB2YXIgZGVib3VuY2VkID0gXy5kZWJvdW5jZShiYXRjaExvZywgMjUwLCB7ICdtYXhXYWl0JzogMTAwMCB9KTtcbiAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTtcbiAqIGpRdWVyeShzb3VyY2UpLm9uKCdtZXNzYWdlJywgZGVib3VuY2VkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgZGVib3VuY2VkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxhc3RBcmdzLFxuICAgICAgbGFzdFRoaXMsXG4gICAgICBtYXhXYWl0LFxuICAgICAgcmVzdWx0LFxuICAgICAgdGltZXJJZCxcbiAgICAgIGxhc3RDYWxsVGltZSxcbiAgICAgIGxhc3RJbnZva2VUaW1lID0gMCxcbiAgICAgIGxlYWRpbmcgPSBmYWxzZSxcbiAgICAgIG1heGluZyA9IGZhbHNlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIHdhaXQgPSB0b051bWJlcih3YWl0KSB8fCAwO1xuICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHtcbiAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7XG4gICAgbWF4aW5nID0gJ21heFdhaXQnIGluIG9wdGlvbnM7XG4gICAgbWF4V2FpdCA9IG1heGluZyA/IG5hdGl2ZU1heCh0b051bWJlcihvcHRpb25zLm1heFdhaXQpIHx8IDAsIHdhaXQpIDogbWF4V2FpdDtcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKSB7XG4gICAgdmFyIGFyZ3MgPSBsYXN0QXJncyxcbiAgICAgICAgdGhpc0FyZyA9IGxhc3RUaGlzO1xuXG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzQXJnLCBhcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gbGVhZGluZ0VkZ2UodGltZSkge1xuICAgIC8vIFJlc2V0IGFueSBgbWF4V2FpdGAgdGltZXIuXG4gICAgbGFzdEludm9rZVRpbWUgPSB0aW1lO1xuICAgIC8vIFN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIHRyYWlsaW5nIGVkZ2UuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAvLyBJbnZva2UgdGhlIGxlYWRpbmcgZWRnZS5cbiAgICByZXR1cm4gbGVhZGluZyA/IGludm9rZUZ1bmModGltZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiByZW1haW5pbmdXYWl0KHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLFxuICAgICAgICByZXN1bHQgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7XG5cbiAgICByZXR1cm4gbWF4aW5nID8gbmF0aXZlTWluKHJlc3VsdCwgbWF4V2FpdCAtIHRpbWVTaW5jZUxhc3RJbnZva2UpIDogcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpIHtcbiAgICB2YXIgdGltZVNpbmNlTGFzdENhbGwgPSB0aW1lIC0gbGFzdENhbGxUaW1lLFxuICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lO1xuXG4gICAgLy8gRWl0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwsIGFjdGl2aXR5IGhhcyBzdG9wcGVkIGFuZCB3ZSdyZSBhdCB0aGVcbiAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZ1xuICAgIC8vIGl0IGFzIHRoZSB0cmFpbGluZyBlZGdlLCBvciB3ZSd2ZSBoaXQgdGhlIGBtYXhXYWl0YCBsaW1pdC5cbiAgICByZXR1cm4gKGxhc3RDYWxsVGltZSA9PT0gdW5kZWZpbmVkIHx8ICh0aW1lU2luY2VMYXN0Q2FsbCA+PSB3YWl0KSB8fFxuICAgICAgKHRpbWVTaW5jZUxhc3RDYWxsIDwgMCkgfHwgKG1heGluZyAmJiB0aW1lU2luY2VMYXN0SW52b2tlID49IG1heFdhaXQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpO1xuICAgIGlmIChzaG91bGRJbnZva2UodGltZSkpIHtcbiAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7XG4gICAgfVxuICAgIC8vIFJlc3RhcnQgdGhlIHRpbWVyLlxuICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSkge1xuICAgIHRpbWVySWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBPbmx5IGludm9rZSBpZiB3ZSBoYXZlIGBsYXN0QXJnc2Agd2hpY2ggbWVhbnMgYGZ1bmNgIGhhcyBiZWVuXG4gICAgLy8gZGVib3VuY2VkIGF0IGxlYXN0IG9uY2UuXG4gICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7XG4gICAgICByZXR1cm4gaW52b2tlRnVuYyh0aW1lKTtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsKCkge1xuICAgIGlmICh0aW1lcklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICB9XG4gICAgbGFzdEludm9rZVRpbWUgPSAwO1xuICAgIGxhc3RBcmdzID0gbGFzdENhbGxUaW1lID0gbGFzdFRoaXMgPSB0aW1lcklkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IHRyYWlsaW5nRWRnZShub3coKSk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7XG4gICAgdmFyIHRpbWUgPSBub3coKSxcbiAgICAgICAgaXNJbnZva2luZyA9IHNob3VsZEludm9rZSh0aW1lKTtcblxuICAgIGxhc3RBcmdzID0gYXJndW1lbnRzO1xuICAgIGxhc3RUaGlzID0gdGhpcztcbiAgICBsYXN0Q2FsbFRpbWUgPSB0aW1lO1xuXG4gICAgaWYgKGlzSW52b2tpbmcpIHtcbiAgICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgICBpZiAobWF4aW5nKSB7XG4gICAgICAgIC8vIEhhbmRsZSBpbnZvY2F0aW9ucyBpbiBhIHRpZ2h0IGxvb3AuXG4gICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgICAgIHJldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aW1lcklkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZGVib3VuY2VkLmNhbmNlbCA9IGNhbmNlbDtcbiAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7XG4gIHJldHVybiBkZWJvdW5jZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgdGhlXG4gKiBbbGFuZ3VhZ2UgdHlwZV0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLWVjbWFzY3JpcHQtbGFuZ3VhZ2UtdHlwZXMpXG4gKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3Qoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KF8ubm9vcCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlKSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlO1xuICByZXR1cm4gISF2YWx1ZSAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocmVUcmltLCAnJyk7XG4gIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7XG4gIHJldHVybiAoaXNCaW5hcnkgfHwgcmVJc09jdGFsLnRlc3QodmFsdWUpKVxuICAgID8gZnJlZVBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCBpc0JpbmFyeSA/IDIgOiA4KVxuICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRlYm91bmNlO1xuIiwiLy8gQGZsb3dcbmltcG9ydCB7Q01JQXJyYXl9IGZyb20gJy4vY21pL2NvbW1vbic7XG5pbXBvcnQge1ZhbGlkYXRpb25FcnJvcn0gZnJvbSAnLi9leGNlcHRpb25zJztcbmltcG9ydCBFcnJvckNvZGVzIGZyb20gJy4vY29uc3RhbnRzL2Vycm9yX2NvZGVzJztcbmltcG9ydCBBUElDb25zdGFudHMgZnJvbSAnLi9jb25zdGFudHMvYXBpX2NvbnN0YW50cyc7XG5pbXBvcnQge3VuZmxhdHRlbn0gZnJvbSAnLi91dGlsaXRpZXMnO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJ2xvZGFzaC5kZWJvdW5jZSc7XG5cbmNvbnN0IGdsb2JhbF9jb25zdGFudHMgPSBBUElDb25zdGFudHMuZ2xvYmFsO1xuY29uc3Qgc2Nvcm0xMl9lcnJvcl9jb2RlcyA9IEVycm9yQ29kZXMuc2Nvcm0xMjtcblxuLyoqXG4gKiBCYXNlIEFQSSBjbGFzcyBmb3IgQUlDQywgU0NPUk0gMS4yLCBhbmQgU0NPUk0gMjAwNC4gU2hvdWxkIGJlIGNvbnNpZGVyZWRcbiAqIGFic3RyYWN0LCBhbmQgbmV2ZXIgaW5pdGlhbGl6ZWQgb24gaXQncyBvd24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VBUEkge1xuICAjdGltZW91dDtcbiAgI2Vycm9yX2NvZGVzO1xuICAjc2V0dGluZ3MgPSB7XG4gICAgYXV0b2NvbW1pdDogZmFsc2UsXG4gICAgYXV0b2NvbW1pdFNlY29uZHM6IDEwLFxuICAgIGFzeW5jQ29tbWl0OiBmYWxzZSxcbiAgICBzZW5kQmVhY29uQ29tbWl0OiBmYWxzZSxcbiAgICBsbXNDb21taXRVcmw6IGZhbHNlLFxuICAgIGRhdGFDb21taXRGb3JtYXQ6ICdqc29uJywgLy8gdmFsaWQgZm9ybWF0cyBhcmUgJ2pzb24nIG9yICdmbGF0dGVuZWQnLCAncGFyYW1zJ1xuICAgIGNvbW1pdFJlcXVlc3REYXRhVHlwZTogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsXG4gICAgYXV0b1Byb2dyZXNzOiBmYWxzZSxcbiAgICBsb2dMZXZlbDogZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfRVJST1IsXG4gICAgc2VsZlJlcG9ydFNlc3Npb25UaW1lOiBmYWxzZSxcbiAgICBhbHdheXNTZW5kVG90YWxUaW1lOiBmYWxzZSxcbiAgICBzdHJpY3RfZXJyb3JzOiB0cnVlLFxuICAgIHhockhlYWRlcnM6IHt9LFxuICAgIHhocldpdGhDcmVkZW50aWFsczogZmFsc2UsXG4gICAgcmVzcG9uc2VIYW5kbGVyOiBmdW5jdGlvbih4aHIpIHtcbiAgICAgIGxldCByZXN1bHQ7XG4gICAgICBpZiAodHlwZW9mIHhociAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCAhe30uaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsICdyZXN1bHQnKSkge1xuICAgICAgICAgIHJlc3VsdCA9IHt9O1xuICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5yZXN1bHQgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX1RSVUU7XG4gICAgICAgICAgICByZXN1bHQuZXJyb3JDb2RlID0gMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnJlc3VsdCA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0U7XG4gICAgICAgICAgICByZXN1bHQuZXJyb3JDb2RlID0gMTAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICAgIG9uTG9nTWVzc2FnZTogZnVuY3Rpb24obWVzc2FnZUxldmVsLCBsb2dNZXNzYWdlKSB7XG4gICAgICBzd2l0Y2ggKG1lc3NhZ2VMZXZlbCkge1xuICAgICAgICBjYXNlIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0VSUk9SOlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IobG9nTWVzc2FnZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfV0FSTklORzpcbiAgICAgICAgICBjb25zb2xlLndhcm4obG9nTWVzc2FnZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTzpcbiAgICAgICAgICBjb25zb2xlLmluZm8obG9nTWVzc2FnZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfREVCVUc6XG4gICAgICAgICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcobG9nTWVzc2FnZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuICBjbWk7XG4gIHN0YXJ0aW5nRGF0YToge307XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBCYXNlIEFQSSBjbGFzcy4gU2V0cyBzb21lIHNoYXJlZCBBUEkgZmllbGRzLCBhcyB3ZWxsIGFzXG4gICAqIHNldHMgdXAgb3B0aW9ucyBmb3IgdGhlIEFQSS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGVycm9yX2NvZGVzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5nc1xuICAgKi9cbiAgY29uc3RydWN0b3IoZXJyb3JfY29kZXMsIHNldHRpbmdzKSB7XG4gICAgaWYgKG5ldy50YXJnZXQgPT09IEJhc2VBUEkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb25zdHJ1Y3QgQmFzZUFQSSBpbnN0YW5jZXMgZGlyZWN0bHknKTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50U3RhdGUgPSBnbG9iYWxfY29uc3RhbnRzLlNUQVRFX05PVF9JTklUSUFMSVpFRDtcbiAgICB0aGlzLmxhc3RFcnJvckNvZGUgPSAwO1xuICAgIHRoaXMubGlzdGVuZXJBcnJheSA9IFtdO1xuXG4gICAgdGhpcy4jdGltZW91dCA9IG51bGw7XG4gICAgdGhpcy4jZXJyb3JfY29kZXMgPSBlcnJvcl9jb2RlcztcblxuICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICB0aGlzLmFwaUxvZ0xldmVsID0gdGhpcy5zZXR0aW5ncy5sb2dMZXZlbDtcbiAgICB0aGlzLnNlbGZSZXBvcnRTZXNzaW9uVGltZSA9IHRoaXMuc2V0dGluZ3Muc2VsZlJlcG9ydFNlc3Npb25UaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIEFQSVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2tOYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbml0aWFsaXplTWVzc2FnZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGVybWluYXRpb25NZXNzYWdlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGluaXRpYWxpemUoXG4gICAgICBjYWxsYmFja05hbWU6IFN0cmluZyxcbiAgICAgIGluaXRpYWxpemVNZXNzYWdlPzogU3RyaW5nLFxuICAgICAgdGVybWluYXRpb25NZXNzYWdlPzogU3RyaW5nKSB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcblxuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQoKSkge1xuICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IodGhpcy4jZXJyb3JfY29kZXMuSU5JVElBTElaRUQsIGluaXRpYWxpemVNZXNzYWdlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNUZXJtaW5hdGVkKCkpIHtcbiAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHRoaXMuI2Vycm9yX2NvZGVzLlRFUk1JTkFURUQsIHRlcm1pbmF0aW9uTWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnNlbGZSZXBvcnRTZXNzaW9uVGltZSkge1xuICAgICAgICB0aGlzLmNtaS5zZXRTdGFydFRpbWUoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSBnbG9iYWxfY29uc3RhbnRzLlNUQVRFX0lOSVRJQUxJWkVEO1xuICAgICAgdGhpcy5sYXN0RXJyb3JDb2RlID0gMDtcbiAgICAgIHJldHVyblZhbHVlID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFO1xuICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKGNhbGxiYWNrTmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCBudWxsLCAncmV0dXJuZWQ6ICcgKyByZXR1cm5WYWx1ZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG4gICAgdGhpcy5jbGVhclNDT1JNRXJyb3IocmV0dXJuVmFsdWUpO1xuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2Vycm9yX2NvZGVzXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIGdldCBlcnJvcl9jb2RlcygpIHtcbiAgICByZXR1cm4gdGhpcy4jZXJyb3JfY29kZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc2V0dGluZ3NcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgZ2V0IHNldHRpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLiNzZXR0aW5ncztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzZXR0aW5nc1xuICAgKiBAcGFyYW0ge29iamVjdH0gc2V0dGluZ3NcbiAgICovXG4gIHNldCBzZXR0aW5ncyhzZXR0aW5nczogT2JqZWN0KSB7XG4gICAgdGhpcy4jc2V0dGluZ3MgPSB7Li4udGhpcy4jc2V0dGluZ3MsIC4uLnNldHRpbmdzfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXJtaW5hdGVzIHRoZSBjdXJyZW50IHJ1biBvZiB0aGUgQVBJXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsYmFja05hbWVcbiAgICogQHBhcmFtIHtib29sZWFufSBjaGVja1Rlcm1pbmF0ZWRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgdGVybWluYXRlKFxuICAgICAgY2FsbGJhY2tOYW1lOiBTdHJpbmcsXG4gICAgICBjaGVja1Rlcm1pbmF0ZWQ6IGJvb2xlYW4pIHtcbiAgICBsZXQgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuXG4gICAgaWYgKHRoaXMuY2hlY2tTdGF0ZShjaGVja1Rlcm1pbmF0ZWQsXG4gICAgICAgIHRoaXMuI2Vycm9yX2NvZGVzLlRFUk1JTkFUSU9OX0JFRk9SRV9JTklULFxuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5NVUxUSVBMRV9URVJNSU5BVElPTikpIHtcbiAgICAgIHRoaXMuY3VycmVudFN0YXRlID0gZ2xvYmFsX2NvbnN0YW50cy5TVEFURV9URVJNSU5BVEVEO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnN0b3JlRGF0YSh0cnVlKTtcbiAgICAgIGlmICghdGhpcy5zZXR0aW5ncy5zZW5kQmVhY29uQ29tbWl0ICYmICF0aGlzLnNldHRpbmdzLmFzeW5jQ29tbWl0ICYmXG4gICAgICAgICAgdHlwZW9mIHJlc3VsdC5lcnJvckNvZGUgIT09ICd1bmRlZmluZWQnICYmIHJlc3VsdC5lcnJvckNvZGUgPiAwKSB7XG4gICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHJlc3VsdC5lcnJvckNvZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuVmFsdWUgPSAodHlwZW9mIHJlc3VsdCAhPT0gJ3VuZGVmaW5lZCcgJiYgcmVzdWx0LnJlc3VsdCkgP1xuICAgICAgICAgIHJlc3VsdC5yZXN1bHQgOiBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuXG4gICAgICBpZiAoY2hlY2tUZXJtaW5hdGVkKSB0aGlzLmxhc3RFcnJvckNvZGUgPSAwO1xuXG4gICAgICByZXR1cm5WYWx1ZSA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fVFJVRTtcbiAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycyhjYWxsYmFja05hbWUpO1xuICAgIH1cblxuICAgIHRoaXMuYXBpTG9nKGNhbGxiYWNrTmFtZSwgbnVsbCwgJ3JldHVybmVkOiAnICsgcmV0dXJuVmFsdWUsXG4gICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0lORk8pO1xuICAgIHRoaXMuY2xlYXJTQ09STUVycm9yKHJldHVyblZhbHVlKTtcblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBDTUlFbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2tOYW1lXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tUZXJtaW5hdGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldFZhbHVlKFxuICAgICAgY2FsbGJhY2tOYW1lOiBTdHJpbmcsXG4gICAgICBjaGVja1Rlcm1pbmF0ZWQ6IGJvb2xlYW4sXG4gICAgICBDTUlFbGVtZW50OiBTdHJpbmcpIHtcbiAgICBsZXQgcmV0dXJuVmFsdWU7XG5cbiAgICBpZiAodGhpcy5jaGVja1N0YXRlKGNoZWNrVGVybWluYXRlZCxcbiAgICAgICAgdGhpcy4jZXJyb3JfY29kZXMuUkVUUklFVkVfQkVGT1JFX0lOSVQsXG4gICAgICAgIHRoaXMuI2Vycm9yX2NvZGVzLlJFVFJJRVZFX0FGVEVSX1RFUk0pKSB7XG4gICAgICBpZiAoY2hlY2tUZXJtaW5hdGVkKSB0aGlzLmxhc3RFcnJvckNvZGUgPSAwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuVmFsdWUgPSB0aGlzLmdldENNSVZhbHVlKENNSUVsZW1lbnQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFZhbGlkYXRpb25FcnJvcikge1xuICAgICAgICAgIHRoaXMubGFzdEVycm9yQ29kZSA9IGUuZXJyb3JDb2RlO1xuICAgICAgICAgIHJldHVyblZhbHVlID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZS5tZXNzYWdlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUubWVzc2FnZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHRoaXMuI2Vycm9yX2NvZGVzLkdFTkVSQUwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoY2FsbGJhY2tOYW1lLCBDTUlFbGVtZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLmFwaUxvZyhjYWxsYmFja05hbWUsIENNSUVsZW1lbnQsICc6IHJldHVybmVkOiAnICsgcmV0dXJuVmFsdWUsXG4gICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0lORk8pO1xuICAgIHRoaXMuY2xlYXJTQ09STUVycm9yKHJldHVyblZhbHVlKTtcblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgQ01JRWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrTmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29tbWl0Q2FsbGJhY2tcbiAgICogQHBhcmFtIHtib29sZWFufSBjaGVja1Rlcm1pbmF0ZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBzZXRWYWx1ZShcbiAgICAgIGNhbGxiYWNrTmFtZTogU3RyaW5nLFxuICAgICAgY29tbWl0Q2FsbGJhY2s6IFN0cmluZyxcbiAgICAgIGNoZWNrVGVybWluYXRlZDogYm9vbGVhbixcbiAgICAgIENNSUVsZW1lbnQsXG4gICAgICB2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSk7XG4gICAgfVxuICAgIGxldCByZXR1cm5WYWx1ZSA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0U7XG5cbiAgICBpZiAodGhpcy5jaGVja1N0YXRlKGNoZWNrVGVybWluYXRlZCwgdGhpcy4jZXJyb3JfY29kZXMuU1RPUkVfQkVGT1JFX0lOSVQsXG4gICAgICAgIHRoaXMuI2Vycm9yX2NvZGVzLlNUT1JFX0FGVEVSX1RFUk0pKSB7XG4gICAgICBpZiAoY2hlY2tUZXJtaW5hdGVkKSB0aGlzLmxhc3RFcnJvckNvZGUgPSAwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuVmFsdWUgPSB0aGlzLnNldENNSVZhbHVlKENNSUVsZW1lbnQsIHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpIHtcbiAgICAgICAgICB0aGlzLmxhc3RFcnJvckNvZGUgPSBlLmVycm9yQ29kZTtcbiAgICAgICAgICByZXR1cm5WYWx1ZSA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGUubWVzc2FnZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlLm1lc3NhZ2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcih0aGlzLiNlcnJvcl9jb2Rlcy5HRU5FUkFMKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKGNhbGxiYWNrTmFtZSwgQ01JRWxlbWVudCwgdmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChyZXR1cm5WYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm5WYWx1ZSA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0U7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgZGlkbid0IGhhdmUgYW55IGVycm9ycyB3aGlsZSBzZXR0aW5nIHRoZSBkYXRhLCBnbyBhaGVhZCBhbmRcbiAgICAvLyBzY2hlZHVsZSBhIGNvbW1pdCwgaWYgYXV0b2NvbW1pdCBpcyB0dXJuZWQgb25cbiAgICBpZiAoU3RyaW5nKHRoaXMubGFzdEVycm9yQ29kZSkgPT09ICcwJykge1xuICAgICAgaWYgKHRoaXMuc2V0dGluZ3MuYXV0b2NvbW1pdCAmJiAhdGhpcy4jdGltZW91dCkge1xuICAgICAgICB0aGlzLnNjaGVkdWxlQ29tbWl0KHRoaXMuc2V0dGluZ3MuYXV0b2NvbW1pdFNlY29uZHMgKiAxMDAwLCBjb21taXRDYWxsYmFjayk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCBDTUlFbGVtZW50LFxuICAgICAgICAnOiAnICsgdmFsdWUgKyAnOiByZXN1bHQ6ICcgKyByZXR1cm5WYWx1ZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG4gICAgdGhpcy5jbGVhclNDT1JNRXJyb3IocmV0dXJuVmFsdWUpO1xuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE9yZGVycyBMTVMgdG8gc3RvcmUgYWxsIGNvbnRlbnQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2tOYW1lXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gY2hlY2tUZXJtaW5hdGVkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGNvbW1pdChcbiAgICAgIGNhbGxiYWNrTmFtZTogU3RyaW5nLFxuICAgICAgY2hlY2tUZXJtaW5hdGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5jbGVhclNjaGVkdWxlZENvbW1pdCgpO1xuXG4gICAgbGV0IHJldHVyblZhbHVlID0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9GQUxTRTtcblxuICAgIGlmICh0aGlzLmNoZWNrU3RhdGUoY2hlY2tUZXJtaW5hdGVkLCB0aGlzLiNlcnJvcl9jb2Rlcy5DT01NSVRfQkVGT1JFX0lOSVQsXG4gICAgICAgIHRoaXMuI2Vycm9yX2NvZGVzLkNPTU1JVF9BRlRFUl9URVJNKSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zdG9yZURhdGEoZmFsc2UpO1xuICAgICAgaWYgKCF0aGlzLnNldHRpbmdzLnNlbmRCZWFjb25Db21taXQgJiYgIXRoaXMuc2V0dGluZ3MuYXN5bmNDb21taXQgJiZcbiAgICAgICAgICByZXN1bHQuZXJyb3JDb2RlICYmIHJlc3VsdC5lcnJvckNvZGUgPiAwKSB7XG4gICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHJlc3VsdC5lcnJvckNvZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuVmFsdWUgPSAodHlwZW9mIHJlc3VsdCAhPT0gJ3VuZGVmaW5lZCcgJiYgcmVzdWx0LnJlc3VsdCkgP1xuICAgICAgICAgIHJlc3VsdC5yZXN1bHQgOiBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFO1xuXG4gICAgICB0aGlzLmFwaUxvZyhjYWxsYmFja05hbWUsICdIdHRwUmVxdWVzdCcsICcgUmVzdWx0OiAnICsgcmV0dXJuVmFsdWUsXG4gICAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfREVCVUcpO1xuXG4gICAgICBpZiAoY2hlY2tUZXJtaW5hdGVkKSB0aGlzLmxhc3RFcnJvckNvZGUgPSAwO1xuXG4gICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoY2FsbGJhY2tOYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLmFwaUxvZyhjYWxsYmFja05hbWUsIG51bGwsICdyZXR1cm5lZDogJyArIHJldHVyblZhbHVlLFxuICAgICAgICBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9JTkZPKTtcbiAgICB0aGlzLmNsZWFyU0NPUk1FcnJvcihyZXR1cm5WYWx1ZSk7XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBsYXN0IGVycm9yIGNvZGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrTmFtZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXRMYXN0RXJyb3IoY2FsbGJhY2tOYW1lOiBTdHJpbmcpIHtcbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IFN0cmluZyh0aGlzLmxhc3RFcnJvckNvZGUpO1xuXG4gICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKGNhbGxiYWNrTmFtZSk7XG5cbiAgICB0aGlzLmFwaUxvZyhjYWxsYmFja05hbWUsIG51bGwsICdyZXR1cm5lZDogJyArIHJldHVyblZhbHVlLFxuICAgICAgICBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9JTkZPKTtcblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlcnJvck51bWJlciBlcnJvciBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2tOYW1lXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpfSBDTUlFcnJvckNvZGVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0RXJyb3JTdHJpbmcoY2FsbGJhY2tOYW1lOiBTdHJpbmcsIENNSUVycm9yQ29kZSkge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9ICcnO1xuXG4gICAgaWYgKENNSUVycm9yQ29kZSAhPT0gbnVsbCAmJiBDTUlFcnJvckNvZGUgIT09ICcnKSB7XG4gICAgICByZXR1cm5WYWx1ZSA9IHRoaXMuZ2V0TG1zRXJyb3JNZXNzYWdlRGV0YWlscyhDTUlFcnJvckNvZGUpO1xuICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKGNhbGxiYWNrTmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5hcGlMb2coY2FsbGJhY2tOYW1lLCBudWxsLCAncmV0dXJuZWQ6ICcgKyByZXR1cm5WYWx1ZSxcbiAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfSU5GTyk7XG5cbiAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvbXByZWhlbnNpdmUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yTnVtYmVyIGVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGJhY2tOYW1lXG4gICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpfSBDTUlFcnJvckNvZGVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0RGlhZ25vc3RpYyhjYWxsYmFja05hbWU6IFN0cmluZywgQ01JRXJyb3JDb2RlKSB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gJyc7XG5cbiAgICBpZiAoQ01JRXJyb3JDb2RlICE9PSBudWxsICYmIENNSUVycm9yQ29kZSAhPT0gJycpIHtcbiAgICAgIHJldHVyblZhbHVlID0gdGhpcy5nZXRMbXNFcnJvck1lc3NhZ2VEZXRhaWxzKENNSUVycm9yQ29kZSwgdHJ1ZSk7XG4gICAgICB0aGlzLnByb2Nlc3NMaXN0ZW5lcnMoY2FsbGJhY2tOYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLmFwaUxvZyhjYWxsYmFja05hbWUsIG51bGwsICdyZXR1cm5lZDogJyArIHJldHVyblZhbHVlLFxuICAgICAgICBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9JTkZPKTtcblxuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgdGhlIExNUyBzdGF0ZSBhbmQgZW5zdXJlcyBpdCBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBjaGVja1Rlcm1pbmF0ZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IGJlZm9yZUluaXRFcnJvclxuICAgKiBAcGFyYW0ge251bWJlcn0gYWZ0ZXJUZXJtRXJyb3JcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGNoZWNrU3RhdGUoXG4gICAgICBjaGVja1Rlcm1pbmF0ZWQ6IGJvb2xlYW4sXG4gICAgICBiZWZvcmVJbml0RXJyb3I6IG51bWJlcixcbiAgICAgIGFmdGVyVGVybUVycm9yPzogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuaXNOb3RJbml0aWFsaXplZCgpKSB7XG4gICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihiZWZvcmVJbml0RXJyb3IpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoY2hlY2tUZXJtaW5hdGVkICYmIHRoaXMuaXNUZXJtaW5hdGVkKCkpIHtcbiAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKGFmdGVyVGVybUVycm9yKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dnaW5nIGZvciBhbGwgU0NPUk0gYWN0aW9uc1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZnVuY3Rpb25OYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dNZXNzYWdlXG4gICAqIEBwYXJhbSB7bnVtYmVyfW1lc3NhZ2VMZXZlbFxuICAgKi9cbiAgYXBpTG9nKFxuICAgICAgZnVuY3Rpb25OYW1lOiBTdHJpbmcsXG4gICAgICBDTUlFbGVtZW50OiBTdHJpbmcsXG4gICAgICBsb2dNZXNzYWdlOiBTdHJpbmcsXG4gICAgICBtZXNzYWdlTGV2ZWw6IG51bWJlcikge1xuICAgIGxvZ01lc3NhZ2UgPSB0aGlzLmZvcm1hdE1lc3NhZ2UoZnVuY3Rpb25OYW1lLCBDTUlFbGVtZW50LCBsb2dNZXNzYWdlKTtcblxuICAgIGlmIChtZXNzYWdlTGV2ZWwgPj0gdGhpcy5hcGlMb2dMZXZlbCkge1xuICAgICAgdGhpcy5zZXR0aW5ncy5vbkxvZ01lc3NhZ2UobWVzc2FnZUxldmVsLCBsb2dNZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0cyB0aGUgU0NPUk0gbWVzc2FnZXMgZm9yIGVhc3kgcmVhZGluZ1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZnVuY3Rpb25OYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGZvcm1hdE1lc3NhZ2UoZnVuY3Rpb25OYW1lOiBTdHJpbmcsIENNSUVsZW1lbnQ6IFN0cmluZywgbWVzc2FnZTogU3RyaW5nKSB7XG4gICAgY29uc3QgYmFzZUxlbmd0aCA9IDIwO1xuICAgIGxldCBtZXNzYWdlU3RyaW5nID0gJyc7XG5cbiAgICBtZXNzYWdlU3RyaW5nICs9IGZ1bmN0aW9uTmFtZTtcblxuICAgIGxldCBmaWxsQ2hhcnMgPSBiYXNlTGVuZ3RoIC0gbWVzc2FnZVN0cmluZy5sZW5ndGg7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGxDaGFyczsgaSsrKSB7XG4gICAgICBtZXNzYWdlU3RyaW5nICs9ICcgJztcbiAgICB9XG5cbiAgICBtZXNzYWdlU3RyaW5nICs9ICc6ICc7XG5cbiAgICBpZiAoQ01JRWxlbWVudCkge1xuICAgICAgY29uc3QgQ01JRWxlbWVudEJhc2VMZW5ndGggPSA3MDtcblxuICAgICAgbWVzc2FnZVN0cmluZyArPSBDTUlFbGVtZW50O1xuXG4gICAgICBmaWxsQ2hhcnMgPSBDTUlFbGVtZW50QmFzZUxlbmd0aCAtIG1lc3NhZ2VTdHJpbmcubGVuZ3RoO1xuXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGZpbGxDaGFyczsgaisrKSB7XG4gICAgICAgIG1lc3NhZ2VTdHJpbmcgKz0gJyAnO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICBtZXNzYWdlU3RyaW5nICs9IG1lc3NhZ2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lc3NhZ2VTdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHRvIHNlZSBpZiB7c3RyfSBjb250YWlucyB7dGVzdGVyfVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIFN0cmluZyB0byBjaGVjayBhZ2FpbnN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXN0ZXIgU3RyaW5nIHRvIGNoZWNrIGZvclxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgc3RyaW5nTWF0Y2hlcyhzdHI6IFN0cmluZywgdGVzdGVyOiBTdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyICYmIHRlc3RlciAmJiBzdHIubWF0Y2godGVzdGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIHNwZWNpZmljIG9iamVjdCBoYXMgdGhlIGdpdmVuIHByb3BlcnR5XG4gICAqIEBwYXJhbSB7Kn0gcmVmT2JqZWN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jaGVja09iamVjdEhhc1Byb3BlcnR5KHJlZk9iamVjdCwgYXR0cmlidXRlOiBTdHJpbmcpIHtcbiAgICByZXR1cm4gT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwocmVmT2JqZWN0LCBhdHRyaWJ1dGUpIHx8XG4gICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YocmVmT2JqZWN0KSwgYXR0cmlidXRlKSB8fFxuICAgICAgICAoYXR0cmlidXRlIGluIHJlZk9iamVjdCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbWVzc2FnZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGVycm9yTnVtYmVyXG4gICAqIEFQSXMgdGhhdCBpbmhlcml0IEJhc2VBUEkgc2hvdWxkIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcil9IF9lcnJvck51bWJlclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IF9kZXRhaWxcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIGdldExtc0Vycm9yTWVzc2FnZURldGFpbHMoX2Vycm9yTnVtYmVyLCBfZGV0YWlsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIGdldExtc0Vycm9yTWVzc2FnZURldGFpbHMgbWV0aG9kIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWMgZWxlbWVudC5cbiAgICogQVBJcyB0aGF0IGluaGVyaXQgQmFzZUFQSSBzaG91bGQgb3ZlcnJpZGUgdGhpcyBmdW5jdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gX0NNSUVsZW1lbnRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIGdldENNSVZhbHVlKF9DTUlFbGVtZW50KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZ2V0Q01JVmFsdWUgbWV0aG9kIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWMgZWxlbWVudC5cbiAgICogQVBJcyB0aGF0IGluaGVyaXQgQmFzZUFQSSBzaG91bGQgb3ZlcnJpZGUgdGhpcyBmdW5jdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gX0NNSUVsZW1lbnRcbiAgICogQHBhcmFtIHthbnl9IF92YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgc2V0Q01JVmFsdWUoX0NNSUVsZW1lbnQsIF92YWx1ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIHNldENNSVZhbHVlIG1ldGhvZCBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaGFyZWQgQVBJIG1ldGhvZCB0byBzZXQgYSB2YWxpZCBmb3IgYSBnaXZlbiBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNjb3JtMjAwNFxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIF9jb21tb25TZXRDTUlWYWx1ZShcbiAgICAgIG1ldGhvZE5hbWU6IFN0cmluZywgc2Nvcm0yMDA0OiBib29sZWFuLCBDTUlFbGVtZW50LCB2YWx1ZSkge1xuICAgIGlmICghQ01JRWxlbWVudCB8fCBDTUlFbGVtZW50ID09PSAnJykge1xuICAgICAgcmV0dXJuIGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0U7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RydWN0dXJlID0gQ01JRWxlbWVudC5zcGxpdCgnLicpO1xuICAgIGxldCByZWZPYmplY3QgPSB0aGlzO1xuICAgIGxldCByZXR1cm5WYWx1ZSA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0U7XG4gICAgbGV0IGZvdW5kRmlyc3RJbmRleCA9IGZhbHNlO1xuXG4gICAgY29uc3QgaW52YWxpZEVycm9yTWVzc2FnZSA9IGBUaGUgZGF0YSBtb2RlbCBlbGVtZW50IHBhc3NlZCB0byAke21ldGhvZE5hbWV9ICgke0NNSUVsZW1lbnR9KSBpcyBub3QgYSB2YWxpZCBTQ09STSBkYXRhIG1vZGVsIGVsZW1lbnQuYDtcbiAgICBjb25zdCBpbnZhbGlkRXJyb3JDb2RlID0gc2Nvcm0yMDA0ID9cbiAgICAgICAgdGhpcy4jZXJyb3JfY29kZXMuVU5ERUZJTkVEX0RBVEFfTU9ERUwgOlxuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5HRU5FUkFMO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJ1Y3R1cmUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IHN0cnVjdHVyZVtpXTtcblxuICAgICAgaWYgKGkgPT09IHN0cnVjdHVyZS5sZW5ndGggLSAxKSB7XG4gICAgICAgIGlmIChzY29ybTIwMDQgJiYgKGF0dHJpYnV0ZS5zdWJzdHIoMCwgOCkgPT09ICd7dGFyZ2V0PScpICYmXG4gICAgICAgICAgICAodHlwZW9mIHJlZk9iamVjdC5faXNUYXJnZXRWYWxpZCA9PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHRoaXMuI2Vycm9yX2NvZGVzLlJFQURfT05MWV9FTEVNRU5UKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5fY2hlY2tPYmplY3RIYXNQcm9wZXJ0eShyZWZPYmplY3QsIGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihpbnZhbGlkRXJyb3JDb2RlLCBpbnZhbGlkRXJyb3JNZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKCkgJiZcbiAgICAgICAgICAgICAgdGhpcy5zdHJpbmdNYXRjaGVzKENNSUVsZW1lbnQsICdcXFxcLmNvcnJlY3RfcmVzcG9uc2VzXFxcXC5cXFxcZCsnKSkge1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZUNvcnJlY3RSZXNwb25zZShDTUlFbGVtZW50LCB2YWx1ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFzY29ybTIwMDQgfHwgdGhpcy5sYXN0RXJyb3JDb2RlID09PSAwKSB7XG4gICAgICAgICAgICByZWZPYmplY3RbYXR0cmlidXRlXSA9IHZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX1RSVUU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWZPYmplY3QgPSByZWZPYmplY3RbYXR0cmlidXRlXTtcbiAgICAgICAgaWYgKCFyZWZPYmplY3QpIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihpbnZhbGlkRXJyb3JDb2RlLCBpbnZhbGlkRXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWZPYmplY3QgaW5zdGFuY2VvZiBDTUlBcnJheSkge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoc3RydWN0dXJlW2kgKyAxXSwgMTApO1xuXG4gICAgICAgICAgLy8gU0NPIGlzIHRyeWluZyB0byBzZXQgYW4gaXRlbSBvbiBhbiBhcnJheVxuICAgICAgICAgIGlmICghaXNOYU4oaW5kZXgpKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gcmVmT2JqZWN0LmNoaWxkQXJyYXlbaW5kZXhdO1xuXG4gICAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgICByZWZPYmplY3QgPSBpdGVtO1xuICAgICAgICAgICAgICBmb3VuZEZpcnN0SW5kZXggPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3Q2hpbGQgPSB0aGlzLmdldENoaWxkRWxlbWVudChDTUlFbGVtZW50LCB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgIGZvdW5kRmlyc3RJbmRleCk7XG4gICAgICAgICAgICAgIGZvdW5kRmlyc3RJbmRleCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgaWYgKCFuZXdDaGlsZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKGludmFsaWRFcnJvckNvZGUsIGludmFsaWRFcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChyZWZPYmplY3QuaW5pdGlhbGl6ZWQpIG5ld0NoaWxkLmluaXRpYWxpemUoKTtcblxuICAgICAgICAgICAgICAgIHJlZk9iamVjdC5jaGlsZEFycmF5LnB1c2gobmV3Q2hpbGQpO1xuICAgICAgICAgICAgICAgIHJlZk9iamVjdCA9IG5ld0NoaWxkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEhhdmUgdG8gdXBkYXRlIGkgdmFsdWUgdG8gc2tpcCB0aGUgYXJyYXkgcG9zaXRpb25cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmV0dXJuVmFsdWUgPT09IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0UpIHtcbiAgICAgIHRoaXMuYXBpTG9nKG1ldGhvZE5hbWUsIG51bGwsXG4gICAgICAgICAgYFRoZXJlIHdhcyBhbiBlcnJvciBzZXR0aW5nIHRoZSB2YWx1ZSBmb3I6ICR7Q01JRWxlbWVudH0sIHZhbHVlIG9mOiAke3ZhbHVlfWAsXG4gICAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfV0FSTklORyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFic3RyYWN0IG1ldGhvZCBmb3IgdmFsaWRhdGluZyB0aGF0IGEgcmVzcG9uc2UgaXMgY29ycmVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IF9DTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7Kn0gX3ZhbHVlXG4gICAqL1xuICB2YWxpZGF0ZUNvcnJlY3RSZXNwb25zZShfQ01JRWxlbWVudCwgX3ZhbHVlKSB7XG4gICAgLy8ganVzdCBhIHN0dWIgbWV0aG9kXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBvciBidWlsZHMgYSBuZXcgY2hpbGQgZWxlbWVudCB0byBhZGQgdG8gdGhlIGFycmF5LlxuICAgKiBBUElzIHRoYXQgaW5oZXJpdCBCYXNlQVBJIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IF9DTUlFbGVtZW50IC0gdW51c2VkXG4gICAqIEBwYXJhbSB7Kn0gX3ZhbHVlIC0gdW51c2VkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gX2ZvdW5kRmlyc3RJbmRleCAtIHVudXNlZFxuICAgKiBAcmV0dXJuIHsqfVxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIGdldENoaWxkRWxlbWVudChfQ01JRWxlbWVudCwgX3ZhbHVlLCBfZm91bmRGaXJzdEluZGV4KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZ2V0Q2hpbGRFbGVtZW50IG1ldGhvZCBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgdmFsdWUgZnJvbSB0aGUgQ01JIE9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNjb3JtMjAwNFxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcmV0dXJuIHsqfVxuICAgKi9cbiAgX2NvbW1vbkdldENNSVZhbHVlKG1ldGhvZE5hbWU6IFN0cmluZywgc2Nvcm0yMDA0OiBib29sZWFuLCBDTUlFbGVtZW50KSB7XG4gICAgaWYgKCFDTUlFbGVtZW50IHx8IENNSUVsZW1lbnQgPT09ICcnKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RydWN0dXJlID0gQ01JRWxlbWVudC5zcGxpdCgnLicpO1xuICAgIGxldCByZWZPYmplY3QgPSB0aGlzO1xuICAgIGxldCBhdHRyaWJ1dGUgPSBudWxsO1xuXG4gICAgY29uc3QgdW5pbml0aWFsaXplZEVycm9yTWVzc2FnZSA9IGBUaGUgZGF0YSBtb2RlbCBlbGVtZW50IHBhc3NlZCB0byAke21ldGhvZE5hbWV9ICgke0NNSUVsZW1lbnR9KSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuYDtcbiAgICBjb25zdCBpbnZhbGlkRXJyb3JNZXNzYWdlID0gYFRoZSBkYXRhIG1vZGVsIGVsZW1lbnQgcGFzc2VkIHRvICR7bWV0aG9kTmFtZX0gKCR7Q01JRWxlbWVudH0pIGlzIG5vdCBhIHZhbGlkIFNDT1JNIGRhdGEgbW9kZWwgZWxlbWVudC5gO1xuICAgIGNvbnN0IGludmFsaWRFcnJvckNvZGUgPSBzY29ybTIwMDQgP1xuICAgICAgICB0aGlzLiNlcnJvcl9jb2Rlcy5VTkRFRklORURfREFUQV9NT0RFTCA6XG4gICAgICAgIHRoaXMuI2Vycm9yX2NvZGVzLkdFTkVSQUw7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cnVjdHVyZS5sZW5ndGg7IGkrKykge1xuICAgICAgYXR0cmlidXRlID0gc3RydWN0dXJlW2ldO1xuXG4gICAgICBpZiAoIXNjb3JtMjAwNCkge1xuICAgICAgICBpZiAoaSA9PT0gc3RydWN0dXJlLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuX2NoZWNrT2JqZWN0SGFzUHJvcGVydHkocmVmT2JqZWN0LCBhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihpbnZhbGlkRXJyb3JDb2RlLCBpbnZhbGlkRXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgoU3RyaW5nKGF0dHJpYnV0ZSkuc3Vic3RyKDAsIDgpID09PSAne3RhcmdldD0nKSAmJlxuICAgICAgICAgICAgKHR5cGVvZiByZWZPYmplY3QuX2lzVGFyZ2V0VmFsaWQgPT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgICBjb25zdCB0YXJnZXQgPSBTdHJpbmcoYXR0cmlidXRlKS5cbiAgICAgICAgICAgICAgc3Vic3RyKDgsIFN0cmluZyhhdHRyaWJ1dGUpLmxlbmd0aCAtIDkpO1xuICAgICAgICAgIHJldHVybiByZWZPYmplY3QuX2lzVGFyZ2V0VmFsaWQodGFyZ2V0KTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5fY2hlY2tPYmplY3RIYXNQcm9wZXJ0eShyZWZPYmplY3QsIGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihpbnZhbGlkRXJyb3JDb2RlLCBpbnZhbGlkRXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmVmT2JqZWN0ID0gcmVmT2JqZWN0W2F0dHJpYnV0ZV07XG4gICAgICBpZiAocmVmT2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IoaW52YWxpZEVycm9yQ29kZSwgaW52YWxpZEVycm9yTWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVmT2JqZWN0IGluc3RhbmNlb2YgQ01JQXJyYXkpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChzdHJ1Y3R1cmVbaSArIDFdLCAxMCk7XG5cbiAgICAgICAgLy8gU0NPIGlzIHRyeWluZyB0byBzZXQgYW4gaXRlbSBvbiBhbiBhcnJheVxuICAgICAgICBpZiAoIWlzTmFOKGluZGV4KSkge1xuICAgICAgICAgIGNvbnN0IGl0ZW0gPSByZWZPYmplY3QuY2hpbGRBcnJheVtpbmRleF07XG5cbiAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgcmVmT2JqZWN0ID0gaXRlbTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IodGhpcy4jZXJyb3JfY29kZXMuVkFMVUVfTk9UX0lOSVRJQUxJWkVELFxuICAgICAgICAgICAgICAgIHVuaW5pdGlhbGl6ZWRFcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSGF2ZSB0byB1cGRhdGUgaSB2YWx1ZSB0byBza2lwIHRoZSBhcnJheSBwb3NpdGlvblxuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZWZPYmplY3QgPT09IG51bGwgfHwgcmVmT2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghc2Nvcm0yMDA0KSB7XG4gICAgICAgIGlmIChhdHRyaWJ1dGUgPT09ICdfY2hpbGRyZW4nKSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3Ioc2Nvcm0xMl9lcnJvcl9jb2Rlcy5DSElMRFJFTl9FUlJPUik7XG4gICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlID09PSAnX2NvdW50Jykge1xuICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMTJfZXJyb3JfY29kZXMuQ09VTlRfRVJST1IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZWZPYmplY3Q7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQVBJJ3MgY3VycmVudCBzdGF0ZSBpcyBTVEFURV9JTklUSUFMSVpFRFxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaXNJbml0aWFsaXplZCgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUgPT09IGdsb2JhbF9jb25zdGFudHMuU1RBVEVfSU5JVElBTElaRUQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBBUEkncyBjdXJyZW50IHN0YXRlIGlzIFNUQVRFX05PVF9JTklUSUFMSVpFRFxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaXNOb3RJbml0aWFsaXplZCgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUgPT09IGdsb2JhbF9jb25zdGFudHMuU1RBVEVfTk9UX0lOSVRJQUxJWkVEO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQVBJJ3MgY3VycmVudCBzdGF0ZSBpcyBTVEFURV9URVJNSU5BVEVEXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBpc1Rlcm1pbmF0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlID09PSBnbG9iYWxfY29uc3RhbnRzLlNUQVRFX1RFUk1JTkFURUQ7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGF0dGFjaGluZyB0byBhIHNwZWNpZmljIFNDT1JNIGV2ZW50XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaXN0ZW5lck5hbWVcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uKGxpc3RlbmVyTmFtZTogU3RyaW5nLCBjYWxsYmFjazogZnVuY3Rpb24pIHtcbiAgICBpZiAoIWNhbGxiYWNrKSByZXR1cm47XG5cbiAgICBjb25zdCBsaXN0ZW5lckZ1bmN0aW9ucyA9IGxpc3RlbmVyTmFtZS5zcGxpdCgnICcpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdGVuZXJGdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGxpc3RlbmVyU3BsaXQgPSBsaXN0ZW5lckZ1bmN0aW9uc1tpXS5zcGxpdCgnLicpO1xuICAgICAgaWYgKGxpc3RlbmVyU3BsaXQubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGxpc3RlbmVyU3BsaXRbMF07XG5cbiAgICAgIGxldCBDTUlFbGVtZW50ID0gbnVsbDtcbiAgICAgIGlmIChsaXN0ZW5lclNwbGl0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgQ01JRWxlbWVudCA9IGxpc3RlbmVyTmFtZS5yZXBsYWNlKGZ1bmN0aW9uTmFtZSArICcuJywgJycpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxpc3RlbmVyQXJyYXkucHVzaCh7XG4gICAgICAgIGZ1bmN0aW9uTmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICBDTUlFbGVtZW50OiBDTUlFbGVtZW50LFxuICAgICAgICBjYWxsYmFjazogY2FsbGJhY2ssXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5hcGlMb2coJ29uJywgZnVuY3Rpb25OYW1lLCBgQWRkZWQgZXZlbnQgbGlzdGVuZXI6ICR7dGhpcy5saXN0ZW5lckFycmF5Lmxlbmd0aH1gLCBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9JTkZPKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGRldGFjaGluZyBhIHNwZWNpZmljIFNDT1JNIGV2ZW50IGxpc3RlbmVyXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaXN0ZW5lck5hbWVcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9mZihsaXN0ZW5lck5hbWU6IFN0cmluZywgY2FsbGJhY2s6IGZ1bmN0aW9uKSB7XG4gICAgaWYgKCFjYWxsYmFjaykgcmV0dXJuO1xuXG4gICAgY29uc3QgbGlzdGVuZXJGdW5jdGlvbnMgPSBsaXN0ZW5lck5hbWUuc3BsaXQoJyAnKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVyRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBsaXN0ZW5lclNwbGl0ID0gbGlzdGVuZXJGdW5jdGlvbnNbaV0uc3BsaXQoJy4nKTtcbiAgICAgIGlmIChsaXN0ZW5lclNwbGl0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBsaXN0ZW5lclNwbGl0WzBdO1xuXG4gICAgICBsZXQgQ01JRWxlbWVudCA9IG51bGw7XG4gICAgICBpZiAobGlzdGVuZXJTcGxpdC5sZW5ndGggPiAxKSB7XG4gICAgICAgIENNSUVsZW1lbnQgPSBsaXN0ZW5lck5hbWUucmVwbGFjZShmdW5jdGlvbk5hbWUgKyAnLicsICcnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVtb3ZlSW5kZXggPSB0aGlzLmxpc3RlbmVyQXJyYXkuZmluZEluZGV4KChvYmopID0+XG4gICAgICAgIG9iai5mdW5jdGlvbk5hbWUgPT09IGZ1bmN0aW9uTmFtZSAmJlxuICAgICAgICBvYmouQ01JRWxlbWVudCA9PT0gQ01JRWxlbWVudCAmJlxuICAgICAgICBvYmouY2FsbGJhY2sgPT09IGNhbGxiYWNrXG4gICAgICApO1xuICAgICAgaWYgKHJlbW92ZUluZGV4ICE9PSAtMSkge1xuICAgICAgICB0aGlzLmxpc3RlbmVyQXJyYXkuc3BsaWNlKHJlbW92ZUluZGV4LCAxKTtcbiAgICAgICAgdGhpcy5hcGlMb2coJ29mZicsIGZ1bmN0aW9uTmFtZSwgYFJlbW92ZWQgZXZlbnQgbGlzdGVuZXI6ICR7dGhpcy5saXN0ZW5lckFycmF5Lmxlbmd0aH1gLCBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9JTkZPKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGNsZWFyaW5nIGFsbCBsaXN0ZW5lcnMgZnJvbSBhIHNwZWNpZmljIFNDT1JNIGV2ZW50XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsaXN0ZW5lck5hbWVcbiAgICovXG4gIGNsZWFyKGxpc3RlbmVyTmFtZTogU3RyaW5nKSB7XG4gICAgY29uc3QgbGlzdGVuZXJGdW5jdGlvbnMgPSBsaXN0ZW5lck5hbWUuc3BsaXQoJyAnKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3RlbmVyRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBsaXN0ZW5lclNwbGl0ID0gbGlzdGVuZXJGdW5jdGlvbnNbaV0uc3BsaXQoJy4nKTtcbiAgICAgIGlmIChsaXN0ZW5lclNwbGl0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBsaXN0ZW5lclNwbGl0WzBdO1xuXG4gICAgICBsZXQgQ01JRWxlbWVudCA9IG51bGw7XG4gICAgICBpZiAobGlzdGVuZXJTcGxpdC5sZW5ndGggPiAxKSB7XG4gICAgICAgIENNSUVsZW1lbnQgPSBsaXN0ZW5lck5hbWUucmVwbGFjZShmdW5jdGlvbk5hbWUgKyAnLicsICcnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5saXN0ZW5lckFycmF5ID0gdGhpcy5saXN0ZW5lckFycmF5LmZpbHRlcigob2JqKSA9PlxuICAgICAgICBvYmouZnVuY3Rpb25OYW1lICE9PSBmdW5jdGlvbk5hbWUgJiZcbiAgICAgICAgb2JqLkNNSUVsZW1lbnQgIT09IENNSUVsZW1lbnQsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgYW55ICdvbicgbGlzdGVuZXJzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uTmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqL1xuICBwcm9jZXNzTGlzdGVuZXJzKGZ1bmN0aW9uTmFtZTogU3RyaW5nLCBDTUlFbGVtZW50OiBTdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLmFwaUxvZyhmdW5jdGlvbk5hbWUsIENNSUVsZW1lbnQsIHZhbHVlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGlzdGVuZXJBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbGlzdGVuZXIgPSB0aGlzLmxpc3RlbmVyQXJyYXlbaV07XG4gICAgICBjb25zdCBmdW5jdGlvbnNNYXRjaCA9IGxpc3RlbmVyLmZ1bmN0aW9uTmFtZSA9PT0gZnVuY3Rpb25OYW1lO1xuICAgICAgY29uc3QgbGlzdGVuZXJIYXNDTUlFbGVtZW50ID0gISFsaXN0ZW5lci5DTUlFbGVtZW50O1xuICAgICAgbGV0IENNSUVsZW1lbnRzTWF0Y2ggPSBmYWxzZTtcbiAgICAgIGlmIChDTUlFbGVtZW50ICYmIGxpc3RlbmVyLkNNSUVsZW1lbnQgJiZcbiAgICAgICAgICBsaXN0ZW5lci5DTUlFbGVtZW50LnN1YnN0cmluZyhsaXN0ZW5lci5DTUlFbGVtZW50Lmxlbmd0aCAtIDEpID09PVxuICAgICAgICAgICcqJykge1xuICAgICAgICBDTUlFbGVtZW50c01hdGNoID0gQ01JRWxlbWVudC5pbmRleE9mKGxpc3RlbmVyLkNNSUVsZW1lbnQuc3Vic3RyaW5nKDAsXG4gICAgICAgICAgICBsaXN0ZW5lci5DTUlFbGVtZW50Lmxlbmd0aCAtIDEpKSA9PT0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIENNSUVsZW1lbnRzTWF0Y2ggPSBsaXN0ZW5lci5DTUlFbGVtZW50ID09PSBDTUlFbGVtZW50O1xuICAgICAgfVxuXG4gICAgICBpZiAoZnVuY3Rpb25zTWF0Y2ggJiYgKCFsaXN0ZW5lckhhc0NNSUVsZW1lbnQgfHwgQ01JRWxlbWVudHNNYXRjaCkpIHtcbiAgICAgICAgbGlzdGVuZXIuY2FsbGJhY2soQ01JRWxlbWVudCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYSBTQ09STSBlcnJvclxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gZXJyb3JOdW1iZXJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICovXG4gIHRocm93U0NPUk1FcnJvcihlcnJvck51bWJlcjogbnVtYmVyLCBtZXNzYWdlOiBTdHJpbmcpIHtcbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgIG1lc3NhZ2UgPSB0aGlzLmdldExtc0Vycm9yTWVzc2FnZURldGFpbHMoZXJyb3JOdW1iZXIpO1xuICAgIH1cblxuICAgIHRoaXMuYXBpTG9nKCd0aHJvd1NDT1JNRXJyb3InLCBudWxsLCBlcnJvck51bWJlciArICc6ICcgKyBtZXNzYWdlLFxuICAgICAgICBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9FUlJPUik7XG5cbiAgICB0aGlzLmxhc3RFcnJvckNvZGUgPSBTdHJpbmcoZXJyb3JOdW1iZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgbGFzdCBTQ09STSBlcnJvciBjb2RlIG9uIHN1Y2Nlc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWNjZXNzXG4gICAqL1xuICBjbGVhclNDT1JNRXJyb3Ioc3VjY2VzczogU3RyaW5nKSB7XG4gICAgaWYgKHN1Y2Nlc3MgIT09IHVuZGVmaW5lZCAmJiBzdWNjZXNzICE9PSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX0ZBTFNFKSB7XG4gICAgICB0aGlzLmxhc3RFcnJvckNvZGUgPSAwO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byBzdG9yZSB0aGUgZGF0YSB0byB0aGUgTE1TLCBsb2dzIGRhdGEgaWYgbm8gTE1TIGNvbmZpZ3VyZWRcbiAgICogQVBJcyB0aGF0IGluaGVyaXQgQmFzZUFQSSBzaG91bGQgb3ZlcnJpZGUgdGhpcyBmdW5jdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IF9jYWxjdWxhdGVUb3RhbFRpbWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIHN0b3JlRGF0YShfY2FsY3VsYXRlVG90YWxUaW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIHN0b3JlRGF0YSBtZXRob2QgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgQ01JIGZyb20gYSBmbGF0dGVuZWQgSlNPTiBvYmplY3RcbiAgICogQHBhcmFtIHtvYmplY3R9IGpzb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICovXG4gIGxvYWRGcm9tRmxhdHRlbmVkSlNPTihqc29uLCBDTUlFbGVtZW50KSB7XG4gICAgaWYgKCF0aGlzLmlzTm90SW5pdGlhbGl6ZWQoKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAnbG9hZEZyb21GbGF0dGVuZWRKU09OIGNhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgdGhlIGNhbGwgdG8gbG1zSW5pdGlhbGl6ZS4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZXN0IG1hdGNoIHBhdHRlcm4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjXG4gICAgICogQHBhcmFtIHtSZWdFeHB9IGFfcGF0dGVyblxuICAgICAqIEByZXR1cm4ge251bWJlcn1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0ZXN0UGF0dGVybihhLCBjLCBhX3BhdHRlcm4pIHtcbiAgICAgIGNvbnN0IGFfbWF0Y2ggPSBhLm1hdGNoKGFfcGF0dGVybik7XG5cbiAgICAgIGxldCBjX21hdGNoO1xuICAgICAgaWYgKGFfbWF0Y2ggIT09IG51bGwgJiYgKGNfbWF0Y2ggPSBjLm1hdGNoKGFfcGF0dGVybikpICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGFfbnVtID0gTnVtYmVyKGFfbWF0Y2hbMl0pO1xuICAgICAgICBjb25zdCBjX251bSA9IE51bWJlcihjX21hdGNoWzJdKTtcbiAgICAgICAgaWYgKGFfbnVtID09PSBjX251bSkge1xuICAgICAgICAgIGlmIChhX21hdGNoWzNdID09PSAnaWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgfSBlbHNlIGlmIChhX21hdGNoWzNdID09PSAndHlwZScpIHtcbiAgICAgICAgICAgIGlmIChjX21hdGNoWzNdID09PSAnaWQnKSB7XG4gICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFfbnVtIC0gY19udW07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGludF9wYXR0ZXJuID0gL14oY21pXFwuaW50ZXJhY3Rpb25zXFwuKShcXGQrKVxcLiguKikkLztcbiAgICBjb25zdCBvYmpfcGF0dGVybiA9IC9eKGNtaVxcLm9iamVjdGl2ZXNcXC4pKFxcZCspXFwuKC4qKSQvO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmtleXMoanNvbikubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIFtTdHJpbmcoa2V5KSwganNvbltrZXldXTtcbiAgICB9KTtcblxuICAgIC8vIENNSSBpbnRlcmFjdGlvbnMgbmVlZCB0byBoYXZlIGlkIGFuZCB0eXBlIGxvYWRlZCBiZWZvcmUgYW55IG90aGVyIGZpZWxkc1xuICAgIHJlc3VsdC5zb3J0KGZ1bmN0aW9uKFthLCBiXSwgW2MsIGRdKSB7XG4gICAgICBsZXQgdGVzdDtcbiAgICAgIGlmICgodGVzdCA9IHRlc3RQYXR0ZXJuKGEsIGMsIGludF9wYXR0ZXJuKSkgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRlc3Q7XG4gICAgICB9XG4gICAgICBpZiAoKHRlc3QgPSB0ZXN0UGF0dGVybihhLCBjLCBvYmpfcGF0dGVybikpICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0ZXN0O1xuICAgICAgfVxuXG4gICAgICBpZiAoYSA8IGMpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYgKGEgPiBjKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIDA7XG4gICAgfSk7XG5cbiAgICBsZXQgb2JqO1xuICAgIHJlc3VsdC5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICBvYmogPSB7fTtcbiAgICAgIG9ialtlbGVtZW50WzBdXSA9IGVsZW1lbnRbMV07XG4gICAgICB0aGlzLmxvYWRGcm9tSlNPTih1bmZsYXR0ZW4ob2JqKSwgQ01JRWxlbWVudCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgQ01JIGRhdGEgZnJvbSBhIEpTT04gb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0ganNvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKi9cbiAgbG9hZEZyb21KU09OKGpzb24sIENNSUVsZW1lbnQpIHtcbiAgICBpZiAoIXRoaXMuaXNOb3RJbml0aWFsaXplZCgpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICdsb2FkRnJvbUpTT04gY2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSB0aGUgY2FsbCB0byBsbXNJbml0aWFsaXplLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIENNSUVsZW1lbnQgPSBDTUlFbGVtZW50ICE9PSB1bmRlZmluZWQgPyBDTUlFbGVtZW50IDogJ2NtaSc7XG5cbiAgICB0aGlzLnN0YXJ0aW5nRGF0YSA9IGpzb247XG5cbiAgICAvLyBjb3VsZCB0aGlzIGJlIHJlZmFjdG9yZWQgZG93biB0byBmbGF0dGVuKGpzb24pIHRoZW4gc2V0Q01JVmFsdWUgb24gZWFjaD9cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBqc29uKSB7XG4gICAgICBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChqc29uLCBrZXkpICYmIGpzb25ba2V5XSkge1xuICAgICAgICBjb25zdCBjdXJyZW50Q01JRWxlbWVudCA9IChDTUlFbGVtZW50ID8gQ01JRWxlbWVudCArICcuJyA6ICcnKSArIGtleTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBqc29uW2tleV07XG5cbiAgICAgICAgaWYgKHZhbHVlWydjaGlsZEFycmF5J10pIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlWydjaGlsZEFycmF5J10ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMubG9hZEZyb21KU09OKHZhbHVlWydjaGlsZEFycmF5J11baV0sXG4gICAgICAgICAgICAgICAgY3VycmVudENNSUVsZW1lbnQgKyAnLicgKyBpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xuICAgICAgICAgIHRoaXMubG9hZEZyb21KU09OKHZhbHVlLCBjdXJyZW50Q01JRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRDTUlWYWx1ZShjdXJyZW50Q01JRWxlbWVudCwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgQ01JIG9iamVjdCB0byBKU09OIGZvciBzZW5kaW5nIHRvIGFuIExNUy5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgcmVuZGVyQ01JVG9KU09OU3RyaW5nKCkge1xuICAgIGNvbnN0IGNtaSA9IHRoaXMuY21pO1xuICAgIC8vIERvIHdlIHdhbnQvbmVlZCB0byByZXR1cm4gZmllbGRzIHRoYXQgaGF2ZSBubyBzZXQgdmFsdWU/XG4gICAgLy8gcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgY21pIH0sIChrLCB2KSA9PiB2ID09PSB1bmRlZmluZWQgPyBudWxsIDogdiwgMik7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtjbWl9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgSlMgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBjbWlcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgcmVuZGVyQ01JVG9KU09OT2JqZWN0KCkge1xuICAgIC8vIERvIHdlIHdhbnQvbmVlZCB0byByZXR1cm4gZmllbGRzIHRoYXQgaGF2ZSBubyBzZXQgdmFsdWU/XG4gICAgLy8gcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgY21pIH0sIChrLCB2KSA9PiB2ID09PSB1bmRlZmluZWQgPyBudWxsIDogdiwgMik7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5yZW5kZXJDTUlUb0pTT05TdHJpbmcoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBjbWkgb2JqZWN0IHRvIHRoZSBwcm9wZXIgZm9ybWF0IGZvciBMTVMgY29tbWl0XG4gICAqIEFQSXMgdGhhdCBpbmhlcml0IEJhc2VBUEkgc2hvdWxkIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBfdGVybWluYXRlQ29tbWl0XG4gICAqIEByZXR1cm4geyp9XG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgcmVuZGVyQ29tbWl0Q01JKF90ZXJtaW5hdGVDb21taXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdUaGUgc3RvcmVEYXRhIG1ldGhvZCBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIHRoZSByZXF1ZXN0IHRvIHRoZSBMTVNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcGFyYW0ge29iamVjdHxBcnJheX0gcGFyYW1zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW1tZWRpYXRlXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIHByb2Nlc3NIdHRwUmVxdWVzdCh1cmw6IFN0cmluZywgcGFyYW1zLCBpbW1lZGlhdGUgPSBmYWxzZSkge1xuICAgIGNvbnN0IGFwaSA9IHRoaXM7XG4gICAgY29uc3QgcHJvY2VzcyA9IGZ1bmN0aW9uKHVybCwgcGFyYW1zLCBzZXR0aW5ncywgZXJyb3JfY29kZXMpIHtcbiAgICAgIGNvbnN0IGdlbmVyaWNFcnJvciA9IHtcbiAgICAgICAgJ3Jlc3VsdCc6IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0UsXG4gICAgICAgICdlcnJvckNvZGUnOiBlcnJvcl9jb2Rlcy5HRU5FUkFMLFxuICAgICAgfTtcblxuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIGlmICghc2V0dGluZ3Muc2VuZEJlYWNvbkNvbW1pdCkge1xuICAgICAgICBjb25zdCBodHRwUmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIGh0dHBSZXEub3BlbignUE9TVCcsIHVybCwgc2V0dGluZ3MuYXN5bmNDb21taXQpO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhzZXR0aW5ncy54aHJIZWFkZXJzKS5sZW5ndGgpIHtcbiAgICAgICAgICBPYmplY3Qua2V5cyhzZXR0aW5ncy54aHJIZWFkZXJzKS5mb3JFYWNoKChoZWFkZXIpID0+IHtcbiAgICAgICAgICAgIGh0dHBSZXEuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIHNldHRpbmdzLnhockhlYWRlcnNbaGVhZGVyXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBodHRwUmVxLndpdGhDcmVkZW50aWFscyA9IHNldHRpbmdzLnhocldpdGhDcmVkZW50aWFscztcblxuICAgICAgICBpZiAoc2V0dGluZ3MuYXN5bmNDb21taXQpIHtcbiAgICAgICAgICBodHRwUmVxLm9ubG9hZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MucmVzcG9uc2VIYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IHNldHRpbmdzLnJlc3BvbnNlSGFuZGxlcihodHRwUmVxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UoaHR0cFJlcS5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAocGFyYW1zIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIGh0dHBSZXEuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyk7XG4gICAgICAgICAgICBodHRwUmVxLnNlbmQocGFyYW1zLmpvaW4oJyYnKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGh0dHBSZXEuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJyxcbiAgICAgICAgICAgICAgICBzZXR0aW5ncy5jb21taXRSZXF1ZXN0RGF0YVR5cGUpO1xuICAgICAgICAgICAgaHR0cFJlcS5zZW5kKEpTT04uc3RyaW5naWZ5KHBhcmFtcykpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghc2V0dGluZ3MuYXN5bmNDb21taXQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MucmVzcG9uc2VIYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IHNldHRpbmdzLnJlc3BvbnNlSGFuZGxlcihodHRwUmVxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UoaHR0cFJlcS5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSB7fTtcbiAgICAgICAgICAgIHJlc3VsdC5yZXN1bHQgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX1RSVUU7XG4gICAgICAgICAgICByZXN1bHQuZXJyb3JDb2RlID0gMDtcbiAgICAgICAgICAgIGFwaS5wcm9jZXNzTGlzdGVuZXJzKCdDb21taXRTdWNjZXNzJyk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgYXBpLnByb2Nlc3NMaXN0ZW5lcnMoJ0NvbW1pdEVycm9yJyk7XG4gICAgICAgICAgcmV0dXJuIGdlbmVyaWNFcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgICAgICAgdHlwZTogc2V0dGluZ3MuY29tbWl0UmVxdWVzdERhdGFUeXBlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgbGV0IGJsb2I7XG4gICAgICAgICAgaWYgKHBhcmFtcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgICAgICBibG9iID0gbmV3IEJsb2IoW3BhcmFtcy5qb2luKCcmJyldLCBoZWFkZXJzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYmxvYiA9IG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShwYXJhbXMpXSwgaGVhZGVycyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzdWx0ID0ge307XG4gICAgICAgICAgaWYgKG5hdmlnYXRvci5zZW5kQmVhY29uKHVybCwgYmxvYikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5yZXN1bHQgPSBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX1RSVUU7XG4gICAgICAgICAgICByZXN1bHQuZXJyb3JDb2RlID0gMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnJlc3VsdCA9IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fRkFMU0U7XG4gICAgICAgICAgICByZXN1bHQuZXJyb3JDb2RlID0gMTAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgYXBpLnByb2Nlc3NMaXN0ZW5lcnMoJ0NvbW1pdEVycm9yJyk7XG4gICAgICAgICAgcmV0dXJuIGdlbmVyaWNFcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgYXBpLnByb2Nlc3NMaXN0ZW5lcnMoJ0NvbW1pdEVycm9yJyk7XG4gICAgICAgIHJldHVybiBnZW5lcmljRXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHQucmVzdWx0ID09PSB0cnVlIHx8XG4gICAgICAgICAgcmVzdWx0LnJlc3VsdCA9PT0gZ2xvYmFsX2NvbnN0YW50cy5TQ09STV9UUlVFKSB7XG4gICAgICAgIGFwaS5wcm9jZXNzTGlzdGVuZXJzKCdDb21taXRTdWNjZXNzJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhcGkucHJvY2Vzc0xpc3RlbmVycygnQ29tbWl0RXJyb3InKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiBkZWJvdW5jZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IGRlYm91bmNlZCA9IGRlYm91bmNlKHByb2Nlc3MsIDUwMCk7XG4gICAgICBkZWJvdW5jZWQodXJsLCBwYXJhbXMsIHRoaXMuc2V0dGluZ3MsIHRoaXMuZXJyb3JfY29kZXMpO1xuXG4gICAgICAvLyBpZiB3ZSdyZSB0ZXJtaW5hdGluZywgZ28gYWhlYWQgYW5kIGNvbW1pdCBpbW1lZGlhdGVseVxuICAgICAgaWYgKGltbWVkaWF0ZSkge1xuICAgICAgICBkZWJvdW5jZWQuZmx1c2goKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdWx0OiBnbG9iYWxfY29uc3RhbnRzLlNDT1JNX1RSVUUsXG4gICAgICAgIGVycm9yQ29kZTogMCxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwcm9jZXNzKHVybCwgcGFyYW1zLCB0aGlzLnNldHRpbmdzLCB0aGlzLmVycm9yX2NvZGVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGEgU0NPUk0gZXJyb3JcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHdoZW4gLSB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBjb21taXR0aW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsYmFjayAtIHRoZSBuYW1lIG9mIHRoZSBjb21taXQgZXZlbnQgY2FsbGJhY2tcbiAgICovXG4gIHNjaGVkdWxlQ29tbWl0KHdoZW46IG51bWJlciwgY2FsbGJhY2s6IHN0cmluZykge1xuICAgIHRoaXMuI3RpbWVvdXQgPSBuZXcgU2NoZWR1bGVkQ29tbWl0KHRoaXMsIHdoZW4sIGNhbGxiYWNrKTtcbiAgICB0aGlzLmFwaUxvZygnc2NoZWR1bGVDb21taXQnLCAnJywgJ3NjaGVkdWxlZCcsXG4gICAgICAgIGdsb2JhbF9jb25zdGFudHMuTE9HX0xFVkVMX0RFQlVHKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgYW5kIGNhbmNlbHMgYW55IGN1cnJlbnRseSBzY2hlZHVsZWQgY29tbWl0c1xuICAgKi9cbiAgY2xlYXJTY2hlZHVsZWRDb21taXQoKSB7XG4gICAgaWYgKHRoaXMuI3RpbWVvdXQpIHtcbiAgICAgIHRoaXMuI3RpbWVvdXQuY2FuY2VsKCk7XG4gICAgICB0aGlzLiN0aW1lb3V0ID0gbnVsbDtcbiAgICAgIHRoaXMuYXBpTG9nKCdjbGVhclNjaGVkdWxlZENvbW1pdCcsICcnLCAnY2xlYXJlZCcsXG4gICAgICAgICAgZ2xvYmFsX2NvbnN0YW50cy5MT0dfTEVWRUxfREVCVUcpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFByaXZhdGUgY2xhc3MgdGhhdCB3cmFwcyBhIHRpbWVvdXQgY2FsbCB0byB0aGUgY29tbWl0KCkgZnVuY3Rpb25cbiAqL1xuY2xhc3MgU2NoZWR1bGVkQ29tbWl0IHtcbiAgI0FQSTtcbiAgI2NhbmNlbGxlZCA9IGZhbHNlO1xuICAjdGltZW91dDtcbiAgI2NhbGxiYWNrO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgU2NoZWR1bGVkQ29tbWl0XG4gICAqIEBwYXJhbSB7QmFzZUFQSX0gQVBJXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB3aGVuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsYmFja1xuICAgKi9cbiAgY29uc3RydWN0b3IoQVBJOiBhbnksIHdoZW46IG51bWJlciwgY2FsbGJhY2s6IHN0cmluZykge1xuICAgIHRoaXMuI0FQSSA9IEFQSTtcbiAgICB0aGlzLiN0aW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLndyYXBwZXIuYmluZCh0aGlzKSwgd2hlbik7XG4gICAgdGhpcy4jY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgYW55IGN1cnJlbnRseSBzY2hlZHVsZWQgY29tbWl0XG4gICAqL1xuICBjYW5jZWwoKSB7XG4gICAgdGhpcy4jY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy4jdGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuI3RpbWVvdXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwIHRoZSBBUEkgY29tbWl0IGNhbGwgdG8gY2hlY2sgaWYgdGhlIGNhbGwgaGFzIGFscmVhZHkgYmVlbiBjYW5jZWxsZWRcbiAgICovXG4gIHdyYXBwZXIoKSB7XG4gICAgaWYgKCF0aGlzLiNjYW5jZWxsZWQpIHtcbiAgICAgIHRoaXMuI0FQSS5jb21taXQodGhpcy4jY2FsbGJhY2spO1xuICAgIH1cbiAgfVxufVxuIiwiLy8gQGZsb3dcbmltcG9ydCBCYXNlQVBJIGZyb20gJy4vQmFzZUFQSSc7XG5pbXBvcnQge1xuICBBREwsXG4gIENNSSxcbiAgQ01JQ29tbWVudHNPYmplY3QsXG4gIENNSUludGVyYWN0aW9uc0NvcnJlY3RSZXNwb25zZXNPYmplY3QsXG4gIENNSUludGVyYWN0aW9uc09iamVjdCxcbiAgQ01JSW50ZXJhY3Rpb25zT2JqZWN0aXZlc09iamVjdCxcbiAgQ01JT2JqZWN0aXZlc09iamVjdCxcbn0gZnJvbSAnLi9jbWkvc2Nvcm0yMDA0X2NtaSc7XG5pbXBvcnQgKiBhcyBVdGlsaXRpZXMgZnJvbSAnLi91dGlsaXRpZXMnO1xuaW1wb3J0IEFQSUNvbnN0YW50cyBmcm9tICcuL2NvbnN0YW50cy9hcGlfY29uc3RhbnRzJztcbmltcG9ydCBFcnJvckNvZGVzIGZyb20gJy4vY29uc3RhbnRzL2Vycm9yX2NvZGVzJztcbmltcG9ydCBSZXNwb25zZXMgZnJvbSAnLi9jb25zdGFudHMvcmVzcG9uc2VfY29uc3RhbnRzJztcbmltcG9ydCBWYWxpZExhbmd1YWdlcyBmcm9tICcuL2NvbnN0YW50cy9sYW5ndWFnZV9jb25zdGFudHMnO1xuaW1wb3J0IFJlZ2V4IGZyb20gJy4vY29uc3RhbnRzL3JlZ2V4JztcblxuY29uc3Qgc2Nvcm0yMDA0X2NvbnN0YW50cyA9IEFQSUNvbnN0YW50cy5zY29ybTIwMDQ7XG5jb25zdCBnbG9iYWxfY29uc3RhbnRzID0gQVBJQ29uc3RhbnRzLmdsb2JhbDtcbmNvbnN0IHNjb3JtMjAwNF9lcnJvcl9jb2RlcyA9IEVycm9yQ29kZXMuc2Nvcm0yMDA0O1xuY29uc3QgY29ycmVjdF9yZXNwb25zZXMgPSBSZXNwb25zZXMuY29ycmVjdDtcbmNvbnN0IHNjb3JtMjAwNF9yZWdleCA9IFJlZ2V4LnNjb3JtMjAwNDtcblxuLyoqXG4gKiBBUEkgY2xhc3MgZm9yIFNDT1JNIDIwMDRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2Nvcm0yMDA0QVBJIGV4dGVuZHMgQmFzZUFQSSB7XG4gICN2ZXJzaW9uOiAnMS4wJztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIFNDT1JNIDIwMDQgQVBJXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzZXR0aW5nc1xuICAgKi9cbiAgY29uc3RydWN0b3Ioc2V0dGluZ3M6IHt9KSB7XG4gICAgY29uc3QgZmluYWxTZXR0aW5ncyA9IHtcbiAgICAgIC4uLntcbiAgICAgICAgbWFzdGVyeV9vdmVycmlkZTogZmFsc2UsXG4gICAgICB9LCAuLi5zZXR0aW5ncyxcbiAgICB9O1xuXG4gICAgc3VwZXIoc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLCBmaW5hbFNldHRpbmdzKTtcblxuICAgIHRoaXMuY21pID0gbmV3IENNSSgpO1xuICAgIHRoaXMuYWRsID0gbmV3IEFETCgpO1xuXG4gICAgLy8gUmVuYW1lIGZ1bmN0aW9ucyB0byBtYXRjaCAyMDA0IFNwZWMgYW5kIGV4cG9zZSB0byBtb2R1bGVzXG4gICAgdGhpcy5Jbml0aWFsaXplID0gdGhpcy5sbXNJbml0aWFsaXplO1xuICAgIHRoaXMuVGVybWluYXRlID0gdGhpcy5sbXNUZXJtaW5hdGU7XG4gICAgdGhpcy5HZXRWYWx1ZSA9IHRoaXMubG1zR2V0VmFsdWU7XG4gICAgdGhpcy5TZXRWYWx1ZSA9IHRoaXMubG1zU2V0VmFsdWU7XG4gICAgdGhpcy5Db21taXQgPSB0aGlzLmxtc0NvbW1pdDtcbiAgICB0aGlzLkdldExhc3RFcnJvciA9IHRoaXMubG1zR2V0TGFzdEVycm9yO1xuICAgIHRoaXMuR2V0RXJyb3JTdHJpbmcgPSB0aGlzLmxtc0dldEVycm9yU3RyaW5nO1xuICAgIHRoaXMuR2V0RGlhZ25vc3RpYyA9IHRoaXMubG1zR2V0RGlhZ25vc3RpYztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN2ZXJzaW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB2ZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLiN2ZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gYm9vbFxuICAgKi9cbiAgbG1zSW5pdGlhbGl6ZSgpIHtcbiAgICB0aGlzLmNtaS5pbml0aWFsaXplKCk7XG4gICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZSgnSW5pdGlhbGl6ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge3N0cmluZ30gYm9vbFxuICAgKi9cbiAgbG1zVGVybWluYXRlKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMudGVybWluYXRlKCdUZXJtaW5hdGUnLCB0cnVlKTtcblxuICAgIGlmIChyZXN1bHQgPT09IGdsb2JhbF9jb25zdGFudHMuU0NPUk1fVFJVRSkge1xuICAgICAgaWYgKHRoaXMuYWRsLm5hdi5yZXF1ZXN0ICE9PSAnX25vbmVfJykge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuYWRsLm5hdi5yZXF1ZXN0KSB7XG4gICAgICAgICAgY2FzZSAnY29udGludWUnOlxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZU5leHQnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3ByZXZpb3VzJzpcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycygnU2VxdWVuY2VQcmV2aW91cycpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnY2hvaWNlJzpcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycygnU2VxdWVuY2VDaG9pY2UnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2V4aXQnOlxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZUV4aXQnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2V4aXRBbGwnOlxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZUV4aXRBbGwnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2FiYW5kb24nOlxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZUFiYW5kb24nKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2FiYW5kb25BbGwnOlxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzTGlzdGVuZXJzKCdTZXF1ZW5jZUFiYW5kb25BbGwnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2V0dGluZ3MuYXV0b1Byb2dyZXNzKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0xpc3RlbmVycygnU2VxdWVuY2VOZXh0Jyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBsbXNHZXRWYWx1ZShDTUlFbGVtZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoJ0dldFZhbHVlJywgdHJ1ZSwgQ01JRWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGxtc1NldFZhbHVlKENNSUVsZW1lbnQsIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0VmFsdWUoJ1NldFZhbHVlJywgJ0NvbW1pdCcsIHRydWUsIENNSUVsZW1lbnQsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcmRlcnMgTE1TIHRvIHN0b3JlIGFsbCBjb250ZW50IHBhcmFtZXRlcnNcbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfSBib29sXG4gICAqL1xuICBsbXNDb21taXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29tbWl0KCdDb21taXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGxhc3QgZXJyb3IgY29kZVxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBsbXNHZXRMYXN0RXJyb3IoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGFzdEVycm9yKCdHZXRMYXN0RXJyb3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlcnJvck51bWJlciBlcnJvciBkZXNjcmlwdGlvblxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gQ01JRXJyb3JDb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGxtc0dldEVycm9yU3RyaW5nKENNSUVycm9yQ29kZSkge1xuICAgIHJldHVybiB0aGlzLmdldEVycm9yU3RyaW5nKCdHZXRFcnJvclN0cmluZycsIENNSUVycm9yQ29kZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvbXByZWhlbnNpdmUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yTnVtYmVyIGVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gQ01JRXJyb3JDb2RlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGxtc0dldERpYWdub3N0aWMoQ01JRXJyb3JDb2RlKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGlhZ25vc3RpYygnR2V0RGlhZ25vc3RpYycsIENNSUVycm9yQ29kZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIHZhbHVlIG9uIHRoZSBDTUkgT2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDTUlFbGVtZW50XG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBzZXRDTUlWYWx1ZShDTUlFbGVtZW50LCB2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9jb21tb25TZXRDTUlWYWx1ZSgnU2V0VmFsdWUnLCB0cnVlLCBDTUlFbGVtZW50LCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBvciBidWlsZHMgYSBuZXcgY2hpbGQgZWxlbWVudCB0byBhZGQgdG8gdGhlIGFycmF5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gQ01JRWxlbWVudFxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICogQHBhcmFtIHtib29sZWFufSBmb3VuZEZpcnN0SW5kZXhcbiAgICogQHJldHVybiB7YW55fVxuICAgKi9cbiAgZ2V0Q2hpbGRFbGVtZW50KENNSUVsZW1lbnQsIHZhbHVlLCBmb3VuZEZpcnN0SW5kZXgpIHtcbiAgICBsZXQgbmV3Q2hpbGQ7XG5cbiAgICBpZiAodGhpcy5zdHJpbmdNYXRjaGVzKENNSUVsZW1lbnQsICdjbWlcXFxcLm9iamVjdGl2ZXNcXFxcLlxcXFxkKycpKSB7XG4gICAgICBuZXdDaGlsZCA9IG5ldyBDTUlPYmplY3RpdmVzT2JqZWN0KCk7XG4gICAgfSBlbHNlIGlmIChmb3VuZEZpcnN0SW5kZXggJiYgdGhpcy5zdHJpbmdNYXRjaGVzKENNSUVsZW1lbnQsXG4gICAgICAgICdjbWlcXFxcLmludGVyYWN0aW9uc1xcXFwuXFxcXGQrXFxcXC5jb3JyZWN0X3Jlc3BvbnNlc1xcXFwuXFxcXGQrJykpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gQ01JRWxlbWVudC5zcGxpdCgnLicpO1xuICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIocGFydHNbMl0pO1xuICAgICAgY29uc3QgaW50ZXJhY3Rpb24gPSB0aGlzLmNtaS5pbnRlcmFjdGlvbnMuY2hpbGRBcnJheVtpbmRleF07XG4gICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKCkpIHtcbiAgICAgICAgaWYgKCFpbnRlcmFjdGlvbi50eXBlKSB7XG4gICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3IoXG4gICAgICAgICAgICAgIHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5ERVBFTkRFTkNZX05PVF9FU1RBQkxJU0hFRCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jaGVja0R1cGxpY2F0ZUNob2ljZVJlc3BvbnNlKGludGVyYWN0aW9uLCB2YWx1ZSk7XG5cbiAgICAgICAgICBjb25zdCByZXNwb25zZV90eXBlID0gY29ycmVjdF9yZXNwb25zZXNbaW50ZXJhY3Rpb24udHlwZV07XG4gICAgICAgICAgaWYgKHJlc3BvbnNlX3R5cGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tWYWxpZFJlc3BvbnNlVHlwZShyZXNwb25zZV90eXBlLCB2YWx1ZSwgaW50ZXJhY3Rpb24udHlwZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5HRU5FUkFMX1NFVF9GQUlMVVJFLFxuICAgICAgICAgICAgICAgICdJbmNvcnJlY3QgUmVzcG9uc2UgVHlwZTogJyArIGludGVyYWN0aW9uLnR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMubGFzdEVycm9yQ29kZSA9PT0gMCkge1xuICAgICAgICBuZXdDaGlsZCA9IG5ldyBDTUlJbnRlcmFjdGlvbnNDb3JyZWN0UmVzcG9uc2VzT2JqZWN0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmb3VuZEZpcnN0SW5kZXggJiYgdGhpcy5zdHJpbmdNYXRjaGVzKENNSUVsZW1lbnQsXG4gICAgICAgICdjbWlcXFxcLmludGVyYWN0aW9uc1xcXFwuXFxcXGQrXFxcXC5vYmplY3RpdmVzXFxcXC5cXFxcZCsnKSkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JSW50ZXJhY3Rpb25zT2JqZWN0aXZlc09iamVjdCgpO1xuICAgIH0gZWxzZSBpZiAoIWZvdW5kRmlyc3RJbmRleCAmJlxuICAgICAgICB0aGlzLnN0cmluZ01hdGNoZXMoQ01JRWxlbWVudCwgJ2NtaVxcXFwuaW50ZXJhY3Rpb25zXFxcXC5cXFxcZCsnKSkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JSW50ZXJhY3Rpb25zT2JqZWN0KCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0cmluZ01hdGNoZXMoQ01JRWxlbWVudCxcbiAgICAgICAgJ2NtaVxcXFwuY29tbWVudHNfZnJvbV9sZWFybmVyXFxcXC5cXFxcZCsnKSkge1xuICAgICAgbmV3Q2hpbGQgPSBuZXcgQ01JQ29tbWVudHNPYmplY3QoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RyaW5nTWF0Y2hlcyhDTUlFbGVtZW50LFxuICAgICAgICAnY21pXFxcXC5jb21tZW50c19mcm9tX2xtc1xcXFwuXFxcXGQrJykpIHtcbiAgICAgIG5ld0NoaWxkID0gbmV3IENNSUNvbW1lbnRzT2JqZWN0KHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdDaGlsZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgZm9yIHZhbGlkIHJlc3BvbnNlIHR5cGVzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSByZXNwb25zZV90eXBlXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW50ZXJhY3Rpb25fdHlwZVxuICAgKi9cbiAgY2hlY2tWYWxpZFJlc3BvbnNlVHlwZShyZXNwb25zZV90eXBlLCB2YWx1ZSwgaW50ZXJhY3Rpb25fdHlwZSkge1xuICAgIGxldCBub2RlcyA9IFtdO1xuICAgIGlmIChyZXNwb25zZV90eXBlPy5kZWxpbWl0ZXIpIHtcbiAgICAgIG5vZGVzID0gU3RyaW5nKHZhbHVlKS5zcGxpdChyZXNwb25zZV90eXBlLmRlbGltaXRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGVzWzBdID0gdmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGVzLmxlbmd0aCA+IDAgJiYgbm9kZXMubGVuZ3RoIDw9IHJlc3BvbnNlX3R5cGUubWF4KSB7XG4gICAgICB0aGlzLmNoZWNrQ29ycmVjdFJlc3BvbnNlVmFsdWUoaW50ZXJhY3Rpb25fdHlwZSwgbm9kZXMsIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKG5vZGVzLmxlbmd0aCA+IHJlc3BvbnNlX3R5cGUubWF4KSB7XG4gICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuR0VORVJBTF9TRVRfRkFJTFVSRSxcbiAgICAgICAgICAnRGF0YSBNb2RlbCBFbGVtZW50IFBhdHRlcm4gVG9vIExvbmcnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGZvciBkdXBsaWNhdGUgJ2Nob2ljZScgcmVzcG9uc2VzLlxuICAgKiBAcGFyYW0ge0NNSUludGVyYWN0aW9uc09iamVjdH0gaW50ZXJhY3Rpb25cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqL1xuICBjaGVja0R1cGxpY2F0ZUNob2ljZVJlc3BvbnNlKGludGVyYWN0aW9uLCB2YWx1ZSkge1xuICAgIGNvbnN0IGludGVyYWN0aW9uX2NvdW50ID0gaW50ZXJhY3Rpb24uY29ycmVjdF9yZXNwb25zZXMuX2NvdW50O1xuICAgIGlmIChpbnRlcmFjdGlvbi50eXBlID09PSAnY2hvaWNlJykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcmFjdGlvbl9jb3VudCAmJiB0aGlzLmxhc3RFcnJvckNvZGUgPT09XG4gICAgICAwOyBpKyspIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBpbnRlcmFjdGlvbi5jb3JyZWN0X3Jlc3BvbnNlcy5jaGlsZEFycmF5W2ldO1xuICAgICAgICBpZiAocmVzcG9uc2UucGF0dGVybiA9PT0gdmFsdWUpIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuR0VORVJBTF9TRVRfRkFJTFVSRSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgY29ycmVjdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKi9cbiAgdmFsaWRhdGVDb3JyZWN0UmVzcG9uc2UoQ01JRWxlbWVudCwgdmFsdWUpIHtcbiAgICBjb25zdCBwYXJ0cyA9IENNSUVsZW1lbnQuc3BsaXQoJy4nKTtcbiAgICBjb25zdCBpbmRleCA9IE51bWJlcihwYXJ0c1syXSk7XG4gICAgY29uc3QgcGF0dGVybl9pbmRleCA9IE51bWJlcihwYXJ0c1s0XSk7XG4gICAgY29uc3QgaW50ZXJhY3Rpb24gPSB0aGlzLmNtaS5pbnRlcmFjdGlvbnMuY2hpbGRBcnJheVtpbmRleF07XG5cbiAgICBjb25zdCBpbnRlcmFjdGlvbl9jb3VudCA9IGludGVyYWN0aW9uLmNvcnJlY3RfcmVzcG9uc2VzLl9jb3VudDtcbiAgICB0aGlzLmNoZWNrRHVwbGljYXRlQ2hvaWNlUmVzcG9uc2UoaW50ZXJhY3Rpb24sIHZhbHVlKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlX3R5cGUgPSBjb3JyZWN0X3Jlc3BvbnNlc1tpbnRlcmFjdGlvbi50eXBlXTtcbiAgICBpZiAodHlwZW9mIHJlc3BvbnNlX3R5cGUubGltaXQgPT09ICd1bmRlZmluZWQnIHx8IGludGVyYWN0aW9uX2NvdW50IDw9XG4gICAgICAgIHJlc3BvbnNlX3R5cGUubGltaXQpIHtcbiAgICAgIHRoaXMuY2hlY2tWYWxpZFJlc3BvbnNlVHlwZShyZXNwb25zZV90eXBlLCB2YWx1ZSwgaW50ZXJhY3Rpb24udHlwZSk7XG5cbiAgICAgIGlmICh0aGlzLmxhc3RFcnJvckNvZGUgPT09IDAgJiZcbiAgICAgICAgICAoIXJlc3BvbnNlX3R5cGUuZHVwbGljYXRlIHx8XG4gICAgICAgICAgICAgICF0aGlzLmNoZWNrRHVwbGljYXRlZFBhdHRlcm4oaW50ZXJhY3Rpb24uY29ycmVjdF9yZXNwb25zZXMsXG4gICAgICAgICAgICAgICAgICBwYXR0ZXJuX2luZGV4LCB2YWx1ZSkpIHx8XG4gICAgICAgICAgKHRoaXMubGFzdEVycm9yQ29kZSA9PT0gMCAmJiB2YWx1ZSA9PT0gJycpKSB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmcsIHdlIHdhbnQgdGhlIGludmVyc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmxhc3RFcnJvckNvZGUgPT09IDApIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuR0VORVJBTF9TRVRfRkFJTFVSRSxcbiAgICAgICAgICAgICAgJ0RhdGEgTW9kZWwgRWxlbWVudCBQYXR0ZXJuIEFscmVhZHkgRXhpc3RzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLkdFTkVSQUxfU0VUX0ZBSUxVUkUsXG4gICAgICAgICAgJ0RhdGEgTW9kZWwgRWxlbWVudCBDb2xsZWN0aW9uIExpbWl0IFJlYWNoZWQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIHZhbHVlIGZyb20gdGhlIENNSSBPYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IENNSUVsZW1lbnRcbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldENNSVZhbHVlKENNSUVsZW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5fY29tbW9uR2V0Q01JVmFsdWUoJ0dldFZhbHVlJywgdHJ1ZSwgQ01JRWxlbWVudCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbWVzc2FnZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGVycm9yTnVtYmVyLlxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gZXJyb3JOdW1iZXJcbiAgICogQHBhcmFtIHtib29sZWFufSBkZXRhaWxcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0TG1zRXJyb3JNZXNzYWdlRGV0YWlscyhlcnJvck51bWJlciwgZGV0YWlsKSB7XG4gICAgbGV0IGJhc2ljTWVzc2FnZSA9ICcnO1xuICAgIGxldCBkZXRhaWxNZXNzYWdlID0gJyc7XG5cbiAgICAvLyBTZXQgZXJyb3IgbnVtYmVyIHRvIHN0cmluZyBzaW5jZSBpbmNvbnNpc3RlbnQgZnJvbSBtb2R1bGVzIGlmIHN0cmluZyBvciBudW1iZXJcbiAgICBlcnJvck51bWJlciA9IFN0cmluZyhlcnJvck51bWJlcik7XG4gICAgaWYgKHNjb3JtMjAwNF9jb25zdGFudHMuZXJyb3JfZGVzY3JpcHRpb25zW2Vycm9yTnVtYmVyXSkge1xuICAgICAgYmFzaWNNZXNzYWdlID0gc2Nvcm0yMDA0X2NvbnN0YW50cy5lcnJvcl9kZXNjcmlwdGlvbnNbZXJyb3JOdW1iZXJdLmJhc2ljTWVzc2FnZTtcbiAgICAgIGRldGFpbE1lc3NhZ2UgPSBzY29ybTIwMDRfY29uc3RhbnRzLmVycm9yX2Rlc2NyaXB0aW9uc1tlcnJvck51bWJlcl0uZGV0YWlsTWVzc2FnZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGV0YWlsID8gZGV0YWlsTWVzc2FnZSA6IGJhc2ljTWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0byBzZWUgaWYgYSBjb3JyZWN0X3Jlc3BvbnNlIHZhbHVlIGhhcyBiZWVuIGR1cGxpY2F0ZWRcbiAgICogQHBhcmFtIHtDTUlBcnJheX0gY29ycmVjdF9yZXNwb25zZVxuICAgKiBAcGFyYW0ge251bWJlcn0gY3VycmVudF9pbmRleFxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBjaGVja0R1cGxpY2F0ZWRQYXR0ZXJuID0gKGNvcnJlY3RfcmVzcG9uc2UsIGN1cnJlbnRfaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgY29uc3QgY291bnQgPSBjb3JyZWN0X3Jlc3BvbnNlLl9jb3VudDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50ICYmICFmb3VuZDsgaSsrKSB7XG4gICAgICBpZiAoaSAhPT0gY3VycmVudF9pbmRleCAmJiBjb3JyZWN0X3Jlc3BvbnNlLmNoaWxkQXJyYXlbaV0gPT09IHZhbHVlKSB7XG4gICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvdW5kO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVja3MgZm9yIGEgdmFsaWQgY29ycmVjdF9yZXNwb25zZSB2YWx1ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gaW50ZXJhY3Rpb25fdHlwZVxuICAgKiBAcGFyYW0ge0FycmF5fSBub2Rlc1xuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqL1xuICBjaGVja0NvcnJlY3RSZXNwb25zZVZhbHVlKGludGVyYWN0aW9uX3R5cGUsIG5vZGVzLCB2YWx1ZSkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gY29ycmVjdF9yZXNwb25zZXNbaW50ZXJhY3Rpb25fdHlwZV07XG4gICAgY29uc3QgZm9ybWF0UmVnZXggPSBuZXcgUmVnRXhwKHJlc3BvbnNlLmZvcm1hdCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGggJiYgdGhpcy5sYXN0RXJyb3JDb2RlID09PSAwOyBpKyspIHtcbiAgICAgIGlmIChpbnRlcmFjdGlvbl90eXBlLm1hdGNoKFxuICAgICAgICAgICdeKGZpbGwtaW58bG9uZy1maWxsLWlufG1hdGNoaW5nfHBlcmZvcm1hbmNlfHNlcXVlbmNpbmcpJCcpKSB7XG4gICAgICAgIG5vZGVzW2ldID0gdGhpcy5yZW1vdmVDb3JyZWN0UmVzcG9uc2VQcmVmaXhlcyhub2Rlc1tpXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNwb25zZT8uZGVsaW1pdGVyMikge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSBub2Rlc1tpXS5zcGxpdChyZXNwb25zZS5kZWxpbWl0ZXIyKTtcbiAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICBjb25zdCBtYXRjaGVzID0gdmFsdWVzWzBdLm1hdGNoKGZvcm1hdFJlZ2V4KTtcbiAgICAgICAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENIKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCF2YWx1ZXNbMV0ubWF0Y2gobmV3IFJlZ0V4cChyZXNwb25zZS5mb3JtYXQyKSkpIHtcbiAgICAgICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlRZUEVfTUlTTUFUQ0gpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSBub2Rlc1tpXS5tYXRjaChmb3JtYXRSZWdleCk7XG4gICAgICAgIGlmICgoIW1hdGNoZXMgJiYgdmFsdWUgIT09ICcnKSB8fFxuICAgICAgICAgICAgKCFtYXRjaGVzICYmIGludGVyYWN0aW9uX3R5cGUgPT09ICd0cnVlLWZhbHNlJykpIHtcbiAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGludGVyYWN0aW9uX3R5cGUgPT09ICdudW1lcmljJyAmJiBub2Rlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBpZiAoTnVtYmVyKG5vZGVzWzBdKSA+IE51bWJlcihub2Rlc1sxXSkpIHtcbiAgICAgICAgICAgICAgdGhpcy50aHJvd1NDT1JNRXJyb3Ioc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlRZUEVfTUlTTUFUQ0gpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobm9kZXNbaV0gIT09ICcnICYmIHJlc3BvbnNlLnVuaXF1ZSkge1xuICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGkgJiYgdGhpcy5sYXN0RXJyb3JDb2RlID09PSAwOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZXNbaV0gPT09IG5vZGVzW2pdKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBwcmVmaXhlcyBmcm9tIGNvcnJlY3RfcmVzcG9uc2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5vZGVcbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIHJlbW92ZUNvcnJlY3RSZXNwb25zZVByZWZpeGVzKG5vZGUpIHtcbiAgICBsZXQgc2Vlbk9yZGVyID0gZmFsc2U7XG4gICAgbGV0IHNlZW5DYXNlID0gZmFsc2U7XG4gICAgbGV0IHNlZW5MYW5nID0gZmFsc2U7XG5cbiAgICBjb25zdCBwcmVmaXhSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICdeKHsobGFuZ3xjYXNlX21hdHRlcnN8b3JkZXJfbWF0dGVycyk9KFtefV0rKX0pJyk7XG4gICAgbGV0IG1hdGNoZXMgPSBub2RlLm1hdGNoKHByZWZpeFJlZ2V4KTtcbiAgICBsZXQgbGFuZ01hdGNoZXMgPSBudWxsO1xuICAgIHdoaWxlIChtYXRjaGVzKSB7XG4gICAgICBzd2l0Y2ggKG1hdGNoZXNbMl0pIHtcbiAgICAgICAgY2FzZSAnbGFuZyc6XG4gICAgICAgICAgbGFuZ01hdGNoZXMgPSBub2RlLm1hdGNoKHNjb3JtMjAwNF9yZWdleC5DTUlMYW5nY3IpO1xuICAgICAgICAgIGlmIChsYW5nTWF0Y2hlcykge1xuICAgICAgICAgICAgY29uc3QgbGFuZyA9IGxhbmdNYXRjaGVzWzNdO1xuICAgICAgICAgICAgaWYgKGxhbmcgIT09IHVuZGVmaW5lZCAmJiBsYW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgaWYgKFZhbGlkTGFuZ3VhZ2VzW2xhbmcudG9Mb3dlckNhc2UoKV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENIKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZWVuTGFuZyA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Nhc2VfbWF0dGVycyc6XG4gICAgICAgICAgaWYgKCFzZWVuTGFuZyAmJiAhc2Vlbk9yZGVyICYmICFzZWVuQ2FzZSkge1xuICAgICAgICAgICAgaWYgKG1hdGNoZXNbM10gIT09ICd0cnVlJyAmJiBtYXRjaGVzWzNdICE9PSAnZmFsc2UnKSB7XG4gICAgICAgICAgICAgIHRoaXMudGhyb3dTQ09STUVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENIKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWVuQ2FzZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ29yZGVyX21hdHRlcnMnOlxuICAgICAgICAgIGlmICghc2VlbkNhc2UgJiYgIXNlZW5MYW5nICYmICFzZWVuT3JkZXIpIHtcbiAgICAgICAgICAgIGlmIChtYXRjaGVzWzNdICE9PSAndHJ1ZScgJiYgbWF0Y2hlc1szXSAhPT0gJ2ZhbHNlJykge1xuICAgICAgICAgICAgICB0aGlzLnRocm93U0NPUk1FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2Vlbk9yZGVyID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIG5vZGUgPSBub2RlLnN1YnN0cihtYXRjaGVzWzFdLmxlbmd0aCk7XG4gICAgICBtYXRjaGVzID0gbm9kZS5tYXRjaChwcmVmaXhSZWdleCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgd2hvbGUgQVBJIHdpdGggYW5vdGhlclxuICAgKiBAcGFyYW0ge1Njb3JtMjAwNEFQSX0gbmV3QVBJXG4gICAqL1xuICByZXBsYWNlV2l0aEFub3RoZXJTY29ybUFQSShuZXdBUEkpIHtcbiAgICAvLyBEYXRhIE1vZGVsXG4gICAgdGhpcy5jbWkgPSBuZXdBUEkuY21pO1xuICAgIHRoaXMuYWRsID0gbmV3QVBJLmFkbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGNtaSBvYmplY3QgdG8gdGhlIHByb3BlciBmb3JtYXQgZm9yIExNUyBjb21taXRcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSB0ZXJtaW5hdGVDb21taXRcbiAgICogQHJldHVybiB7b2JqZWN0fEFycmF5fVxuICAgKi9cbiAgcmVuZGVyQ29tbWl0Q01JKHRlcm1pbmF0ZUNvbW1pdDogYm9vbGVhbikge1xuICAgIGNvbnN0IGNtaUV4cG9ydCA9IHRoaXMucmVuZGVyQ01JVG9KU09OT2JqZWN0KCk7XG5cbiAgICBpZiAodGVybWluYXRlQ29tbWl0KSB7XG4gICAgICBjbWlFeHBvcnQuY21pLnRvdGFsX3RpbWUgPSB0aGlzLmNtaS5nZXRDdXJyZW50VG90YWxUaW1lKCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgY29uc3QgZmxhdHRlbmVkID0gVXRpbGl0aWVzLmZsYXR0ZW4oY21pRXhwb3J0KTtcbiAgICBzd2l0Y2ggKHRoaXMuc2V0dGluZ3MuZGF0YUNvbW1pdEZvcm1hdCkge1xuICAgICAgY2FzZSAnZmxhdHRlbmVkJzpcbiAgICAgICAgcmV0dXJuIFV0aWxpdGllcy5mbGF0dGVuKGNtaUV4cG9ydCk7XG4gICAgICBjYXNlICdwYXJhbXMnOlxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gaW4gZmxhdHRlbmVkKSB7XG4gICAgICAgICAgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwoZmxhdHRlbmVkLCBpdGVtKSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goYCR7aXRlbX09JHtmbGF0dGVuZWRbaXRlbV19YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICBjYXNlICdqc29uJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBjbWlFeHBvcnQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIHN0b3JlIHRoZSBkYXRhIHRvIHRoZSBMTVNcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSB0ZXJtaW5hdGVDb21taXRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgc3RvcmVEYXRhKHRlcm1pbmF0ZUNvbW1pdDogYm9vbGVhbikge1xuICAgIGlmICh0ZXJtaW5hdGVDb21taXQpIHtcbiAgICAgIGlmICh0aGlzLmNtaS5tb2RlID09PSAnbm9ybWFsJykge1xuICAgICAgICBpZiAodGhpcy5jbWkuY3JlZGl0ID09PSAnY3JlZGl0Jykge1xuICAgICAgICAgIGlmICh0aGlzLmNtaS5jb21wbGV0aW9uX3RocmVzaG9sZCAmJiB0aGlzLmNtaS5wcm9ncmVzc19tZWFzdXJlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jbWkucHJvZ3Jlc3NfbWVhc3VyZSA+PSB0aGlzLmNtaS5jb21wbGV0aW9uX3RocmVzaG9sZCkge1xuICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdTZXR0aW5nIENvbXBsZXRpb24gU3RhdHVzOiBDb21wbGV0ZWQnKTtcbiAgICAgICAgICAgICAgdGhpcy5jbWkuY29tcGxldGlvbl9zdGF0dXMgPSAnY29tcGxldGVkJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1NldHRpbmcgQ29tcGxldGlvbiBTdGF0dXM6IEluY29tcGxldGUnKTtcbiAgICAgICAgICAgICAgdGhpcy5jbWkuY29tcGxldGlvbl9zdGF0dXMgPSAnaW5jb21wbGV0ZSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLmNtaS5zY2FsZWRfcGFzc2luZ19zY29yZSAmJiB0aGlzLmNtaS5zY29yZS5zY2FsZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNtaS5zY29yZS5zY2FsZWQgPj0gdGhpcy5jbWkuc2NhbGVkX3Bhc3Npbmdfc2NvcmUpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygnU2V0dGluZyBTdWNjZXNzIFN0YXR1czogUGFzc2VkJyk7XG4gICAgICAgICAgICAgIHRoaXMuY21pLnN1Y2Nlc3Nfc3RhdHVzID0gJ3Bhc3NlZCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdTZXR0aW5nIFN1Y2Nlc3MgU3RhdHVzOiBGYWlsZWQnKTtcbiAgICAgICAgICAgICAgdGhpcy5jbWkuc3VjY2Vzc19zdGF0dXMgPSAnZmFpbGVkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgbmF2UmVxdWVzdCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmFkbC5uYXYucmVxdWVzdCAhPT0gKHRoaXMuc3RhcnRpbmdEYXRhPy5hZGw/Lm5hdj8ucmVxdWVzdCkgJiZcbiAgICAgICAgdGhpcy5hZGwubmF2LnJlcXVlc3QgIT09ICdfbm9uZV8nKSB7XG4gICAgICB0aGlzLmFkbC5uYXYucmVxdWVzdCA9IGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmFkbC5uYXYucmVxdWVzdCk7XG4gICAgICBuYXZSZXF1ZXN0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21taXRPYmplY3QgPSB0aGlzLnJlbmRlckNvbW1pdENNSSh0ZXJtaW5hdGVDb21taXQgfHxcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5hbHdheXNTZW5kVG90YWxUaW1lKTtcblxuICAgIGlmICh0aGlzLmFwaUxvZ0xldmVsID09PSBnbG9iYWxfY29uc3RhbnRzLkxPR19MRVZFTF9ERUJVRykge1xuICAgICAgY29uc29sZS5kZWJ1ZygnQ29tbWl0ICh0ZXJtaW5hdGVkOiAnICtcbiAgICAgICAgICAgICh0ZXJtaW5hdGVDb21taXQgPyAneWVzJyA6ICdubycpICsgJyk6ICcpO1xuICAgICAgY29uc29sZS5kZWJ1Zyhjb21taXRPYmplY3QpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5sbXNDb21taXRVcmwpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucHJvY2Vzc0h0dHBSZXF1ZXN0KHRoaXMuc2V0dGluZ3MubG1zQ29tbWl0VXJsLFxuICAgICAgICAgIGNvbW1pdE9iamVjdCwgdGVybWluYXRlQ29tbWl0KTtcblxuICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBhIHNlcXVlbmNpbmcgY2FsbCwgYW5kIHRoZW4gY2FsbCB0aGUgbmVjZXNzYXJ5IEpTXG4gICAgICB7XG4gICAgICAgIGlmIChuYXZSZXF1ZXN0ICYmIHJlc3VsdC5uYXZSZXF1ZXN0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHJlc3VsdC5uYXZSZXF1ZXN0ICE9PSAnJykge1xuICAgICAgICAgIEZ1bmN0aW9uKGBcInVzZSBzdHJpY3RcIjsoKCkgPT4geyAke3Jlc3VsdC5uYXZSZXF1ZXN0fSB9KSgpYCkoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdsb2JhbF9jb25zdGFudHMuU0NPUk1fVFJVRTtcbiAgICB9XG4gIH1cbn1cbiIsIi8vIEBmbG93XG5pbXBvcnQgQVBJQ29uc3RhbnRzIGZyb20gJy4uL2NvbnN0YW50cy9hcGlfY29uc3RhbnRzJztcbmltcG9ydCBFcnJvckNvZGVzIGZyb20gJy4uL2NvbnN0YW50cy9lcnJvcl9jb2Rlcyc7XG5pbXBvcnQgUmVnZXggZnJvbSAnLi4vY29uc3RhbnRzL3JlZ2V4JztcblxuY29uc3Qgc2Nvcm0xMl9jb25zdGFudHMgPSBBUElDb25zdGFudHMuc2Nvcm0xMjtcbmNvbnN0IHNjb3JtMTJfcmVnZXggPSBSZWdleC5zY29ybTEyO1xuY29uc3Qgc2Nvcm0xMl9lcnJvcl9jb2RlcyA9IEVycm9yQ29kZXMuc2Nvcm0xMjtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgdmFsdWUgbWF0Y2hlcyB0aGUgcHJvcGVyIGZvcm1hdC4gSWYgbm90LCB0aHJvdyBwcm9wZXIgZXJyb3IgY29kZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWdleFBhdHRlcm5cbiAqIEBwYXJhbSB7bnVtYmVyfSBlcnJvckNvZGVcbiAqIEBwYXJhbSB7Y2xhc3N9IGVycm9yQ2xhc3NcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dFbXB0eVN0cmluZ1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrVmFsaWRGb3JtYXQoXG4gICAgdmFsdWU6IFN0cmluZyxcbiAgICByZWdleFBhdHRlcm46IFN0cmluZyxcbiAgICBlcnJvckNvZGU6IG51bWJlcixcbiAgICBlcnJvckNsYXNzOiBmdW5jdGlvbixcbiAgICBhbGxvd0VtcHR5U3RyaW5nPzogYm9vbGVhbikge1xuICBjb25zdCBmb3JtYXRSZWdleCA9IG5ldyBSZWdFeHAocmVnZXhQYXR0ZXJuKTtcbiAgY29uc3QgbWF0Y2hlcyA9IHZhbHVlLm1hdGNoKGZvcm1hdFJlZ2V4KTtcbiAgaWYgKGFsbG93RW1wdHlTdHJpbmcgJiYgdmFsdWUgPT09ICcnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgIW1hdGNoZXMgfHwgbWF0Y2hlc1swXSA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IoZXJyb3JDb2RlKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgdmFsdWUgbWF0Y2hlcyB0aGUgcHJvcGVyIHJhbmdlLiBJZiBub3QsIHRocm93IHByb3BlciBlcnJvciBjb2RlLlxuICpcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSByYW5nZVBhdHRlcm5cbiAqIEBwYXJhbSB7bnVtYmVyfSBlcnJvckNvZGVcbiAqIEBwYXJhbSB7Y2xhc3N9IGVycm9yQ2xhc3NcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1ZhbGlkUmFuZ2UoXG4gICAgdmFsdWU6IGFueSxcbiAgICByYW5nZVBhdHRlcm46IFN0cmluZyxcbiAgICBlcnJvckNvZGU6IG51bWJlcixcbiAgICBlcnJvckNsYXNzOiBmdW5jdGlvbikge1xuICBjb25zdCByYW5nZXMgPSByYW5nZVBhdHRlcm4uc3BsaXQoJyMnKTtcbiAgdmFsdWUgPSB2YWx1ZSAqIDEuMDtcbiAgaWYgKHZhbHVlID49IHJhbmdlc1swXSkge1xuICAgIGlmICgocmFuZ2VzWzFdID09PSAnKicpIHx8ICh2YWx1ZSA8PSByYW5nZXNbMV0pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IGVycm9yQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yKGVycm9yQ29kZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBlcnJvckNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvcihlcnJvckNvZGUpO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgQVBJIGNtaSBvYmplY3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlQ01JIHtcbiAganNvblN0cmluZyA9IGZhbHNlO1xuICAjaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgI3N0YXJ0X3RpbWU7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBCYXNlQ01JLCBqdXN0IG1hcmtzIHRoZSBjbGFzcyBhcyBhYnN0cmFjdFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKG5ldy50YXJnZXQgPT09IEJhc2VDTUkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjb25zdHJ1Y3QgQmFzZUNNSSBpbnN0YW5jZXMgZGlyZWN0bHknKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjaW5pdGlhbGl6ZWRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGdldCBpbml0aWFsaXplZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jaW5pdGlhbGl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc3RhcnRfdGltZVxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAqL1xuICBnZXQgc3RhcnRfdGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jc3RhcnRfdGltZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgQVBJIGhhcyBiZWVuIGluaXRpYWxpemVkIGFmdGVyIHRoZSBDTUkgaGFzIGJlZW4gY3JlYXRlZFxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICB0aGlzLiNpbml0aWFsaXplZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsYXllciBzaG91bGQgb3ZlcnJpZGUgdGhlICdzZXNzaW9uX3RpbWUnIHByb3ZpZGVkIGJ5XG4gICAqIHRoZSBtb2R1bGVcbiAgICovXG4gIHNldFN0YXJ0VGltZSgpIHtcbiAgICB0aGlzLiNzdGFydF90aW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBjbWkgKi5zY29yZSBvYmplY3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlTY29yZSBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yICouc2NvcmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjb3JlX2NoaWxkcmVuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY29yZV9yYW5nZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF4XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbnZhbGlkRXJyb3JDb2RlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbnZhbGlkVHlwZUNvZGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGludmFsaWRSYW5nZUNvZGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlY2ltYWxSZWdleFxuICAgKiBAcGFyYW0ge2NsYXNzfSBlcnJvckNsYXNzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICAgIHtcbiAgICAgICAgc2NvcmVfY2hpbGRyZW4sXG4gICAgICAgIHNjb3JlX3JhbmdlLFxuICAgICAgICBtYXgsXG4gICAgICAgIGludmFsaWRFcnJvckNvZGUsXG4gICAgICAgIGludmFsaWRUeXBlQ29kZSxcbiAgICAgICAgaW52YWxpZFJhbmdlQ29kZSxcbiAgICAgICAgZGVjaW1hbFJlZ2V4LFxuICAgICAgICBlcnJvckNsYXNzLFxuICAgICAgfSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLiNfY2hpbGRyZW4gPSBzY29yZV9jaGlsZHJlbiB8fFxuICAgICAgICBzY29ybTEyX2NvbnN0YW50cy5zY29yZV9jaGlsZHJlbjtcbiAgICB0aGlzLiNfc2NvcmVfcmFuZ2UgPSAhc2NvcmVfcmFuZ2UgPyBmYWxzZSA6IHNjb3JtMTJfcmVnZXguc2NvcmVfcmFuZ2U7XG4gICAgdGhpcy4jbWF4ID0gKG1heCB8fCBtYXggPT09ICcnKSA/IG1heCA6ICcxMDAnO1xuICAgIHRoaXMuI19pbnZhbGlkX2Vycm9yX2NvZGUgPSBpbnZhbGlkRXJyb3JDb2RlIHx8XG4gICAgICAgIHNjb3JtMTJfZXJyb3JfY29kZXMuSU5WQUxJRF9TRVRfVkFMVUU7XG4gICAgdGhpcy4jX2ludmFsaWRfdHlwZV9jb2RlID0gaW52YWxpZFR5cGVDb2RlIHx8XG4gICAgICAgIHNjb3JtMTJfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSDtcbiAgICB0aGlzLiNfaW52YWxpZF9yYW5nZV9jb2RlID0gaW52YWxpZFJhbmdlQ29kZSB8fFxuICAgICAgICBzY29ybTEyX2Vycm9yX2NvZGVzLlZBTFVFX09VVF9PRl9SQU5HRTtcbiAgICB0aGlzLiNfZGVjaW1hbF9yZWdleCA9IGRlY2ltYWxSZWdleCB8fFxuICAgICAgICBzY29ybTEyX3JlZ2V4LkNNSURlY2ltYWw7XG4gICAgdGhpcy4jX2Vycm9yX2NsYXNzID0gZXJyb3JDbGFzcztcbiAgfVxuXG4gICNfY2hpbGRyZW47XG4gICNfc2NvcmVfcmFuZ2U7XG4gICNfaW52YWxpZF9lcnJvcl9jb2RlO1xuICAjX2ludmFsaWRfdHlwZV9jb2RlO1xuICAjX2ludmFsaWRfcmFuZ2VfY29kZTtcbiAgI19kZWNpbWFsX3JlZ2V4O1xuICAjX2Vycm9yX2NsYXNzO1xuICAjcmF3ID0gJyc7XG4gICNtaW4gPSAnJztcbiAgI21heDtcblxuICAvKipcbiAgICogR2V0dGVyIGZvciBfY2hpbGRyZW5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0IF9jaGlsZHJlbigpIHtcbiAgICByZXR1cm4gdGhpcy4jX2NoaWxkcmVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgX2NoaWxkcmVuLiBKdXN0IHRocm93cyBhbiBlcnJvci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IF9jaGlsZHJlblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2V0IF9jaGlsZHJlbihfY2hpbGRyZW4pIHtcbiAgICB0aHJvdyBuZXcgdGhpcy4jX2Vycm9yX2NsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcih0aGlzLiNfaW52YWxpZF9lcnJvcl9jb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNyYXdcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHJhdygpIHtcbiAgICByZXR1cm4gdGhpcy4jcmF3O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3Jhd1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcmF3XG4gICAqL1xuICBzZXQgcmF3KHJhdykge1xuICAgIGlmIChjaGVja1ZhbGlkRm9ybWF0KHJhdywgdGhpcy4jX2RlY2ltYWxfcmVnZXgsIHRoaXMuI19pbnZhbGlkX3R5cGVfY29kZSwgdGhpcy4jX2Vycm9yX2NsYXNzKSAmJlxuICAgICAgICAoIXRoaXMuI19zY29yZV9yYW5nZSB8fFxuICAgICAgICAgICAgY2hlY2tWYWxpZFJhbmdlKHJhdywgdGhpcy4jX3Njb3JlX3JhbmdlLCB0aGlzLiNfaW52YWxpZF9yYW5nZV9jb2RlLCB0aGlzLiNfZXJyb3JfY2xhc3MpKSkge1xuICAgICAgdGhpcy4jcmF3ID0gcmF3O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNtaW5cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG1pbigpIHtcbiAgICByZXR1cm4gdGhpcy4jbWluO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI21pblxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWluXG4gICAqL1xuICBzZXQgbWluKG1pbikge1xuICAgIGlmIChjaGVja1ZhbGlkRm9ybWF0KG1pbiwgdGhpcy4jX2RlY2ltYWxfcmVnZXgsIHRoaXMuI19pbnZhbGlkX3R5cGVfY29kZSwgdGhpcy4jX2Vycm9yX2NsYXNzKSAmJlxuICAgICAgICAoIXRoaXMuI19zY29yZV9yYW5nZSB8fFxuICAgICAgICAgICAgY2hlY2tWYWxpZFJhbmdlKG1pbiwgdGhpcy4jX3Njb3JlX3JhbmdlLCB0aGlzLiNfaW52YWxpZF9yYW5nZV9jb2RlLCB0aGlzLiNfZXJyb3JfY2xhc3MpKSkge1xuICAgICAgdGhpcy4jbWluID0gbWluO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNtYXhcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG1heCgpIHtcbiAgICByZXR1cm4gdGhpcy4jbWF4O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI21heFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF4XG4gICAqL1xuICBzZXQgbWF4KG1heCkge1xuICAgIGlmIChjaGVja1ZhbGlkRm9ybWF0KG1heCwgdGhpcy4jX2RlY2ltYWxfcmVnZXgsIHRoaXMuI19pbnZhbGlkX3R5cGVfY29kZSwgdGhpcy4jX2Vycm9yX2NsYXNzKSAmJlxuICAgICAgICAoIXRoaXMuI19zY29yZV9yYW5nZSB8fFxuICAgICAgICAgICAgY2hlY2tWYWxpZFJhbmdlKG1heCwgdGhpcy4jX3Njb3JlX3JhbmdlLCB0aGlzLiNfaW52YWxpZF9yYW5nZV9jb2RlLCB0aGlzLiNfZXJyb3JfY2xhc3MpKSkge1xuICAgICAgdGhpcy4jbWF4ID0gbWF4O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yICouc2NvcmVcbiAgICogQHJldHVybiB7e21pbjogc3RyaW5nLCBtYXg6IHN0cmluZywgcmF3OiBzdHJpbmd9fVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ3Jhdyc6IHRoaXMucmF3LFxuICAgICAgJ21pbic6IHRoaXMubWluLFxuICAgICAgJ21heCc6IHRoaXMubWF4LFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgY21pICoubiBvYmplY3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlBcnJheSBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgY21pICoubiBhcnJheXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoaWxkcmVuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBlcnJvckNvZGVcbiAgICogQHBhcmFtIHtjbGFzc30gZXJyb3JDbGFzc1xuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NoaWxkcmVuLCBlcnJvckNvZGUsIGVycm9yQ2xhc3N9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLiNfY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICB0aGlzLiNlcnJvckNvZGUgPSBlcnJvckNvZGU7XG4gICAgdGhpcy4jZXJyb3JDbGFzcyA9IGVycm9yQ2xhc3M7XG4gICAgdGhpcy5jaGlsZEFycmF5ID0gW107XG4gIH1cblxuICAjZXJyb3JDb2RlO1xuICAjZXJyb3JDbGFzcztcbiAgI19jaGlsZHJlbjtcblxuICAvKipcbiAgICogR2V0dGVyIGZvciBfY2hpbGRyZW5cbiAgICogQHJldHVybiB7Kn1cbiAgICovXG4gIGdldCBfY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI19jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yIF9jaGlsZHJlbi4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfY2hpbGRyZW5cbiAgICovXG4gIHNldCBfY2hpbGRyZW4oX2NoaWxkcmVuKSB7XG4gICAgdGhyb3cgbmV3IHRoaXMuI2Vycm9yQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yKHRoaXMuI2Vycm9yQ29kZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciBfY291bnRcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IF9jb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZEFycmF5Lmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yIF9jb3VudC4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBfY291bnRcbiAgICovXG4gIHNldCBfY291bnQoX2NvdW50KSB7XG4gICAgdGhyb3cgbmV3IHRoaXMuI2Vycm9yQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yKHRoaXMuI2Vycm9yQ29kZSk7XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciAqLm4gYXJyYXlzXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHRbaSArICcnXSA9IHRoaXMuY2hpbGRBcnJheVtpXTtcbiAgICB9XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvLyBAZmxvd1xuaW1wb3J0IHtcbiAgQmFzZUNNSSxcbiAgY2hlY2tWYWxpZEZvcm1hdCxcbiAgY2hlY2tWYWxpZFJhbmdlLFxuICBDTUlBcnJheSxcbiAgQ01JU2NvcmUsXG59IGZyb20gJy4vY29tbW9uJztcbmltcG9ydCBBUElDb25zdGFudHMgZnJvbSAnLi4vY29uc3RhbnRzL2FwaV9jb25zdGFudHMnO1xuaW1wb3J0IFJlZ2V4IGZyb20gJy4uL2NvbnN0YW50cy9yZWdleCc7XG5pbXBvcnQgRXJyb3JDb2RlcyBmcm9tICcuLi9jb25zdGFudHMvZXJyb3JfY29kZXMnO1xuaW1wb3J0IFJlc3BvbnNlcyBmcm9tICcuLi9jb25zdGFudHMvcmVzcG9uc2VfY29uc3RhbnRzJztcbmltcG9ydCB7U2Nvcm0yMDA0VmFsaWRhdGlvbkVycm9yfSBmcm9tICcuLi9leGNlcHRpb25zJztcbmltcG9ydCAqIGFzIFV0aWwgZnJvbSAnLi4vdXRpbGl0aWVzJztcblxuY29uc3Qgc2Nvcm0yMDA0X2NvbnN0YW50cyA9IEFQSUNvbnN0YW50cy5zY29ybTIwMDQ7XG5jb25zdCBzY29ybTIwMDRfZXJyb3JfY29kZXMgPSBFcnJvckNvZGVzLnNjb3JtMjAwNDtcbmNvbnN0IGxlYXJuZXJfcmVzcG9uc2VzID0gUmVzcG9uc2VzLmxlYXJuZXI7XG5cbmNvbnN0IHNjb3JtMjAwNF9yZWdleCA9IFJlZ2V4LnNjb3JtMjAwNDtcblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kIGZvciB0aHJvd2luZyBSZWFkIE9ubHkgZXJyb3JcbiAqL1xuZnVuY3Rpb24gdGhyb3dSZWFkT25seUVycm9yKCkge1xuICB0aHJvdyBuZXcgU2Nvcm0yMDA0VmFsaWRhdGlvbkVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5SRUFEX09OTFlfRUxFTUVOVCk7XG59XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCBmb3IgdGhyb3dpbmcgV3JpdGUgT25seSBlcnJvclxuICovXG5mdW5jdGlvbiB0aHJvd1dyaXRlT25seUVycm9yKCkge1xuICB0aHJvdyBuZXcgU2Nvcm0yMDA0VmFsaWRhdGlvbkVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5XUklURV9PTkxZX0VMRU1FTlQpO1xufVxuXG4vKipcbiAqIEhlbHBlciBtZXRob2QgZm9yIHRocm93aW5nIFR5cGUgTWlzbWF0Y2ggZXJyb3JcbiAqL1xuZnVuY3Rpb24gdGhyb3dUeXBlTWlzbWF0Y2hFcnJvcigpIHtcbiAgdGhyb3cgbmV3IFNjb3JtMjAwNFZhbGlkYXRpb25FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuVFlQRV9NSVNNQVRDSCk7XG59XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCBmb3IgdGhyb3dpbmcgRGVwZW5kZW5jeSBOb3QgRXN0YWJsaXNoZWQgZXJyb3JcbiAqL1xuZnVuY3Rpb24gdGhyb3dEZXBlbmRlbmN5Tm90RXN0YWJsaXNoZWRFcnJvcigpIHtcbiAgdGhyb3cgbmV3IFNjb3JtMjAwNFZhbGlkYXRpb25FcnJvcihzY29ybTIwMDRfZXJyb3JfY29kZXMuREVQRU5ERU5DWV9OT1RfRVNUQUJMSVNIRUQpO1xufVxuXG4vKipcbiAqIEhlbHBlciBtZXRob2QgZm9yIHRocm93aW5nIERlcGVuZGVuY3kgTm90IEVzdGFibGlzaGVkIGVycm9yXG4gKi9cbmZ1bmN0aW9uIHRocm93R2VuZXJhbFNldEVycm9yKCkge1xuICB0aHJvdyBuZXcgU2Nvcm0yMDA0VmFsaWRhdGlvbkVycm9yKHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5HRU5FUkFMX1NFVF9GQUlMVVJFKTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kLCBubyByZWFzb24gdG8gaGF2ZSB0byBwYXNzIHRoZSBzYW1lIGVycm9yIGNvZGVzIGV2ZXJ5IHRpbWVcbiAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWdleFBhdHRlcm5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dFbXB0eVN0cmluZ1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gY2hlY2syMDA0VmFsaWRGb3JtYXQoXG4gICAgdmFsdWU6IFN0cmluZyxcbiAgICByZWdleFBhdHRlcm46IFN0cmluZyxcbiAgICBhbGxvd0VtcHR5U3RyaW5nPzogYm9vbGVhbikge1xuICByZXR1cm4gY2hlY2tWYWxpZEZvcm1hdChcbiAgICAgIHZhbHVlLFxuICAgICAgcmVnZXhQYXR0ZXJuLFxuICAgICAgc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlRZUEVfTUlTTUFUQ0gsXG4gICAgICBTY29ybTIwMDRWYWxpZGF0aW9uRXJyb3IsXG4gICAgICBhbGxvd0VtcHR5U3RyaW5nLFxuICApO1xufVxuXG4vKipcbiAqIEhlbHBlciBtZXRob2QsIG5vIHJlYXNvbiB0byBoYXZlIHRvIHBhc3MgdGhlIHNhbWUgZXJyb3IgY29kZXMgZXZlcnkgdGltZVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IHJhbmdlUGF0dGVyblxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gY2hlY2syMDA0VmFsaWRSYW5nZSh2YWx1ZTogYW55LCByYW5nZVBhdHRlcm46IFN0cmluZykge1xuICByZXR1cm4gY2hlY2tWYWxpZFJhbmdlKFxuICAgICAgdmFsdWUsXG4gICAgICByYW5nZVBhdHRlcm4sXG4gICAgICBzY29ybTIwMDRfZXJyb3JfY29kZXMuVkFMVUVfT1VUX09GX1JBTkdFLFxuICAgICAgU2Nvcm0yMDA0VmFsaWRhdGlvbkVycm9yLFxuICApO1xufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBjbWkgb2JqZWN0IGZvciBTQ09STSAyMDA0XG4gKi9cbmV4cG9ydCBjbGFzcyBDTUkgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciB0aGUgU0NPUk0gMjAwNCBjbWkgb2JqZWN0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5pdGlhbGl6ZWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKGluaXRpYWxpemVkOiBib29sZWFuKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMubGVhcm5lcl9wcmVmZXJlbmNlID0gbmV3IENNSUxlYXJuZXJQcmVmZXJlbmNlKCk7XG4gICAgdGhpcy5zY29yZSA9IG5ldyBTY29ybTIwMDRDTUlTY29yZSgpO1xuICAgIHRoaXMuY29tbWVudHNfZnJvbV9sZWFybmVyID0gbmV3IENNSUNvbW1lbnRzRnJvbUxlYXJuZXIoKTtcbiAgICB0aGlzLmNvbW1lbnRzX2Zyb21fbG1zID0gbmV3IENNSUNvbW1lbnRzRnJvbUxNUygpO1xuICAgIHRoaXMuaW50ZXJhY3Rpb25zID0gbmV3IENNSUludGVyYWN0aW9ucygpO1xuICAgIHRoaXMub2JqZWN0aXZlcyA9IG5ldyBDTUlPYmplY3RpdmVzKCk7XG5cbiAgICBpZiAoaW5pdGlhbGl6ZWQpIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgI192ZXJzaW9uID0gJzEuMCc7XG4gICNfY2hpbGRyZW4gPSBzY29ybTIwMDRfY29uc3RhbnRzLmNtaV9jaGlsZHJlbjtcbiAgI2NvbXBsZXRpb25fc3RhdHVzID0gJ3Vua25vd24nO1xuICAjY29tcGxldGlvbl90aHJlc2hvbGQgPSAnJztcbiAgI2NyZWRpdCA9ICdjcmVkaXQnO1xuICAjZW50cnkgPSAnJztcbiAgI2V4aXQgPSAnJztcbiAgI2xhdW5jaF9kYXRhID0gJyc7XG4gICNsZWFybmVyX2lkID0gJyc7XG4gICNsZWFybmVyX25hbWUgPSAnJztcbiAgI2xvY2F0aW9uID0gJyc7XG4gICNtYXhfdGltZV9hbGxvd2VkID0gJyc7XG4gICNtb2RlID0gJ25vcm1hbCc7XG4gICNwcm9ncmVzc19tZWFzdXJlID0gJyc7XG4gICNzY2FsZWRfcGFzc2luZ19zY29yZSA9ICcnO1xuICAjc2Vzc2lvbl90aW1lID0gJ1BUMEgwTTBTJztcbiAgI3N1Y2Nlc3Nfc3RhdHVzID0gJ3Vua25vd24nO1xuICAjc3VzcGVuZF9kYXRhID0gJyc7XG4gICN0aW1lX2xpbWl0X2FjdGlvbiA9ICdjb250aW51ZSxubyBtZXNzYWdlJztcbiAgI3RvdGFsX3RpbWUgPSAnJztcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZCBhZnRlciB0aGUgQ01JIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIGluaXRpYWxpemUoKSB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMubGVhcm5lcl9wcmVmZXJlbmNlPy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5zY29yZT8uaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuY29tbWVudHNfZnJvbV9sZWFybmVyPy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5jb21tZW50c19mcm9tX2xtcz8uaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuaW50ZXJhY3Rpb25zPy5pbml0aWFsaXplKCk7XG4gICAgdGhpcy5vYmplY3RpdmVzPy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjX3ZlcnNpb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0IF92ZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNfdmVyc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNfdmVyc2lvbi4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBfdmVyc2lvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2V0IF92ZXJzaW9uKF92ZXJzaW9uKSB7XG4gICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjX2NoaWxkcmVuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldCBfY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI19jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNfY2hpbGRyZW4uIEp1c3QgdGhyb3dzIGFuIGVycm9yLlxuICAgKiBAcGFyYW0ge251bWJlcn0gX2NoaWxkcmVuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZXQgX2NoaWxkcmVuKF9jaGlsZHJlbikge1xuICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2NvbXBsZXRpb25fc3RhdHVzXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBjb21wbGV0aW9uX3N0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy4jY29tcGxldGlvbl9zdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjY29tcGxldGlvbl9zdGF0dXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbXBsZXRpb25fc3RhdHVzXG4gICAqL1xuICBzZXQgY29tcGxldGlvbl9zdGF0dXMoY29tcGxldGlvbl9zdGF0dXMpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoY29tcGxldGlvbl9zdGF0dXMsIHNjb3JtMjAwNF9yZWdleC5DTUlDU3RhdHVzKSkge1xuICAgICAgdGhpcy4jY29tcGxldGlvbl9zdGF0dXMgPSBjb21wbGV0aW9uX3N0YXR1cztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjY29tcGxldGlvbl90aHJlc2hvbGRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGNvbXBsZXRpb25fdGhyZXNob2xkKCkge1xuICAgIHJldHVybiB0aGlzLiNjb21wbGV0aW9uX3RocmVzaG9sZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNjb21wbGV0aW9uX3RocmVzaG9sZC4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb21wbGV0aW9uX3RocmVzaG9sZFxuICAgKi9cbiAgc2V0IGNvbXBsZXRpb25fdGhyZXNob2xkKGNvbXBsZXRpb25fdGhyZXNob2xkKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgP1xuICAgICAgdGhpcy4jY29tcGxldGlvbl90aHJlc2hvbGQgPSBjb21wbGV0aW9uX3RocmVzaG9sZCA6XG4gICAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNjcmVkaXRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGNyZWRpdCgpIHtcbiAgICByZXR1cm4gdGhpcy4jY3JlZGl0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2NyZWRpdC4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjcmVkaXRcbiAgICovXG4gIHNldCBjcmVkaXQoY3JlZGl0KSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgPyB0aGlzLiNjcmVkaXQgPSBjcmVkaXQgOiB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNlbnRyeVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZW50cnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2VudHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2VudHJ5LiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGVudHJ5XG4gICAqL1xuICBzZXQgZW50cnkoZW50cnkpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/IHRoaXMuI2VudHJ5ID0gZW50cnkgOiB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNleGl0LiBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIEpTT04gZXhwb3J0LlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZXhpdCgpIHtcbiAgICByZXR1cm4gKCF0aGlzLmpzb25TdHJpbmcpID8gdGhyb3dXcml0ZU9ubHlFcnJvcigpIDogdGhpcy4jZXhpdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNleGl0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleGl0XG4gICAqL1xuICBzZXQgZXhpdChleGl0KSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGV4aXQsIHNjb3JtMjAwNF9yZWdleC5DTUlFeGl0LCB0cnVlKSkge1xuICAgICAgdGhpcy4jZXhpdCA9IGV4aXQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xhdW5jaF9kYXRhXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsYXVuY2hfZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy4jbGF1bmNoX2RhdGE7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbGF1bmNoX2RhdGEuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGF1bmNoX2RhdGFcbiAgICovXG4gIHNldCBsYXVuY2hfZGF0YShsYXVuY2hfZGF0YSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID8gdGhpcy4jbGF1bmNoX2RhdGEgPSBsYXVuY2hfZGF0YSA6IHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xlYXJuZXJfaWRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxlYXJuZXJfaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2xlYXJuZXJfaWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbGVhcm5lcl9pZC4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsZWFybmVyX2lkXG4gICAqL1xuICBzZXQgbGVhcm5lcl9pZChsZWFybmVyX2lkKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgPyB0aGlzLiNsZWFybmVyX2lkID0gbGVhcm5lcl9pZCA6IHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xlYXJuZXJfbmFtZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbGVhcm5lcl9uYW1lKCkge1xuICAgIHJldHVybiB0aGlzLiNsZWFybmVyX25hbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbGVhcm5lcl9uYW1lLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxlYXJuZXJfbmFtZVxuICAgKi9cbiAgc2V0IGxlYXJuZXJfbmFtZShsZWFybmVyX25hbWUpIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICB0aGlzLiNsZWFybmVyX25hbWUgPSBsZWFybmVyX25hbWUgOlxuICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbG9jYXRpb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxvY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLiNsb2NhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsb2NhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb25cbiAgICovXG4gIHNldCBsb2NhdGlvbihsb2NhdGlvbikge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChsb2NhdGlvbiwgc2Nvcm0yMDA0X3JlZ2V4LkNNSVN0cmluZzEwMDApKSB7XG4gICAgICB0aGlzLiNsb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNtYXhfdGltZV9hbGxvd2VkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBtYXhfdGltZV9hbGxvd2VkKCkge1xuICAgIHJldHVybiB0aGlzLiNtYXhfdGltZV9hbGxvd2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI21heF90aW1lX2FsbG93ZWQuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF4X3RpbWVfYWxsb3dlZFxuICAgKi9cbiAgc2V0IG1heF90aW1lX2FsbG93ZWQobWF4X3RpbWVfYWxsb3dlZCkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgIHRoaXMuI21heF90aW1lX2FsbG93ZWQgPSBtYXhfdGltZV9hbGxvd2VkIDpcbiAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI21vZGVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IG1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI21vZGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbW9kZS4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlXG4gICAqL1xuICBzZXQgbW9kZShtb2RlKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgPyB0aGlzLiNtb2RlID0gbW9kZSA6IHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3Byb2dyZXNzX21lYXN1cmVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHByb2dyZXNzX21lYXN1cmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Byb2dyZXNzX21lYXN1cmU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjcHJvZ3Jlc3NfbWVhc3VyZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvZ3Jlc3NfbWVhc3VyZVxuICAgKi9cbiAgc2V0IHByb2dyZXNzX21lYXN1cmUocHJvZ3Jlc3NfbWVhc3VyZSkge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChwcm9ncmVzc19tZWFzdXJlLCBzY29ybTIwMDRfcmVnZXguQ01JRGVjaW1hbCkgJiZcbiAgICAgIGNoZWNrMjAwNFZhbGlkUmFuZ2UocHJvZ3Jlc3NfbWVhc3VyZSwgc2Nvcm0yMDA0X3JlZ2V4LnByb2dyZXNzX3JhbmdlKSkge1xuICAgICAgdGhpcy4jcHJvZ3Jlc3NfbWVhc3VyZSA9IHByb2dyZXNzX21lYXN1cmU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3NjYWxlZF9wYXNzaW5nX3Njb3JlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBzY2FsZWRfcGFzc2luZ19zY29yZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jc2NhbGVkX3Bhc3Npbmdfc2NvcmU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc2NhbGVkX3Bhc3Npbmdfc2NvcmUuIENhbiBvbmx5IGJlIGNhbGxlZCBiZWZvcmUgIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NhbGVkX3Bhc3Npbmdfc2NvcmVcbiAgICovXG4gIHNldCBzY2FsZWRfcGFzc2luZ19zY29yZShzY2FsZWRfcGFzc2luZ19zY29yZSkge1xuICAgICF0aGlzLmluaXRpYWxpemVkID9cbiAgICAgIHRoaXMuI3NjYWxlZF9wYXNzaW5nX3Njb3JlID0gc2NhbGVkX3Bhc3Npbmdfc2NvcmUgOlxuICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc2Vzc2lvbl90aW1lLiBTaG91bGQgb25seSBiZSBjYWxsZWQgZHVyaW5nIEpTT04gZXhwb3J0LlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgc2Vzc2lvbl90aW1lKCkge1xuICAgIHJldHVybiAoIXRoaXMuanNvblN0cmluZykgPyB0aHJvd1dyaXRlT25seUVycm9yKCkgOiB0aGlzLiNzZXNzaW9uX3RpbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc2Vzc2lvbl90aW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXNzaW9uX3RpbWVcbiAgICovXG4gIHNldCBzZXNzaW9uX3RpbWUoc2Vzc2lvbl90aW1lKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KHNlc3Npb25fdGltZSwgc2Nvcm0yMDA0X3JlZ2V4LkNNSVRpbWVzcGFuKSkge1xuICAgICAgdGhpcy4jc2Vzc2lvbl90aW1lID0gc2Vzc2lvbl90aW1lO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNzdWNjZXNzX3N0YXR1c1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgc3VjY2Vzc19zdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N1Y2Nlc3Nfc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3N1Y2Nlc3Nfc3RhdHVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWNjZXNzX3N0YXR1c1xuICAgKi9cbiAgc2V0IHN1Y2Nlc3Nfc3RhdHVzKHN1Y2Nlc3Nfc3RhdHVzKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KHN1Y2Nlc3Nfc3RhdHVzLCBzY29ybTIwMDRfcmVnZXguQ01JU1N0YXR1cykpIHtcbiAgICAgIHRoaXMuI3N1Y2Nlc3Nfc3RhdHVzID0gc3VjY2Vzc19zdGF0dXM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3N1c3BlbmRfZGF0YVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgc3VzcGVuZF9kYXRhKCkge1xuICAgIHJldHVybiB0aGlzLiNzdXNwZW5kX2RhdGE7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc3VzcGVuZF9kYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdXNwZW5kX2RhdGFcbiAgICovXG4gIHNldCBzdXNwZW5kX2RhdGEoc3VzcGVuZF9kYXRhKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KHN1c3BlbmRfZGF0YSwgc2Nvcm0yMDA0X3JlZ2V4LkNNSVN0cmluZzY0MDAwLFxuICAgICAgICB0cnVlKSkge1xuICAgICAgdGhpcy4jc3VzcGVuZF9kYXRhID0gc3VzcGVuZF9kYXRhO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0aW1lX2xpbWl0X2FjdGlvblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgdGltZV9saW1pdF9hY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RpbWVfbGltaXRfYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3RpbWVfbGltaXRfYWN0aW9uLiBDYW4gb25seSBiZSBjYWxsZWQgYmVmb3JlICBpbml0aWFsaXphdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWVfbGltaXRfYWN0aW9uXG4gICAqL1xuICBzZXQgdGltZV9saW1pdF9hY3Rpb24odGltZV9saW1pdF9hY3Rpb24pIHtcbiAgICAhdGhpcy5pbml0aWFsaXplZCA/XG4gICAgICB0aGlzLiN0aW1lX2xpbWl0X2FjdGlvbiA9IHRpbWVfbGltaXRfYWN0aW9uIDpcbiAgICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3RvdGFsX3RpbWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHRvdGFsX3RpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RvdGFsX3RpbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjdG90YWxfdGltZS4gQ2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSAgaW5pdGlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b3RhbF90aW1lXG4gICAqL1xuICBzZXQgdG90YWxfdGltZSh0b3RhbF90aW1lKSB7XG4gICAgIXRoaXMuaW5pdGlhbGl6ZWQgPyB0aGlzLiN0b3RhbF90aW1lID0gdG90YWxfdGltZSA6IHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiB0aW1lIHRvIHRoZSBleGlzdGluZyB0b3RhbCB0aW1lLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IElTTzg2MDEgRHVyYXRpb25cbiAgICovXG4gIGdldEN1cnJlbnRUb3RhbFRpbWUoKSB7XG4gICAgbGV0IHNlc3Npb25UaW1lID0gdGhpcy4jc2Vzc2lvbl90aW1lO1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IHRoaXMuc3RhcnRfdGltZTtcblxuICAgIGlmICh0eXBlb2Ygc3RhcnRUaW1lICE9PSAndW5kZWZpbmVkJyAmJiBzdGFydFRpbWUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHNlY29uZHMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0VGltZTtcbiAgICAgIHNlc3Npb25UaW1lID0gVXRpbC5nZXRTZWNvbmRzQXNJU09EdXJhdGlvbihzZWNvbmRzIC8gMTAwMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFV0aWwuYWRkVHdvRHVyYXRpb25zKFxuICAgICAgICB0aGlzLiN0b3RhbF90aW1lLFxuICAgICAgICBzZXNzaW9uVGltZSxcbiAgICAgICAgc2Nvcm0yMDA0X3JlZ2V4LkNNSVRpbWVzcGFuLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWlcbiAgICpcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBjb21tZW50c19mcm9tX2xlYXJuZXI6IENNSUNvbW1lbnRzRnJvbUxlYXJuZXIsXG4gICAqICAgICAgY29tbWVudHNfZnJvbV9sbXM6IENNSUNvbW1lbnRzRnJvbUxNUyxcbiAgICogICAgICBjb21wbGV0aW9uX3N0YXR1czogc3RyaW5nLFxuICAgKiAgICAgIGNvbXBsZXRpb25fdGhyZXNob2xkOiBzdHJpbmcsXG4gICAqICAgICAgY3JlZGl0OiBzdHJpbmcsXG4gICAqICAgICAgZW50cnk6IHN0cmluZyxcbiAgICogICAgICBleGl0OiBzdHJpbmcsXG4gICAqICAgICAgaW50ZXJhY3Rpb25zOiBDTUlJbnRlcmFjdGlvbnMsXG4gICAqICAgICAgbGF1bmNoX2RhdGE6IHN0cmluZyxcbiAgICogICAgICBsZWFybmVyX2lkOiBzdHJpbmcsXG4gICAqICAgICAgbGVhcm5lcl9uYW1lOiBzdHJpbmcsXG4gICAqICAgICAgbGVhcm5lcl9wcmVmZXJlbmNlOiBDTUlMZWFybmVyUHJlZmVyZW5jZSxcbiAgICogICAgICBsb2NhdGlvbjogc3RyaW5nLFxuICAgKiAgICAgIG1heF90aW1lX2FsbG93ZWQ6IHN0cmluZyxcbiAgICogICAgICBtb2RlOiBzdHJpbmcsXG4gICAqICAgICAgb2JqZWN0aXZlczogQ01JT2JqZWN0aXZlcyxcbiAgICogICAgICBwcm9ncmVzc19tZWFzdXJlOiBzdHJpbmcsXG4gICAqICAgICAgc2NhbGVkX3Bhc3Npbmdfc2NvcmU6IHN0cmluZyxcbiAgICogICAgICBzY29yZTogU2Nvcm0yMDA0Q01JU2NvcmUsXG4gICAqICAgICAgc2Vzc2lvbl90aW1lOiBzdHJpbmcsXG4gICAqICAgICAgc3VjY2Vzc19zdGF0dXM6IHN0cmluZyxcbiAgICogICAgICBzdXNwZW5kX2RhdGE6IHN0cmluZyxcbiAgICogICAgICB0aW1lX2xpbWl0X2FjdGlvbjogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdjb21tZW50c19mcm9tX2xlYXJuZXInOiB0aGlzLmNvbW1lbnRzX2Zyb21fbGVhcm5lcixcbiAgICAgICdjb21tZW50c19mcm9tX2xtcyc6IHRoaXMuY29tbWVudHNfZnJvbV9sbXMsXG4gICAgICAnY29tcGxldGlvbl9zdGF0dXMnOiB0aGlzLmNvbXBsZXRpb25fc3RhdHVzLFxuICAgICAgJ2NvbXBsZXRpb25fdGhyZXNob2xkJzogdGhpcy5jb21wbGV0aW9uX3RocmVzaG9sZCxcbiAgICAgICdjcmVkaXQnOiB0aGlzLmNyZWRpdCxcbiAgICAgICdlbnRyeSc6IHRoaXMuZW50cnksXG4gICAgICAnZXhpdCc6IHRoaXMuZXhpdCxcbiAgICAgICdpbnRlcmFjdGlvbnMnOiB0aGlzLmludGVyYWN0aW9ucyxcbiAgICAgICdsYXVuY2hfZGF0YSc6IHRoaXMubGF1bmNoX2RhdGEsXG4gICAgICAnbGVhcm5lcl9pZCc6IHRoaXMubGVhcm5lcl9pZCxcbiAgICAgICdsZWFybmVyX25hbWUnOiB0aGlzLmxlYXJuZXJfbmFtZSxcbiAgICAgICdsZWFybmVyX3ByZWZlcmVuY2UnOiB0aGlzLmxlYXJuZXJfcHJlZmVyZW5jZSxcbiAgICAgICdsb2NhdGlvbic6IHRoaXMubG9jYXRpb24sXG4gICAgICAnbWF4X3RpbWVfYWxsb3dlZCc6IHRoaXMubWF4X3RpbWVfYWxsb3dlZCxcbiAgICAgICdtb2RlJzogdGhpcy5tb2RlLFxuICAgICAgJ29iamVjdGl2ZXMnOiB0aGlzLm9iamVjdGl2ZXMsXG4gICAgICAncHJvZ3Jlc3NfbWVhc3VyZSc6IHRoaXMucHJvZ3Jlc3NfbWVhc3VyZSxcbiAgICAgICdzY2FsZWRfcGFzc2luZ19zY29yZSc6IHRoaXMuc2NhbGVkX3Bhc3Npbmdfc2NvcmUsXG4gICAgICAnc2NvcmUnOiB0aGlzLnNjb3JlLFxuICAgICAgJ3Nlc3Npb25fdGltZSc6IHRoaXMuc2Vzc2lvbl90aW1lLFxuICAgICAgJ3N1Y2Nlc3Nfc3RhdHVzJzogdGhpcy5zdWNjZXNzX3N0YXR1cyxcbiAgICAgICdzdXNwZW5kX2RhdGEnOiB0aGlzLnN1c3BlbmRfZGF0YSxcbiAgICAgICd0aW1lX2xpbWl0X2FjdGlvbic6IHRoaXMudGltZV9saW1pdF9hY3Rpb24sXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyBmb3IgU0NPUk0gMjAwNCdzIGNtaS5sZWFybmVyX3ByZWZlcmVuY2Ugb2JqZWN0XG4gKi9cbmNsYXNzIENNSUxlYXJuZXJQcmVmZXJlbmNlIGV4dGVuZHMgQmFzZUNNSSB7XG4gICNfY2hpbGRyZW4gPSBzY29ybTIwMDRfY29uc3RhbnRzLnN0dWRlbnRfcHJlZmVyZW5jZV9jaGlsZHJlbjtcbiAgI2F1ZGlvX2xldmVsID0gJzEnO1xuICAjbGFuZ3VhZ2UgPSAnJztcbiAgI2RlbGl2ZXJ5X3NwZWVkID0gJzEnO1xuICAjYXVkaW9fY2FwdGlvbmluZyA9ICcwJztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5sZWFybmVyX3ByZWZlcmVuY2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjX2NoaWxkcmVuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldCBfY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuI19jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNfY2hpbGRyZW4uIEp1c3QgdGhyb3dzIGFuIGVycm9yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gX2NoaWxkcmVuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZXQgX2NoaWxkcmVuKF9jaGlsZHJlbikge1xuICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2F1ZGlvX2xldmVsXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBhdWRpb19sZXZlbCgpIHtcbiAgICByZXR1cm4gdGhpcy4jYXVkaW9fbGV2ZWw7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjYXVkaW9fbGV2ZWxcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF1ZGlvX2xldmVsXG4gICAqL1xuICBzZXQgYXVkaW9fbGV2ZWwoYXVkaW9fbGV2ZWwpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoYXVkaW9fbGV2ZWwsIHNjb3JtMjAwNF9yZWdleC5DTUlEZWNpbWFsKSAmJlxuICAgICAgY2hlY2syMDA0VmFsaWRSYW5nZShhdWRpb19sZXZlbCwgc2Nvcm0yMDA0X3JlZ2V4LmF1ZGlvX3JhbmdlKSkge1xuICAgICAgdGhpcy4jYXVkaW9fbGV2ZWwgPSBhdWRpb19sZXZlbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbGFuZ3VhZ2VcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGxhbmd1YWdlKCkge1xuICAgIHJldHVybiB0aGlzLiNsYW5ndWFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsYW5ndWFnZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2VcbiAgICovXG4gIHNldCBsYW5ndWFnZShsYW5ndWFnZSkge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChsYW5ndWFnZSwgc2Nvcm0yMDA0X3JlZ2V4LkNNSUxhbmcpKSB7XG4gICAgICB0aGlzLiNsYW5ndWFnZSA9IGxhbmd1YWdlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNkZWxpdmVyeV9zcGVlZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZGVsaXZlcnlfc3BlZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2RlbGl2ZXJ5X3NwZWVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2RlbGl2ZXJ5X3NwZWVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZWxpdmVyeV9zcGVlZFxuICAgKi9cbiAgc2V0IGRlbGl2ZXJ5X3NwZWVkKGRlbGl2ZXJ5X3NwZWVkKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGRlbGl2ZXJ5X3NwZWVkLCBzY29ybTIwMDRfcmVnZXguQ01JRGVjaW1hbCkgJiZcbiAgICAgIGNoZWNrMjAwNFZhbGlkUmFuZ2UoZGVsaXZlcnlfc3BlZWQsIHNjb3JtMjAwNF9yZWdleC5zcGVlZF9yYW5nZSkpIHtcbiAgICAgIHRoaXMuI2RlbGl2ZXJ5X3NwZWVkID0gZGVsaXZlcnlfc3BlZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2F1ZGlvX2NhcHRpb25pbmdcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGF1ZGlvX2NhcHRpb25pbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2F1ZGlvX2NhcHRpb25pbmc7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjYXVkaW9fY2FwdGlvbmluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gYXVkaW9fY2FwdGlvbmluZ1xuICAgKi9cbiAgc2V0IGF1ZGlvX2NhcHRpb25pbmcoYXVkaW9fY2FwdGlvbmluZykge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChhdWRpb19jYXB0aW9uaW5nLCBzY29ybTIwMDRfcmVnZXguQ01JU0ludGVnZXIpICYmXG4gICAgICBjaGVjazIwMDRWYWxpZFJhbmdlKGF1ZGlvX2NhcHRpb25pbmcsIHNjb3JtMjAwNF9yZWdleC50ZXh0X3JhbmdlKSkge1xuICAgICAgdGhpcy4jYXVkaW9fY2FwdGlvbmluZyA9IGF1ZGlvX2NhcHRpb25pbmc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLmxlYXJuZXJfcHJlZmVyZW5jZVxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGF1ZGlvX2xldmVsOiBzdHJpbmcsXG4gICAqICAgICAgbGFuZ3VhZ2U6IHN0cmluZyxcbiAgICogICAgICBkZWxpdmVyeV9zcGVlZDogc3RyaW5nLFxuICAgKiAgICAgIGF1ZGlvX2NhcHRpb25pbmc6IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAnYXVkaW9fbGV2ZWwnOiB0aGlzLmF1ZGlvX2xldmVsLFxuICAgICAgJ2xhbmd1YWdlJzogdGhpcy5sYW5ndWFnZSxcbiAgICAgICdkZWxpdmVyeV9zcGVlZCc6IHRoaXMuZGVsaXZlcnlfc3BlZWQsXG4gICAgICAnYXVkaW9fY2FwdGlvbmluZyc6IHRoaXMuYXVkaW9fY2FwdGlvbmluZyxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAyMDA0J3MgY21pLmludGVyYWN0aW9ucyBvYmplY3RcbiAqL1xuY2xhc3MgQ01JSW50ZXJhY3Rpb25zIGV4dGVuZHMgQ01JQXJyYXkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5vYmplY3RpdmVzIEFycmF5XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih7XG4gICAgICBjaGlsZHJlbjogc2Nvcm0yMDA0X2NvbnN0YW50cy5pbnRlcmFjdGlvbnNfY2hpbGRyZW4sXG4gICAgICBlcnJvckNvZGU6IHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5SRUFEX09OTFlfRUxFTUVOVCxcbiAgICAgIGVycm9yQ2xhc3M6IFNjb3JtMjAwNFZhbGlkYXRpb25FcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAyMDA0J3MgY21pLm9iamVjdGl2ZXMgb2JqZWN0XG4gKi9cbmNsYXNzIENNSU9iamVjdGl2ZXMgZXh0ZW5kcyBDTUlBcnJheSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLm9iamVjdGl2ZXMgQXJyYXlcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHtcbiAgICAgIGNoaWxkcmVuOiBzY29ybTIwMDRfY29uc3RhbnRzLm9iamVjdGl2ZXNfY2hpbGRyZW4sXG4gICAgICBlcnJvckNvZGU6IHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5SRUFEX09OTFlfRUxFTUVOVCxcbiAgICAgIGVycm9yQ2xhc3M6IFNjb3JtMjAwNFZhbGlkYXRpb25FcnJvcixcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAyMDA0J3MgY21pLmNvbW1lbnRzX2Zyb21fbG1zIG9iamVjdFxuICovXG5jbGFzcyBDTUlDb21tZW50c0Zyb21MTVMgZXh0ZW5kcyBDTUlBcnJheSB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgY21pLmNvbW1lbnRzX2Zyb21fbG1zIEFycmF5XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcih7XG4gICAgICBjaGlsZHJlbjogc2Nvcm0yMDA0X2NvbnN0YW50cy5jb21tZW50c19jaGlsZHJlbixcbiAgICAgIGVycm9yQ29kZTogc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlJFQURfT05MWV9FTEVNRU5ULFxuICAgICAgZXJyb3JDbGFzczogU2Nvcm0yMDA0VmFsaWRhdGlvbkVycm9yLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ2xhc3MgcmVwcmVzZW50aW5nIFNDT1JNIDIwMDQncyBjbWkuY29tbWVudHNfZnJvbV9sZWFybmVyIG9iamVjdFxuICovXG5jbGFzcyBDTUlDb21tZW50c0Zyb21MZWFybmVyIGV4dGVuZHMgQ01JQXJyYXkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5jb21tZW50c19mcm9tX2xlYXJuZXIgQXJyYXlcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHtcbiAgICAgIGNoaWxkcmVuOiBzY29ybTIwMDRfY29uc3RhbnRzLmNvbW1lbnRzX2NoaWxkcmVuLFxuICAgICAgZXJyb3JDb2RlOiBzY29ybTIwMDRfZXJyb3JfY29kZXMuUkVBRF9PTkxZX0VMRU1FTlQsXG4gICAgICBlcnJvckNsYXNzOiBTY29ybTIwMDRWYWxpZGF0aW9uRXJyb3IsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyBmb3IgU0NPUk0gMjAwNCdzIGNtaS5pbnRlcmFjdGlvbi5uIG9iamVjdFxuICovXG5leHBvcnQgY2xhc3MgQ01JSW50ZXJhY3Rpb25zT2JqZWN0IGV4dGVuZHMgQmFzZUNNSSB7XG4gICNpZCA9ICcnO1xuICAjdHlwZSA9ICcnO1xuICAjdGltZXN0YW1wID0gJyc7XG4gICN3ZWlnaHRpbmcgPSAnJztcbiAgI2xlYXJuZXJfcmVzcG9uc2UgPSAnJztcbiAgI3Jlc3VsdCA9ICcnO1xuICAjbGF0ZW5jeSA9ICcnO1xuICAjZGVzY3JpcHRpb24gPSAnJztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5pbnRlcmFjdGlvbi5uXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5vYmplY3RpdmVzID0gbmV3IENNSUFycmF5KHtcbiAgICAgIGVycm9yQ29kZTogc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlJFQURfT05MWV9FTEVNRU5ULFxuICAgICAgZXJyb3JDbGFzczogU2Nvcm0yMDA0VmFsaWRhdGlvbkVycm9yLFxuICAgICAgY2hpbGRyZW46IHNjb3JtMjAwNF9jb25zdGFudHMub2JqZWN0aXZlc19jaGlsZHJlbixcbiAgICB9KTtcbiAgICB0aGlzLmNvcnJlY3RfcmVzcG9uc2VzID0gbmV3IENNSUFycmF5KHtcbiAgICAgIGVycm9yQ29kZTogc2Nvcm0yMDA0X2Vycm9yX2NvZGVzLlJFQURfT05MWV9FTEVNRU5ULFxuICAgICAgZXJyb3JDbGFzczogU2Nvcm0yMDA0VmFsaWRhdGlvbkVycm9yLFxuICAgICAgY2hpbGRyZW46IHNjb3JtMjAwNF9jb25zdGFudHMuY29ycmVjdF9yZXNwb25zZXNfY2hpbGRyZW4sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIEFQSSBoYXMgYmVlbiBpbml0aWFsaXplZCBhZnRlciB0aGUgQ01JIGhhcyBiZWVuIGNyZWF0ZWRcbiAgICovXG4gIGluaXRpYWxpemUoKSB7XG4gICAgc3VwZXIuaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMub2JqZWN0aXZlcz8uaW5pdGlhbGl6ZSgpO1xuICAgIHRoaXMuY29ycmVjdF9yZXNwb25zZXM/LmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNpZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2lkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuICAgKi9cbiAgc2V0IGlkKGlkKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGlkLCBzY29ybTIwMDRfcmVnZXguQ01JTG9uZ0lkZW50aWZpZXIpKSB7XG4gICAgICB0aGlzLiNpZCA9IGlkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICN0eXBlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiB0aGlzLiN0eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3R5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICovXG4gIHNldCB0eXBlKHR5cGUpIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCAmJiB0aGlzLiNpZCA9PT0gJycpIHtcbiAgICAgIHRocm93RGVwZW5kZW5jeU5vdEVzdGFibGlzaGVkRXJyb3IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KHR5cGUsIHNjb3JtMjAwNF9yZWdleC5DTUlUeXBlKSkge1xuICAgICAgICB0aGlzLiN0eXBlID0gdHlwZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjdGltZXN0YW1wXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB0aW1lc3RhbXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RpbWVzdGFtcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICN0aW1lc3RhbXBcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWVzdGFtcFxuICAgKi9cbiAgc2V0IHRpbWVzdGFtcCh0aW1lc3RhbXApIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCAmJiB0aGlzLiNpZCA9PT0gJycpIHtcbiAgICAgIHRocm93RGVwZW5kZW5jeU5vdEVzdGFibGlzaGVkRXJyb3IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KHRpbWVzdGFtcCwgc2Nvcm0yMDA0X3JlZ2V4LkNNSVRpbWUpKSB7XG4gICAgICAgIHRoaXMuI3RpbWVzdGFtcCA9IHRpbWVzdGFtcDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjd2VpZ2h0aW5nXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB3ZWlnaHRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3dlaWdodGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICN3ZWlnaHRpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IHdlaWdodGluZ1xuICAgKi9cbiAgc2V0IHdlaWdodGluZyh3ZWlnaHRpbmcpIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCAmJiB0aGlzLiNpZCA9PT0gJycpIHtcbiAgICAgIHRocm93RGVwZW5kZW5jeU5vdEVzdGFibGlzaGVkRXJyb3IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KHdlaWdodGluZywgc2Nvcm0yMDA0X3JlZ2V4LkNNSURlY2ltYWwpKSB7XG4gICAgICAgIHRoaXMuI3dlaWdodGluZyA9IHdlaWdodGluZztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjbGVhcm5lcl9yZXNwb25zZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgbGVhcm5lcl9yZXNwb25zZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jbGVhcm5lcl9yZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNsZWFybmVyX3Jlc3BvbnNlLiBEb2VzIHR5cGUgdmFsaWRhdGlvbiB0byBtYWtlIHN1cmUgcmVzcG9uc2VcbiAgICogbWF0Y2hlcyBTQ09STSAyMDA0J3Mgc3BlY1xuICAgKiBAcGFyYW0ge3N0cmluZ30gbGVhcm5lcl9yZXNwb25zZVxuICAgKi9cbiAgc2V0IGxlYXJuZXJfcmVzcG9uc2UobGVhcm5lcl9yZXNwb25zZSkge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkICYmICh0aGlzLiN0eXBlID09PSAnJyB8fCB0aGlzLiNpZCA9PT0gJycpKSB7XG4gICAgICB0aHJvd0RlcGVuZGVuY3lOb3RFc3RhYmxpc2hlZEVycm9yKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBub2RlcyA9IFtdO1xuICAgICAgY29uc3QgcmVzcG9uc2VfdHlwZSA9IGxlYXJuZXJfcmVzcG9uc2VzW3RoaXMudHlwZV07XG4gICAgICBpZiAocmVzcG9uc2VfdHlwZSkge1xuICAgICAgICBpZiAocmVzcG9uc2VfdHlwZT8uZGVsaW1pdGVyKSB7XG4gICAgICAgICAgbm9kZXMgPSBsZWFybmVyX3Jlc3BvbnNlLnNwbGl0KHJlc3BvbnNlX3R5cGUuZGVsaW1pdGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2Rlc1swXSA9IGxlYXJuZXJfcmVzcG9uc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKG5vZGVzLmxlbmd0aCA+IDApICYmIChub2Rlcy5sZW5ndGggPD0gcmVzcG9uc2VfdHlwZS5tYXgpKSB7XG4gICAgICAgICAgY29uc3QgZm9ybWF0UmVnZXggPSBuZXcgUmVnRXhwKHJlc3BvbnNlX3R5cGUuZm9ybWF0KTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfdHlwZT8uZGVsaW1pdGVyMikge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBub2Rlc1tpXS5zcGxpdChyZXNwb25zZV90eXBlLmRlbGltaXRlcjIpO1xuICAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgIGlmICghdmFsdWVzWzBdLm1hdGNoKGZvcm1hdFJlZ2V4KSkge1xuICAgICAgICAgICAgICAgICAgdGhyb3dUeXBlTWlzbWF0Y2hFcnJvcigpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlc1sxXS5tYXRjaChuZXcgUmVnRXhwKHJlc3BvbnNlX3R5cGUuZm9ybWF0MikpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93VHlwZU1pc21hdGNoRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3dUeXBlTWlzbWF0Y2hFcnJvcigpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoIW5vZGVzW2ldLm1hdGNoKGZvcm1hdFJlZ2V4KSkge1xuICAgICAgICAgICAgICAgIHRocm93VHlwZU1pc21hdGNoRXJyb3IoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZXNbaV0gIT09ICcnICYmIHJlc3BvbnNlX3R5cGUudW5pcXVlKSB7XG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGk7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZXNbaV0gPT09IG5vZGVzW2pdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhyb3dUeXBlTWlzbWF0Y2hFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93R2VuZXJhbFNldEVycm9yKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLiNsZWFybmVyX3Jlc3BvbnNlID0gbGVhcm5lcl9yZXNwb25zZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93VHlwZU1pc21hdGNoRXJyb3IoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjcmVzdWx0XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCByZXN1bHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Jlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNyZXN1bHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3VsdFxuICAgKi9cbiAgc2V0IHJlc3VsdChyZXN1bHQpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQocmVzdWx0LCBzY29ybTIwMDRfcmVnZXguQ01JUmVzdWx0KSkge1xuICAgICAgdGhpcy4jcmVzdWx0ID0gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNsYXRlbmN5XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsYXRlbmN5KCkge1xuICAgIHJldHVybiB0aGlzLiNsYXRlbmN5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2xhdGVuY3lcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxhdGVuY3lcbiAgICovXG4gIHNldCBsYXRlbmN5KGxhdGVuY3kpIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCAmJiB0aGlzLiNpZCA9PT0gJycpIHtcbiAgICAgIHRocm93RGVwZW5kZW5jeU5vdEVzdGFibGlzaGVkRXJyb3IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGxhdGVuY3ksIHNjb3JtMjAwNF9yZWdleC5DTUlUaW1lc3BhbikpIHtcbiAgICAgICAgdGhpcy4jbGF0ZW5jeSA9IGxhdGVuY3k7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2Rlc2NyaXB0aW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBkZXNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy4jZGVzY3JpcHRpb247XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjZGVzY3JpcHRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXG4gICAqL1xuICBzZXQgZGVzY3JpcHRpb24oZGVzY3JpcHRpb24pIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCAmJiB0aGlzLiNpZCA9PT0gJycpIHtcbiAgICAgIHRocm93RGVwZW5kZW5jeU5vdEVzdGFibGlzaGVkRXJyb3IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGRlc2NyaXB0aW9uLCBzY29ybTIwMDRfcmVnZXguQ01JTGFuZ1N0cmluZzI1MCxcbiAgICAgICAgICB0cnVlKSkge1xuICAgICAgICB0aGlzLiNkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5pbnRlcmFjdGlvbnMublxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGlkOiBzdHJpbmcsXG4gICAqICAgICAgdHlwZTogc3RyaW5nLFxuICAgKiAgICAgIG9iamVjdGl2ZXM6IENNSUFycmF5LFxuICAgKiAgICAgIHRpbWVzdGFtcDogc3RyaW5nLFxuICAgKiAgICAgIGNvcnJlY3RfcmVzcG9uc2VzOiBDTUlBcnJheSxcbiAgICogICAgICB3ZWlnaHRpbmc6IHN0cmluZyxcbiAgICogICAgICBsZWFybmVyX3Jlc3BvbnNlOiBzdHJpbmcsXG4gICAqICAgICAgcmVzdWx0OiBzdHJpbmcsXG4gICAqICAgICAgbGF0ZW5jeTogc3RyaW5nLFxuICAgKiAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ2lkJzogdGhpcy5pZCxcbiAgICAgICd0eXBlJzogdGhpcy50eXBlLFxuICAgICAgJ29iamVjdGl2ZXMnOiB0aGlzLm9iamVjdGl2ZXMsXG4gICAgICAndGltZXN0YW1wJzogdGhpcy50aW1lc3RhbXAsXG4gICAgICAnd2VpZ2h0aW5nJzogdGhpcy53ZWlnaHRpbmcsXG4gICAgICAnbGVhcm5lcl9yZXNwb25zZSc6IHRoaXMubGVhcm5lcl9yZXNwb25zZSxcbiAgICAgICdyZXN1bHQnOiB0aGlzLnJlc3VsdCxcbiAgICAgICdsYXRlbmN5JzogdGhpcy5sYXRlbmN5LFxuICAgICAgJ2Rlc2NyaXB0aW9uJzogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICdjb3JyZWN0X3Jlc3BvbnNlcyc6IHRoaXMuY29ycmVjdF9yZXNwb25zZXMsXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyBmb3IgU0NPUk0gMjAwNCdzIGNtaS5vYmplY3RpdmVzLm4gb2JqZWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlPYmplY3RpdmVzT2JqZWN0IGV4dGVuZHMgQmFzZUNNSSB7XG4gICNpZCA9ICcnO1xuICAjc3VjY2Vzc19zdGF0dXMgPSAndW5rbm93bic7XG4gICNjb21wbGV0aW9uX3N0YXR1cyA9ICd1bmtub3duJztcbiAgI3Byb2dyZXNzX21lYXN1cmUgPSAnJztcbiAgI2Rlc2NyaXB0aW9uID0gJyc7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkub2JqZWN0aXZlcy5uXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5zY29yZSA9IG5ldyBTY29ybTIwMDRDTUlTY29yZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIENNSSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBpbml0aWFsaXplKCkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLnNjb3JlPy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjaWRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLiNpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gaWRcbiAgICovXG4gIHNldCBpZChpZCkge1xuICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChpZCwgc2Nvcm0yMDA0X3JlZ2V4LkNNSUxvbmdJZGVudGlmaWVyKSkge1xuICAgICAgdGhpcy4jaWQgPSBpZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjc3VjY2Vzc19zdGF0dXNcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHN1Y2Nlc3Nfc3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLiNzdWNjZXNzX3N0YXR1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNzdWNjZXNzX3N0YXR1c1xuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VjY2Vzc19zdGF0dXNcbiAgICovXG4gIHNldCBzdWNjZXNzX3N0YXR1cyhzdWNjZXNzX3N0YXR1cykge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkICYmIHRoaXMuI2lkID09PSAnJykge1xuICAgICAgdGhyb3dEZXBlbmRlbmN5Tm90RXN0YWJsaXNoZWRFcnJvcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoc3VjY2Vzc19zdGF0dXMsIHNjb3JtMjAwNF9yZWdleC5DTUlTU3RhdHVzKSkge1xuICAgICAgICB0aGlzLiNzdWNjZXNzX3N0YXR1cyA9IHN1Y2Nlc3Nfc3RhdHVzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNjb21wbGV0aW9uX3N0YXR1c1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgY29tcGxldGlvbl9zdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbXBsZXRpb25fc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2NvbXBsZXRpb25fc3RhdHVzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb21wbGV0aW9uX3N0YXR1c1xuICAgKi9cbiAgc2V0IGNvbXBsZXRpb25fc3RhdHVzKGNvbXBsZXRpb25fc3RhdHVzKSB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQgJiYgdGhpcy4jaWQgPT09ICcnKSB7XG4gICAgICB0aHJvd0RlcGVuZGVuY3lOb3RFc3RhYmxpc2hlZEVycm9yKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChjb21wbGV0aW9uX3N0YXR1cywgc2Nvcm0yMDA0X3JlZ2V4LkNNSUNTdGF0dXMpKSB7XG4gICAgICAgIHRoaXMuI2NvbXBsZXRpb25fc3RhdHVzID0gY29tcGxldGlvbl9zdGF0dXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3Byb2dyZXNzX21lYXN1cmVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IHByb2dyZXNzX21lYXN1cmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3Byb2dyZXNzX21lYXN1cmU7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjcHJvZ3Jlc3NfbWVhc3VyZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvZ3Jlc3NfbWVhc3VyZVxuICAgKi9cbiAgc2V0IHByb2dyZXNzX21lYXN1cmUocHJvZ3Jlc3NfbWVhc3VyZSkge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkICYmIHRoaXMuI2lkID09PSAnJykge1xuICAgICAgdGhyb3dEZXBlbmRlbmN5Tm90RXN0YWJsaXNoZWRFcnJvcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQocHJvZ3Jlc3NfbWVhc3VyZSwgc2Nvcm0yMDA0X3JlZ2V4LkNNSURlY2ltYWwpICYmXG4gICAgICAgIGNoZWNrMjAwNFZhbGlkUmFuZ2UocHJvZ3Jlc3NfbWVhc3VyZSxcbiAgICAgICAgICAgIHNjb3JtMjAwNF9yZWdleC5wcm9ncmVzc19yYW5nZSkpIHtcbiAgICAgICAgdGhpcy4jcHJvZ3Jlc3NfbWVhc3VyZSA9IHByb2dyZXNzX21lYXN1cmU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2Rlc2NyaXB0aW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBkZXNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy4jZGVzY3JpcHRpb247XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjZGVzY3JpcHRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXG4gICAqL1xuICBzZXQgZGVzY3JpcHRpb24oZGVzY3JpcHRpb24pIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCAmJiB0aGlzLiNpZCA9PT0gJycpIHtcbiAgICAgIHRocm93RGVwZW5kZW5jeU5vdEVzdGFibGlzaGVkRXJyb3IoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KGRlc2NyaXB0aW9uLCBzY29ybTIwMDRfcmVnZXguQ01JTGFuZ1N0cmluZzI1MCxcbiAgICAgICAgICB0cnVlKSkge1xuICAgICAgICB0aGlzLiNkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB0b0pTT04gZm9yIGNtaS5vYmplY3RpdmVzLm5cbiAgICpcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBpZDogc3RyaW5nLFxuICAgKiAgICAgIHN1Y2Nlc3Nfc3RhdHVzOiBzdHJpbmcsXG4gICAqICAgICAgY29tcGxldGlvbl9zdGF0dXM6IHN0cmluZyxcbiAgICogICAgICBwcm9ncmVzc19tZWFzdXJlOiBzdHJpbmcsXG4gICAqICAgICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICogICAgICBzY29yZTogU2Nvcm0yMDA0Q01JU2NvcmVcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ2lkJzogdGhpcy5pZCxcbiAgICAgICdzdWNjZXNzX3N0YXR1cyc6IHRoaXMuc3VjY2Vzc19zdGF0dXMsXG4gICAgICAnY29tcGxldGlvbl9zdGF0dXMnOiB0aGlzLmNvbXBsZXRpb25fc3RhdHVzLFxuICAgICAgJ3Byb2dyZXNzX21lYXN1cmUnOiB0aGlzLnByb2dyZXNzX21lYXN1cmUsXG4gICAgICAnZGVzY3JpcHRpb24nOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgJ3Njb3JlJzogdGhpcy5zY29yZSxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIGZvciBTQ09STSAyMDA0J3MgY21pICouc2NvcmUgb2JqZWN0XG4gKi9cbmNsYXNzIFNjb3JtMjAwNENNSVNjb3JlIGV4dGVuZHMgQ01JU2NvcmUge1xuICAjc2NhbGVkID0gJyc7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkgKi5zY29yZVxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXG4gICAgICAgIHtcbiAgICAgICAgICBzY29yZV9jaGlsZHJlbjogc2Nvcm0yMDA0X2NvbnN0YW50cy5zY29yZV9jaGlsZHJlbixcbiAgICAgICAgICBtYXg6ICcnLFxuICAgICAgICAgIGludmFsaWRFcnJvckNvZGU6IHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5SRUFEX09OTFlfRUxFTUVOVCxcbiAgICAgICAgICBpbnZhbGlkVHlwZUNvZGU6IHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5UWVBFX01JU01BVENILFxuICAgICAgICAgIGludmFsaWRSYW5nZUNvZGU6IHNjb3JtMjAwNF9lcnJvcl9jb2Rlcy5WQUxVRV9PVVRfT0ZfUkFOR0UsXG4gICAgICAgICAgZGVjaW1hbFJlZ2V4OiBzY29ybTIwMDRfcmVnZXguQ01JRGVjaW1hbCxcbiAgICAgICAgICBlcnJvckNsYXNzOiBTY29ybTIwMDRWYWxpZGF0aW9uRXJyb3IsXG4gICAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI3NjYWxlZFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgc2NhbGVkKCkge1xuICAgIHJldHVybiB0aGlzLiNzY2FsZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjc2NhbGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzY2FsZWRcbiAgICovXG4gIHNldCBzY2FsZWQoc2NhbGVkKSB7XG4gICAgaWYgKGNoZWNrMjAwNFZhbGlkRm9ybWF0KHNjYWxlZCwgc2Nvcm0yMDA0X3JlZ2V4LkNNSURlY2ltYWwpICYmXG4gICAgICBjaGVjazIwMDRWYWxpZFJhbmdlKHNjYWxlZCwgc2Nvcm0yMDA0X3JlZ2V4LnNjYWxlZF9yYW5nZSkpIHtcbiAgICAgIHRoaXMuI3NjYWxlZCA9IHNjYWxlZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdG9KU09OIGZvciBjbWkgKi5zY29yZVxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIHNjYWxlZDogc3RyaW5nLFxuICAgKiAgICAgIHJhdzogc3RyaW5nLFxuICAgKiAgICAgIG1pbjogc3RyaW5nLFxuICAgKiAgICAgIG1heDogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdzY2FsZWQnOiB0aGlzLnNjYWxlZCxcbiAgICAgICdyYXcnOiBzdXBlci5yYXcsXG4gICAgICAnbWluJzogc3VwZXIubWluLFxuICAgICAgJ21heCc6IHN1cGVyLm1heCxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAyMDA0J3MgY21pLmNvbW1lbnRzX2Zyb21fbGVhcm5lci5uIGFuZCBjbWkuY29tbWVudHNfZnJvbV9sbXMubiBvYmplY3RcbiAqL1xuZXhwb3J0IGNsYXNzIENNSUNvbW1lbnRzT2JqZWN0IGV4dGVuZHMgQmFzZUNNSSB7XG4gICNjb21tZW50ID0gJyc7XG4gICNsb2NhdGlvbiA9ICcnO1xuICAjdGltZXN0YW1wID0gJyc7XG4gICNyZWFkT25seUFmdGVySW5pdDtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGNtaS5jb21tZW50c19mcm9tX2xlYXJuZXIubiBhbmQgY21pLmNvbW1lbnRzX2Zyb21fbG1zLm5cbiAgICogQHBhcmFtIHtib29sZWFufSByZWFkT25seUFmdGVySW5pdFxuICAgKi9cbiAgY29uc3RydWN0b3IocmVhZE9ubHlBZnRlckluaXQgPSBmYWxzZSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jY29tbWVudCA9ICcnO1xuICAgIHRoaXMuI2xvY2F0aW9uID0gJyc7XG4gICAgdGhpcy4jdGltZXN0YW1wID0gJyc7XG4gICAgdGhpcy4jcmVhZE9ubHlBZnRlckluaXQgPSByZWFkT25seUFmdGVySW5pdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNjb21tZW50XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBjb21tZW50KCkge1xuICAgIHJldHVybiB0aGlzLiNjb21tZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI2NvbW1lbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbW1lbnRcbiAgICovXG4gIHNldCBjb21tZW50KGNvbW1lbnQpIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCAmJiB0aGlzLiNyZWFkT25seUFmdGVySW5pdCkge1xuICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChjb21tZW50LCBzY29ybTIwMDRfcmVnZXguQ01JTGFuZ1N0cmluZzQwMDAsXG4gICAgICAgICAgdHJ1ZSkpIHtcbiAgICAgICAgdGhpcy4jY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2xvY2F0aW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBsb2NhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy4jbG9jYXRpb247XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjbG9jYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uXG4gICAqL1xuICBzZXQgbG9jYXRpb24obG9jYXRpb24pIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCAmJiB0aGlzLiNyZWFkT25seUFmdGVySW5pdCkge1xuICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdChsb2NhdGlvbiwgc2Nvcm0yMDA0X3JlZ2V4LkNNSVN0cmluZzI1MCkpIHtcbiAgICAgICAgdGhpcy4jbG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjdGltZXN0YW1wXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCB0aW1lc3RhbXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RpbWVzdGFtcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICN0aW1lc3RhbXBcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpbWVzdGFtcFxuICAgKi9cbiAgc2V0IHRpbWVzdGFtcCh0aW1lc3RhbXApIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCAmJiB0aGlzLiNyZWFkT25seUFmdGVySW5pdCkge1xuICAgICAgdGhyb3dSZWFkT25seUVycm9yKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjaGVjazIwMDRWYWxpZEZvcm1hdCh0aW1lc3RhbXAsIHNjb3JtMjAwNF9yZWdleC5DTUlUaW1lKSkge1xuICAgICAgICB0aGlzLiN0aW1lc3RhbXAgPSB0aW1lc3RhbXA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLmNvbW1lbnRzX2Zyb21fbGVhcm5lci5uIG9iamVjdFxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGNvbW1lbnQ6IHN0cmluZyxcbiAgICogICAgICBsb2NhdGlvbjogc3RyaW5nLFxuICAgKiAgICAgIHRpbWVzdGFtcDogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdjb21tZW50JzogdGhpcy5jb21tZW50LFxuICAgICAgJ2xvY2F0aW9uJzogdGhpcy5sb2NhdGlvbixcbiAgICAgICd0aW1lc3RhbXAnOiB0aGlzLnRpbWVzdGFtcCxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAyMDA0J3MgY21pLmludGVyYWN0aW9ucy5uLm9iamVjdGl2ZXMubiBvYmplY3RcbiAqL1xuZXhwb3J0IGNsYXNzIENNSUludGVyYWN0aW9uc09iamVjdGl2ZXNPYmplY3QgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgI2lkID0gJyc7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkuaW50ZXJhY3Rpb25zLm4ub2JqZWN0aXZlcy5uXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2lkXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy4jaWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0dGVyIGZvciAjaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkXG4gICAqL1xuICBzZXQgaWQoaWQpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQoaWQsIHNjb3JtMjAwNF9yZWdleC5DTUlMb25nSWRlbnRpZmllcikpIHtcbiAgICAgIHRoaXMuI2lkID0gaWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgY21pLmludGVyYWN0aW9ucy5uLm9iamVjdGl2ZXMublxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIGlkOiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ2lkJzogdGhpcy5pZCxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAyMDA0J3MgY21pLmludGVyYWN0aW9ucy5uLmNvcnJlY3RfcmVzcG9uc2VzLm4gb2JqZWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBDTUlJbnRlcmFjdGlvbnNDb3JyZWN0UmVzcG9uc2VzT2JqZWN0IGV4dGVuZHMgQmFzZUNNSSB7XG4gICNwYXR0ZXJuID0gJyc7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBjbWkuaW50ZXJhY3Rpb25zLm4uY29ycmVjdF9yZXNwb25zZXMublxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNwYXR0ZXJuXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCBwYXR0ZXJuKCkge1xuICAgIHJldHVybiB0aGlzLiNwYXR0ZXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3BhdHRlcm5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm5cbiAgICovXG4gIHNldCBwYXR0ZXJuKHBhdHRlcm4pIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQocGF0dGVybiwgc2Nvcm0yMDA0X3JlZ2V4LkNNSUZlZWRiYWNrKSkge1xuICAgICAgdGhpcy4jcGF0dGVybiA9IHBhdHRlcm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBjbWkuaW50ZXJhY3Rpb25zLm4uY29ycmVjdF9yZXNwb25zZXMubiBvYmplY3RcbiAgICogQHJldHVybiB7XG4gICAqICAgIHtcbiAgICogICAgICBwYXR0ZXJuOiBzdHJpbmdcbiAgICogICAgfVxuICAgKiAgfVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHRoaXMuanNvblN0cmluZyA9IHRydWU7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgJ3BhdHRlcm4nOiB0aGlzLnBhdHRlcm4sXG4gICAgfTtcbiAgICBkZWxldGUgdGhpcy5qc29uU3RyaW5nO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDbGFzcyByZXByZXNlbnRpbmcgU0NPUk0gMjAwNCdzIGFkbCBvYmplY3RcbiAqL1xuZXhwb3J0IGNsYXNzIEFETCBleHRlbmRzIEJhc2VDTUkge1xuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIGFkbFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMubmF2ID0gbmV3IEFETE5hdigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIENNSSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBpbml0aWFsaXplKCkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLm5hdj8uaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgYWRsXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgbmF2OiB7XG4gICAqICAgICAgICByZXF1ZXN0OiBzdHJpbmdcbiAgICogICAgICB9XG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICduYXYnOiB0aGlzLm5hdixcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAyMDA0J3MgYWRsLm5hdiBvYmplY3RcbiAqL1xuY2xhc3MgQURMTmF2IGV4dGVuZHMgQmFzZUNNSSB7XG4gICNyZXF1ZXN0ID0gJ19ub25lXyc7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBhZGwubmF2XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5yZXF1ZXN0X3ZhbGlkID0gbmV3IEFETE5hdlJlcXVlc3RWYWxpZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIENNSSBoYXMgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBpbml0aWFsaXplKCkge1xuICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICB0aGlzLnJlcXVlc3RfdmFsaWQ/LmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNyZXF1ZXN0XG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldCByZXF1ZXN0KCkge1xuICAgIHJldHVybiB0aGlzLiNyZXF1ZXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3JlcXVlc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlcXVlc3RcbiAgICovXG4gIHNldCByZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICBpZiAoY2hlY2syMDA0VmFsaWRGb3JtYXQocmVxdWVzdCwgc2Nvcm0yMDA0X3JlZ2V4Lk5BVkV2ZW50KSkge1xuICAgICAgdGhpcy4jcmVxdWVzdCA9IHJlcXVlc3Q7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgYWRsLm5hdlxuICAgKlxuICAgKiBAcmV0dXJuIHtcbiAgICogICAge1xuICAgKiAgICAgIHJlcXVlc3Q6IHN0cmluZ1xuICAgKiAgICB9XG4gICAqICB9XG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgdGhpcy5qc29uU3RyaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAncmVxdWVzdCc6IHRoaXMucmVxdWVzdCxcbiAgICB9O1xuICAgIGRlbGV0ZSB0aGlzLmpzb25TdHJpbmc7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyBTQ09STSAyMDA0J3MgYWRsLm5hdi5yZXF1ZXN0X3ZhbGlkIG9iamVjdFxuICovXG5jbGFzcyBBRExOYXZSZXF1ZXN0VmFsaWQgZXh0ZW5kcyBCYXNlQ01JIHtcbiAgI2NvbnRpbnVlID0gJ3Vua25vd24nO1xuICAjcHJldmlvdXMgPSAndW5rbm93bic7XG4gIGNob2ljZSA9IGNsYXNzIHtcbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0YXJnZXQgaXMgdmFsaWRcbiAgICAgKiBAcGFyYW0geyp9IF90YXJnZXRcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAgICovXG4gICAgX2lzVGFyZ2V0VmFsaWQgPSAoX3RhcmdldCkgPT4gJ3Vua25vd24nO1xuICB9O1xuICBqdW1wID0gY2xhc3Mge1xuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRhcmdldCBpcyB2YWxpZFxuICAgICAqIEBwYXJhbSB7Kn0gX3RhcmdldFxuICAgICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICAgKi9cbiAgICBfaXNUYXJnZXRWYWxpZCA9IChfdGFyZ2V0KSA9PiAndW5rbm93bic7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIGZvciBhZGwubmF2LnJlcXVlc3RfdmFsaWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjY29udGludWVcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGNvbnRpbnVlKCkge1xuICAgIHJldHVybiB0aGlzLiNjb250aW51ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgZm9yICNjb250aW51ZS4gSnVzdCB0aHJvd3MgYW4gZXJyb3IuXG4gICAqIEBwYXJhbSB7Kn0gX1xuICAgKi9cbiAgc2V0IGNvbnRpbnVlKF8pIHtcbiAgICB0aHJvd1JlYWRPbmx5RXJyb3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNwcmV2aW91c1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgcHJldmlvdXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3ByZXZpb3VzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHRlciBmb3IgI3ByZXZpb3VzLiBKdXN0IHRocm93cyBhbiBlcnJvci5cbiAgICogQHBhcmFtIHsqfSBfXG4gICAqL1xuICBzZXQgcHJldmlvdXMoXykge1xuICAgIHRocm93UmVhZE9ubHlFcnJvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRvSlNPTiBmb3IgYWRsLm5hdi5yZXF1ZXN0X3ZhbGlkXG4gICAqXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICB7XG4gICAqICAgICAgcHJldmlvdXM6IHN0cmluZyxcbiAgICogICAgICBjb250aW51ZTogc3RyaW5nXG4gICAqICAgIH1cbiAgICogIH1cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICB0aGlzLmpzb25TdHJpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICdwcmV2aW91cyc6IHRoaXMucHJldmlvdXMsXG4gICAgICAnY29udGludWUnOiB0aGlzLmNvbnRpbnVlLFxuICAgIH07XG4gICAgZGVsZXRlIHRoaXMuanNvblN0cmluZztcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvLyBAZmxvd1xuXG5jb25zdCBnbG9iYWwgPSB7XG4gIFNDT1JNX1RSVUU6ICd0cnVlJyxcbiAgU0NPUk1fRkFMU0U6ICdmYWxzZScsXG4gIFNUQVRFX05PVF9JTklUSUFMSVpFRDogMCxcbiAgU1RBVEVfSU5JVElBTElaRUQ6IDEsXG4gIFNUQVRFX1RFUk1JTkFURUQ6IDIsXG4gIExPR19MRVZFTF9ERUJVRzogMSxcbiAgTE9HX0xFVkVMX0lORk86IDIsXG4gIExPR19MRVZFTF9XQVJOSU5HOiAzLFxuICBMT0dfTEVWRUxfRVJST1I6IDQsXG4gIExPR19MRVZFTF9OT05FOiA1LFxufTtcblxuY29uc3Qgc2Nvcm0xMiA9IHtcbiAgLy8gQ2hpbGRyZW4gbGlzdHNcbiAgY21pX2NoaWxkcmVuOiAnY29yZSxzdXNwZW5kX2RhdGEsbGF1bmNoX2RhdGEsY29tbWVudHMsb2JqZWN0aXZlcyxzdHVkZW50X2RhdGEsc3R1ZGVudF9wcmVmZXJlbmNlLGludGVyYWN0aW9ucycsXG4gIGNvcmVfY2hpbGRyZW46ICdzdHVkZW50X2lkLHN0dWRlbnRfbmFtZSxsZXNzb25fbG9jYXRpb24sY3JlZGl0LGxlc3Nvbl9zdGF0dXMsZW50cnksc2NvcmUsdG90YWxfdGltZSxsZXNzb25fbW9kZSxleGl0LHNlc3Npb25fdGltZScsXG4gIHNjb3JlX2NoaWxkcmVuOiAncmF3LG1pbixtYXgnLFxuICBjb21tZW50c19jaGlsZHJlbjogJ2NvbnRlbnQsbG9jYXRpb24sdGltZScsXG4gIG9iamVjdGl2ZXNfY2hpbGRyZW46ICdpZCxzY29yZSxzdGF0dXMnLFxuICBjb3JyZWN0X3Jlc3BvbnNlc19jaGlsZHJlbjogJ3BhdHRlcm4nLFxuICBzdHVkZW50X2RhdGFfY2hpbGRyZW46ICdtYXN0ZXJ5X3Njb3JlLG1heF90aW1lX2FsbG93ZWQsdGltZV9saW1pdF9hY3Rpb24nLFxuICBzdHVkZW50X3ByZWZlcmVuY2VfY2hpbGRyZW46ICdhdWRpbyxsYW5ndWFnZSxzcGVlZCx0ZXh0JyxcbiAgaW50ZXJhY3Rpb25zX2NoaWxkcmVuOiAnaWQsb2JqZWN0aXZlcyx0aW1lLHR5cGUsY29ycmVjdF9yZXNwb25zZXMsd2VpZ2h0aW5nLHN0dWRlbnRfcmVzcG9uc2UscmVzdWx0LGxhdGVuY3knLFxuXG4gIGVycm9yX2Rlc2NyaXB0aW9uczoge1xuICAgICcxMDEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdHZW5lcmFsIEV4Y2VwdGlvbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnTm8gc3BlY2lmaWMgZXJyb3IgY29kZSBleGlzdHMgdG8gZGVzY3JpYmUgdGhlIGVycm9yLiBVc2UgTE1TR2V0RGlhZ25vc3RpYyBmb3IgbW9yZSBpbmZvcm1hdGlvbicsXG4gICAgfSxcbiAgICAnMjAxJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnSW52YWxpZCBhcmd1bWVudCBlcnJvcicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnSW5kaWNhdGVzIHRoYXQgYW4gYXJndW1lbnQgcmVwcmVzZW50cyBhbiBpbnZhbGlkIGRhdGEgbW9kZWwgZWxlbWVudCBvciBpcyBvdGhlcndpc2UgaW5jb3JyZWN0LicsXG4gICAgfSxcbiAgICAnMjAyJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRWxlbWVudCBjYW5ub3QgaGF2ZSBjaGlsZHJlbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnSW5kaWNhdGVzIHRoYXQgTE1TR2V0VmFsdWUgd2FzIGNhbGxlZCB3aXRoIGEgZGF0YSBtb2RlbCBlbGVtZW50IG5hbWUgdGhhdCBlbmRzIGluIFwiX2NoaWxkcmVuXCIgZm9yIGEgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgXCJfY2hpbGRyZW5cIiBzdWZmaXguJyxcbiAgICB9LFxuICAgICcyMDMnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdFbGVtZW50IG5vdCBhbiBhcnJheSAtIGNhbm5vdCBoYXZlIGNvdW50JyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdJbmRpY2F0ZXMgdGhhdCBMTVNHZXRWYWx1ZSB3YXMgY2FsbGVkIHdpdGggYSBkYXRhIG1vZGVsIGVsZW1lbnQgbmFtZSB0aGF0IGVuZHMgaW4gXCJfY291bnRcIiBmb3IgYSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBcIl9jb3VudFwiIHN1ZmZpeC4nLFxuICAgIH0sXG4gICAgJzMwMSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ05vdCBpbml0aWFsaXplZCcsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnSW5kaWNhdGVzIHRoYXQgYW4gQVBJIGNhbGwgd2FzIG1hZGUgYmVmb3JlIHRoZSBjYWxsIHRvIGxtc0luaXRpYWxpemUuJyxcbiAgICB9LFxuICAgICc0MDEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdOb3QgaW1wbGVtZW50ZWQgZXJyb3InLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ1RoZSBkYXRhIG1vZGVsIGVsZW1lbnQgaW5kaWNhdGVkIGluIGEgY2FsbCB0byBMTVNHZXRWYWx1ZSBvciBMTVNTZXRWYWx1ZSBpcyB2YWxpZCwgYnV0IHdhcyBub3QgaW1wbGVtZW50ZWQgYnkgdGhpcyBMTVMuIFNDT1JNIDEuMiBkZWZpbmVzIGEgc2V0IG9mIGRhdGEgbW9kZWwgZWxlbWVudHMgYXMgYmVpbmcgb3B0aW9uYWwgZm9yIGFuIExNUyB0byBpbXBsZW1lbnQuJyxcbiAgICB9LFxuICAgICc0MDInOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdJbnZhbGlkIHNldCB2YWx1ZSwgZWxlbWVudCBpcyBhIGtleXdvcmQnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0luZGljYXRlcyB0aGF0IExNU1NldFZhbHVlIHdhcyBjYWxsZWQgb24gYSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEga2V5d29yZCAoZWxlbWVudHMgdGhhdCBlbmQgaW4gXCJfY2hpbGRyZW5cIiBhbmQgXCJfY291bnRcIikuJyxcbiAgICB9LFxuICAgICc0MDMnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdFbGVtZW50IGlzIHJlYWQgb25seScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnTE1TU2V0VmFsdWUgd2FzIGNhbGxlZCB3aXRoIGEgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgY2FuIG9ubHkgYmUgcmVhZC4nLFxuICAgIH0sXG4gICAgJzQwNCc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0VsZW1lbnQgaXMgd3JpdGUgb25seScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnTE1TR2V0VmFsdWUgd2FzIGNhbGxlZCBvbiBhIGRhdGEgbW9kZWwgZWxlbWVudCB0aGF0IGNhbiBvbmx5IGJlIHdyaXR0ZW4gdG8uJyxcbiAgICB9LFxuICAgICc0MDUnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdJbmNvcnJlY3QgRGF0YSBUeXBlJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdMTVNTZXRWYWx1ZSB3YXMgY2FsbGVkIHdpdGggYSB2YWx1ZSB0aGF0IGlzIG5vdCBjb25zaXN0ZW50IHdpdGggdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBzdXBwbGllZCBkYXRhIG1vZGVsIGVsZW1lbnQuJyxcbiAgICB9LFxuICAgICc0MDcnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdFbGVtZW50IFZhbHVlIE91dCBPZiBSYW5nZScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnVGhlIG51bWVyaWMgdmFsdWUgc3VwcGxpZWQgdG8gYSBMTVNTZXRWYWx1ZSBjYWxsIGlzIG91dHNpZGUgb2YgdGhlIG51bWVyaWMgcmFuZ2UgYWxsb3dlZCBmb3IgdGhlIHN1cHBsaWVkIGRhdGEgbW9kZWwgZWxlbWVudC4nLFxuICAgIH0sXG4gICAgJzQwOCc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0RhdGEgTW9kZWwgRGVwZW5kZW5jeSBOb3QgRXN0YWJsaXNoZWQnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ1NvbWUgZGF0YSBtb2RlbCBlbGVtZW50cyBjYW5ub3QgYmUgc2V0IHVudGlsIGFub3RoZXIgZGF0YSBtb2RlbCBlbGVtZW50IHdhcyBzZXQuIFRoaXMgZXJyb3IgY29uZGl0aW9uIGluZGljYXRlcyB0aGF0IHRoZSBwcmVyZXF1aXNpdGUgZWxlbWVudCB3YXMgbm90IHNldCBiZWZvcmUgdGhlIGRlcGVuZGVudCBlbGVtZW50LicsXG4gICAgfSxcbiAgfSxcbn07XG5cbmNvbnN0IGFpY2MgPSB7XG4gIC4uLnNjb3JtMTIsIC4uLntcbiAgICBjbWlfY2hpbGRyZW46ICdjb3JlLHN1c3BlbmRfZGF0YSxsYXVuY2hfZGF0YSxjb21tZW50cyxvYmplY3RpdmVzLHN0dWRlbnRfZGF0YSxzdHVkZW50X3ByZWZlcmVuY2UsaW50ZXJhY3Rpb25zLGV2YWx1YXRpb24nLFxuICAgIHN0dWRlbnRfcHJlZmVyZW5jZV9jaGlsZHJlbjogJ2F1ZGlvLGxhbmd1YWdlLGxlc3Nvbl90eXBlLHNwZWVkLHRleHQsdGV4dF9jb2xvcix0ZXh0X2xvY2F0aW9uLHRleHRfc2l6ZSx2aWRlbyx3aW5kb3dzJyxcbiAgICBzdHVkZW50X2RhdGFfY2hpbGRyZW46ICdhdHRlbXB0X251bWJlcix0cmllcyxtYXN0ZXJ5X3Njb3JlLG1heF90aW1lX2FsbG93ZWQsdGltZV9saW1pdF9hY3Rpb24nLFxuICAgIHN0dWRlbnRfZGVtb2dyYXBoaWNzX2NoaWxkcmVuOiAnY2l0eSxjbGFzcyxjb21wYW55LGNvdW50cnksZXhwZXJpZW5jZSxmYW1pbGlhcl9uYW1lLGluc3RydWN0b3JfbmFtZSx0aXRsZSxuYXRpdmVfbGFuZ3VhZ2Usc3RhdGUsc3RyZWV0X2FkZHJlc3MsdGVsZXBob25lLHllYXJzX2V4cGVyaWVuY2UnLFxuICAgIHRyaWVzX2NoaWxkcmVuOiAndGltZSxzdGF0dXMsc2NvcmUnLFxuICAgIGF0dGVtcHRfcmVjb3Jkc19jaGlsZHJlbjogJ3Njb3JlLGxlc3Nvbl9zdGF0dXMnLFxuICAgIHBhdGhzX2NoaWxkcmVuOiAnbG9jYXRpb25faWQsZGF0ZSx0aW1lLHN0YXR1cyx3aHlfbGVmdCx0aW1lX2luX2VsZW1lbnQnLFxuICB9LFxufTtcblxuY29uc3Qgc2Nvcm0yMDA0ID0ge1xuICAvLyBDaGlsZHJlbiBsaXN0c1xuICBjbWlfY2hpbGRyZW46ICdfdmVyc2lvbixjb21tZW50c19mcm9tX2xlYXJuZXIsY29tbWVudHNfZnJvbV9sbXMsY29tcGxldGlvbl9zdGF0dXMsY3JlZGl0LGVudHJ5LGV4aXQsaW50ZXJhY3Rpb25zLGxhdW5jaF9kYXRhLGxlYXJuZXJfaWQsbGVhcm5lcl9uYW1lLGxlYXJuZXJfcHJlZmVyZW5jZSxsb2NhdGlvbixtYXhfdGltZV9hbGxvd2VkLG1vZGUsb2JqZWN0aXZlcyxwcm9ncmVzc19tZWFzdXJlLHNjYWxlZF9wYXNzaW5nX3Njb3JlLHNjb3JlLHNlc3Npb25fdGltZSxzdWNjZXNzX3N0YXR1cyxzdXNwZW5kX2RhdGEsdGltZV9saW1pdF9hY3Rpb24sdG90YWxfdGltZScsXG4gIGNvbW1lbnRzX2NoaWxkcmVuOiAnY29tbWVudCx0aW1lc3RhbXAsbG9jYXRpb24nLFxuICBzY29yZV9jaGlsZHJlbjogJ21heCxyYXcsc2NhbGVkLG1pbicsXG4gIG9iamVjdGl2ZXNfY2hpbGRyZW46ICdwcm9ncmVzc19tZWFzdXJlLGNvbXBsZXRpb25fc3RhdHVzLHN1Y2Nlc3Nfc3RhdHVzLGRlc2NyaXB0aW9uLHNjb3JlLGlkJyxcbiAgY29ycmVjdF9yZXNwb25zZXNfY2hpbGRyZW46ICdwYXR0ZXJuJyxcbiAgc3R1ZGVudF9kYXRhX2NoaWxkcmVuOiAnbWFzdGVyeV9zY29yZSxtYXhfdGltZV9hbGxvd2VkLHRpbWVfbGltaXRfYWN0aW9uJyxcbiAgc3R1ZGVudF9wcmVmZXJlbmNlX2NoaWxkcmVuOiAnYXVkaW9fbGV2ZWwsYXVkaW9fY2FwdGlvbmluZyxkZWxpdmVyeV9zcGVlZCxsYW5ndWFnZScsXG4gIGludGVyYWN0aW9uc19jaGlsZHJlbjogJ2lkLHR5cGUsb2JqZWN0aXZlcyx0aW1lc3RhbXAsY29ycmVjdF9yZXNwb25zZXMsd2VpZ2h0aW5nLGxlYXJuZXJfcmVzcG9uc2UscmVzdWx0LGxhdGVuY3ksZGVzY3JpcHRpb24nLFxuXG4gIGVycm9yX2Rlc2NyaXB0aW9uczoge1xuICAgICcwJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnTm8gRXJyb3InLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ05vIGVycm9yIG9jY3VycmVkLCB0aGUgcHJldmlvdXMgQVBJIGNhbGwgd2FzIHN1Y2Nlc3NmdWwuJyxcbiAgICB9LFxuICAgICcxMDEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdHZW5lcmFsIEV4Y2VwdGlvbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnTm8gc3BlY2lmaWMgZXJyb3IgY29kZSBleGlzdHMgdG8gZGVzY3JpYmUgdGhlIGVycm9yLiBVc2UgR2V0RGlhZ25vc3RpYyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLFxuICAgIH0sXG4gICAgJzEwMic6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0dlbmVyYWwgSW5pdGlhbGl6YXRpb24gRmFpbHVyZScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBJbml0aWFsaXplIGZhaWxlZCBmb3IgYW4gdW5rbm93biByZWFzb24uJyxcbiAgICB9LFxuICAgICcxMDMnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdBbHJlYWR5IEluaXRpYWxpemVkJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIEluaXRpYWxpemUgZmFpbGVkIGJlY2F1c2UgSW5pdGlhbGl6ZSB3YXMgYWxyZWFkeSBjYWxsZWQuJyxcbiAgICB9LFxuICAgICcxMDQnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdDb250ZW50IEluc3RhbmNlIFRlcm1pbmF0ZWQnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gSW5pdGlhbGl6ZSBmYWlsZWQgYmVjYXVzZSBUZXJtaW5hdGUgd2FzIGFscmVhZHkgY2FsbGVkLicsXG4gICAgfSxcbiAgICAnMTExJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnR2VuZXJhbCBUZXJtaW5hdGlvbiBGYWlsdXJlJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIFRlcm1pbmF0ZSBmYWlsZWQgZm9yIGFuIHVua25vd24gcmVhc29uLicsXG4gICAgfSxcbiAgICAnMTEyJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnVGVybWluYXRpb24gQmVmb3JlIEluaXRpYWxpemF0aW9uJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIFRlcm1pbmF0ZSBmYWlsZWQgYmVjYXVzZSBpdCB3YXMgbWFkZSBiZWZvcmUgdGhlIGNhbGwgdG8gSW5pdGlhbGl6ZS4nLFxuICAgIH0sXG4gICAgJzExMyc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ1Rlcm1pbmF0aW9uIEFmdGVyIFRlcm1pbmF0aW9uJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIFRlcm1pbmF0ZSBmYWlsZWQgYmVjYXVzZSBUZXJtaW5hdGUgd2FzIGFscmVhZHkgY2FsbGVkLicsXG4gICAgfSxcbiAgICAnMTIyJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnUmV0cmlldmUgRGF0YSBCZWZvcmUgSW5pdGlhbGl6YXRpb24nLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0NhbGwgdG8gR2V0VmFsdWUgZmFpbGVkIGJlY2F1c2UgaXQgd2FzIG1hZGUgYmVmb3JlIHRoZSBjYWxsIHRvIEluaXRpYWxpemUuJyxcbiAgICB9LFxuICAgICcxMjMnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdSZXRyaWV2ZSBEYXRhIEFmdGVyIFRlcm1pbmF0aW9uJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIEdldFZhbHVlIGZhaWxlZCBiZWNhdXNlIGl0IHdhcyBtYWRlIGFmdGVyIHRoZSBjYWxsIHRvIFRlcm1pbmF0ZS4nLFxuICAgIH0sXG4gICAgJzEzMic6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ1N0b3JlIERhdGEgQmVmb3JlIEluaXRpYWxpemF0aW9uJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIFNldFZhbHVlIGZhaWxlZCBiZWNhdXNlIGl0IHdhcyBtYWRlIGJlZm9yZSB0aGUgY2FsbCB0byBJbml0aWFsaXplLicsXG4gICAgfSxcbiAgICAnMTMzJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnU3RvcmUgRGF0YSBBZnRlciBUZXJtaW5hdGlvbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBTZXRWYWx1ZSBmYWlsZWQgYmVjYXVzZSBpdCB3YXMgbWFkZSBhZnRlciB0aGUgY2FsbCB0byBUZXJtaW5hdGUuJyxcbiAgICB9LFxuICAgICcxNDInOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdDb21taXQgQmVmb3JlIEluaXRpYWxpemF0aW9uJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdDYWxsIHRvIENvbW1pdCBmYWlsZWQgYmVjYXVzZSBpdCB3YXMgbWFkZSBiZWZvcmUgdGhlIGNhbGwgdG8gSW5pdGlhbGl6ZS4nLFxuICAgIH0sXG4gICAgJzE0Myc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0NvbW1pdCBBZnRlciBUZXJtaW5hdGlvbicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQ2FsbCB0byBDb21taXQgZmFpbGVkIGJlY2F1c2UgaXQgd2FzIG1hZGUgYWZ0ZXIgdGhlIGNhbGwgdG8gVGVybWluYXRlLicsXG4gICAgfSxcbiAgICAnMjAxJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnR2VuZXJhbCBBcmd1bWVudCBFcnJvcicsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQW4gaW52YWxpZCBhcmd1bWVudCB3YXMgcGFzc2VkIHRvIGFuIEFQSSBtZXRob2QgKHVzdWFsbHkgaW5kaWNhdGVzIHRoYXQgSW5pdGlhbGl6ZSwgQ29tbWl0IG9yIFRlcm1pbmF0ZSBkaWQgbm90IHJlY2VpdmUgdGhlIGV4cGVjdGVkIGVtcHR5IHN0cmluZyBhcmd1bWVudC4nLFxuICAgIH0sXG4gICAgJzMwMSc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0dlbmVyYWwgR2V0IEZhaWx1cmUnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0luZGljYXRlcyBhIGZhaWxlZCBHZXRWYWx1ZSBjYWxsIHdoZXJlIG5vIG90aGVyIHNwZWNpZmljIGVycm9yIGNvZGUgaXMgYXBwbGljYWJsZS4gVXNlIEdldERpYWdub3N0aWMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyxcbiAgICB9LFxuICAgICczNTEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdHZW5lcmFsIFNldCBGYWlsdXJlJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdJbmRpY2F0ZXMgYSBmYWlsZWQgU2V0VmFsdWUgY2FsbCB3aGVyZSBubyBvdGhlciBzcGVjaWZpYyBlcnJvciBjb2RlIGlzIGFwcGxpY2FibGUuIFVzZSBHZXREaWFnbm9zdGljIGZvciBtb3JlIGluZm9ybWF0aW9uLicsXG4gICAgfSxcbiAgICAnMzkxJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnR2VuZXJhbCBDb21taXQgRmFpbHVyZScsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnSW5kaWNhdGVzIGEgZmFpbGVkIENvbW1pdCBjYWxsIHdoZXJlIG5vIG90aGVyIHNwZWNpZmljIGVycm9yIGNvZGUgaXMgYXBwbGljYWJsZS4gVXNlIEdldERpYWdub3N0aWMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyxcbiAgICB9LFxuICAgICc0MDEnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdVbmRlZmluZWQgRGF0YSBNb2RlbCBFbGVtZW50JyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdUaGUgZGF0YSBtb2RlbCBlbGVtZW50IG5hbWUgcGFzc2VkIHRvIEdldFZhbHVlIG9yIFNldFZhbHVlIGlzIG5vdCBhIHZhbGlkIFNDT1JNIGRhdGEgbW9kZWwgZWxlbWVudC4nLFxuICAgIH0sXG4gICAgJzQwMic6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ1VuaW1wbGVtZW50ZWQgRGF0YSBNb2RlbCBFbGVtZW50JyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdUaGUgZGF0YSBtb2RlbCBlbGVtZW50IGluZGljYXRlZCBpbiBhIGNhbGwgdG8gR2V0VmFsdWUgb3IgU2V0VmFsdWUgaXMgdmFsaWQsIGJ1dCB3YXMgbm90IGltcGxlbWVudGVkIGJ5IHRoaXMgTE1TLiBJbiBTQ09STSAyMDA0LCB0aGlzIGVycm9yIHdvdWxkIGluZGljYXRlIGFuIExNUyB0aGF0IGlzIG5vdCBmdWxseSBTQ09STSBjb25mb3JtYW50LicsXG4gICAgfSxcbiAgICAnNDAzJzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRGF0YSBNb2RlbCBFbGVtZW50IFZhbHVlIE5vdCBJbml0aWFsaXplZCcsXG4gICAgICBkZXRhaWxNZXNzYWdlOiAnQXR0ZW1wdCB0byByZWFkIGEgZGF0YSBtb2RlbCBlbGVtZW50IHRoYXQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIGJ5IHRoZSBMTVMgb3IgdGhyb3VnaCBhIFNldFZhbHVlIGNhbGwuIFRoaXMgZXJyb3IgY29uZGl0aW9uIGlzIG9mdGVuIHJlYWNoZWQgZHVyaW5nIG5vcm1hbCBleGVjdXRpb24gb2YgYSBTQ08uJyxcbiAgICB9LFxuICAgICc0MDQnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdEYXRhIE1vZGVsIEVsZW1lbnQgSXMgUmVhZCBPbmx5JyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdTZXRWYWx1ZSB3YXMgY2FsbGVkIHdpdGggYSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCBjYW4gb25seSBiZSByZWFkLicsXG4gICAgfSxcbiAgICAnNDA1Jzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRGF0YSBNb2RlbCBFbGVtZW50IElzIFdyaXRlIE9ubHknLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ0dldFZhbHVlIHdhcyBjYWxsZWQgb24gYSBkYXRhIG1vZGVsIGVsZW1lbnQgdGhhdCBjYW4gb25seSBiZSB3cml0dGVuIHRvLicsXG4gICAgfSxcbiAgICAnNDA2Jzoge1xuICAgICAgYmFzaWNNZXNzYWdlOiAnRGF0YSBNb2RlbCBFbGVtZW50IFR5cGUgTWlzbWF0Y2gnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ1NldFZhbHVlIHdhcyBjYWxsZWQgd2l0aCBhIHZhbHVlIHRoYXQgaXMgbm90IGNvbnNpc3RlbnQgd2l0aCB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIHN1cHBsaWVkIGRhdGEgbW9kZWwgZWxlbWVudC4nLFxuICAgIH0sXG4gICAgJzQwNyc6IHtcbiAgICAgIGJhc2ljTWVzc2FnZTogJ0RhdGEgTW9kZWwgRWxlbWVudCBWYWx1ZSBPdXQgT2YgUmFuZ2UnLFxuICAgICAgZGV0YWlsTWVzc2FnZTogJ1RoZSBudW1lcmljIHZhbHVlIHN1cHBsaWVkIHRvIGEgU2V0VmFsdWUgY2FsbCBpcyBvdXRzaWRlIG9mIHRoZSBudW1lcmljIHJhbmdlIGFsbG93ZWQgZm9yIHRoZSBzdXBwbGllZCBkYXRhIG1vZGVsIGVsZW1lbnQuJyxcbiAgICB9LFxuICAgICc0MDgnOiB7XG4gICAgICBiYXNpY01lc3NhZ2U6ICdEYXRhIE1vZGVsIERlcGVuZGVuY3kgTm90IEVzdGFibGlzaGVkJyxcbiAgICAgIGRldGFpbE1lc3NhZ2U6ICdTb21lIGRhdGEgbW9kZWwgZWxlbWVudHMgY2Fubm90IGJlIHNldCB1bnRpbCBhbm90aGVyIGRhdGEgbW9kZWwgZWxlbWVudCB3YXMgc2V0LiBUaGlzIGVycm9yIGNvbmRpdGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJlcmVxdWlzaXRlIGVsZW1lbnQgd2FzIG5vdCBzZXQgYmVmb3JlIHRoZSBkZXBlbmRlbnQgZWxlbWVudC4nLFxuICAgIH0sXG4gIH0sXG59O1xuXG5jb25zdCBBUElDb25zdGFudHMgPSB7XG4gIGdsb2JhbDogZ2xvYmFsLFxuICBzY29ybTEyOiBzY29ybTEyLFxuICBhaWNjOiBhaWNjLFxuICBzY29ybTIwMDQ6IHNjb3JtMjAwNCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFQSUNvbnN0YW50cztcbiIsIi8vIEBmbG93XG5jb25zdCBnbG9iYWwgPSB7XG4gIEdFTkVSQUw6IDEwMSxcbiAgSU5JVElBTElaQVRJT05fRkFJTEVEOiAxMDEsXG4gIElOSVRJQUxJWkVEOiAxMDEsXG4gIFRFUk1JTkFURUQ6IDEwMSxcbiAgVEVSTUlOQVRJT05fRkFJTFVSRTogMTAxLFxuICBURVJNSU5BVElPTl9CRUZPUkVfSU5JVDogMTAxLFxuICBNVUxUSVBMRV9URVJNSU5BVElPTjogMTAxLFxuICBSRVRSSUVWRV9CRUZPUkVfSU5JVDogMTAxLFxuICBSRVRSSUVWRV9BRlRFUl9URVJNOiAxMDEsXG4gIFNUT1JFX0JFRk9SRV9JTklUOiAxMDEsXG4gIFNUT1JFX0FGVEVSX1RFUk06IDEwMSxcbiAgQ09NTUlUX0JFRk9SRV9JTklUOiAxMDEsXG4gIENPTU1JVF9BRlRFUl9URVJNOiAxMDEsXG4gIEFSR1VNRU5UX0VSUk9SOiAxMDEsXG4gIENISUxEUkVOX0VSUk9SOiAxMDEsXG4gIENPVU5UX0VSUk9SOiAxMDEsXG4gIEdFTkVSQUxfR0VUX0ZBSUxVUkU6IDEwMSxcbiAgR0VORVJBTF9TRVRfRkFJTFVSRTogMTAxLFxuICBHRU5FUkFMX0NPTU1JVF9GQUlMVVJFOiAxMDEsXG4gIFVOREVGSU5FRF9EQVRBX01PREVMOiAxMDEsXG4gIFVOSU1QTEVNRU5URURfRUxFTUVOVDogMTAxLFxuICBWQUxVRV9OT1RfSU5JVElBTElaRUQ6IDEwMSxcbiAgSU5WQUxJRF9TRVRfVkFMVUU6IDEwMSxcbiAgUkVBRF9PTkxZX0VMRU1FTlQ6IDEwMSxcbiAgV1JJVEVfT05MWV9FTEVNRU5UOiAxMDEsXG4gIFRZUEVfTUlTTUFUQ0g6IDEwMSxcbiAgVkFMVUVfT1VUX09GX1JBTkdFOiAxMDEsXG4gIERFUEVOREVOQ1lfTk9UX0VTVEFCTElTSEVEOiAxMDEsXG59O1xuXG5jb25zdCBzY29ybTEyID0ge1xuICAuLi5nbG9iYWwsIC4uLntcbiAgICBSRVRSSUVWRV9CRUZPUkVfSU5JVDogMzAxLFxuICAgIFNUT1JFX0JFRk9SRV9JTklUOiAzMDEsXG4gICAgQ09NTUlUX0JFRk9SRV9JTklUOiAzMDEsXG4gICAgQVJHVU1FTlRfRVJST1I6IDIwMSxcbiAgICBDSElMRFJFTl9FUlJPUjogMjAyLFxuICAgIENPVU5UX0VSUk9SOiAyMDMsXG4gICAgVU5ERUZJTkVEX0RBVEFfTU9ERUw6IDQwMSxcbiAgICBVTklNUExFTUVOVEVEX0VMRU1FTlQ6IDQwMSxcbiAgICBWQUxVRV9OT1RfSU5JVElBTElaRUQ6IDMwMSxcbiAgICBJTlZBTElEX1NFVF9WQUxVRTogNDAyLFxuICAgIFJFQURfT05MWV9FTEVNRU5UOiA0MDMsXG4gICAgV1JJVEVfT05MWV9FTEVNRU5UOiA0MDQsXG4gICAgVFlQRV9NSVNNQVRDSDogNDA1LFxuICAgIFZBTFVFX09VVF9PRl9SQU5HRTogNDA3LFxuICAgIERFUEVOREVOQ1lfTk9UX0VTVEFCTElTSEVEOiA0MDgsXG4gIH0sXG59O1xuXG5jb25zdCBzY29ybTIwMDQgPSB7XG4gIC4uLmdsb2JhbCwgLi4ue1xuICAgIElOSVRJQUxJWkFUSU9OX0ZBSUxFRDogMTAyLFxuICAgIElOSVRJQUxJWkVEOiAxMDMsXG4gICAgVEVSTUlOQVRFRDogMTA0LFxuICAgIFRFUk1JTkFUSU9OX0ZBSUxVUkU6IDExMSxcbiAgICBURVJNSU5BVElPTl9CRUZPUkVfSU5JVDogMTEyLFxuICAgIE1VTFRJUExFX1RFUk1JTkFUSU9OUzogMTEzLFxuICAgIFJFVFJJRVZFX0JFRk9SRV9JTklUOiAxMjIsXG4gICAgUkVUUklFVkVfQUZURVJfVEVSTTogMTIzLFxuICAgIFNUT1JFX0JFRk9SRV9JTklUOiAxMzIsXG4gICAgU1RPUkVfQUZURVJfVEVSTTogMTMzLFxuICAgIENPTU1JVF9CRUZPUkVfSU5JVDogMTQyLFxuICAgIENPTU1JVF9BRlRFUl9URVJNOiAxNDMsXG4gICAgQVJHVU1FTlRfRVJST1I6IDIwMSxcbiAgICBHRU5FUkFMX0dFVF9GQUlMVVJFOiAzMDEsXG4gICAgR0VORVJBTF9TRVRfRkFJTFVSRTogMzUxLFxuICAgIEdFTkVSQUxfQ09NTUlUX0ZBSUxVUkU6IDM5MSxcbiAgICBVTkRFRklORURfREFUQV9NT0RFTDogNDAxLFxuICAgIFVOSU1QTEVNRU5URURfRUxFTUVOVDogNDAyLFxuICAgIFZBTFVFX05PVF9JTklUSUFMSVpFRDogNDAzLFxuICAgIFJFQURfT05MWV9FTEVNRU5UOiA0MDQsXG4gICAgV1JJVEVfT05MWV9FTEVNRU5UOiA0MDUsXG4gICAgVFlQRV9NSVNNQVRDSDogNDA2LFxuICAgIFZBTFVFX09VVF9PRl9SQU5HRTogNDA3LFxuICAgIERFUEVOREVOQ1lfTk9UX0VTVEFCTElTSEVEOiA0MDgsXG4gIH0sXG59O1xuXG5jb25zdCBFcnJvckNvZGVzID0ge1xuICBzY29ybTEyOiBzY29ybTEyLFxuICBzY29ybTIwMDQ6IHNjb3JtMjAwNCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEVycm9yQ29kZXM7XG4iLCJjb25zdCBWYWxpZExhbmd1YWdlcyA9IHtcbiAgJ2FhJzogJ2FhJywgJ2FiJzogJ2FiJywgJ2FlJzogJ2FlJywgJ2FmJzogJ2FmJywgJ2FrJzogJ2FrJywgJ2FtJzogJ2FtJyxcbiAgJ2FuJzogJ2FuJywgJ2FyJzogJ2FyJywgJ2FzJzogJ2FzJywgJ2F2JzogJ2F2JywgJ2F5JzogJ2F5JywgJ2F6JzogJ2F6JyxcbiAgJ2JhJzogJ2JhJywgJ2JlJzogJ2JlJywgJ2JnJzogJ2JnJywgJ2JoJzogJ2JoJywgJ2JpJzogJ2JpJywgJ2JtJzogJ2JtJyxcbiAgJ2JuJzogJ2JuJywgJ2JvJzogJ2JvJywgJ2JyJzogJ2JyJywgJ2JzJzogJ2JzJywgJ2NhJzogJ2NhJywgJ2NlJzogJ2NlJyxcbiAgJ2NoJzogJ2NoJywgJ2NvJzogJ2NvJywgJ2NyJzogJ2NyJywgJ2NzJzogJ2NzJywgJ2N1JzogJ2N1JywgJ2N2JzogJ2N2JyxcbiAgJ2N5JzogJ2N5JywgJ2RhJzogJ2RhJywgJ2RlJzogJ2RlJywgJ2R2JzogJ2R2JywgJ2R6JzogJ2R6JywgJ2VlJzogJ2VlJyxcbiAgJ2VsJzogJ2VsJywgJ2VuJzogJ2VuJywgJ2VvJzogJ2VvJywgJ2VzJzogJ2VzJywgJ2V0JzogJ2V0JywgJ2V1JzogJ2V1JyxcbiAgJ2ZhJzogJ2ZhJywgJ2ZmJzogJ2ZmJywgJ2ZpJzogJ2ZpJywgJ2ZqJzogJ2ZqJywgJ2ZvJzogJ2ZvJywgJ2ZyJzogJ2ZyJyxcbiAgJ2Z5JzogJ2Z5JywgJ2dhJzogJ2dhJywgJ2dkJzogJ2dkJywgJ2dsJzogJ2dsJywgJ2duJzogJ2duJywgJ2d1JzogJ2d1JyxcbiAgJ2d2JzogJ2d2JywgJ2hhJzogJ2hhJywgJ2hlJzogJ2hlJywgJ2hpJzogJ2hpJywgJ2hvJzogJ2hvJywgJ2hyJzogJ2hyJyxcbiAgJ2h0JzogJ2h0JywgJ2h1JzogJ2h1JywgJ2h5JzogJ2h5JywgJ2h6JzogJ2h6JywgJ2lhJzogJ2lhJywgJ2lkJzogJ2lkJyxcbiAgJ2llJzogJ2llJywgJ2lnJzogJ2lnJywgJ2lpJzogJ2lpJywgJ2lrJzogJ2lrJywgJ2lvJzogJ2lvJywgJ2lzJzogJ2lzJyxcbiAgJ2l0JzogJ2l0JywgJ2l1JzogJ2l1JywgJ2phJzogJ2phJywgJ2p2JzogJ2p2JywgJ2thJzogJ2thJywgJ2tnJzogJ2tnJyxcbiAgJ2tpJzogJ2tpJywgJ2tqJzogJ2tqJywgJ2trJzogJ2trJywgJ2tsJzogJ2tsJywgJ2ttJzogJ2ttJywgJ2tuJzogJ2tuJyxcbiAgJ2tvJzogJ2tvJywgJ2tyJzogJ2tyJywgJ2tzJzogJ2tzJywgJ2t1JzogJ2t1JywgJ2t2JzogJ2t2JywgJ2t3JzogJ2t3JyxcbiAgJ2t5JzogJ2t5JywgJ2xhJzogJ2xhJywgJ2xiJzogJ2xiJywgJ2xnJzogJ2xnJywgJ2xpJzogJ2xpJywgJ2xuJzogJ2xuJyxcbiAgJ2xvJzogJ2xvJywgJ2x0JzogJ2x0JywgJ2x1JzogJ2x1JywgJ2x2JzogJ2x2JywgJ21nJzogJ21nJywgJ21oJzogJ21oJyxcbiAgJ21pJzogJ21pJywgJ21rJzogJ21rJywgJ21sJzogJ21sJywgJ21uJzogJ21uJywgJ21vJzogJ21vJywgJ21yJzogJ21yJyxcbiAgJ21zJzogJ21zJywgJ210JzogJ210JywgJ215JzogJ215JywgJ25hJzogJ25hJywgJ25iJzogJ25iJywgJ25kJzogJ25kJyxcbiAgJ25lJzogJ25lJywgJ25nJzogJ25nJywgJ25sJzogJ25sJywgJ25uJzogJ25uJywgJ25vJzogJ25vJywgJ25yJzogJ25yJyxcbiAgJ252JzogJ252JywgJ255JzogJ255JywgJ29jJzogJ29jJywgJ29qJzogJ29qJywgJ29tJzogJ29tJywgJ29yJzogJ29yJyxcbiAgJ29zJzogJ29zJywgJ3BhJzogJ3BhJywgJ3BpJzogJ3BpJywgJ3BsJzogJ3BsJywgJ3BzJzogJ3BzJywgJ3B0JzogJ3B0JyxcbiAgJ3F1JzogJ3F1JywgJ3JtJzogJ3JtJywgJ3JuJzogJ3JuJywgJ3JvJzogJ3JvJywgJ3J1JzogJ3J1JywgJ3J3JzogJ3J3JyxcbiAgJ3NhJzogJ3NhJywgJ3NjJzogJ3NjJywgJ3NkJzogJ3NkJywgJ3NlJzogJ3NlJywgJ3NnJzogJ3NnJywgJ3NoJzogJ3NoJyxcbiAgJ3NpJzogJ3NpJywgJ3NrJzogJ3NrJywgJ3NsJzogJ3NsJywgJ3NtJzogJ3NtJywgJ3NuJzogJ3NuJywgJ3NvJzogJ3NvJyxcbiAgJ3NxJzogJ3NxJywgJ3NyJzogJ3NyJywgJ3NzJzogJ3NzJywgJ3N0JzogJ3N0JywgJ3N1JzogJ3N1JywgJ3N2JzogJ3N2JyxcbiAgJ3N3JzogJ3N3JywgJ3RhJzogJ3RhJywgJ3RlJzogJ3RlJywgJ3RnJzogJ3RnJywgJ3RoJzogJ3RoJywgJ3RpJzogJ3RpJyxcbiAgJ3RrJzogJ3RrJywgJ3RsJzogJ3RsJywgJ3RuJzogJ3RuJywgJ3RvJzogJ3RvJywgJ3RyJzogJ3RyJywgJ3RzJzogJ3RzJyxcbiAgJ3R0JzogJ3R0JywgJ3R3JzogJ3R3JywgJ3R5JzogJ3R5JywgJ3VnJzogJ3VnJywgJ3VrJzogJ3VrJywgJ3VyJzogJ3VyJyxcbiAgJ3V6JzogJ3V6JywgJ3ZlJzogJ3ZlJywgJ3ZpJzogJ3ZpJywgJ3ZvJzogJ3ZvJywgJ3dhJzogJ3dhJywgJ3dvJzogJ3dvJyxcbiAgJ3hoJzogJ3hoJywgJ3lpJzogJ3lpJywgJ3lvJzogJ3lvJywgJ3phJzogJ3phJywgJ3poJzogJ3poJywgJ3p1JzogJ3p1JyxcbiAgJ2Fhcic6ICdhYXInLCAnYWJrJzogJ2FiaycsICdhdmUnOiAnYXZlJywgJ2Fmcic6ICdhZnInLCAnYWthJzogJ2FrYScsXG4gICdhbWgnOiAnYW1oJywgJ2FyZyc6ICdhcmcnLCAnYXJhJzogJ2FyYScsICdhc20nOiAnYXNtJywgJ2F2YSc6ICdhdmEnLFxuICAnYXltJzogJ2F5bScsICdhemUnOiAnYXplJywgJ2Jhayc6ICdiYWsnLCAnYmVsJzogJ2JlbCcsICdidWwnOiAnYnVsJyxcbiAgJ2JpaCc6ICdiaWgnLCAnYmlzJzogJ2JpcycsICdiYW0nOiAnYmFtJywgJ2Jlbic6ICdiZW4nLCAndGliJzogJ3RpYicsXG4gICdib2QnOiAnYm9kJywgJ2JyZSc6ICdicmUnLCAnYm9zJzogJ2JvcycsICdjYXQnOiAnY2F0JywgJ2NoZSc6ICdjaGUnLFxuICAnY2hhJzogJ2NoYScsICdjb3MnOiAnY29zJywgJ2NyZSc6ICdjcmUnLCAnY3plJzogJ2N6ZScsICdjZXMnOiAnY2VzJyxcbiAgJ2NodSc6ICdjaHUnLCAnY2h2JzogJ2NodicsICd3ZWwnOiAnd2VsJywgJ2N5bSc6ICdjeW0nLCAnZGFuJzogJ2RhbicsXG4gICdnZXInOiAnZ2VyJywgJ2RldSc6ICdkZXUnLCAnZGl2JzogJ2RpdicsICdkem8nOiAnZHpvJywgJ2V3ZSc6ICdld2UnLFxuICAnZ3JlJzogJ2dyZScsICdlbGwnOiAnZWxsJywgJ2VuZyc6ICdlbmcnLCAnZXBvJzogJ2VwbycsICdzcGEnOiAnc3BhJyxcbiAgJ2VzdCc6ICdlc3QnLCAnYmFxJzogJ2JhcScsICdldXMnOiAnZXVzJywgJ3Blcic6ICdwZXInLCAnZmFzJzogJ2ZhcycsXG4gICdmdWwnOiAnZnVsJywgJ2Zpbic6ICdmaW4nLCAnZmlqJzogJ2ZpaicsICdmYW8nOiAnZmFvJywgJ2ZyZSc6ICdmcmUnLFxuICAnZnJhJzogJ2ZyYScsICdmcnknOiAnZnJ5JywgJ2dsZSc6ICdnbGUnLCAnZ2xhJzogJ2dsYScsICdnbGcnOiAnZ2xnJyxcbiAgJ2dybic6ICdncm4nLCAnZ3VqJzogJ2d1aicsICdnbHYnOiAnZ2x2JywgJ2hhdSc6ICdoYXUnLCAnaGViJzogJ2hlYicsXG4gICdoaW4nOiAnaGluJywgJ2htbyc6ICdobW8nLCAnaHJ2JzogJ2hydicsICdoYXQnOiAnaGF0JywgJ2h1bic6ICdodW4nLFxuICAnYXJtJzogJ2FybScsICdoeWUnOiAnaHllJywgJ2hlcic6ICdoZXInLCAnaW5hJzogJ2luYScsICdpbmQnOiAnaW5kJyxcbiAgJ2lsZSc6ICdpbGUnLCAnaWJvJzogJ2libycsICdpaWknOiAnaWlpJywgJ2lwayc6ICdpcGsnLCAnaWRvJzogJ2lkbycsXG4gICdpY2UnOiAnaWNlJywgJ2lzbCc6ICdpc2wnLCAnaXRhJzogJ2l0YScsICdpa3UnOiAnaWt1JywgJ2pwbic6ICdqcG4nLFxuICAnamF2JzogJ2phdicsICdnZW8nOiAnZ2VvJywgJ2thdCc6ICdrYXQnLCAna29uJzogJ2tvbicsICdraWsnOiAna2lrJyxcbiAgJ2t1YSc6ICdrdWEnLCAna2F6JzogJ2theicsICdrYWwnOiAna2FsJywgJ2tobSc6ICdraG0nLCAna2FuJzogJ2thbicsXG4gICdrb3InOiAna29yJywgJ2thdSc6ICdrYXUnLCAna2FzJzogJ2thcycsICdrdXInOiAna3VyJywgJ2tvbSc6ICdrb20nLFxuICAnY29yJzogJ2NvcicsICdraXInOiAna2lyJywgJ2xhdCc6ICdsYXQnLCAnbHR6JzogJ2x0eicsICdsdWcnOiAnbHVnJyxcbiAgJ2xpbSc6ICdsaW0nLCAnbGluJzogJ2xpbicsICdsYW8nOiAnbGFvJywgJ2xpdCc6ICdsaXQnLCAnbHViJzogJ2x1YicsXG4gICdsYXYnOiAnbGF2JywgJ21sZyc6ICdtbGcnLCAnbWFoJzogJ21haCcsICdtYW8nOiAnbWFvJywgJ21yaSc6ICdtcmknLFxuICAnbWFjJzogJ21hYycsICdta2QnOiAnbWtkJywgJ21hbCc6ICdtYWwnLCAnbW9uJzogJ21vbicsICdtb2wnOiAnbW9sJyxcbiAgJ21hcic6ICdtYXInLCAnbWF5JzogJ21heScsICdtc2EnOiAnbXNhJywgJ21sdCc6ICdtbHQnLCAnYnVyJzogJ2J1cicsXG4gICdteWEnOiAnbXlhJywgJ25hdSc6ICduYXUnLCAnbm9iJzogJ25vYicsICduZGUnOiAnbmRlJywgJ25lcCc6ICduZXAnLFxuICAnbmRvJzogJ25kbycsICdkdXQnOiAnZHV0JywgJ25sZCc6ICdubGQnLCAnbm5vJzogJ25ubycsICdub3InOiAnbm9yJyxcbiAgJ25ibCc6ICduYmwnLCAnbmF2JzogJ25hdicsICdueWEnOiAnbnlhJywgJ29jaSc6ICdvY2knLCAnb2ppJzogJ29qaScsXG4gICdvcm0nOiAnb3JtJywgJ29yaSc6ICdvcmknLCAnb3NzJzogJ29zcycsICdwYW4nOiAncGFuJywgJ3BsaSc6ICdwbGknLFxuICAncG9sJzogJ3BvbCcsICdwdXMnOiAncHVzJywgJ3Bvcic6ICdwb3InLCAncXVlJzogJ3F1ZScsICdyb2gnOiAncm9oJyxcbiAgJ3J1bic6ICdydW4nLCAncnVtJzogJ3J1bScsICdyb24nOiAncm9uJywgJ3J1cyc6ICdydXMnLCAna2luJzogJ2tpbicsXG4gICdzYW4nOiAnc2FuJywgJ3NyZCc6ICdzcmQnLCAnc25kJzogJ3NuZCcsICdzbWUnOiAnc21lJywgJ3NhZyc6ICdzYWcnLFxuICAnc2xvJzogJ3NsbycsICdzaW4nOiAnc2luJywgJ3Nsayc6ICdzbGsnLCAnc2x2JzogJ3NsdicsICdzbW8nOiAnc21vJyxcbiAgJ3NuYSc6ICdzbmEnLCAnc29tJzogJ3NvbScsICdhbGInOiAnYWxiJywgJ3NxaSc6ICdzcWknLCAnc3JwJzogJ3NycCcsXG4gICdzc3cnOiAnc3N3JywgJ3NvdCc6ICdzb3QnLCAnc3VuJzogJ3N1bicsICdzd2UnOiAnc3dlJywgJ3N3YSc6ICdzd2EnLFxuICAndGFtJzogJ3RhbScsICd0ZWwnOiAndGVsJywgJ3Rnayc6ICd0Z2snLCAndGhhJzogJ3RoYScsICd0aXInOiAndGlyJyxcbiAgJ3R1ayc6ICd0dWsnLCAndGdsJzogJ3RnbCcsICd0c24nOiAndHNuJywgJ3Rvbic6ICd0b24nLCAndHVyJzogJ3R1cicsXG4gICd0c28nOiAndHNvJywgJ3RhdCc6ICd0YXQnLCAndHdpJzogJ3R3aScsICd0YWgnOiAndGFoJywgJ3VpZyc6ICd1aWcnLFxuICAndWtyJzogJ3VrcicsICd1cmQnOiAndXJkJywgJ3V6Yic6ICd1emInLCAndmVuJzogJ3ZlbicsICd2aWUnOiAndmllJyxcbiAgJ3ZvbCc6ICd2b2wnLCAnd2xuJzogJ3dsbicsICd3b2wnOiAnd29sJywgJ3hobyc6ICd4aG8nLCAneWlkJzogJ3lpZCcsXG4gICd5b3InOiAneW9yJywgJ3poYSc6ICd6aGEnLCAnY2hpJzogJ2NoaScsICd6aG8nOiAnemhvJywgJ3p1bCc6ICd6dWwnLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgVmFsaWRMYW5ndWFnZXM7XG4iLCIvLyBAZmxvd1xuXG5jb25zdCBzY29ybTEyID0ge1xuICBDTUlTdHJpbmcyNTY6ICdeLnswLDI1NX0kJyxcbiAgQ01JU3RyaW5nNDA5NjogJ14uezAsNDA5Nn0kJyxcbiAgQ01JVGltZTogJ14oPzpbMDFdXFxcXGR8MlswMTIzXSk6KD86WzAxMjM0NV1cXFxcZCk6KD86WzAxMjM0NV1cXFxcZCkkJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBDTUlUaW1lc3BhbjogJ14oWzAtOV17Mix9KTooWzAtOV17Mn0pOihbMC05XXsyfSkoXFwuWzAtOV17MSwyfSk/JCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgQ01JSW50ZWdlcjogJ15cXFxcZCskJyxcbiAgQ01JU0ludGVnZXI6ICdeLT8oWzAtOV0rKSQnLFxuICBDTUlEZWNpbWFsOiAnXi0/KFswLTldezAsM30pKFxcLlswLTldKik/JCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgQ01JSWRlbnRpZmllcjogJ15bXFxcXHUwMDIxLVxcXFx1MDA3RVxcXFxzXXswLDI1NX0kJyxcbiAgQ01JRmVlZGJhY2s6ICdeLnswLDI1NX0kJywgLy8gVGhpcyBtdXN0IGJlIHJlZGVmaW5lZFxuICBDTUlJbmRleDogJ1suX10oXFxcXGQrKS4nLFxuXG4gIC8vIFZvY2FidWxhcnkgRGF0YSBUeXBlIERlZmluaXRpb25cbiAgQ01JU3RhdHVzOiAnXihwYXNzZWR8Y29tcGxldGVkfGZhaWxlZHxpbmNvbXBsZXRlfGJyb3dzZWQpJCcsXG4gIENNSVN0YXR1czI6ICdeKHBhc3NlZHxjb21wbGV0ZWR8ZmFpbGVkfGluY29tcGxldGV8YnJvd3NlZHxub3QgYXR0ZW1wdGVkKSQnLFxuICBDTUlFeGl0OiAnXih0aW1lLW91dHxzdXNwZW5kfGxvZ291dHwpJCcsXG4gIENNSVR5cGU6ICdeKHRydWUtZmFsc2V8Y2hvaWNlfGZpbGwtaW58bWF0Y2hpbmd8cGVyZm9ybWFuY2V8c2VxdWVuY2luZ3xsaWtlcnR8bnVtZXJpYykkJyxcbiAgQ01JUmVzdWx0OiAnXihjb3JyZWN0fHdyb25nfHVuYW50aWNpcGF0ZWR8bmV1dHJhbHwoWzAtOV17MCwzfSk/KFxcXFwuWzAtOV0qKT8pJCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgTkFWRXZlbnQ6ICdeKHByZXZpb3VzfGNvbnRpbnVlKSQnLFxuXG4gIC8vIERhdGEgcmFuZ2VzXG4gIHNjb3JlX3JhbmdlOiAnMCMxMDAnLFxuICBhdWRpb19yYW5nZTogJy0xIzEwMCcsXG4gIHNwZWVkX3JhbmdlOiAnLTEwMCMxMDAnLFxuICB3ZWlnaHRpbmdfcmFuZ2U6ICctMTAwIzEwMCcsXG4gIHRleHRfcmFuZ2U6ICctMSMxJyxcbn07XG5cbmNvbnN0IGFpY2MgPSB7XG4gIC4uLnNjb3JtMTIsIC4uLntcbiAgICBDTUlJZGVudGlmaWVyOiAnXlxcXFx3ezEsMjU1fSQnLFxuICB9LFxufTtcblxuY29uc3Qgc2Nvcm0yMDA0ID0ge1xuICBDTUlTdHJpbmcyMDA6ICdeW1xcXFx1MDAwMC1cXFxcdUZGRkZdezAsMjAwfSQnLFxuICBDTUlTdHJpbmcyNTA6ICdeW1xcXFx1MDAwMC1cXFxcdUZGRkZdezAsMjUwfSQnLFxuICBDTUlTdHJpbmcxMDAwOiAnXltcXFxcdTAwMDAtXFxcXHVGRkZGXXswLDEwMDB9JCcsXG4gIENNSVN0cmluZzQwMDA6ICdeW1xcXFx1MDAwMC1cXFxcdUZGRkZdezAsNDAwMH0kJyxcbiAgQ01JU3RyaW5nNjQwMDA6ICdeW1xcXFx1MDAwMC1cXFxcdUZGRkZdezAsNjQwMDB9JCcsXG4gIENNSUxhbmc6ICdeKFthLXpBLVpdezIsM318aXx4KShcXC1bYS16QS1aMC05XFwtXXsyLDh9KT8kfF4kJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBDTUlMYW5nU3RyaW5nMjUwOiAnXihcXHtsYW5nPShbYS16QS1aXXsyLDN9fGl8eCkoXFwtW2EtekEtWjAtOVxcLV17Miw4fSk/XFx9KT8oKD8hXFx7LiokKS57MCwyNTB9JCk/JCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgQ01JTGFuZ2NyOiAnXigoXFx7bGFuZz0oW2EtekEtWl17MiwzfXxpfHgpPyhcXC1bYS16QS1aMC05XFwtXXsyLDh9KT9cXH0pKSguKj8pJCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgQ01JTGFuZ1N0cmluZzI1MGNyOiAnXigoXFx7bGFuZz0oW2EtekEtWl17MiwzfXxpfHgpPyhcXC1bYS16QS1aMC05XFwtXXsyLDh9KT9cXH0pPyguezAsMjUwfSk/KT8kJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBDTUlMYW5nU3RyaW5nNDAwMDogJ14oXFx7bGFuZz0oW2EtekEtWl17MiwzfXxpfHgpKFxcLVthLXpBLVowLTlcXC1dezIsOH0pP1xcfSk/KCg/IVxcey4qJCkuezAsNDAwMH0kKT8kJywgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICBDTUlUaW1lOiAnXigxOVs3LTldezF9WzAtOV17MX18MjBbMC0yXXsxfVswLTldezF9fDIwM1swLThdezF9KSgoLSgwWzEtOV17MX18MVswLTJdezF9KSkoKC0oMFsxLTldezF9fFsxLTJdezF9WzAtOV17MX18M1swLTFdezF9KSkoVChbMC0xXXsxfVswLTldezF9fDJbMC0zXXsxfSkoKDpbMC01XXsxfVswLTldezF9KSgoOlswLTVdezF9WzAtOV17MX0pKChcXFxcLlswLTldezEsMn0pKChafChbK3wtXShbMC0xXXsxfVswLTldezF9fDJbMC0zXXsxfSkpKSg6WzAtNV17MX1bMC05XXsxfSk/KT8pPyk/KT8pPyk/KT8kJyxcbiAgQ01JVGltZXNwYW46ICdeUCg/OihbLixcXFxcZF0rKVkpPyg/OihbLixcXFxcZF0rKU0pPyg/OihbLixcXFxcZF0rKVcpPyg/OihbLixcXFxcZF0rKUQpPyg/OlQ/KD86KFsuLFxcXFxkXSspSCk/KD86KFsuLFxcXFxkXSspTSk/KD86KFsuLFxcXFxkXSspUyk/KT8kJyxcbiAgQ01JSW50ZWdlcjogJ15cXFxcZCskJyxcbiAgQ01JU0ludGVnZXI6ICdeLT8oWzAtOV0rKSQnLFxuICBDTUlEZWNpbWFsOiAnXi0/KFswLTldezEsNX0pKFxcXFwuWzAtOV17MSwxOH0pPyQnLFxuICBDTUlJZGVudGlmaWVyOiAnXlxcXFxTezEsMjUwfVthLXpBLVowLTldJCcsXG4gIENNSVNob3J0SWRlbnRpZmllcjogJ15bXFxcXHdcXFxcLlxcXFwtXFxcXF9dezEsMjUwfSQnLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIENNSUxvbmdJZGVudGlmaWVyOiAnXig/Oig/IXVybjopXFxcXFN7MSw0MDAwfXx1cm46W0EtWmEtejAtOS1dezEsMzF9OlxcXFxTezEsNDAwMH18LnsxLDQwMDB9KSQnLCAvLyBuZWVkIHRvIHJlLWV4YW1pbmUgdGhpc1xuICBDTUlGZWVkYmFjazogJ14uKiQnLCAvLyBUaGlzIG11c3QgYmUgcmVkZWZpbmVkXG4gIENNSUluZGV4OiAnWy5fXShcXFxcZCspLicsXG4gIENNSUluZGV4U3RvcmU6ICcuTihcXFxcZCspLicsXG5cbiAgLy8gVm9jYWJ1bGFyeSBEYXRhIFR5cGUgRGVmaW5pdGlvblxuICBDTUlDU3RhdHVzOiAnXihjb21wbGV0ZWR8aW5jb21wbGV0ZXxub3QgYXR0ZW1wdGVkfHVua25vd24pJCcsXG4gIENNSVNTdGF0dXM6ICdeKHBhc3NlZHxmYWlsZWR8dW5rbm93bikkJyxcbiAgQ01JRXhpdDogJ14odGltZS1vdXR8c3VzcGVuZHxsb2dvdXR8bm9ybWFsKSQnLFxuICBDTUlUeXBlOiAnXih0cnVlLWZhbHNlfGNob2ljZXxmaWxsLWlufGxvbmctZmlsbC1pbnxtYXRjaGluZ3xwZXJmb3JtYW5jZXxzZXF1ZW5jaW5nfGxpa2VydHxudW1lcmljfG90aGVyKSQnLFxuICBDTUlSZXN1bHQ6ICdeKGNvcnJlY3R8aW5jb3JyZWN0fHVuYW50aWNpcGF0ZWR8bmV1dHJhbHwtPyhbMC05XXsxLDR9KShcXFxcLlswLTldezEsMTh9KT8pJCcsXG4gIE5BVkV2ZW50OiAnXihwcmV2aW91c3xjb250aW51ZXxleGl0fGV4aXRBbGx8YWJhbmRvbnxhYmFuZG9uQWxsfHN1c3BlbmRBbGx8XFx7dGFyZ2V0PVxcXFxTezAsMjAwfVthLXpBLVowLTldXFx9Y2hvaWNlfGp1bXApJCcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgTkFWQm9vbGVhbjogJ14odW5rbm93bnx0cnVlfGZhbHNlJCknLFxuICBOQVZUYXJnZXQ6ICdeKHByZXZpb3VzfGNvbnRpbnVlfGNob2ljZS57dGFyZ2V0PVxcXFxTezAsMjAwfVthLXpBLVowLTldfSkkJyxcblxuICAvLyBEYXRhIHJhbmdlc1xuICBzY2FsZWRfcmFuZ2U6ICctMSMxJyxcbiAgYXVkaW9fcmFuZ2U6ICcwIyonLFxuICBzcGVlZF9yYW5nZTogJzAjKicsXG4gIHRleHRfcmFuZ2U6ICctMSMxJyxcbiAgcHJvZ3Jlc3NfcmFuZ2U6ICcwIzEnLFxufTtcblxuY29uc3QgUmVnZXggPSB7XG4gIGFpY2M6IGFpY2MsXG4gIHNjb3JtMTI6IHNjb3JtMTIsXG4gIHNjb3JtMjAwNDogc2Nvcm0yMDA0LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgUmVnZXg7XG4iLCIvLyBAZmxvd1xuaW1wb3J0IFJlZ2V4IGZyb20gJy4vcmVnZXgnO1xuXG5jb25zdCBzY29ybTIwMDRfcmVnZXggPSBSZWdleC5zY29ybTIwMDQ7XG5cbmNvbnN0IGxlYXJuZXIgPSB7XG4gICd0cnVlLWZhbHNlJzoge1xuICAgIGZvcm1hdDogJ150cnVlJHxeZmFsc2UkJyxcbiAgICBtYXg6IDEsXG4gICAgZGVsaW1pdGVyOiAnJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICB9LFxuICAnY2hvaWNlJzoge1xuICAgIGZvcm1hdDogc2Nvcm0yMDA0X3JlZ2V4LkNNSUxvbmdJZGVudGlmaWVyLFxuICAgIG1heDogMzYsXG4gICAgZGVsaW1pdGVyOiAnWyxdJyxcbiAgICB1bmlxdWU6IHRydWUsXG4gIH0sXG4gICdmaWxsLWluJzoge1xuICAgIGZvcm1hdDogc2Nvcm0yMDA0X3JlZ2V4LkNNSUxhbmdTdHJpbmcyNTAsXG4gICAgbWF4OiAxMCxcbiAgICBkZWxpbWl0ZXI6ICdbLF0nLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gIH0sXG4gICdsb25nLWZpbGwtaW4nOiB7XG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JTGFuZ1N0cmluZzQwMDAsXG4gICAgbWF4OiAxLFxuICAgIGRlbGltaXRlcjogJycsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgfSxcbiAgJ21hdGNoaW5nJzoge1xuICAgIGZvcm1hdDogc2Nvcm0yMDA0X3JlZ2V4LkNNSVNob3J0SWRlbnRpZmllcixcbiAgICBmb3JtYXQyOiBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICAgIG1heDogMzYsXG4gICAgZGVsaW1pdGVyOiAnWyxdJyxcbiAgICBkZWxpbWl0ZXIyOiAnWy5dJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICB9LFxuICAncGVyZm9ybWFuY2UnOiB7XG4gICAgZm9ybWF0OiAnXiR8JyArIHNjb3JtMjAwNF9yZWdleC5DTUlTaG9ydElkZW50aWZpZXIsXG4gICAgZm9ybWF0Mjogc2Nvcm0yMDA0X3JlZ2V4LkNNSURlY2ltYWwgKyAnfF4kfCcgK1xuICAgICAgICBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICAgIG1heDogMjUwLFxuICAgIGRlbGltaXRlcjogJ1ssXScsXG4gICAgZGVsaW1pdGVyMjogJ1suXScsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgfSxcbiAgJ3NlcXVlbmNpbmcnOiB7XG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICAgIG1heDogMzYsXG4gICAgZGVsaW1pdGVyOiAnWyxdJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICB9LFxuICAnbGlrZXJ0Jzoge1xuICAgIGZvcm1hdDogc2Nvcm0yMDA0X3JlZ2V4LkNNSVNob3J0SWRlbnRpZmllcixcbiAgICBtYXg6IDEsXG4gICAgZGVsaW1pdGVyOiAnJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICB9LFxuICAnbnVtZXJpYyc6IHtcbiAgICBmb3JtYXQ6IHNjb3JtMjAwNF9yZWdleC5DTUlEZWNpbWFsLFxuICAgIG1heDogMSxcbiAgICBkZWxpbWl0ZXI6ICcnLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gIH0sXG4gICdvdGhlcic6IHtcbiAgICBmb3JtYXQ6IHNjb3JtMjAwNF9yZWdleC5DTUlTdHJpbmc0MDAwLFxuICAgIG1heDogMSxcbiAgICBkZWxpbWl0ZXI6ICcnLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gIH0sXG59O1xuXG5jb25zdCBjb3JyZWN0ID0ge1xuICAndHJ1ZS1mYWxzZSc6IHtcbiAgICBtYXg6IDEsXG4gICAgZGVsaW1pdGVyOiAnJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICAgIGR1cGxpY2F0ZTogZmFsc2UsXG4gICAgZm9ybWF0OiAnXnRydWUkfF5mYWxzZSQnLFxuICAgIGxpbWl0OiAxLFxuICB9LFxuICAnY2hvaWNlJzoge1xuICAgIG1heDogMzYsXG4gICAgZGVsaW1pdGVyOiAnWyxdJyxcbiAgICB1bmlxdWU6IHRydWUsXG4gICAgZHVwbGljYXRlOiBmYWxzZSxcbiAgICBmb3JtYXQ6IHNjb3JtMjAwNF9yZWdleC5DTUlMb25nSWRlbnRpZmllcixcbiAgfSxcbiAgJ2ZpbGwtaW4nOiB7XG4gICAgbWF4OiAxMCxcbiAgICBkZWxpbWl0ZXI6ICdbLF0nLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gICAgZHVwbGljYXRlOiBmYWxzZSxcbiAgICBmb3JtYXQ6IHNjb3JtMjAwNF9yZWdleC5DTUlMYW5nU3RyaW5nMjUwY3IsXG4gIH0sXG4gICdsb25nLWZpbGwtaW4nOiB7XG4gICAgbWF4OiAxLFxuICAgIGRlbGltaXRlcjogJycsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgICBkdXBsaWNhdGU6IHRydWUsXG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JTGFuZ1N0cmluZzQwMDAsXG4gIH0sXG4gICdtYXRjaGluZyc6IHtcbiAgICBtYXg6IDM2LFxuICAgIGRlbGltaXRlcjogJ1ssXScsXG4gICAgZGVsaW1pdGVyMjogJ1suXScsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgICBkdXBsaWNhdGU6IGZhbHNlLFxuICAgIGZvcm1hdDogc2Nvcm0yMDA0X3JlZ2V4LkNNSVNob3J0SWRlbnRpZmllcixcbiAgICBmb3JtYXQyOiBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICB9LFxuICAncGVyZm9ybWFuY2UnOiB7XG4gICAgbWF4OiAyNTAsXG4gICAgZGVsaW1pdGVyOiAnWyxdJyxcbiAgICBkZWxpbWl0ZXIyOiAnWy5dJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICAgIGR1cGxpY2F0ZTogZmFsc2UsXG4gICAgZm9ybWF0OiAnXiR8JyArIHNjb3JtMjAwNF9yZWdleC5DTUlTaG9ydElkZW50aWZpZXIsXG4gICAgZm9ybWF0Mjogc2Nvcm0yMDA0X3JlZ2V4LkNNSURlY2ltYWwgKyAnfF4kfCcgK1xuICAgICAgICBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICB9LFxuICAnc2VxdWVuY2luZyc6IHtcbiAgICBtYXg6IDM2LFxuICAgIGRlbGltaXRlcjogJ1ssXScsXG4gICAgdW5pcXVlOiBmYWxzZSxcbiAgICBkdXBsaWNhdGU6IGZhbHNlLFxuICAgIGZvcm1hdDogc2Nvcm0yMDA0X3JlZ2V4LkNNSVNob3J0SWRlbnRpZmllcixcbiAgfSxcbiAgJ2xpa2VydCc6IHtcbiAgICBtYXg6IDEsXG4gICAgZGVsaW1pdGVyOiAnJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICAgIGR1cGxpY2F0ZTogZmFsc2UsXG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JU2hvcnRJZGVudGlmaWVyLFxuICAgIGxpbWl0OiAxLFxuICB9LFxuICAnbnVtZXJpYyc6IHtcbiAgICBtYXg6IDIsXG4gICAgZGVsaW1pdGVyOiAnWzpdJyxcbiAgICB1bmlxdWU6IGZhbHNlLFxuICAgIGR1cGxpY2F0ZTogZmFsc2UsXG4gICAgZm9ybWF0OiBzY29ybTIwMDRfcmVnZXguQ01JRGVjaW1hbCxcbiAgICBsaW1pdDogMSxcbiAgfSxcbiAgJ290aGVyJzoge1xuICAgIG1heDogMSxcbiAgICBkZWxpbWl0ZXI6ICcnLFxuICAgIHVuaXF1ZTogZmFsc2UsXG4gICAgZHVwbGljYXRlOiBmYWxzZSxcbiAgICBmb3JtYXQ6IHNjb3JtMjAwNF9yZWdleC5DTUlTdHJpbmc0MDAwLFxuICAgIGxpbWl0OiAxLFxuICB9LFxufTtcblxuY29uc3QgUmVzcG9uc2VzID0ge1xuICBsZWFybmVyOiBsZWFybmVyLFxuICBjb3JyZWN0OiBjb3JyZWN0LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgUmVzcG9uc2VzO1xuIiwiLy8gQGZsb3dcblxuaW1wb3J0IEFQSUNvbnN0YW50cyBmcm9tICcuL2NvbnN0YW50cy9hcGlfY29uc3RhbnRzJztcblxuY29uc3Qgc2Nvcm0xMl9lcnJvcnMgPSBBUElDb25zdGFudHMuc2Nvcm0xMi5lcnJvcl9kZXNjcmlwdGlvbnM7XG5jb25zdCBhaWNjX2Vycm9ycyA9IEFQSUNvbnN0YW50cy5haWNjLmVycm9yX2Rlc2NyaXB0aW9ucztcbmNvbnN0IHNjb3JtMjAwNF9lcnJvcnMgPSBBUElDb25zdGFudHMuc2Nvcm0yMDA0LmVycm9yX2Rlc2NyaXB0aW9ucztcblxuLyoqXG4gKiBCYXNlIFZhbGlkYXRpb24gRXhjZXB0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciB0byB0YWtlIGluIGFuIGVycm9yIG1lc3NhZ2UgYW5kIGNvZGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGVycm9yQ29kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXJyb3JNZXNzYWdlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkZXRhaWxlZE1lc3NhZ2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKGVycm9yQ29kZTogbnVtYmVyLCBlcnJvck1lc3NhZ2U6IFN0cmluZywgZGV0YWlsZWRNZXNzYWdlOiBTdHJpbmcpIHtcbiAgICBzdXBlcihlcnJvck1lc3NhZ2UpO1xuICAgIHRoaXMuI2Vycm9yQ29kZSA9IGVycm9yQ29kZTtcbiAgICB0aGlzLiNlcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7XG4gICAgdGhpcy4jZGV0YWlsZWRNZXNzYWdlID0gZGV0YWlsZWRNZXNzYWdlO1xuICB9XG5cbiAgI2Vycm9yQ29kZTtcbiAgI2Vycm9yTWVzc2FnZTtcbiAgI2RldGFpbGVkTWVzc2FnZTtcblxuICAvKipcbiAgICogR2V0dGVyIGZvciAjZXJyb3JDb2RlXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIGdldCBlcnJvckNvZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2Vycm9yQ29kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZm9yICNlcnJvck1lc3NhZ2VcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0IGVycm9yTWVzc2FnZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jZXJyb3JNZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciBmb3IgI2RldGFpbGVkTWVzc2FnZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXQgZGV0YWlsZWRNZXNzYWdlKCkge1xuICAgIHJldHVybiB0aGlzLiNkZXRhaWxlZE1lc3NhZ2U7XG4gIH1cbn1cblxuLyoqXG4gKiBTQ09STSAxLjIgVmFsaWRhdGlvbiBFcnJvclxuICovXG5leHBvcnQgY2xhc3MgU2Nvcm0xMlZhbGlkYXRpb25FcnJvciBleHRlbmRzIFZhbGlkYXRpb25FcnJvciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciB0byB0YWtlIGluIGFuIGVycm9yIGNvZGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGVycm9yQ29kZVxuICAgKi9cbiAgY29uc3RydWN0b3IoZXJyb3JDb2RlOiBudW1iZXIpIHtcbiAgICBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChzY29ybTEyX2Vycm9ycywgU3RyaW5nKGVycm9yQ29kZSkpKSB7XG4gICAgICBzdXBlcihlcnJvckNvZGUsIHNjb3JtMTJfZXJyb3JzW1N0cmluZyhlcnJvckNvZGUpXS5iYXNpY01lc3NhZ2UsIHNjb3JtMTJfZXJyb3JzW1N0cmluZyhlcnJvckNvZGUpXS5kZXRhaWxNZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIoMTAxLCBzY29ybTEyX2Vycm9yc1snMTAxJ10uYmFzaWNNZXNzYWdlLCBzY29ybTEyX2Vycm9yc1snMTAxJ10uZGV0YWlsTWVzc2FnZSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQUlDQyBWYWxpZGF0aW9uIEVycm9yXG4gKi9cbmV4cG9ydCBjbGFzcyBBSUNDVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgVmFsaWRhdGlvbkVycm9yIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIHRvIHRha2UgaW4gYW4gZXJyb3IgY29kZVxuICAgKiBAcGFyYW0ge251bWJlcn0gZXJyb3JDb2RlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlcnJvckNvZGU6IG51bWJlcikge1xuICAgIGlmICh7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFpY2NfZXJyb3JzLCBTdHJpbmcoZXJyb3JDb2RlKSkpIHtcbiAgICAgIHN1cGVyKGVycm9yQ29kZSwgYWljY19lcnJvcnNbU3RyaW5nKGVycm9yQ29kZSldLmJhc2ljTWVzc2FnZSwgYWljY19lcnJvcnNbU3RyaW5nKGVycm9yQ29kZSldLmRldGFpbE1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlcigxMDEsIGFpY2NfZXJyb3JzWycxMDEnXS5iYXNpY01lc3NhZ2UsIGFpY2NfZXJyb3JzWycxMDEnXS5kZXRhaWxNZXNzYWdlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTQ09STSAyMDA0IFZhbGlkYXRpb24gRXJyb3JcbiAqL1xuZXhwb3J0IGNsYXNzIFNjb3JtMjAwNFZhbGlkYXRpb25FcnJvciBleHRlbmRzIFZhbGlkYXRpb25FcnJvciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciB0byB0YWtlIGluIGFuIGVycm9yIGNvZGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IGVycm9yQ29kZVxuICAgKi9cbiAgY29uc3RydWN0b3IoZXJyb3JDb2RlOiBudW1iZXIpIHtcbiAgICBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChzY29ybTIwMDRfZXJyb3JzLCBTdHJpbmcoZXJyb3JDb2RlKSkpIHtcbiAgICAgIHN1cGVyKGVycm9yQ29kZSwgc2Nvcm0yMDA0X2Vycm9yc1tTdHJpbmcoZXJyb3JDb2RlKV0uYmFzaWNNZXNzYWdlLCBzY29ybTIwMDRfZXJyb3JzW1N0cmluZyhlcnJvckNvZGUpXS5kZXRhaWxNZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIoMTAxLCBzY29ybTIwMDRfZXJyb3JzWycxMDEnXS5iYXNpY01lc3NhZ2UsIHNjb3JtMjAwNF9lcnJvcnNbJzEwMSddLmRldGFpbE1lc3NhZ2UpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IFNjb3JtMjAwNEFQSSBmcm9tICcuLi9TY29ybTIwMDRBUEknO1xuXG53aW5kb3cuU2Nvcm0yMDA0QVBJID0gU2Nvcm0yMDA0QVBJO1xuIiwiLy8gQGZsb3dcbmV4cG9ydCBjb25zdCBTRUNPTkRTX1BFUl9TRUNPTkQgPSAxLjA7XG5leHBvcnQgY29uc3QgU0VDT05EU19QRVJfTUlOVVRFID0gNjA7XG5leHBvcnQgY29uc3QgU0VDT05EU19QRVJfSE9VUiA9IDYwICogU0VDT05EU19QRVJfTUlOVVRFO1xuZXhwb3J0IGNvbnN0IFNFQ09ORFNfUEVSX0RBWSA9IDI0ICogU0VDT05EU19QRVJfSE9VUjtcblxuY29uc3QgZGVzaWduYXRpb25zID0gW1xuICBbJ0QnLCBTRUNPTkRTX1BFUl9EQVldLFxuICBbJ0gnLCBTRUNPTkRTX1BFUl9IT1VSXSxcbiAgWydNJywgU0VDT05EU19QRVJfTUlOVVRFXSxcbiAgWydTJywgU0VDT05EU19QRVJfU0VDT05EXSxcbl07XG5cbi8qKlxuICogQ29udmVydHMgYSBOdW1iZXIgdG8gYSBTdHJpbmcgb2YgSEg6TU06U1NcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gdG90YWxTZWNvbmRzXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWNvbmRzQXNISE1NU1ModG90YWxTZWNvbmRzOiBOdW1iZXIpIHtcbiAgLy8gU0NPUk0gc3BlYyBkb2VzIG5vdCBkZWFsIHdpdGggbmVnYXRpdmUgZHVyYXRpb25zLCBnaXZlIHplcm8gYmFja1xuICBpZiAoIXRvdGFsU2Vjb25kcyB8fCB0b3RhbFNlY29uZHMgPD0gMCkge1xuICAgIHJldHVybiAnMDA6MDA6MDAnO1xuICB9XG5cbiAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHRvdGFsU2Vjb25kcyAvIFNFQ09ORFNfUEVSX0hPVVIpO1xuXG4gIGNvbnN0IGRhdGVPYmogPSBuZXcgRGF0ZSh0b3RhbFNlY29uZHMgKiAxMDAwKTtcbiAgY29uc3QgbWludXRlcyA9IGRhdGVPYmouZ2V0VVRDTWludXRlcygpO1xuICAvLyBtYWtlIHN1cmUgd2UgYWRkIGFueSBwb3NzaWJsZSBkZWNpbWFsIHZhbHVlXG4gIGNvbnN0IHNlY29uZHMgPSBkYXRlT2JqLmdldFNlY29uZHMoKTtcbiAgY29uc3QgbXMgPSB0b3RhbFNlY29uZHMgJSAxLjA7XG4gIGxldCBtc1N0ciA9ICcnO1xuICBpZiAoY291bnREZWNpbWFscyhtcykgPiAwKSB7XG4gICAgaWYgKGNvdW50RGVjaW1hbHMobXMpID4gMikge1xuICAgICAgbXNTdHIgPSBtcy50b0ZpeGVkKDIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtc1N0ciA9IFN0cmluZyhtcyk7XG4gICAgfVxuICAgIG1zU3RyID0gJy4nICsgbXNTdHIuc3BsaXQoJy4nKVsxXTtcbiAgfVxuXG4gIHJldHVybiAoaG91cnMgKyAnOicgKyBtaW51dGVzICsgJzonICsgc2Vjb25kcykucmVwbGFjZSgvXFxiXFxkXFxiL2csXG4gICAgICAnMCQmJykgKyBtc1N0cjtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzZWNvbmRzIGZyb20gSVNPIDg2MDEgRHVyYXRpb25cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gc2Vjb25kc1xuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2Vjb25kc0FzSVNPRHVyYXRpb24oc2Vjb25kczogTnVtYmVyKSB7XG4gIC8vIFNDT1JNIHNwZWMgZG9lcyBub3QgZGVhbCB3aXRoIG5lZ2F0aXZlIGR1cmF0aW9ucywgZ2l2ZSB6ZXJvIGJhY2tcbiAgaWYgKCFzZWNvbmRzIHx8IHNlY29uZHMgPD0gMCkge1xuICAgIHJldHVybiAnUFQwUyc7XG4gIH1cblxuICBsZXQgZHVyYXRpb24gPSAnUCc7XG4gIGxldCByZW1haW5kZXIgPSBzZWNvbmRzO1xuXG4gIGRlc2lnbmF0aW9ucy5mb3JFYWNoKChbc2lnbiwgY3VycmVudF9zZWNvbmRzXSkgPT4ge1xuICAgIGxldCB2YWx1ZSA9IE1hdGguZmxvb3IocmVtYWluZGVyIC8gY3VycmVudF9zZWNvbmRzKTtcblxuICAgIHJlbWFpbmRlciA9IHJlbWFpbmRlciAlIGN1cnJlbnRfc2Vjb25kcztcbiAgICBpZiAoY291bnREZWNpbWFscyhyZW1haW5kZXIpID4gMikge1xuICAgICAgcmVtYWluZGVyID0gTnVtYmVyKE51bWJlcihyZW1haW5kZXIpLnRvRml4ZWQoMikpO1xuICAgIH1cbiAgICAvLyBJZiB3ZSBoYXZlIGFueXRoaW5nIGxlZnQgaW4gdGhlIHJlbWFpbmRlciwgYW5kIHdlJ3JlIGN1cnJlbnRseSBhZGRpbmdcbiAgICAvLyBzZWNvbmRzIHRvIHRoZSBkdXJhdGlvbiwgZ28gYWhlYWQgYW5kIGFkZCB0aGUgZGVjaW1hbCB0byB0aGUgc2Vjb25kc1xuICAgIGlmIChzaWduID09PSAnUycgJiYgcmVtYWluZGVyID4gMCkge1xuICAgICAgdmFsdWUgKz0gcmVtYWluZGVyO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKChkdXJhdGlvbi5pbmRleE9mKCdEJykgPiAwIHx8XG4gICAgICAgICAgc2lnbiA9PT0gJ0gnIHx8IHNpZ24gPT09ICdNJyB8fCBzaWduID09PSAnUycpICYmXG4gICAgICAgICAgZHVyYXRpb24uaW5kZXhPZignVCcpID09PSAtMSkge1xuICAgICAgICBkdXJhdGlvbiArPSAnVCc7XG4gICAgICB9XG4gICAgICBkdXJhdGlvbiArPSBgJHt2YWx1ZX0ke3NpZ259YDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBkdXJhdGlvbjtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzZWNvbmRzIGZyb20gSEg6TU06U1MuREREREREXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRpbWVTdHJpbmdcbiAqIEBwYXJhbSB7UmVnRXhwfSB0aW1lUmVnZXhcbiAqIEByZXR1cm4ge251bWJlcn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRpbWVBc1NlY29uZHModGltZVN0cmluZzogU3RyaW5nLCB0aW1lUmVnZXg6IFJlZ0V4cCkge1xuICBpZiAoIXRpbWVTdHJpbmcgfHwgdHlwZW9mIHRpbWVTdHJpbmcgIT09ICdzdHJpbmcnIHx8XG4gICAgICAhdGltZVN0cmluZy5tYXRjaCh0aW1lUmVnZXgpKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29uc3QgcGFydHMgPSB0aW1lU3RyaW5nLnNwbGl0KCc6Jyk7XG4gIGNvbnN0IGhvdXJzID0gTnVtYmVyKHBhcnRzWzBdKTtcbiAgY29uc3QgbWludXRlcyA9IE51bWJlcihwYXJ0c1sxXSk7XG4gIGNvbnN0IHNlY29uZHMgPSBOdW1iZXIocGFydHNbMl0pO1xuICByZXR1cm4gKGhvdXJzICogMzYwMCkgKyAobWludXRlcyAqIDYwKSArIHNlY29uZHM7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBmcm9tIElTTyA4NjAxIER1cmF0aW9uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGR1cmF0aW9uXG4gKiBAcGFyYW0ge1JlZ0V4cH0gZHVyYXRpb25SZWdleFxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RHVyYXRpb25Bc1NlY29uZHMoZHVyYXRpb246IFN0cmluZywgZHVyYXRpb25SZWdleDogUmVnRXhwKSB7XG4gIGlmICghZHVyYXRpb24gfHwgIWR1cmF0aW9uLm1hdGNoKGR1cmF0aW9uUmVnZXgpKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBjb25zdCBbLCB5ZWFycywgbW9udGhzLCAsIGRheXMsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzXSA9IG5ldyBSZWdFeHAoXG4gICAgICBkdXJhdGlvblJlZ2V4KS5leGVjKGR1cmF0aW9uKSB8fCBbXTtcblxuICBsZXQgcmVzdWx0ID0gMC4wO1xuXG4gIHJlc3VsdCArPSAoTnVtYmVyKHNlY29uZHMpICogMS4wIHx8IDAuMCk7XG4gIHJlc3VsdCArPSAoTnVtYmVyKG1pbnV0ZXMpICogNjAuMCB8fCAwLjApO1xuICByZXN1bHQgKz0gKE51bWJlcihob3VycykgKiAzNjAwLjAgfHwgMC4wKTtcbiAgcmVzdWx0ICs9IChOdW1iZXIoZGF5cykgKiAoNjAgKiA2MCAqIDI0LjApIHx8IDAuMCk7XG4gIHJlc3VsdCArPSAoTnVtYmVyKHllYXJzKSAqICg2MCAqIDYwICogMjQgKiAzNjUuMCkgfHwgMC4wKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEFkZHMgdG9nZXRoZXIgdHdvIElTTzg2MDEgRHVyYXRpb24gc3RyaW5nc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaXJzdFxuICogQHBhcmFtIHtzdHJpbmd9IHNlY29uZFxuICogQHBhcmFtIHtSZWdFeHB9IGR1cmF0aW9uUmVnZXhcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFR3b0R1cmF0aW9ucyhcbiAgICBmaXJzdDogU3RyaW5nLFxuICAgIHNlY29uZDogU3RyaW5nLFxuICAgIGR1cmF0aW9uUmVnZXg6IFJlZ0V4cCkge1xuICByZXR1cm4gZ2V0U2Vjb25kc0FzSVNPRHVyYXRpb24oXG4gICAgICBnZXREdXJhdGlvbkFzU2Vjb25kcyhmaXJzdCwgZHVyYXRpb25SZWdleCkgK1xuICAgICAgZ2V0RHVyYXRpb25Bc1NlY29uZHMoc2Vjb25kLCBkdXJhdGlvblJlZ2V4KSxcbiAgKTtcbn1cblxuLyoqXG4gKiBBZGQgdG9nZXRoZXIgdHdvIEhIOk1NOlNTLkREIHN0cmluZ3NcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlyc3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZWNvbmRcbiAqIEBwYXJhbSB7UmVnRXhwfSB0aW1lUmVnZXhcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEhITU1TU1RpbWVTdHJpbmdzKFxuICAgIGZpcnN0OiBTdHJpbmcsXG4gICAgc2Vjb25kOiBTdHJpbmcsXG4gICAgdGltZVJlZ2V4OiBSZWdFeHApIHtcbiAgcmV0dXJuIGdldFNlY29uZHNBc0hITU1TUyhcbiAgICAgIGdldFRpbWVBc1NlY29uZHMoZmlyc3QsIHRpbWVSZWdleCkgK1xuICAgICAgZ2V0VGltZUFzU2Vjb25kcyhcbiAgICAgICAgICBzZWNvbmQsIHRpbWVSZWdleCksXG4gICk7XG59XG5cbi8qKlxuICogRmxhdHRlbiBhIEpTT04gb2JqZWN0IGRvd24gdG8gc3RyaW5nIHBhdGhzIGZvciBlYWNoIHZhbHVlc1xuICogQHBhcmFtIHtvYmplY3R9IGRhdGFcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW4oZGF0YSkge1xuICBjb25zdCByZXN1bHQgPSB7fTtcblxuICAvKipcbiAgICogUmVjdXJzZSB0aHJvdWdoIHRoZSBvYmplY3RcbiAgICogQHBhcmFtIHsqfSBjdXJcbiAgICogQHBhcmFtIHsqfSBwcm9wXG4gICAqL1xuICBmdW5jdGlvbiByZWN1cnNlKGN1ciwgcHJvcCkge1xuICAgIGlmIChPYmplY3QoY3VyKSAhPT0gY3VyKSB7XG4gICAgICByZXN1bHRbcHJvcF0gPSBjdXI7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGN1cikpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY3VyLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICByZWN1cnNlKGN1cltpXSwgcHJvcCArICdbJyArIGkgKyAnXScpO1xuICAgICAgICBpZiAobCA9PT0gMCkgcmVzdWx0W3Byb3BdID0gW107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBpc0VtcHR5ID0gdHJ1ZTtcbiAgICAgIGZvciAoY29uc3QgcCBpbiBjdXIpIHtcbiAgICAgICAgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwoY3VyLCBwKSkge1xuICAgICAgICAgIGlzRW1wdHkgPSBmYWxzZTtcbiAgICAgICAgICByZWN1cnNlKGN1cltwXSwgcHJvcCA/IHByb3AgKyAnLicgKyBwIDogcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpc0VtcHR5ICYmIHByb3ApIHJlc3VsdFtwcm9wXSA9IHt9O1xuICAgIH1cbiAgfVxuXG4gIHJlY3Vyc2UoZGF0YSwgJycpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFVuLWZsYXR0ZW4gYSBmbGF0IEpTT04gb2JqZWN0XG4gKiBAcGFyYW0ge29iamVjdH0gZGF0YVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5mbGF0dGVuKGRhdGEpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICBpZiAoT2JqZWN0KGRhdGEpICE9PSBkYXRhIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHJldHVybiBkYXRhO1xuICBjb25zdCByZWdleCA9IC9cXC4/KFteLltcXF1dKyl8XFxbKFxcZCspXS9nO1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgZm9yIChjb25zdCBwIGluIGRhdGEpIHtcbiAgICBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCBwKSkge1xuICAgICAgbGV0IGN1ciA9IHJlc3VsdDtcbiAgICAgIGxldCBwcm9wID0gJyc7XG4gICAgICBsZXQgbSA9IHJlZ2V4LmV4ZWMocCk7XG4gICAgICB3aGlsZSAobSkge1xuICAgICAgICBjdXIgPSBjdXJbcHJvcF0gfHwgKGN1cltwcm9wXSA9IChtWzJdID8gW10gOiB7fSkpO1xuICAgICAgICBwcm9wID0gbVsyXSB8fCBtWzFdO1xuICAgICAgICBtID0gcmVnZXguZXhlYyhwKTtcbiAgICAgIH1cbiAgICAgIGN1cltwcm9wXSA9IGRhdGFbcF07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRbJyddIHx8IHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb3VudHMgdGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlc1xuICogQHBhcmFtIHtudW1iZXJ9IG51bVxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY291bnREZWNpbWFscyhudW06IG51bWJlcikge1xuICBpZiAoTWF0aC5mbG9vcihudW0pID09PSBudW0gfHwgU3RyaW5nKG51bSkuaW5kZXhPZignLicpIDwgMCkgcmV0dXJuIDA7XG4gIGNvbnN0IHBhcnRzID0gbnVtLnRvU3RyaW5nKCkuc3BsaXQoJy4nKVsxXTtcbiAgcmV0dXJuIHBhcnRzLmxlbmd0aCB8fCAwO1xufVxuIl19
+/***/ })
+
+/******/ });
+/************************************************************************/
+/******/ // 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] = {
+/******/ // no module.id needed
+/******/ // no module.loaded needed
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/************************************************************************/
+/******/ /* webpack/runtime/compat get default export */
+/******/ !function() {
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function() { return module['default']; } :
+/******/ function() { return module; };
+/******/ __webpack_require__.d(getter, { a: getter });
+/******/ return getter;
+/******/ };
+/******/ }();
+/******/
+/******/ /* webpack/runtime/define property getters */
+/******/ !function() {
+/******/ // define getter functions for harmony exports
+/******/ __webpack_require__.d = function(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/global */
+/******/ !function() {
+/******/ __webpack_require__.g = (function() {
+/******/ if (typeof globalThis === 'object') return globalThis;
+/******/ try {
+/******/ return this || new Function('return this')();
+/******/ } catch (e) {
+/******/ if (typeof window === 'object') return window;
+/******/ }
+/******/ })();
+/******/ }();
+/******/
+/******/ /* webpack/runtime/hasOwnProperty shorthand */
+/******/ !function() {
+/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
+/******/ }();
+/******/
+/******/ /* webpack/runtime/make namespace object */
+/******/ !function() {
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/ }();
+/******/
+/************************************************************************/
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be in strict mode.
+!function() {
+"use strict";
+/*!**********************************!*\
+ !*** ./src/exports/scorm2004.js ***!
+ \**********************************/
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Scorm2004API__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Scorm2004API */ "./src/Scorm2004API.js");
+
+window.Scorm2004API = _Scorm2004API__WEBPACK_IMPORTED_MODULE_0__["default"];
+}();
+/******/ })()
+;
+//# sourceMappingURL=scorm2004.js.map
\ No newline at end of file
diff --git a/dist/scorm2004.js.map b/dist/scorm2004.js.map
new file mode 100644
index 0000000..0bedbd6
--- /dev/null
+++ b/dist/scorm2004.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"scorm2004.js","mappings":"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","sources":["webpack://scorm-again/./node_modules/lodash.debounce/index.js","webpack://scorm-again/./src/BaseAPI.js","webpack://scorm-again/./src/Scorm2004API.js","webpack://scorm-again/./src/cmi/common.js","webpack://scorm-again/./src/cmi/scorm2004_cmi.js","webpack://scorm-again/./src/constants/api_constants.js","webpack://scorm-again/./src/constants/error_codes.js","webpack://scorm-again/./src/constants/language_constants.js","webpack://scorm-again/./src/constants/regex.js","webpack://scorm-again/./src/constants/response_constants.js","webpack://scorm-again/./src/exceptions.js","webpack://scorm-again/./src/utilities.js","webpack://scorm-again/webpack/bootstrap","webpack://scorm-again/webpack/runtime/compat get default export","webpack://scorm-again/webpack/runtime/define property getters","webpack://scorm-again/webpack/runtime/global","webpack://scorm-again/webpack/runtime/hasOwnProperty shorthand","webpack://scorm-again/webpack/runtime/make namespace object","webpack://scorm-again/./src/exports/scorm2004.js"],"sourcesContent":["/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n","// @flow\nimport {CMIArray} from './cmi/common';\nimport {ValidationError} from './exceptions';\nimport ErrorCodes from './constants/error_codes';\nimport APIConstants from './constants/api_constants';\nimport {unflatten} from './utilities';\nimport debounce from 'lodash.debounce';\n\nconst global_constants = APIConstants.global;\nconst scorm12_error_codes = ErrorCodes.scorm12;\n\n/**\n * Base API class for AICC, SCORM 1.2, and SCORM 2004. Should be considered\n * abstract, and never initialized on it's own.\n */\nexport default class BaseAPI {\n #timeout;\n #error_codes;\n #settings = {\n autocommit: false,\n autocommitSeconds: 10,\n asyncCommit: false,\n sendBeaconCommit: false,\n lmsCommitUrl: false,\n dataCommitFormat: 'json', // valid formats are 'json' or 'flattened', 'params'\n commitRequestDataType: 'application/json;charset=UTF-8',\n autoProgress: false,\n logLevel: global_constants.LOG_LEVEL_ERROR,\n selfReportSessionTime: false,\n alwaysSendTotalTime: false,\n strict_errors: true,\n xhrHeaders: {},\n xhrWithCredentials: false,\n responseHandler: function(xhr) {\n let result;\n if (typeof xhr !== 'undefined') {\n result = JSON.parse(xhr.responseText);\n if (result === null || !{}.hasOwnProperty.call(result, 'result')) {\n result = {};\n if (xhr.status === 200) {\n result.result = global_constants.SCORM_TRUE;\n result.errorCode = 0;\n } else {\n result.result = global_constants.SCORM_FALSE;\n result.errorCode = 101;\n }\n }\n }\n return result;\n },\n requestHandler: function(commitObject) {\n return commitObject;\n },\n onLogMessage: function(messageLevel, logMessage) {\n switch (messageLevel) {\n case global_constants.LOG_LEVEL_ERROR:\n console.error(logMessage);\n break;\n case global_constants.LOG_LEVEL_WARNING:\n console.warn(logMessage);\n break;\n case global_constants.LOG_LEVEL_INFO:\n console.info(logMessage);\n break;\n case global_constants.LOG_LEVEL_DEBUG:\n if (console.debug) {\n console.debug(logMessage);\n } else {\n console.log(logMessage);\n }\n break;\n }\n },\n };\n cmi;\n startingData: {};\n\n /**\n * Constructor for Base API class. Sets some shared API fields, as well as\n * sets up options for the API.\n * @param {object} error_codes\n * @param {object} settings\n */\n constructor(error_codes, settings) {\n if (new.target === BaseAPI) {\n throw new TypeError('Cannot construct BaseAPI instances directly');\n }\n this.currentState = global_constants.STATE_NOT_INITIALIZED;\n this.lastErrorCode = 0;\n this.listenerArray = [];\n\n this.#timeout = null;\n this.#error_codes = error_codes;\n\n this.settings = settings;\n this.apiLogLevel = this.settings.logLevel;\n this.selfReportSessionTime = this.settings.selfReportSessionTime;\n }\n\n /**\n * Initialize the API\n * @param {string} callbackName\n * @param {string} initializeMessage\n * @param {string} terminationMessage\n * @return {string}\n */\n initialize(\n callbackName: String,\n initializeMessage?: String,\n terminationMessage?: String) {\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.isInitialized()) {\n this.throwSCORMError(this.#error_codes.INITIALIZED, initializeMessage);\n } else if (this.isTerminated()) {\n this.throwSCORMError(this.#error_codes.TERMINATED, terminationMessage);\n } else {\n if (this.selfReportSessionTime) {\n this.cmi.setStartTime();\n }\n\n this.currentState = global_constants.STATE_INITIALIZED;\n this.lastErrorCode = 0;\n returnValue = global_constants.SCORM_TRUE;\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Getter for #error_codes\n * @return {object}\n */\n get error_codes() {\n return this.#error_codes;\n }\n\n /**\n * Getter for #settings\n * @return {object}\n */\n get settings() {\n return this.#settings;\n }\n\n /**\n * Setter for #settings\n * @param {object} settings\n */\n set settings(settings: Object) {\n this.#settings = {...this.#settings, ...settings};\n }\n\n /**\n * Terminates the current run of the API\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @return {string}\n */\n terminate(\n callbackName: String,\n checkTerminated: boolean) {\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.checkState(checkTerminated,\n this.#error_codes.TERMINATION_BEFORE_INIT,\n this.#error_codes.MULTIPLE_TERMINATION)) {\n this.currentState = global_constants.STATE_TERMINATED;\n\n const result = this.storeData(true);\n if (!this.settings.sendBeaconCommit && !this.settings.asyncCommit &&\n typeof result.errorCode !== 'undefined' && result.errorCode > 0) {\n this.throwSCORMError(result.errorCode);\n }\n returnValue = (typeof result !== 'undefined' && result.result) ?\n result.result : global_constants.SCORM_FALSE;\n\n if (checkTerminated) this.lastErrorCode = 0;\n\n returnValue = global_constants.SCORM_TRUE;\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Get the value of the CMIElement.\n *\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @param {string} CMIElement\n * @return {string}\n */\n getValue(\n callbackName: String,\n checkTerminated: boolean,\n CMIElement: String) {\n let returnValue;\n\n if (this.checkState(checkTerminated,\n this.#error_codes.RETRIEVE_BEFORE_INIT,\n this.#error_codes.RETRIEVE_AFTER_TERM)) {\n if (checkTerminated) this.lastErrorCode = 0;\n try {\n returnValue = this.getCMIValue(CMIElement);\n } catch (e) {\n if (e instanceof ValidationError) {\n this.lastErrorCode = e.errorCode;\n returnValue = global_constants.SCORM_FALSE;\n } else {\n if (e.message) {\n console.error(e.message);\n } else {\n console.error(e);\n }\n this.throwSCORMError(this.#error_codes.GENERAL);\n }\n }\n this.processListeners(callbackName, CMIElement);\n }\n\n this.apiLog(callbackName, CMIElement, ': returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Sets the value of the CMIElement.\n *\n * @param {string} callbackName\n * @param {string} commitCallback\n * @param {boolean} checkTerminated\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n setValue(\n callbackName: String,\n commitCallback: String,\n checkTerminated: boolean,\n CMIElement,\n value) {\n if (value !== undefined) {\n value = String(value);\n }\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.checkState(checkTerminated, this.#error_codes.STORE_BEFORE_INIT,\n this.#error_codes.STORE_AFTER_TERM)) {\n if (checkTerminated) this.lastErrorCode = 0;\n try {\n returnValue = this.setCMIValue(CMIElement, value);\n } catch (e) {\n if (e instanceof ValidationError) {\n this.lastErrorCode = e.errorCode;\n returnValue = global_constants.SCORM_FALSE;\n } else {\n if (e.message) {\n console.error(e.message);\n } else {\n console.error(e);\n }\n this.throwSCORMError(this.#error_codes.GENERAL);\n }\n }\n this.processListeners(callbackName, CMIElement, value);\n }\n\n if (returnValue === undefined) {\n returnValue = global_constants.SCORM_FALSE;\n }\n\n // If we didn't have any errors while setting the data, go ahead and\n // schedule a commit, if autocommit is turned on\n if (String(this.lastErrorCode) === '0') {\n if (this.settings.autocommit && !this.#timeout) {\n this.scheduleCommit(this.settings.autocommitSeconds * 1000, commitCallback);\n }\n }\n\n this.apiLog(callbackName, CMIElement,\n ': ' + value + ': result: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Orders LMS to store all content parameters\n * @param {string} callbackName\n * @param {boolean} checkTerminated\n * @return {string}\n */\n commit(\n callbackName: String,\n checkTerminated: boolean) {\n this.clearScheduledCommit();\n\n let returnValue = global_constants.SCORM_FALSE;\n\n if (this.checkState(checkTerminated, this.#error_codes.COMMIT_BEFORE_INIT,\n this.#error_codes.COMMIT_AFTER_TERM)) {\n const result = this.storeData(false);\n if (!this.settings.sendBeaconCommit && !this.settings.asyncCommit &&\n result.errorCode && result.errorCode > 0) {\n this.throwSCORMError(result.errorCode);\n }\n returnValue = (typeof result !== 'undefined' && result.result) ?\n result.result : global_constants.SCORM_FALSE;\n\n this.apiLog(callbackName, 'HttpRequest', ' Result: ' + returnValue,\n global_constants.LOG_LEVEL_DEBUG);\n\n if (checkTerminated) this.lastErrorCode = 0;\n\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n this.clearSCORMError(returnValue);\n\n return returnValue;\n }\n\n /**\n * Returns last error code\n * @param {string} callbackName\n * @return {string}\n */\n getLastError(callbackName: String) {\n const returnValue = String(this.lastErrorCode);\n\n this.processListeners(callbackName);\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Returns the errorNumber error description\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getErrorString(callbackName: String, CMIErrorCode) {\n let returnValue = '';\n\n if (CMIErrorCode !== null && CMIErrorCode !== '') {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Returns a comprehensive description of the errorNumber error.\n *\n * @param {string} callbackName\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n getDiagnostic(callbackName: String, CMIErrorCode) {\n let returnValue = '';\n\n if (CMIErrorCode !== null && CMIErrorCode !== '') {\n returnValue = this.getLmsErrorMessageDetails(CMIErrorCode, true);\n this.processListeners(callbackName);\n }\n\n this.apiLog(callbackName, null, 'returned: ' + returnValue,\n global_constants.LOG_LEVEL_INFO);\n\n return returnValue;\n }\n\n /**\n * Checks the LMS state and ensures it has been initialized.\n *\n * @param {boolean} checkTerminated\n * @param {number} beforeInitError\n * @param {number} afterTermError\n * @return {boolean}\n */\n checkState(\n checkTerminated: boolean,\n beforeInitError: number,\n afterTermError?: number) {\n if (this.isNotInitialized()) {\n this.throwSCORMError(beforeInitError);\n return false;\n } else if (checkTerminated && this.isTerminated()) {\n this.throwSCORMError(afterTermError);\n return false;\n }\n\n return true;\n }\n\n /**\n * Logging for all SCORM actions\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {string} logMessage\n * @param {number}messageLevel\n */\n apiLog(\n functionName: String,\n CMIElement: String,\n logMessage: String,\n messageLevel: number) {\n logMessage = this.formatMessage(functionName, CMIElement, logMessage);\n\n if (messageLevel >= this.apiLogLevel) {\n this.settings.onLogMessage(messageLevel, logMessage);\n }\n }\n\n /**\n * Formats the SCORM messages for easy reading\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {string} message\n * @return {string}\n */\n formatMessage(functionName: String, CMIElement: String, message: String) {\n const baseLength = 20;\n let messageString = '';\n\n messageString += functionName;\n\n let fillChars = baseLength - messageString.length;\n\n for (let i = 0; i < fillChars; i++) {\n messageString += ' ';\n }\n\n messageString += ': ';\n\n if (CMIElement) {\n const CMIElementBaseLength = 70;\n\n messageString += CMIElement;\n\n fillChars = CMIElementBaseLength - messageString.length;\n\n for (let j = 0; j < fillChars; j++) {\n messageString += ' ';\n }\n }\n\n if (message) {\n messageString += message;\n }\n\n return messageString;\n }\n\n /**\n * Checks to see if {str} contains {tester}\n *\n * @param {string} str String to check against\n * @param {string} tester String to check for\n * @return {boolean}\n */\n stringMatches(str: String, tester: String) {\n return str && tester && str.match(tester);\n }\n\n /**\n * Check to see if the specific object has the given property\n * @param {*} refObject\n * @param {string} attribute\n * @return {boolean}\n * @private\n */\n _checkObjectHasProperty(refObject, attribute: String) {\n return Object.hasOwnProperty.call(refObject, attribute) ||\n Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(refObject), attribute) ||\n (attribute in refObject);\n }\n\n /**\n * Returns the message that corresponds to errorNumber\n * APIs that inherit BaseAPI should override this function\n *\n * @param {(string|number)} _errorNumber\n * @param {boolean} _detail\n * @return {string}\n * @abstract\n */\n getLmsErrorMessageDetails(_errorNumber, _detail) {\n throw new Error(\n 'The getLmsErrorMessageDetails method has not been implemented');\n }\n\n /**\n * Gets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @return {string}\n * @abstract\n */\n getCMIValue(_CMIElement) {\n throw new Error('The getCMIValue method has not been implemented');\n }\n\n /**\n * Sets the value for the specific element.\n * APIs that inherit BaseAPI should override this function\n *\n * @param {string} _CMIElement\n * @param {any} _value\n * @return {string}\n * @abstract\n */\n setCMIValue(_CMIElement, _value) {\n throw new Error('The setCMIValue method has not been implemented');\n }\n\n /**\n * Shared API method to set a valid for a given element.\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @param {*} value\n * @return {string}\n */\n _commonSetCMIValue(\n methodName: String, scorm2004: boolean, CMIElement, value) {\n if (!CMIElement || CMIElement === '') {\n return global_constants.SCORM_FALSE;\n }\n\n const structure = CMIElement.split('.');\n let refObject = this;\n let returnValue = global_constants.SCORM_FALSE;\n let foundFirstIndex = false;\n\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004 ?\n this.#error_codes.UNDEFINED_DATA_MODEL :\n this.#error_codes.GENERAL;\n\n for (let i = 0; i < structure.length; i++) {\n const attribute = structure[i];\n\n if (i === structure.length - 1) {\n if (scorm2004 && (attribute.substr(0, 8) === '{target=') &&\n (typeof refObject._isTargetValid == 'function')) {\n this.throwSCORMError(this.#error_codes.READ_ONLY_ELEMENT);\n } else if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n } else {\n if (this.isInitialized() &&\n this.stringMatches(CMIElement, '\\\\.correct_responses\\\\.\\\\d+')) {\n this.validateCorrectResponse(CMIElement, value);\n }\n\n if (!scorm2004 || this.lastErrorCode === 0) {\n refObject[attribute] = value;\n returnValue = global_constants.SCORM_TRUE;\n }\n }\n } else {\n refObject = refObject[attribute];\n if (!refObject) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[i + 1], 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n foundFirstIndex = true;\n } else {\n const newChild = this.getChildElement(CMIElement, value,\n foundFirstIndex);\n foundFirstIndex = true;\n\n if (!newChild) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n } else {\n if (refObject.initialized) newChild.initialize();\n\n refObject.childArray.push(newChild);\n refObject = newChild;\n }\n }\n\n // Have to update i value to skip the array position\n i++;\n }\n }\n }\n }\n\n if (returnValue === global_constants.SCORM_FALSE) {\n this.apiLog(methodName, null,\n `There was an error setting the value for: ${CMIElement}, value of: ${value}`,\n global_constants.LOG_LEVEL_WARNING);\n }\n\n return returnValue;\n }\n\n /**\n * Abstract method for validating that a response is correct.\n *\n * @param {string} _CMIElement\n * @param {*} _value\n */\n validateCorrectResponse(_CMIElement, _value) {\n // just a stub method\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n * APIs that inherit BaseAPI should override this method.\n *\n * @param {string} _CMIElement - unused\n * @param {*} _value - unused\n * @param {boolean} _foundFirstIndex - unused\n * @return {*}\n * @abstract\n */\n getChildElement(_CMIElement, _value, _foundFirstIndex) {\n throw new Error('The getChildElement method has not been implemented');\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} methodName\n * @param {boolean} scorm2004\n * @param {string} CMIElement\n * @return {*}\n */\n _commonGetCMIValue(methodName: String, scorm2004: boolean, CMIElement) {\n if (!CMIElement || CMIElement === '') {\n return '';\n }\n\n const structure = CMIElement.split('.');\n let refObject = this;\n let attribute = null;\n\n const uninitializedErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) has not been initialized.`;\n const invalidErrorMessage = `The data model element passed to ${methodName} (${CMIElement}) is not a valid SCORM data model element.`;\n const invalidErrorCode = scorm2004 ?\n this.#error_codes.UNDEFINED_DATA_MODEL :\n this.#error_codes.GENERAL;\n\n for (let i = 0; i < structure.length; i++) {\n attribute = structure[i];\n\n if (!scorm2004) {\n if (i === structure.length - 1) {\n if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n } else {\n if ((String(attribute).substr(0, 8) === '{target=') &&\n (typeof refObject._isTargetValid == 'function')) {\n const target = String(attribute).substr(8, String(attribute).length - 9);\n return refObject._isTargetValid(target);\n } else if (!this._checkObjectHasProperty(refObject, attribute)) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n return;\n }\n }\n\n refObject = refObject[attribute];\n if (refObject === undefined) {\n this.throwSCORMError(invalidErrorCode, invalidErrorMessage);\n break;\n }\n\n if (refObject instanceof CMIArray) {\n const index = parseInt(structure[i + 1], 10);\n\n // SCO is trying to set an item on an array\n if (!isNaN(index)) {\n const item = refObject.childArray[index];\n\n if (item) {\n refObject = item;\n } else {\n this.throwSCORMError(this.#error_codes.VALUE_NOT_INITIALIZED,\n uninitializedErrorMessage);\n break;\n }\n\n // Have to update i value to skip the array position\n i++;\n }\n }\n }\n\n if (refObject === null || refObject === undefined) {\n if (!scorm2004) {\n if (attribute === '_children') {\n this.throwSCORMError(scorm12_error_codes.CHILDREN_ERROR);\n } else if (attribute === '_count') {\n this.throwSCORMError(scorm12_error_codes.COUNT_ERROR);\n }\n }\n } else {\n return refObject;\n }\n }\n\n /**\n * Returns true if the API's current state is STATE_INITIALIZED\n *\n * @return {boolean}\n */\n isInitialized() {\n return this.currentState === global_constants.STATE_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_NOT_INITIALIZED\n *\n * @return {boolean}\n */\n isNotInitialized() {\n return this.currentState === global_constants.STATE_NOT_INITIALIZED;\n }\n\n /**\n * Returns true if the API's current state is STATE_TERMINATED\n *\n * @return {boolean}\n */\n isTerminated() {\n return this.currentState === global_constants.STATE_TERMINATED;\n }\n\n /**\n * Provides a mechanism for attaching to a specific SCORM event\n *\n * @param {string} listenerName\n * @param {function} callback\n */\n on(listenerName: String, callback: function) {\n if (!callback) return;\n\n const listenerFunctions = listenerName.split(' ');\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split('.');\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + '.', '');\n }\n\n this.listenerArray.push({\n functionName: functionName,\n CMIElement: CMIElement,\n callback: callback,\n });\n\n this.apiLog('on', functionName, `Added event listener: ${this.listenerArray.length}`, global_constants.LOG_LEVEL_INFO);\n }\n }\n\n /**\n * Provides a mechanism for detaching a specific SCORM event listener\n *\n * @param {string} listenerName\n * @param {function} callback\n */\n off(listenerName: String, callback: function) {\n if (!callback) return;\n\n const listenerFunctions = listenerName.split(' ');\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split('.');\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + '.', '');\n }\n\n const removeIndex = this.listenerArray.findIndex((obj) =>\n obj.functionName === functionName &&\n obj.CMIElement === CMIElement &&\n obj.callback === callback,\n );\n if (removeIndex !== -1) {\n this.listenerArray.splice(removeIndex, 1);\n this.apiLog('off', functionName, `Removed event listener: ${this.listenerArray.length}`, global_constants.LOG_LEVEL_INFO);\n }\n }\n }\n\n /**\n * Provides a mechanism for clearing all listeners from a specific SCORM event\n *\n * @param {string} listenerName\n */\n clear(listenerName: String) {\n const listenerFunctions = listenerName.split(' ');\n for (let i = 0; i < listenerFunctions.length; i++) {\n const listenerSplit = listenerFunctions[i].split('.');\n if (listenerSplit.length === 0) return;\n\n const functionName = listenerSplit[0];\n\n let CMIElement = null;\n if (listenerSplit.length > 1) {\n CMIElement = listenerName.replace(functionName + '.', '');\n }\n\n this.listenerArray = this.listenerArray.filter((obj) =>\n obj.functionName !== functionName &&\n obj.CMIElement !== CMIElement,\n );\n }\n }\n\n /**\n * Processes any 'on' listeners that have been created\n *\n * @param {string} functionName\n * @param {string} CMIElement\n * @param {*} value\n */\n processListeners(functionName: String, CMIElement: String, value: any) {\n this.apiLog(functionName, CMIElement, value);\n for (let i = 0; i < this.listenerArray.length; i++) {\n const listener = this.listenerArray[i];\n const functionsMatch = listener.functionName === functionName;\n const listenerHasCMIElement = !!listener.CMIElement;\n let CMIElementsMatch = false;\n if (CMIElement && listener.CMIElement &&\n listener.CMIElement.substring(listener.CMIElement.length - 1) ===\n '*') {\n CMIElementsMatch = CMIElement.indexOf(listener.CMIElement.substring(0,\n listener.CMIElement.length - 1)) === 0;\n } else {\n CMIElementsMatch = listener.CMIElement === CMIElement;\n }\n\n if (functionsMatch && (!listenerHasCMIElement || CMIElementsMatch)) {\n listener.callback(CMIElement, value);\n }\n }\n }\n\n /**\n * Throws a SCORM error\n *\n * @param {number} errorNumber\n * @param {string} message\n */\n throwSCORMError(errorNumber: number, message: String) {\n if (!message) {\n message = this.getLmsErrorMessageDetails(errorNumber);\n }\n\n this.apiLog('throwSCORMError', null, errorNumber + ': ' + message,\n global_constants.LOG_LEVEL_ERROR);\n\n this.lastErrorCode = String(errorNumber);\n }\n\n /**\n * Clears the last SCORM error code on success.\n *\n * @param {string} success\n */\n clearSCORMError(success: String) {\n if (success !== undefined && success !== global_constants.SCORM_FALSE) {\n this.lastErrorCode = 0;\n }\n }\n\n /**\n * Attempts to store the data to the LMS, logs data if no LMS configured\n * APIs that inherit BaseAPI should override this function\n *\n * @param {boolean} _calculateTotalTime\n * @return {string}\n * @abstract\n */\n storeData(_calculateTotalTime) {\n throw new Error(\n 'The storeData method has not been implemented');\n }\n\n /**\n * Load the CMI from a flattened JSON object\n * @param {object} json\n * @param {string} CMIElement\n */\n loadFromFlattenedJSON(json, CMIElement) {\n if (!this.isNotInitialized()) {\n console.error(\n 'loadFromFlattenedJSON can only be called before the call to lmsInitialize.');\n return;\n }\n\n /**\n * Test match pattern.\n *\n * @param {string} a\n * @param {string} c\n * @param {RegExp} a_pattern\n * @return {number}\n */\n function testPattern(a, c, a_pattern) {\n const a_match = a.match(a_pattern);\n\n let c_match;\n if (a_match !== null && (c_match = c.match(a_pattern)) !== null) {\n const a_num = Number(a_match[2]);\n const c_num = Number(c_match[2]);\n if (a_num === c_num) {\n if (a_match[3] === 'id') {\n return -1;\n } else if (a_match[3] === 'type') {\n if (c_match[3] === 'id') {\n return 1;\n } else {\n return -1;\n }\n } else {\n return 1;\n }\n }\n return a_num - c_num;\n }\n\n return null;\n }\n\n const int_pattern = /^(cmi\\.interactions\\.)(\\d+)\\.(.*)$/;\n const obj_pattern = /^(cmi\\.objectives\\.)(\\d+)\\.(.*)$/;\n\n const result = Object.keys(json).map(function(key) {\n return [String(key), json[key]];\n });\n\n // CMI interactions need to have id and type loaded before any other fields\n result.sort(function([a, b], [c, d]) {\n let test;\n if ((test = testPattern(a, c, int_pattern)) !== null) {\n return test;\n }\n if ((test = testPattern(a, c, obj_pattern)) !== null) {\n return test;\n }\n\n if (a < c) {\n return -1;\n }\n if (a > c) {\n return 1;\n }\n return 0;\n });\n\n let obj;\n result.forEach((element) => {\n obj = {};\n obj[element[0]] = element[1];\n this.loadFromJSON(unflatten(obj), CMIElement);\n });\n }\n\n /**\n * Loads CMI data from a JSON object.\n *\n * @param {object} json\n * @param {string} CMIElement\n */\n loadFromJSON(json, CMIElement) {\n if (!this.isNotInitialized()) {\n console.error(\n 'loadFromJSON can only be called before the call to lmsInitialize.');\n return;\n }\n\n CMIElement = CMIElement !== undefined ? CMIElement : 'cmi';\n\n this.startingData = json;\n\n // could this be refactored down to flatten(json) then setCMIValue on each?\n for (const key in json) {\n if ({}.hasOwnProperty.call(json, key) && json[key]) {\n const currentCMIElement = (CMIElement ? CMIElement + '.' : '') + key;\n const value = json[key];\n\n if (value['childArray']) {\n for (let i = 0; i < value['childArray'].length; i++) {\n this.loadFromJSON(value['childArray'][i],\n currentCMIElement + '.' + i);\n }\n } else if (value.constructor === Object) {\n this.loadFromJSON(value, currentCMIElement);\n } else {\n this.setCMIValue(currentCMIElement, value);\n }\n }\n }\n }\n\n /**\n * Render the CMI object to JSON for sending to an LMS.\n *\n * @return {string}\n */\n renderCMIToJSONString() {\n const cmi = this.cmi;\n // Do we want/need to return fields that have no set value?\n // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);\n return JSON.stringify({cmi});\n }\n\n /**\n * Returns a JS object representing the current cmi\n * @return {object}\n */\n renderCMIToJSONObject() {\n // Do we want/need to return fields that have no set value?\n // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);\n return JSON.parse(this.renderCMIToJSONString());\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n * APIs that inherit BaseAPI should override this function\n *\n * @param {boolean} _terminateCommit\n * @return {*}\n * @abstract\n */\n renderCommitCMI(_terminateCommit) {\n throw new Error(\n 'The storeData method has not been implemented');\n }\n\n /**\n * Send the request to the LMS\n * @param {string} url\n * @param {object|Array} params\n * @param {boolean} immediate\n * @return {object}\n */\n processHttpRequest(url: String, params, immediate = false) {\n const api = this;\n const process = function(url, params, settings, error_codes) {\n const genericError = {\n 'result': global_constants.SCORM_FALSE,\n 'errorCode': error_codes.GENERAL,\n };\n\n let result;\n if (!settings.sendBeaconCommit) {\n const httpReq = new XMLHttpRequest();\n httpReq.open('POST', url, settings.asyncCommit);\n\n if (Object.keys(settings.xhrHeaders).length) {\n Object.keys(settings.xhrHeaders).forEach((header) => {\n httpReq.setRequestHeader(header, settings.xhrHeaders[header]);\n });\n }\n\n httpReq.withCredentials = settings.xhrWithCredentials;\n\n if (settings.asyncCommit) {\n httpReq.onload = function(e) {\n if (typeof settings.responseHandler === 'function') {\n result = settings.responseHandler(httpReq);\n } else {\n result = JSON.parse(httpReq.responseText);\n }\n };\n }\n try {\n params = settings.requestHandler(params);\n if (params instanceof Array) {\n httpReq.setRequestHeader('Content-Type',\n 'application/x-www-form-urlencoded');\n httpReq.send(params.join('&'));\n } else {\n httpReq.setRequestHeader('Content-Type',\n settings.commitRequestDataType);\n httpReq.send(JSON.stringify(params));\n }\n\n if (!settings.asyncCommit) {\n if (typeof settings.responseHandler === 'function') {\n result = settings.responseHandler(httpReq);\n } else {\n result = JSON.parse(httpReq.responseText);\n }\n } else {\n result = {};\n result.result = global_constants.SCORM_TRUE;\n result.errorCode = 0;\n api.processListeners('CommitSuccess');\n return result;\n }\n } catch (e) {\n console.error(e);\n api.processListeners('CommitError');\n return genericError;\n }\n } else {\n try {\n const headers = {\n type: settings.commitRequestDataType,\n };\n let blob;\n if (params instanceof Array) {\n blob = new Blob([params.join('&')], headers);\n } else {\n blob = new Blob([JSON.stringify(params)], headers);\n }\n\n result = {};\n if (navigator.sendBeacon(url, blob)) {\n result.result = global_constants.SCORM_TRUE;\n result.errorCode = 0;\n } else {\n result.result = global_constants.SCORM_FALSE;\n result.errorCode = 101;\n }\n } catch (e) {\n console.error(e);\n api.processListeners('CommitError');\n return genericError;\n }\n }\n\n if (typeof result === 'undefined') {\n api.processListeners('CommitError');\n return genericError;\n }\n\n if (result.result === true ||\n result.result === global_constants.SCORM_TRUE) {\n api.processListeners('CommitSuccess');\n } else {\n api.processListeners('CommitError');\n }\n\n return result;\n };\n\n if (typeof debounce !== 'undefined') {\n const debounced = debounce(process, 500);\n debounced(url, params, this.settings, this.error_codes);\n\n // if we're terminating, go ahead and commit immediately\n if (immediate) {\n debounced.flush();\n }\n\n return {\n result: global_constants.SCORM_TRUE,\n errorCode: 0,\n };\n } else {\n return process(url, params, this.settings, this.error_codes);\n }\n }\n\n /**\n * Throws a SCORM error\n *\n * @param {number} when - the number of milliseconds to wait before committing\n * @param {string} callback - the name of the commit event callback\n */\n scheduleCommit(when: number, callback: string) {\n this.#timeout = new ScheduledCommit(this, when, callback);\n this.apiLog('scheduleCommit', '', 'scheduled',\n global_constants.LOG_LEVEL_DEBUG);\n }\n\n /**\n * Clears and cancels any currently scheduled commits\n */\n clearScheduledCommit() {\n if (this.#timeout) {\n this.#timeout.cancel();\n this.#timeout = null;\n this.apiLog('clearScheduledCommit', '', 'cleared',\n global_constants.LOG_LEVEL_DEBUG);\n }\n }\n}\n\n/**\n * Private class that wraps a timeout call to the commit() function\n */\nclass ScheduledCommit {\n #API;\n #cancelled = false;\n #timeout;\n #callback;\n\n /**\n * Constructor for ScheduledCommit\n * @param {BaseAPI} API\n * @param {number} when\n * @param {string} callback\n */\n constructor(API: any, when: number, callback: string) {\n this.#API = API;\n this.#timeout = setTimeout(this.wrapper.bind(this), when);\n this.#callback = callback;\n }\n\n /**\n * Cancel any currently scheduled commit\n */\n cancel() {\n this.#cancelled = true;\n if (this.#timeout) {\n clearTimeout(this.#timeout);\n }\n }\n\n /**\n * Wrap the API commit call to check if the call has already been cancelled\n */\n wrapper() {\n if (!this.#cancelled) {\n this.#API.commit(this.#callback);\n }\n }\n}\n","// @flow\nimport BaseAPI from './BaseAPI';\nimport {\n ADL,\n CMI,\n CMICommentsObject,\n CMIInteractionsCorrectResponsesObject,\n CMIInteractionsObject,\n CMIInteractionsObjectivesObject,\n CMIObjectivesObject,\n} from './cmi/scorm2004_cmi';\nimport * as Utilities from './utilities';\nimport APIConstants from './constants/api_constants';\nimport ErrorCodes from './constants/error_codes';\nimport Responses from './constants/response_constants';\nimport ValidLanguages from './constants/language_constants';\nimport Regex from './constants/regex';\n\nconst scorm2004_constants = APIConstants.scorm2004;\nconst global_constants = APIConstants.global;\nconst scorm2004_error_codes = ErrorCodes.scorm2004;\nconst correct_responses = Responses.correct;\nconst scorm2004_regex = Regex.scorm2004;\n\n/**\n * API class for SCORM 2004\n */\nexport default class Scorm2004API extends BaseAPI {\n #version: '1.0';\n\n /**\n * Constructor for SCORM 2004 API\n * @param {object} settings\n */\n constructor(settings: {}) {\n const finalSettings = {\n ...{\n mastery_override: false,\n }, ...settings,\n };\n\n super(scorm2004_error_codes, finalSettings);\n\n this.cmi = new CMI();\n this.adl = new ADL();\n\n // Rename functions to match 2004 Spec and expose to modules\n this.Initialize = this.lmsInitialize;\n this.Terminate = this.lmsTerminate;\n this.GetValue = this.lmsGetValue;\n this.SetValue = this.lmsSetValue;\n this.Commit = this.lmsCommit;\n this.GetLastError = this.lmsGetLastError;\n this.GetErrorString = this.lmsGetErrorString;\n this.GetDiagnostic = this.lmsGetDiagnostic;\n }\n\n /**\n * Getter for #version\n * @return {string}\n */\n get version() {\n return this.#version;\n }\n\n /**\n * @return {string} bool\n */\n lmsInitialize() {\n this.cmi.initialize();\n return this.initialize('Initialize');\n }\n\n /**\n * @return {string} bool\n */\n lmsTerminate() {\n const result = this.terminate('Terminate', true);\n\n if (result === global_constants.SCORM_TRUE) {\n if (this.adl.nav.request !== '_none_') {\n switch (this.adl.nav.request) {\n case 'continue':\n this.processListeners('SequenceNext');\n break;\n case 'previous':\n this.processListeners('SequencePrevious');\n break;\n case 'choice':\n this.processListeners('SequenceChoice');\n break;\n case 'exit':\n this.processListeners('SequenceExit');\n break;\n case 'exitAll':\n this.processListeners('SequenceExitAll');\n break;\n case 'abandon':\n this.processListeners('SequenceAbandon');\n break;\n case 'abandonAll':\n this.processListeners('SequenceAbandonAll');\n break;\n }\n } else if (this.settings.autoProgress) {\n this.processListeners('SequenceNext');\n }\n }\n\n return result;\n }\n\n /**\n * @param {string} CMIElement\n * @return {string}\n */\n lmsGetValue(CMIElement) {\n return this.getValue('GetValue', true, CMIElement);\n }\n\n /**\n * @param {string} CMIElement\n * @param {any} value\n * @return {string}\n */\n lmsSetValue(CMIElement, value) {\n return this.setValue('SetValue', 'Commit', true, CMIElement, value);\n }\n\n /**\n * Orders LMS to store all content parameters\n *\n * @return {string} bool\n */\n lmsCommit() {\n return this.commit('Commit');\n }\n\n /**\n * Returns last error code\n *\n * @return {string}\n */\n lmsGetLastError() {\n return this.getLastError('GetLastError');\n }\n\n /**\n * Returns the errorNumber error description\n *\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n lmsGetErrorString(CMIErrorCode) {\n return this.getErrorString('GetErrorString', CMIErrorCode);\n }\n\n /**\n * Returns a comprehensive description of the errorNumber error.\n *\n * @param {(string|number)} CMIErrorCode\n * @return {string}\n */\n lmsGetDiagnostic(CMIErrorCode) {\n return this.getDiagnostic('GetDiagnostic', CMIErrorCode);\n }\n\n /**\n * Sets a value on the CMI Object\n *\n * @param {string} CMIElement\n * @param {any} value\n * @return {string}\n */\n setCMIValue(CMIElement, value) {\n return this._commonSetCMIValue('SetValue', true, CMIElement, value);\n }\n\n /**\n * Gets or builds a new child element to add to the array.\n *\n * @param {string} CMIElement\n * @param {any} value\n * @param {boolean} foundFirstIndex\n * @return {any}\n */\n getChildElement(CMIElement, value, foundFirstIndex) {\n let newChild;\n\n if (this.stringMatches(CMIElement, 'cmi\\\\.objectives\\\\.\\\\d+')) {\n newChild = new CMIObjectivesObject();\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d+\\\\.correct_responses\\\\.\\\\d+')) {\n const parts = CMIElement.split('.');\n const index = Number(parts[2]);\n const interaction = this.cmi.interactions.childArray[index];\n if (this.isInitialized()) {\n if (!interaction.type) {\n this.throwSCORMError(\n scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);\n } else {\n this.checkDuplicateChoiceResponse(interaction, value);\n\n const response_type = correct_responses[interaction.type];\n if (response_type) {\n this.checkValidResponseType(response_type, value, interaction.type);\n } else {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Incorrect Response Type: ' + interaction.type);\n }\n }\n }\n if (this.lastErrorCode === 0) {\n newChild = new CMIInteractionsCorrectResponsesObject();\n }\n } else if (foundFirstIndex && this.stringMatches(CMIElement,\n 'cmi\\\\.interactions\\\\.\\\\d+\\\\.objectives\\\\.\\\\d+')) {\n newChild = new CMIInteractionsObjectivesObject();\n } else if (!foundFirstIndex &&\n this.stringMatches(CMIElement, 'cmi\\\\.interactions\\\\.\\\\d+')) {\n newChild = new CMIInteractionsObject();\n } else if (this.stringMatches(CMIElement,\n 'cmi\\\\.comments_from_learner\\\\.\\\\d+')) {\n newChild = new CMICommentsObject();\n } else if (this.stringMatches(CMIElement,\n 'cmi\\\\.comments_from_lms\\\\.\\\\d+')) {\n newChild = new CMICommentsObject(true);\n }\n\n return newChild;\n }\n\n /**\n * Checks for valid response types\n * @param {object} response_type\n * @param {any} value\n * @param {string} interaction_type\n */\n checkValidResponseType(response_type, value, interaction_type) {\n let nodes = [];\n if (response_type?.delimiter) {\n nodes = String(value).split(response_type.delimiter);\n } else {\n nodes[0] = value;\n }\n\n if (nodes.length > 0 && nodes.length <= response_type.max) {\n this.checkCorrectResponseValue(interaction_type, nodes, value);\n } else if (nodes.length > response_type.max) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Pattern Too Long');\n }\n }\n\n /**\n * Checks for duplicate 'choice' responses.\n * @param {CMIInteractionsObject} interaction\n * @param {any} value\n */\n checkDuplicateChoiceResponse(interaction, value) {\n const interaction_count = interaction.correct_responses._count;\n if (interaction.type === 'choice') {\n for (let i = 0; i < interaction_count && this.lastErrorCode ===\n 0; i++) {\n const response = interaction.correct_responses.childArray[i];\n if (response.pattern === value) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE);\n }\n }\n }\n }\n\n /**\n * Validate correct response.\n * @param {string} CMIElement\n * @param {*} value\n */\n validateCorrectResponse(CMIElement, value) {\n const parts = CMIElement.split('.');\n const index = Number(parts[2]);\n const pattern_index = Number(parts[4]);\n const interaction = this.cmi.interactions.childArray[index];\n\n const interaction_count = interaction.correct_responses._count;\n this.checkDuplicateChoiceResponse(interaction, value);\n\n const response_type = correct_responses[interaction.type];\n if (typeof response_type.limit === 'undefined' || interaction_count <=\n response_type.limit) {\n this.checkValidResponseType(response_type, value, interaction.type);\n\n if (this.lastErrorCode === 0 &&\n (!response_type.duplicate ||\n !this.checkDuplicatedPattern(interaction.correct_responses,\n pattern_index, value)) ||\n (this.lastErrorCode === 0 && value === '')) {\n // do nothing, we want the inverse\n } else {\n if (this.lastErrorCode === 0) {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Pattern Already Exists');\n }\n }\n } else {\n this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE,\n 'Data Model Element Collection Limit Reached');\n }\n }\n\n /**\n * Gets a value from the CMI Object\n *\n * @param {string} CMIElement\n * @return {*}\n */\n getCMIValue(CMIElement) {\n return this._commonGetCMIValue('GetValue', true, CMIElement);\n }\n\n /**\n * Returns the message that corresponds to errorNumber.\n *\n * @param {(string|number)} errorNumber\n * @param {boolean} detail\n * @return {string}\n */\n getLmsErrorMessageDetails(errorNumber, detail) {\n let basicMessage = '';\n let detailMessage = '';\n\n // Set error number to string since inconsistent from modules if string or number\n errorNumber = String(errorNumber);\n if (scorm2004_constants.error_descriptions[errorNumber]) {\n basicMessage = scorm2004_constants.error_descriptions[errorNumber].basicMessage;\n detailMessage = scorm2004_constants.error_descriptions[errorNumber].detailMessage;\n }\n\n return detail ? detailMessage : basicMessage;\n }\n\n /**\n * Check to see if a correct_response value has been duplicated\n * @param {CMIArray} correct_response\n * @param {number} current_index\n * @param {*} value\n * @return {boolean}\n */\n checkDuplicatedPattern = (correct_response, current_index, value) => {\n let found = false;\n const count = correct_response._count;\n for (let i = 0; i < count && !found; i++) {\n if (i !== current_index && correct_response.childArray[i] === value) {\n found = true;\n }\n }\n return found;\n };\n\n /**\n * Checks for a valid correct_response value\n * @param {string} interaction_type\n * @param {Array} nodes\n * @param {*} value\n */\n checkCorrectResponseValue(interaction_type, nodes, value) {\n const response = correct_responses[interaction_type];\n const formatRegex = new RegExp(response.format);\n for (let i = 0; i < nodes.length && this.lastErrorCode === 0; i++) {\n if (interaction_type.match(\n '^(fill-in|long-fill-in|matching|performance|sequencing)$')) {\n nodes[i] = this.removeCorrectResponsePrefixes(nodes[i]);\n }\n\n if (response?.delimiter2) {\n const values = nodes[i].split(response.delimiter2);\n if (values.length === 2) {\n const matches = values[0].match(formatRegex);\n if (!matches) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n } else {\n if (!values[1].match(new RegExp(response.format2))) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n } else {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n } else {\n const matches = nodes[i].match(formatRegex);\n if ((!matches && value !== '') ||\n (!matches && interaction_type === 'true-false')) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n } else {\n if (interaction_type === 'numeric' && nodes.length > 1) {\n if (Number(nodes[0]) > Number(nodes[1])) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n } else {\n if (nodes[i] !== '' && response.unique) {\n for (let j = 0; j < i && this.lastErrorCode === 0; j++) {\n if (nodes[i] === nodes[j]) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n }\n }\n }\n }\n }\n }\n\n /**\n * Remove prefixes from correct_response\n * @param {string} node\n * @return {*}\n */\n removeCorrectResponsePrefixes(node) {\n let seenOrder = false;\n let seenCase = false;\n let seenLang = false;\n\n const prefixRegex = new RegExp(\n '^({(lang|case_matters|order_matters)=([^}]+)})');\n let matches = node.match(prefixRegex);\n let langMatches = null;\n while (matches) {\n switch (matches[2]) {\n case 'lang':\n langMatches = node.match(scorm2004_regex.CMILangcr);\n if (langMatches) {\n const lang = langMatches[3];\n if (lang !== undefined && lang.length > 0) {\n if (ValidLanguages[lang.toLowerCase()] === undefined) {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n }\n seenLang = true;\n break;\n case 'case_matters':\n if (!seenLang && !seenOrder && !seenCase) {\n if (matches[3] !== 'true' && matches[3] !== 'false') {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n\n seenCase = true;\n break;\n case 'order_matters':\n if (!seenCase && !seenLang && !seenOrder) {\n if (matches[3] !== 'true' && matches[3] !== 'false') {\n this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);\n }\n }\n\n seenOrder = true;\n break;\n default:\n break;\n }\n node = node.substr(matches[1].length);\n matches = node.match(prefixRegex);\n }\n\n return node;\n }\n\n /**\n * Replace the whole API with another\n * @param {Scorm2004API} newAPI\n */\n replaceWithAnotherScormAPI(newAPI) {\n // Data Model\n this.cmi = newAPI.cmi;\n this.adl = newAPI.adl;\n }\n\n /**\n * Render the cmi object to the proper format for LMS commit\n *\n * @param {boolean} terminateCommit\n * @return {object|Array}\n */\n renderCommitCMI(terminateCommit: boolean) {\n const cmiExport = this.renderCMIToJSONObject();\n\n if (terminateCommit) {\n cmiExport.cmi.total_time = this.cmi.getCurrentTotalTime();\n }\n\n const result = [];\n const flattened = Utilities.flatten(cmiExport);\n switch (this.settings.dataCommitFormat) {\n case 'flattened':\n return Utilities.flatten(cmiExport);\n case 'params':\n for (const item in flattened) {\n if ({}.hasOwnProperty.call(flattened, item)) {\n result.push(`${item}=${flattened[item]}`);\n }\n }\n return result;\n case 'json':\n default:\n return cmiExport;\n }\n }\n\n /**\n * Attempts to store the data to the LMS\n *\n * @param {boolean} terminateCommit\n * @return {string}\n */\n storeData(terminateCommit: boolean) {\n if (terminateCommit) {\n if (this.cmi.mode === 'normal') {\n if (this.cmi.credit === 'credit') {\n if (this.cmi.completion_threshold && this.cmi.progress_measure) {\n if (this.cmi.progress_measure >= this.cmi.completion_threshold) {\n console.debug('Setting Completion Status: Completed');\n this.cmi.completion_status = 'completed';\n } else {\n console.debug('Setting Completion Status: Incomplete');\n this.cmi.completion_status = 'incomplete';\n }\n }\n if (this.cmi.scaled_passing_score && this.cmi.score.scaled) {\n if (this.cmi.score.scaled >= this.cmi.scaled_passing_score) {\n console.debug('Setting Success Status: Passed');\n this.cmi.success_status = 'passed';\n } else {\n console.debug('Setting Success Status: Failed');\n this.cmi.success_status = 'failed';\n }\n }\n }\n }\n }\n\n let navRequest = false;\n if (this.adl.nav.request !== (this.startingData?.adl?.nav?.request) &&\n this.adl.nav.request !== '_none_') {\n this.adl.nav.request = encodeURIComponent(this.adl.nav.request);\n navRequest = true;\n }\n\n const commitObject = this.renderCommitCMI(terminateCommit ||\n this.settings.alwaysSendTotalTime);\n\n if (this.apiLogLevel === global_constants.LOG_LEVEL_DEBUG) {\n console.debug('Commit (terminated: ' +\n (terminateCommit ? 'yes' : 'no') + '): ');\n console.debug(commitObject);\n }\n if (this.settings.lmsCommitUrl) {\n const result = this.processHttpRequest(this.settings.lmsCommitUrl,\n commitObject, terminateCommit);\n\n // check if this is a sequencing call, and then call the necessary JS\n {\n if (navRequest && result.navRequest !== undefined &&\n result.navRequest !== '') {\n Function(`\"use strict\";(() => { ${result.navRequest} })()`)();\n }\n }\n return result;\n } else {\n return global_constants.SCORM_TRUE;\n }\n }\n}\n","// @flow\nimport APIConstants from '../constants/api_constants';\nimport ErrorCodes from '../constants/error_codes';\nimport Regex from '../constants/regex';\n\nconst scorm12_constants = APIConstants.scorm12;\nconst scorm12_regex = Regex.scorm12;\nconst scorm12_error_codes = ErrorCodes.scorm12;\n\n/**\n * Check if the value matches the proper format. If not, throw proper error code.\n *\n * @param {string} value\n * @param {string} regexPattern\n * @param {number} errorCode\n * @param {class} errorClass\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nexport function checkValidFormat(\n value: String,\n regexPattern: String,\n errorCode: number,\n errorClass: function,\n allowEmptyString?: boolean) {\n const formatRegex = new RegExp(regexPattern);\n const matches = value.match(formatRegex);\n if (allowEmptyString && value === '') {\n return true;\n }\n if (value === undefined || !matches || matches[0] === '') {\n throw new errorClass.prototype.constructor(errorCode);\n }\n return true;\n}\n\n/**\n * Check if the value matches the proper range. If not, throw proper error code.\n *\n * @param {*} value\n * @param {string} rangePattern\n * @param {number} errorCode\n * @param {class} errorClass\n * @return {boolean}\n */\nexport function checkValidRange(\n value: any,\n rangePattern: String,\n errorCode: number,\n errorClass: function) {\n const ranges = rangePattern.split('#');\n value = value * 1.0;\n if (value >= ranges[0]) {\n if ((ranges[1] === '*') || (value <= ranges[1])) {\n return true;\n } else {\n throw new errorClass.prototype.constructor(errorCode);\n }\n } else {\n throw new errorClass.prototype.constructor(errorCode);\n }\n}\n\n/**\n * Base class for API cmi objects\n */\nexport class BaseCMI {\n jsonString = false;\n #initialized = false;\n #start_time;\n\n /**\n * Constructor for BaseCMI, just marks the class as abstract\n */\n constructor() {\n if (new.target === BaseCMI) {\n throw new TypeError('Cannot construct BaseCMI instances directly');\n }\n }\n\n /**\n * Getter for #initialized\n * @return {boolean}\n */\n get initialized() {\n return this.#initialized;\n }\n\n /**\n * Getter for #start_time\n * @return {Number}\n */\n get start_time() {\n return this.#start_time;\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n this.#initialized = true;\n }\n\n /**\n * Called when the player should override the 'session_time' provided by\n * the module\n */\n setStartTime() {\n this.#start_time = new Date().getTime();\n }\n}\n\n/**\n * Base class for cmi *.score objects\n */\nexport class CMIScore extends BaseCMI {\n /**\n * Constructor for *.score\n * @param {string} score_children\n * @param {string} score_range\n * @param {string} max\n * @param {number} invalidErrorCode\n * @param {number} invalidTypeCode\n * @param {number} invalidRangeCode\n * @param {string} decimalRegex\n * @param {class} errorClass\n */\n constructor(\n {\n score_children,\n score_range,\n max,\n invalidErrorCode,\n invalidTypeCode,\n invalidRangeCode,\n decimalRegex,\n errorClass,\n }) {\n super();\n\n this.#_children = score_children ||\n scorm12_constants.score_children;\n this.#_score_range = !score_range ? false : scorm12_regex.score_range;\n this.#max = (max || max === '') ? max : '100';\n this.#_invalid_error_code = invalidErrorCode ||\n scorm12_error_codes.INVALID_SET_VALUE;\n this.#_invalid_type_code = invalidTypeCode ||\n scorm12_error_codes.TYPE_MISMATCH;\n this.#_invalid_range_code = invalidRangeCode ||\n scorm12_error_codes.VALUE_OUT_OF_RANGE;\n this.#_decimal_regex = decimalRegex ||\n scorm12_regex.CMIDecimal;\n this.#_error_class = errorClass;\n }\n\n #_children;\n #_score_range;\n #_invalid_error_code;\n #_invalid_type_code;\n #_invalid_range_code;\n #_decimal_regex;\n #_error_class;\n #raw = '';\n #min = '';\n #max;\n\n /**\n * Getter for _children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throw new this.#_error_class.prototype.constructor(this.#_invalid_error_code);\n }\n\n /**\n * Getter for #raw\n * @return {string}\n */\n get raw() {\n return this.#raw;\n }\n\n /**\n * Setter for #raw\n * @param {string} raw\n */\n set raw(raw) {\n if (checkValidFormat(raw, this.#_decimal_regex, this.#_invalid_type_code, this.#_error_class) &&\n (!this.#_score_range ||\n checkValidRange(raw, this.#_score_range, this.#_invalid_range_code, this.#_error_class))) {\n this.#raw = raw;\n }\n }\n\n /**\n * Getter for #min\n * @return {string}\n */\n get min() {\n return this.#min;\n }\n\n /**\n * Setter for #min\n * @param {string} min\n */\n set min(min) {\n if (checkValidFormat(min, this.#_decimal_regex, this.#_invalid_type_code, this.#_error_class) &&\n (!this.#_score_range ||\n checkValidRange(min, this.#_score_range, this.#_invalid_range_code, this.#_error_class))) {\n this.#min = min;\n }\n }\n\n /**\n * Getter for #max\n * @return {string}\n */\n get max() {\n return this.#max;\n }\n\n /**\n * Setter for #max\n * @param {string} max\n */\n set max(max) {\n if (checkValidFormat(max, this.#_decimal_regex, this.#_invalid_type_code, this.#_error_class) &&\n (!this.#_score_range ||\n checkValidRange(max, this.#_score_range, this.#_invalid_range_code, this.#_error_class))) {\n this.#max = max;\n }\n }\n\n /**\n * toJSON for *.score\n * @return {{min: string, max: string, raw: string}}\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'raw': this.raw,\n 'min': this.min,\n 'max': this.max,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Base class for cmi *.n objects\n */\nexport class CMIArray extends BaseCMI {\n /**\n * Constructor cmi *.n arrays\n * @param {string} children\n * @param {number} errorCode\n * @param {class} errorClass\n */\n constructor({children, errorCode, errorClass}) {\n super();\n this.#_children = children;\n this.#errorCode = errorCode;\n this.#errorClass = errorClass;\n this.childArray = [];\n }\n\n #errorCode;\n #errorClass;\n #_children;\n\n /**\n * Getter for _children\n * @return {*}\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for _children. Just throws an error.\n * @param {string} _children\n */\n set _children(_children) {\n throw new this.#errorClass.prototype.constructor(this.#errorCode);\n }\n\n /**\n * Getter for _count\n * @return {number}\n */\n get _count() {\n return this.childArray.length;\n }\n\n /**\n * Setter for _count. Just throws an error.\n * @param {number} _count\n */\n set _count(_count) {\n throw new this.#errorClass.prototype.constructor(this.#errorCode);\n }\n\n /**\n * toJSON for *.n arrays\n * @return {object}\n */\n toJSON() {\n this.jsonString = true;\n const result = {};\n for (let i = 0; i < this.childArray.length; i++) {\n result[i + ''] = this.childArray[i];\n }\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\nimport {\n BaseCMI,\n checkValidFormat,\n checkValidRange,\n CMIArray,\n CMIScore,\n} from './common';\nimport APIConstants from '../constants/api_constants';\nimport Regex from '../constants/regex';\nimport ErrorCodes from '../constants/error_codes';\nimport Responses from '../constants/response_constants';\nimport {Scorm2004ValidationError} from '../exceptions';\nimport * as Util from '../utilities';\n\nconst scorm2004_constants = APIConstants.scorm2004;\nconst scorm2004_error_codes = ErrorCodes.scorm2004;\nconst learner_responses = Responses.learner;\n\nconst scorm2004_regex = Regex.scorm2004;\n\n/**\n * Helper method for throwing Read Only error\n */\nfunction throwReadOnlyError() {\n throw new Scorm2004ValidationError(scorm2004_error_codes.READ_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Write Only error\n */\nfunction throwWriteOnlyError() {\n throw new Scorm2004ValidationError(scorm2004_error_codes.WRITE_ONLY_ELEMENT);\n}\n\n/**\n * Helper method for throwing Type Mismatch error\n */\nfunction throwTypeMismatchError() {\n throw new Scorm2004ValidationError(scorm2004_error_codes.TYPE_MISMATCH);\n}\n\n/**\n * Helper method for throwing Dependency Not Established error\n */\nfunction throwDependencyNotEstablishedError() {\n throw new Scorm2004ValidationError(scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);\n}\n\n/**\n * Helper method for throwing Dependency Not Established error\n */\nfunction throwGeneralSetError() {\n throw new Scorm2004ValidationError(scorm2004_error_codes.GENERAL_SET_FAILURE);\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} regexPattern\n * @param {boolean} allowEmptyString\n * @return {boolean}\n */\nfunction check2004ValidFormat(\n value: String,\n regexPattern: String,\n allowEmptyString?: boolean) {\n return checkValidFormat(\n value,\n regexPattern,\n scorm2004_error_codes.TYPE_MISMATCH,\n Scorm2004ValidationError,\n allowEmptyString,\n );\n}\n\n/**\n * Helper method, no reason to have to pass the same error codes every time\n * @param {*} value\n * @param {string} rangePattern\n * @return {boolean}\n */\nfunction check2004ValidRange(value: any, rangePattern: String) {\n return checkValidRange(\n value,\n rangePattern,\n scorm2004_error_codes.VALUE_OUT_OF_RANGE,\n Scorm2004ValidationError,\n );\n}\n\n/**\n * Class representing cmi object for SCORM 2004\n */\nexport class CMI extends BaseCMI {\n /**\n * Constructor for the SCORM 2004 cmi object\n * @param {boolean} initialized\n */\n constructor(initialized: boolean) {\n super();\n\n this.learner_preference = new CMILearnerPreference();\n this.score = new Scorm2004CMIScore();\n this.comments_from_learner = new CMICommentsFromLearner();\n this.comments_from_lms = new CMICommentsFromLMS();\n this.interactions = new CMIInteractions();\n this.objectives = new CMIObjectives();\n\n if (initialized) this.initialize();\n }\n\n #_version = '1.0';\n #_children = scorm2004_constants.cmi_children;\n #completion_status = 'unknown';\n #completion_threshold = '';\n #credit = 'credit';\n #entry = '';\n #exit = '';\n #launch_data = '';\n #learner_id = '';\n #learner_name = '';\n #location = '';\n #max_time_allowed = '';\n #mode = 'normal';\n #progress_measure = '';\n #scaled_passing_score = '';\n #session_time = 'PT0H0M0S';\n #success_status = 'unknown';\n #suspend_data = '';\n #time_limit_action = 'continue,no message';\n #total_time = '';\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.learner_preference?.initialize();\n this.score?.initialize();\n this.comments_from_learner?.initialize();\n this.comments_from_lms?.initialize();\n this.interactions?.initialize();\n this.objectives?.initialize();\n }\n\n /**\n * Getter for #_version\n * @return {string}\n * @private\n */\n get _version() {\n return this.#_version;\n }\n\n /**\n * Setter for #_version. Just throws an error.\n * @param {string} _version\n * @private\n */\n set _version(_version) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {number} _children\n * @private\n */\n set _children(_children) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #completion_status\n * @return {string}\n */\n get completion_status() {\n return this.#completion_status;\n }\n\n /**\n * Setter for #completion_status\n * @param {string} completion_status\n */\n set completion_status(completion_status) {\n if (check2004ValidFormat(completion_status, scorm2004_regex.CMICStatus)) {\n this.#completion_status = completion_status;\n }\n }\n\n /**\n * Getter for #completion_threshold\n * @return {string}\n */\n get completion_threshold() {\n return this.#completion_threshold;\n }\n\n /**\n * Setter for #completion_threshold. Can only be called before initialization.\n * @param {string} completion_threshold\n */\n set completion_threshold(completion_threshold) {\n !this.initialized ?\n this.#completion_threshold = completion_threshold :\n throwReadOnlyError();\n }\n\n /**\n * Setter for #credit\n * @return {string}\n */\n get credit() {\n return this.#credit;\n }\n\n /**\n * Setter for #credit. Can only be called before initialization.\n * @param {string} credit\n */\n set credit(credit) {\n !this.initialized ? this.#credit = credit : throwReadOnlyError();\n }\n\n /**\n * Getter for #entry\n * @return {string}\n */\n get entry() {\n return this.#entry;\n }\n\n /**\n * Setter for #entry. Can only be called before initialization.\n * @param {string} entry\n */\n set entry(entry) {\n !this.initialized ? this.#entry = entry : throwReadOnlyError();\n }\n\n /**\n * Getter for #exit. Should only be called during JSON export.\n * @return {string}\n */\n get exit() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#exit;\n }\n\n /**\n * Getter for #exit\n * @param {string} exit\n */\n set exit(exit) {\n if (check2004ValidFormat(exit, scorm2004_regex.CMIExit, true)) {\n this.#exit = exit;\n }\n }\n\n /**\n * Getter for #launch_data\n * @return {string}\n */\n get launch_data() {\n return this.#launch_data;\n }\n\n /**\n * Setter for #launch_data. Can only be called before initialization.\n * @param {string} launch_data\n */\n set launch_data(launch_data) {\n !this.initialized ? this.#launch_data = launch_data : throwReadOnlyError();\n }\n\n /**\n * Getter for #learner_id\n * @return {string}\n */\n get learner_id() {\n return this.#learner_id;\n }\n\n /**\n * Setter for #learner_id. Can only be called before initialization.\n * @param {string} learner_id\n */\n set learner_id(learner_id) {\n !this.initialized ? this.#learner_id = learner_id : throwReadOnlyError();\n }\n\n /**\n * Getter for #learner_name\n * @return {string}\n */\n get learner_name() {\n return this.#learner_name;\n }\n\n /**\n * Setter for #learner_name. Can only be called before initialization.\n * @param {string} learner_name\n */\n set learner_name(learner_name) {\n !this.initialized ?\n this.#learner_name = learner_name :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #location\n * @return {string}\n */\n get location() {\n return this.#location;\n }\n\n /**\n * Setter for #location\n * @param {string} location\n */\n set location(location) {\n if (check2004ValidFormat(location, scorm2004_regex.CMIString1000)) {\n this.#location = location;\n }\n }\n\n /**\n * Getter for #max_time_allowed\n * @return {string}\n */\n get max_time_allowed() {\n return this.#max_time_allowed;\n }\n\n /**\n * Setter for #max_time_allowed. Can only be called before initialization.\n * @param {string} max_time_allowed\n */\n set max_time_allowed(max_time_allowed) {\n !this.initialized ?\n this.#max_time_allowed = max_time_allowed :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #mode\n * @return {string}\n */\n get mode() {\n return this.#mode;\n }\n\n /**\n * Setter for #mode. Can only be called before initialization.\n * @param {string} mode\n */\n set mode(mode) {\n !this.initialized ? this.#mode = mode : throwReadOnlyError();\n }\n\n /**\n * Getter for #progress_measure\n * @return {string}\n */\n get progress_measure() {\n return this.#progress_measure;\n }\n\n /**\n * Setter for #progress_measure\n * @param {string} progress_measure\n */\n set progress_measure(progress_measure) {\n if (check2004ValidFormat(progress_measure, scorm2004_regex.CMIDecimal) &&\n check2004ValidRange(progress_measure, scorm2004_regex.progress_range)) {\n this.#progress_measure = progress_measure;\n }\n }\n\n /**\n * Getter for #scaled_passing_score\n * @return {string}\n */\n get scaled_passing_score() {\n return this.#scaled_passing_score;\n }\n\n /**\n * Setter for #scaled_passing_score. Can only be called before initialization.\n * @param {string} scaled_passing_score\n */\n set scaled_passing_score(scaled_passing_score) {\n !this.initialized ?\n this.#scaled_passing_score = scaled_passing_score :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #session_time. Should only be called during JSON export.\n * @return {string}\n */\n get session_time() {\n return (!this.jsonString) ? throwWriteOnlyError() : this.#session_time;\n }\n\n /**\n * Setter for #session_time\n * @param {string} session_time\n */\n set session_time(session_time) {\n if (check2004ValidFormat(session_time, scorm2004_regex.CMITimespan)) {\n this.#session_time = session_time;\n }\n }\n\n /**\n * Getter for #success_status\n * @return {string}\n */\n get success_status() {\n return this.#success_status;\n }\n\n /**\n * Setter for #success_status\n * @param {string} success_status\n */\n set success_status(success_status) {\n if (check2004ValidFormat(success_status, scorm2004_regex.CMISStatus)) {\n this.#success_status = success_status;\n }\n }\n\n /**\n * Getter for #suspend_data\n * @return {string}\n */\n get suspend_data() {\n return this.#suspend_data;\n }\n\n /**\n * Setter for #suspend_data\n * @param {string} suspend_data\n */\n set suspend_data(suspend_data) {\n if (check2004ValidFormat(suspend_data, scorm2004_regex.CMIString64000,\n true)) {\n this.#suspend_data = suspend_data;\n }\n }\n\n /**\n * Getter for #time_limit_action\n * @return {string}\n */\n get time_limit_action() {\n return this.#time_limit_action;\n }\n\n /**\n * Setter for #time_limit_action. Can only be called before initialization.\n * @param {string} time_limit_action\n */\n set time_limit_action(time_limit_action) {\n !this.initialized ?\n this.#time_limit_action = time_limit_action :\n throwReadOnlyError();\n }\n\n /**\n * Getter for #total_time\n * @return {string}\n */\n get total_time() {\n return this.#total_time;\n }\n\n /**\n * Setter for #total_time. Can only be called before initialization.\n * @param {string} total_time\n */\n set total_time(total_time) {\n !this.initialized ? this.#total_time = total_time : throwReadOnlyError();\n }\n\n /**\n * Adds the current session time to the existing total time.\n *\n * @return {string} ISO8601 Duration\n */\n getCurrentTotalTime() {\n let sessionTime = this.#session_time;\n const startTime = this.start_time;\n\n if (typeof startTime !== 'undefined' && startTime !== null) {\n const seconds = new Date().getTime() - startTime;\n sessionTime = Util.getSecondsAsISODuration(seconds / 1000);\n }\n\n return Util.addTwoDurations(\n this.#total_time,\n sessionTime,\n scorm2004_regex.CMITimespan,\n );\n }\n\n /**\n * toJSON for cmi\n *\n * @return {\n * {\n * comments_from_learner: CMICommentsFromLearner,\n * comments_from_lms: CMICommentsFromLMS,\n * completion_status: string,\n * completion_threshold: string,\n * credit: string,\n * entry: string,\n * exit: string,\n * interactions: CMIInteractions,\n * launch_data: string,\n * learner_id: string,\n * learner_name: string,\n * learner_preference: CMILearnerPreference,\n * location: string,\n * max_time_allowed: string,\n * mode: string,\n * objectives: CMIObjectives,\n * progress_measure: string,\n * scaled_passing_score: string,\n * score: Scorm2004CMIScore,\n * session_time: string,\n * success_status: string,\n * suspend_data: string,\n * time_limit_action: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'comments_from_learner': this.comments_from_learner,\n 'comments_from_lms': this.comments_from_lms,\n 'completion_status': this.completion_status,\n 'completion_threshold': this.completion_threshold,\n 'credit': this.credit,\n 'entry': this.entry,\n 'exit': this.exit,\n 'interactions': this.interactions,\n 'launch_data': this.launch_data,\n 'learner_id': this.learner_id,\n 'learner_name': this.learner_name,\n 'learner_preference': this.learner_preference,\n 'location': this.location,\n 'max_time_allowed': this.max_time_allowed,\n 'mode': this.mode,\n 'objectives': this.objectives,\n 'progress_measure': this.progress_measure,\n 'scaled_passing_score': this.scaled_passing_score,\n 'score': this.score,\n 'session_time': this.session_time,\n 'success_status': this.success_status,\n 'suspend_data': this.suspend_data,\n 'time_limit_action': this.time_limit_action,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.learner_preference object\n */\nclass CMILearnerPreference extends BaseCMI {\n #_children = scorm2004_constants.student_preference_children;\n #audio_level = '1';\n #language = '';\n #delivery_speed = '1';\n #audio_captioning = '0';\n\n /**\n * Constructor for cmi.learner_preference\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #_children\n * @return {string}\n * @private\n */\n get _children() {\n return this.#_children;\n }\n\n /**\n * Setter for #_children. Just throws an error.\n * @param {string} _children\n * @private\n */\n set _children(_children) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #audio_level\n * @return {string}\n */\n get audio_level() {\n return this.#audio_level;\n }\n\n /**\n * Setter for #audio_level\n * @param {string} audio_level\n */\n set audio_level(audio_level) {\n if (check2004ValidFormat(audio_level, scorm2004_regex.CMIDecimal) &&\n check2004ValidRange(audio_level, scorm2004_regex.audio_range)) {\n this.#audio_level = audio_level;\n }\n }\n\n /**\n * Getter for #language\n * @return {string}\n */\n get language() {\n return this.#language;\n }\n\n /**\n * Setter for #language\n * @param {string} language\n */\n set language(language) {\n if (check2004ValidFormat(language, scorm2004_regex.CMILang)) {\n this.#language = language;\n }\n }\n\n /**\n * Getter for #delivery_speed\n * @return {string}\n */\n get delivery_speed() {\n return this.#delivery_speed;\n }\n\n /**\n * Setter for #delivery_speed\n * @param {string} delivery_speed\n */\n set delivery_speed(delivery_speed) {\n if (check2004ValidFormat(delivery_speed, scorm2004_regex.CMIDecimal) &&\n check2004ValidRange(delivery_speed, scorm2004_regex.speed_range)) {\n this.#delivery_speed = delivery_speed;\n }\n }\n\n /**\n * Getter for #audio_captioning\n * @return {string}\n */\n get audio_captioning() {\n return this.#audio_captioning;\n }\n\n /**\n * Setter for #audio_captioning\n * @param {string} audio_captioning\n */\n set audio_captioning(audio_captioning) {\n if (check2004ValidFormat(audio_captioning, scorm2004_regex.CMISInteger) &&\n check2004ValidRange(audio_captioning, scorm2004_regex.text_range)) {\n this.#audio_captioning = audio_captioning;\n }\n }\n\n /**\n * toJSON for cmi.learner_preference\n *\n * @return {\n * {\n * audio_level: string,\n * language: string,\n * delivery_speed: string,\n * audio_captioning: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'audio_level': this.audio_level,\n 'language': this.language,\n 'delivery_speed': this.delivery_speed,\n 'audio_captioning': this.audio_captioning,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions object\n */\nclass CMIInteractions extends CMIArray {\n /**\n * Constructor for cmi.objectives Array\n */\n constructor() {\n super({\n children: scorm2004_constants.interactions_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.objectives object\n */\nclass CMIObjectives extends CMIArray {\n /**\n * Constructor for cmi.objectives Array\n */\n constructor() {\n super({\n children: scorm2004_constants.objectives_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_lms object\n */\nclass CMICommentsFromLMS extends CMIArray {\n /**\n * Constructor for cmi.comments_from_lms Array\n */\n constructor() {\n super({\n children: scorm2004_constants.comments_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n });\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_learner object\n */\nclass CMICommentsFromLearner extends CMIArray {\n /**\n * Constructor for cmi.comments_from_learner Array\n */\n constructor() {\n super({\n children: scorm2004_constants.comments_children,\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n });\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.interaction.n object\n */\nexport class CMIInteractionsObject extends BaseCMI {\n #id = '';\n #type = '';\n #timestamp = '';\n #weighting = '';\n #learner_response = '';\n #result = '';\n #latency = '';\n #description = '';\n\n /**\n * Constructor for cmi.interaction.n\n */\n constructor() {\n super();\n\n this.objectives = new CMIArray({\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n children: scorm2004_constants.objectives_children,\n });\n this.correct_responses = new CMIArray({\n errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n errorClass: Scorm2004ValidationError,\n children: scorm2004_constants.correct_responses_children,\n });\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.objectives?.initialize();\n this.correct_responses?.initialize();\n }\n\n /**\n * Getter for #id\n * @return {string}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #type\n * @return {string}\n */\n get type() {\n return this.#type;\n }\n\n /**\n * Setter for #type\n * @param {string} type\n */\n set type(type) {\n if (this.initialized && this.#id === '') {\n throwDependencyNotEstablishedError();\n } else {\n if (check2004ValidFormat(type, scorm2004_regex.CMIType)) {\n this.#type = type;\n }\n }\n }\n\n /**\n * Getter for #timestamp\n * @return {string}\n */\n get timestamp() {\n return this.#timestamp;\n }\n\n /**\n * Setter for #timestamp\n * @param {string} timestamp\n */\n set timestamp(timestamp) {\n if (this.initialized && this.#id === '') {\n throwDependencyNotEstablishedError();\n } else {\n if (check2004ValidFormat(timestamp, scorm2004_regex.CMITime)) {\n this.#timestamp = timestamp;\n }\n }\n }\n\n /**\n * Getter for #weighting\n * @return {string}\n */\n get weighting() {\n return this.#weighting;\n }\n\n /**\n * Setter for #weighting\n * @param {string} weighting\n */\n set weighting(weighting) {\n if (this.initialized && this.#id === '') {\n throwDependencyNotEstablishedError();\n } else {\n if (check2004ValidFormat(weighting, scorm2004_regex.CMIDecimal)) {\n this.#weighting = weighting;\n }\n }\n }\n\n /**\n * Getter for #learner_response\n * @return {string}\n */\n get learner_response() {\n return this.#learner_response;\n }\n\n /**\n * Setter for #learner_response. Does type validation to make sure response\n * matches SCORM 2004's spec\n * @param {string} learner_response\n */\n set learner_response(learner_response) {\n if (this.initialized && (this.#type === '' || this.#id === '')) {\n throwDependencyNotEstablishedError();\n } else {\n let nodes = [];\n const response_type = learner_responses[this.type];\n if (response_type) {\n if (response_type?.delimiter) {\n nodes = learner_response.split(response_type.delimiter);\n } else {\n nodes[0] = learner_response;\n }\n\n if ((nodes.length > 0) && (nodes.length <= response_type.max)) {\n const formatRegex = new RegExp(response_type.format);\n for (let i = 0; i < nodes.length; i++) {\n if (response_type?.delimiter2) {\n const values = nodes[i].split(response_type.delimiter2);\n if (values.length === 2) {\n if (!values[0].match(formatRegex)) {\n throwTypeMismatchError();\n } else {\n if (!values[1].match(new RegExp(response_type.format2))) {\n throwTypeMismatchError();\n }\n }\n } else {\n throwTypeMismatchError();\n }\n } else {\n if (!nodes[i].match(formatRegex)) {\n throwTypeMismatchError();\n } else {\n if (nodes[i] !== '' && response_type.unique) {\n for (let j = 0; j < i; j++) {\n if (nodes[i] === nodes[j]) {\n throwTypeMismatchError();\n }\n }\n }\n }\n }\n }\n } else {\n throwGeneralSetError();\n }\n\n this.#learner_response = learner_response;\n } else {\n throwTypeMismatchError();\n }\n }\n }\n\n /**\n * Getter for #result\n * @return {string}\n */\n get result() {\n return this.#result;\n }\n\n /**\n * Setter for #result\n * @param {string} result\n */\n set result(result) {\n if (check2004ValidFormat(result, scorm2004_regex.CMIResult)) {\n this.#result = result;\n }\n }\n\n /**\n * Getter for #latency\n * @return {string}\n */\n get latency() {\n return this.#latency;\n }\n\n /**\n * Setter for #latency\n * @param {string} latency\n */\n set latency(latency) {\n if (this.initialized && this.#id === '') {\n throwDependencyNotEstablishedError();\n } else {\n if (check2004ValidFormat(latency, scorm2004_regex.CMITimespan)) {\n this.#latency = latency;\n }\n }\n }\n\n /**\n * Getter for #description\n * @return {string}\n */\n get description() {\n return this.#description;\n }\n\n /**\n * Setter for #description\n * @param {string} description\n */\n set description(description) {\n if (this.initialized && this.#id === '') {\n throwDependencyNotEstablishedError();\n } else {\n if (check2004ValidFormat(description, scorm2004_regex.CMILangString250,\n true)) {\n this.#description = description;\n }\n }\n }\n\n /**\n * toJSON for cmi.interactions.n\n *\n * @return {\n * {\n * id: string,\n * type: string,\n * objectives: CMIArray,\n * timestamp: string,\n * correct_responses: CMIArray,\n * weighting: string,\n * learner_response: string,\n * result: string,\n * latency: string,\n * description: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'type': this.type,\n 'objectives': this.objectives,\n 'timestamp': this.timestamp,\n 'weighting': this.weighting,\n 'learner_response': this.learner_response,\n 'result': this.result,\n 'latency': this.latency,\n 'description': this.description,\n 'correct_responses': this.correct_responses,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for SCORM 2004's cmi.objectives.n object\n */\nexport class CMIObjectivesObject extends BaseCMI {\n #id = '';\n #success_status = 'unknown';\n #completion_status = 'unknown';\n #progress_measure = '';\n #description = '';\n\n /**\n * Constructor for cmi.objectives.n\n */\n constructor() {\n super();\n\n this.score = new Scorm2004CMIScore();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.score?.initialize();\n }\n\n /**\n * Getter for #id\n * @return {string}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * Getter for #success_status\n * @return {string}\n */\n get success_status() {\n return this.#success_status;\n }\n\n /**\n * Setter for #success_status\n * @param {string} success_status\n */\n set success_status(success_status) {\n if (this.initialized && this.#id === '') {\n throwDependencyNotEstablishedError();\n } else {\n if (check2004ValidFormat(success_status, scorm2004_regex.CMISStatus)) {\n this.#success_status = success_status;\n }\n }\n }\n\n /**\n * Getter for #completion_status\n * @return {string}\n */\n get completion_status() {\n return this.#completion_status;\n }\n\n /**\n * Setter for #completion_status\n * @param {string} completion_status\n */\n set completion_status(completion_status) {\n if (this.initialized && this.#id === '') {\n throwDependencyNotEstablishedError();\n } else {\n if (check2004ValidFormat(completion_status, scorm2004_regex.CMICStatus)) {\n this.#completion_status = completion_status;\n }\n }\n }\n\n /**\n * Getter for #progress_measure\n * @return {string}\n */\n get progress_measure() {\n return this.#progress_measure;\n }\n\n /**\n * Setter for #progress_measure\n * @param {string} progress_measure\n */\n set progress_measure(progress_measure) {\n if (this.initialized && this.#id === '') {\n throwDependencyNotEstablishedError();\n } else {\n if (check2004ValidFormat(progress_measure, scorm2004_regex.CMIDecimal) &&\n check2004ValidRange(progress_measure,\n scorm2004_regex.progress_range)) {\n this.#progress_measure = progress_measure;\n }\n }\n }\n\n /**\n * Getter for #description\n * @return {string}\n */\n get description() {\n return this.#description;\n }\n\n /**\n * Setter for #description\n * @param {string} description\n */\n set description(description) {\n if (this.initialized && this.#id === '') {\n throwDependencyNotEstablishedError();\n } else {\n if (check2004ValidFormat(description, scorm2004_regex.CMILangString250,\n true)) {\n this.#description = description;\n }\n }\n }\n\n /**\n * toJSON for cmi.objectives.n\n *\n * @return {\n * {\n * id: string,\n * success_status: string,\n * completion_status: string,\n * progress_measure: string,\n * description: string,\n * score: Scorm2004CMIScore\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n 'success_status': this.success_status,\n 'completion_status': this.completion_status,\n 'progress_measure': this.progress_measure,\n 'description': this.description,\n 'score': this.score,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class for SCORM 2004's cmi *.score object\n */\nclass Scorm2004CMIScore extends CMIScore {\n #scaled = '';\n\n /**\n * Constructor for cmi *.score\n */\n constructor() {\n super(\n {\n score_children: scorm2004_constants.score_children,\n max: '',\n invalidErrorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,\n invalidTypeCode: scorm2004_error_codes.TYPE_MISMATCH,\n invalidRangeCode: scorm2004_error_codes.VALUE_OUT_OF_RANGE,\n decimalRegex: scorm2004_regex.CMIDecimal,\n errorClass: Scorm2004ValidationError,\n });\n }\n\n /**\n * Getter for #scaled\n * @return {string}\n */\n get scaled() {\n return this.#scaled;\n }\n\n /**\n * Setter for #scaled\n * @param {string} scaled\n */\n set scaled(scaled) {\n if (check2004ValidFormat(scaled, scorm2004_regex.CMIDecimal) &&\n check2004ValidRange(scaled, scorm2004_regex.scaled_range)) {\n this.#scaled = scaled;\n }\n }\n\n /**\n * toJSON for cmi *.score\n *\n * @return {\n * {\n * scaled: string,\n * raw: string,\n * min: string,\n * max: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'scaled': this.scaled,\n 'raw': super.raw,\n 'min': super.min,\n 'max': super.max,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.comments_from_learner.n and cmi.comments_from_lms.n object\n */\nexport class CMICommentsObject extends BaseCMI {\n #comment = '';\n #location = '';\n #timestamp = '';\n #readOnlyAfterInit;\n\n /**\n * Constructor for cmi.comments_from_learner.n and cmi.comments_from_lms.n\n * @param {boolean} readOnlyAfterInit\n */\n constructor(readOnlyAfterInit = false) {\n super();\n this.#comment = '';\n this.#location = '';\n this.#timestamp = '';\n this.#readOnlyAfterInit = readOnlyAfterInit;\n }\n\n /**\n * Getter for #comment\n * @return {string}\n */\n get comment() {\n return this.#comment;\n }\n\n /**\n * Setter for #comment\n * @param {string} comment\n */\n set comment(comment) {\n if (this.initialized && this.#readOnlyAfterInit) {\n throwReadOnlyError();\n } else {\n if (check2004ValidFormat(comment, scorm2004_regex.CMILangString4000,\n true)) {\n this.#comment = comment;\n }\n }\n }\n\n /**\n * Getter for #location\n * @return {string}\n */\n get location() {\n return this.#location;\n }\n\n /**\n * Setter for #location\n * @param {string} location\n */\n set location(location) {\n if (this.initialized && this.#readOnlyAfterInit) {\n throwReadOnlyError();\n } else {\n if (check2004ValidFormat(location, scorm2004_regex.CMIString250)) {\n this.#location = location;\n }\n }\n }\n\n /**\n * Getter for #timestamp\n * @return {string}\n */\n get timestamp() {\n return this.#timestamp;\n }\n\n /**\n * Setter for #timestamp\n * @param {string} timestamp\n */\n set timestamp(timestamp) {\n if (this.initialized && this.#readOnlyAfterInit) {\n throwReadOnlyError();\n } else {\n if (check2004ValidFormat(timestamp, scorm2004_regex.CMITime)) {\n this.#timestamp = timestamp;\n }\n }\n }\n\n /**\n * toJSON for cmi.comments_from_learner.n object\n * @return {\n * {\n * comment: string,\n * location: string,\n * timestamp: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'comment': this.comment,\n 'location': this.location,\n 'timestamp': this.timestamp,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions.n.objectives.n object\n */\nexport class CMIInteractionsObjectivesObject extends BaseCMI {\n #id = '';\n\n /**\n * Constructor for cmi.interactions.n.objectives.n\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #id\n * @return {string}\n */\n get id() {\n return this.#id;\n }\n\n /**\n * Setter for #id\n * @param {string} id\n */\n set id(id) {\n if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) {\n this.#id = id;\n }\n }\n\n /**\n * toJSON for cmi.interactions.n.objectives.n\n * @return {\n * {\n * id: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'id': this.id,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's cmi.interactions.n.correct_responses.n object\n */\nexport class CMIInteractionsCorrectResponsesObject extends BaseCMI {\n #pattern = '';\n\n /**\n * Constructor for cmi.interactions.n.correct_responses.n\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #pattern\n * @return {string}\n */\n get pattern() {\n return this.#pattern;\n }\n\n /**\n * Setter for #pattern\n * @param {string} pattern\n */\n set pattern(pattern) {\n if (check2004ValidFormat(pattern, scorm2004_regex.CMIFeedback)) {\n this.#pattern = pattern;\n }\n }\n\n /**\n * toJSON cmi.interactions.n.correct_responses.n object\n * @return {\n * {\n * pattern: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'pattern': this.pattern,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's adl object\n */\nexport class ADL extends BaseCMI {\n /**\n * Constructor for adl\n */\n constructor() {\n super();\n\n this.nav = new ADLNav();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.nav?.initialize();\n }\n\n /**\n * toJSON for adl\n * @return {\n * {\n * nav: {\n * request: string\n * }\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'nav': this.nav,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's adl.nav object\n */\nclass ADLNav extends BaseCMI {\n #request = '_none_';\n\n /**\n * Constructor for adl.nav\n */\n constructor() {\n super();\n\n this.request_valid = new ADLNavRequestValid();\n }\n\n /**\n * Called when the API has been initialized after the CMI has been created\n */\n initialize() {\n super.initialize();\n this.request_valid?.initialize();\n }\n\n /**\n * Getter for #request\n * @return {string}\n */\n get request() {\n return this.#request;\n }\n\n /**\n * Setter for #request\n * @param {string} request\n */\n set request(request) {\n if (check2004ValidFormat(request, scorm2004_regex.NAVEvent)) {\n this.#request = request;\n }\n }\n\n /**\n * toJSON for adl.nav\n *\n * @return {\n * {\n * request: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'request': this.request,\n };\n delete this.jsonString;\n return result;\n }\n}\n\n/**\n * Class representing SCORM 2004's adl.nav.request_valid object\n */\nclass ADLNavRequestValid extends BaseCMI {\n #continue = 'unknown';\n #previous = 'unknown';\n choice = class {\n /**\n * Check if target is valid\n * @param {*} _target\n * @return {string}\n */\n _isTargetValid = (_target) => 'unknown';\n };\n jump = class {\n /**\n * Check if target is valid\n * @param {*} _target\n * @return {string}\n */\n _isTargetValid = (_target) => 'unknown';\n };\n\n /**\n * Constructor for adl.nav.request_valid\n */\n constructor() {\n super();\n }\n\n /**\n * Getter for #continue\n * @return {string}\n */\n get continue() {\n return this.#continue;\n }\n\n /**\n * Setter for #continue. Just throws an error.\n * @param {*} _\n */\n set continue(_) {\n throwReadOnlyError();\n }\n\n /**\n * Getter for #previous\n * @return {string}\n */\n get previous() {\n return this.#previous;\n }\n\n /**\n * Setter for #previous. Just throws an error.\n * @param {*} _\n */\n set previous(_) {\n throwReadOnlyError();\n }\n\n /**\n * toJSON for adl.nav.request_valid\n *\n * @return {\n * {\n * previous: string,\n * continue: string\n * }\n * }\n */\n toJSON() {\n this.jsonString = true;\n const result = {\n 'previous': this.previous,\n 'continue': this.continue,\n };\n delete this.jsonString;\n return result;\n }\n}\n","// @flow\n\nconst global = {\n SCORM_TRUE: 'true',\n SCORM_FALSE: 'false',\n STATE_NOT_INITIALIZED: 0,\n STATE_INITIALIZED: 1,\n STATE_TERMINATED: 2,\n LOG_LEVEL_DEBUG: 1,\n LOG_LEVEL_INFO: 2,\n LOG_LEVEL_WARNING: 3,\n LOG_LEVEL_ERROR: 4,\n LOG_LEVEL_NONE: 5,\n};\n\nconst scorm12 = {\n // Children lists\n cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions',\n core_children: 'student_id,student_name,lesson_location,credit,lesson_status,entry,score,total_time,lesson_mode,exit,session_time',\n score_children: 'raw,min,max',\n comments_children: 'content,location,time',\n objectives_children: 'id,score,status',\n correct_responses_children: 'pattern',\n student_data_children: 'mastery_score,max_time_allowed,time_limit_action',\n student_preference_children: 'audio,language,speed,text',\n interactions_children: 'id,objectives,time,type,correct_responses,weighting,student_response,result,latency',\n\n error_descriptions: {\n '101': {\n basicMessage: 'General Exception',\n detailMessage: 'No specific error code exists to describe the error. Use LMSGetDiagnostic for more information',\n },\n '201': {\n basicMessage: 'Invalid argument error',\n detailMessage: 'Indicates that an argument represents an invalid data model element or is otherwise incorrect.',\n },\n '202': {\n basicMessage: 'Element cannot have children',\n detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in \"_children\" for a data model element that does not support the \"_children\" suffix.',\n },\n '203': {\n basicMessage: 'Element not an array - cannot have count',\n detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in \"_count\" for a data model element that does not support the \"_count\" suffix.',\n },\n '301': {\n basicMessage: 'Not initialized',\n detailMessage: 'Indicates that an API call was made before the call to lmsInitialize.',\n },\n '401': {\n basicMessage: 'Not implemented error',\n detailMessage: 'The data model element indicated in a call to LMSGetValue or LMSSetValue is valid, but was not implemented by this LMS. SCORM 1.2 defines a set of data model elements as being optional for an LMS to implement.',\n },\n '402': {\n basicMessage: 'Invalid set value, element is a keyword',\n detailMessage: 'Indicates that LMSSetValue was called on a data model element that represents a keyword (elements that end in \"_children\" and \"_count\").',\n },\n '403': {\n basicMessage: 'Element is read only',\n detailMessage: 'LMSSetValue was called with a data model element that can only be read.',\n },\n '404': {\n basicMessage: 'Element is write only',\n detailMessage: 'LMSGetValue was called on a data model element that can only be written to.',\n },\n '405': {\n basicMessage: 'Incorrect Data Type',\n detailMessage: 'LMSSetValue was called with a value that is not consistent with the data format of the supplied data model element.',\n },\n '407': {\n basicMessage: 'Element Value Out Of Range',\n detailMessage: 'The numeric value supplied to a LMSSetValue call is outside of the numeric range allowed for the supplied data model element.',\n },\n '408': {\n basicMessage: 'Data Model Dependency Not Established',\n detailMessage: 'Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.',\n },\n },\n};\n\nconst aicc = {\n ...scorm12, ...{\n cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions,evaluation',\n student_preference_children: 'audio,language,lesson_type,speed,text,text_color,text_location,text_size,video,windows',\n student_data_children: 'attempt_number,tries,mastery_score,max_time_allowed,time_limit_action',\n student_demographics_children: 'city,class,company,country,experience,familiar_name,instructor_name,title,native_language,state,street_address,telephone,years_experience',\n tries_children: 'time,status,score',\n attempt_records_children: 'score,lesson_status',\n paths_children: 'location_id,date,time,status,why_left,time_in_element',\n },\n};\n\nconst scorm2004 = {\n // Children lists\n cmi_children: '_version,comments_from_learner,comments_from_lms,completion_status,credit,entry,exit,interactions,launch_data,learner_id,learner_name,learner_preference,location,max_time_allowed,mode,objectives,progress_measure,scaled_passing_score,score,session_time,success_status,suspend_data,time_limit_action,total_time',\n comments_children: 'comment,timestamp,location',\n score_children: 'max,raw,scaled,min',\n objectives_children: 'progress_measure,completion_status,success_status,description,score,id',\n correct_responses_children: 'pattern',\n student_data_children: 'mastery_score,max_time_allowed,time_limit_action',\n student_preference_children: 'audio_level,audio_captioning,delivery_speed,language',\n interactions_children: 'id,type,objectives,timestamp,correct_responses,weighting,learner_response,result,latency,description',\n\n error_descriptions: {\n '0': {\n basicMessage: 'No Error',\n detailMessage: 'No error occurred, the previous API call was successful.',\n },\n '101': {\n basicMessage: 'General Exception',\n detailMessage: 'No specific error code exists to describe the error. Use GetDiagnostic for more information.',\n },\n '102': {\n basicMessage: 'General Initialization Failure',\n detailMessage: 'Call to Initialize failed for an unknown reason.',\n },\n '103': {\n basicMessage: 'Already Initialized',\n detailMessage: 'Call to Initialize failed because Initialize was already called.',\n },\n '104': {\n basicMessage: 'Content Instance Terminated',\n detailMessage: 'Call to Initialize failed because Terminate was already called.',\n },\n '111': {\n basicMessage: 'General Termination Failure',\n detailMessage: 'Call to Terminate failed for an unknown reason.',\n },\n '112': {\n basicMessage: 'Termination Before Initialization',\n detailMessage: 'Call to Terminate failed because it was made before the call to Initialize.',\n },\n '113': {\n basicMessage: 'Termination After Termination',\n detailMessage: 'Call to Terminate failed because Terminate was already called.',\n },\n '122': {\n basicMessage: 'Retrieve Data Before Initialization',\n detailMessage: 'Call to GetValue failed because it was made before the call to Initialize.',\n },\n '123': {\n basicMessage: 'Retrieve Data After Termination',\n detailMessage: 'Call to GetValue failed because it was made after the call to Terminate.',\n },\n '132': {\n basicMessage: 'Store Data Before Initialization',\n detailMessage: 'Call to SetValue failed because it was made before the call to Initialize.',\n },\n '133': {\n basicMessage: 'Store Data After Termination',\n detailMessage: 'Call to SetValue failed because it was made after the call to Terminate.',\n },\n '142': {\n basicMessage: 'Commit Before Initialization',\n detailMessage: 'Call to Commit failed because it was made before the call to Initialize.',\n },\n '143': {\n basicMessage: 'Commit After Termination',\n detailMessage: 'Call to Commit failed because it was made after the call to Terminate.',\n },\n '201': {\n basicMessage: 'General Argument Error',\n detailMessage: 'An invalid argument was passed to an API method (usually indicates that Initialize, Commit or Terminate did not receive the expected empty string argument.',\n },\n '301': {\n basicMessage: 'General Get Failure',\n detailMessage: 'Indicates a failed GetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '351': {\n basicMessage: 'General Set Failure',\n detailMessage: 'Indicates a failed SetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '391': {\n basicMessage: 'General Commit Failure',\n detailMessage: 'Indicates a failed Commit call where no other specific error code is applicable. Use GetDiagnostic for more information.',\n },\n '401': {\n basicMessage: 'Undefined Data Model Element',\n detailMessage: 'The data model element name passed to GetValue or SetValue is not a valid SCORM data model element.',\n },\n '402': {\n basicMessage: 'Unimplemented Data Model Element',\n detailMessage: 'The data model element indicated in a call to GetValue or SetValue is valid, but was not implemented by this LMS. In SCORM 2004, this error would indicate an LMS that is not fully SCORM conformant.',\n },\n '403': {\n basicMessage: 'Data Model Element Value Not Initialized',\n detailMessage: 'Attempt to read a data model element that has not been initialized by the LMS or through a SetValue call. This error condition is often reached during normal execution of a SCO.',\n },\n '404': {\n basicMessage: 'Data Model Element Is Read Only',\n detailMessage: 'SetValue was called with a data model element that can only be read.',\n },\n '405': {\n basicMessage: 'Data Model Element Is Write Only',\n detailMessage: 'GetValue was called on a data model element that can only be written to.',\n },\n '406': {\n basicMessage: 'Data Model Element Type Mismatch',\n detailMessage: 'SetValue was called with a value that is not consistent with the data format of the supplied data model element.',\n },\n '407': {\n basicMessage: 'Data Model Element Value Out Of Range',\n detailMessage: 'The numeric value supplied to a SetValue call is outside of the numeric range allowed for the supplied data model element.',\n },\n '408': {\n basicMessage: 'Data Model Dependency Not Established',\n detailMessage: 'Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.',\n },\n },\n};\n\nconst APIConstants = {\n global: global,\n scorm12: scorm12,\n aicc: aicc,\n scorm2004: scorm2004,\n};\n\nexport default APIConstants;\n","// @flow\nconst global = {\n GENERAL: 101,\n INITIALIZATION_FAILED: 101,\n INITIALIZED: 101,\n TERMINATED: 101,\n TERMINATION_FAILURE: 101,\n TERMINATION_BEFORE_INIT: 101,\n MULTIPLE_TERMINATION: 101,\n RETRIEVE_BEFORE_INIT: 101,\n RETRIEVE_AFTER_TERM: 101,\n STORE_BEFORE_INIT: 101,\n STORE_AFTER_TERM: 101,\n COMMIT_BEFORE_INIT: 101,\n COMMIT_AFTER_TERM: 101,\n ARGUMENT_ERROR: 101,\n CHILDREN_ERROR: 101,\n COUNT_ERROR: 101,\n GENERAL_GET_FAILURE: 101,\n GENERAL_SET_FAILURE: 101,\n GENERAL_COMMIT_FAILURE: 101,\n UNDEFINED_DATA_MODEL: 101,\n UNIMPLEMENTED_ELEMENT: 101,\n VALUE_NOT_INITIALIZED: 101,\n INVALID_SET_VALUE: 101,\n READ_ONLY_ELEMENT: 101,\n WRITE_ONLY_ELEMENT: 101,\n TYPE_MISMATCH: 101,\n VALUE_OUT_OF_RANGE: 101,\n DEPENDENCY_NOT_ESTABLISHED: 101,\n};\n\nconst scorm12 = {\n ...global, ...{\n RETRIEVE_BEFORE_INIT: 301,\n STORE_BEFORE_INIT: 301,\n COMMIT_BEFORE_INIT: 301,\n ARGUMENT_ERROR: 201,\n CHILDREN_ERROR: 202,\n COUNT_ERROR: 203,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 401,\n VALUE_NOT_INITIALIZED: 301,\n INVALID_SET_VALUE: 402,\n READ_ONLY_ELEMENT: 403,\n WRITE_ONLY_ELEMENT: 404,\n TYPE_MISMATCH: 405,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n },\n};\n\nconst scorm2004 = {\n ...global, ...{\n INITIALIZATION_FAILED: 102,\n INITIALIZED: 103,\n TERMINATED: 104,\n TERMINATION_FAILURE: 111,\n TERMINATION_BEFORE_INIT: 112,\n MULTIPLE_TERMINATIONS: 113,\n RETRIEVE_BEFORE_INIT: 122,\n RETRIEVE_AFTER_TERM: 123,\n STORE_BEFORE_INIT: 132,\n STORE_AFTER_TERM: 133,\n COMMIT_BEFORE_INIT: 142,\n COMMIT_AFTER_TERM: 143,\n ARGUMENT_ERROR: 201,\n GENERAL_GET_FAILURE: 301,\n GENERAL_SET_FAILURE: 351,\n GENERAL_COMMIT_FAILURE: 391,\n UNDEFINED_DATA_MODEL: 401,\n UNIMPLEMENTED_ELEMENT: 402,\n VALUE_NOT_INITIALIZED: 403,\n READ_ONLY_ELEMENT: 404,\n WRITE_ONLY_ELEMENT: 405,\n TYPE_MISMATCH: 406,\n VALUE_OUT_OF_RANGE: 407,\n DEPENDENCY_NOT_ESTABLISHED: 408,\n },\n};\n\nconst ErrorCodes = {\n scorm12: scorm12,\n scorm2004: scorm2004,\n};\n\nexport default ErrorCodes;\n","const ValidLanguages = {\n 'aa': 'aa', 'ab': 'ab', 'ae': 'ae', 'af': 'af', 'ak': 'ak', 'am': 'am',\n 'an': 'an', 'ar': 'ar', 'as': 'as', 'av': 'av', 'ay': 'ay', 'az': 'az',\n 'ba': 'ba', 'be': 'be', 'bg': 'bg', 'bh': 'bh', 'bi': 'bi', 'bm': 'bm',\n 'bn': 'bn', 'bo': 'bo', 'br': 'br', 'bs': 'bs', 'ca': 'ca', 'ce': 'ce',\n 'ch': 'ch', 'co': 'co', 'cr': 'cr', 'cs': 'cs', 'cu': 'cu', 'cv': 'cv',\n 'cy': 'cy', 'da': 'da', 'de': 'de', 'dv': 'dv', 'dz': 'dz', 'ee': 'ee',\n 'el': 'el', 'en': 'en', 'eo': 'eo', 'es': 'es', 'et': 'et', 'eu': 'eu',\n 'fa': 'fa', 'ff': 'ff', 'fi': 'fi', 'fj': 'fj', 'fo': 'fo', 'fr': 'fr',\n 'fy': 'fy', 'ga': 'ga', 'gd': 'gd', 'gl': 'gl', 'gn': 'gn', 'gu': 'gu',\n 'gv': 'gv', 'ha': 'ha', 'he': 'he', 'hi': 'hi', 'ho': 'ho', 'hr': 'hr',\n 'ht': 'ht', 'hu': 'hu', 'hy': 'hy', 'hz': 'hz', 'ia': 'ia', 'id': 'id',\n 'ie': 'ie', 'ig': 'ig', 'ii': 'ii', 'ik': 'ik', 'io': 'io', 'is': 'is',\n 'it': 'it', 'iu': 'iu', 'ja': 'ja', 'jv': 'jv', 'ka': 'ka', 'kg': 'kg',\n 'ki': 'ki', 'kj': 'kj', 'kk': 'kk', 'kl': 'kl', 'km': 'km', 'kn': 'kn',\n 'ko': 'ko', 'kr': 'kr', 'ks': 'ks', 'ku': 'ku', 'kv': 'kv', 'kw': 'kw',\n 'ky': 'ky', 'la': 'la', 'lb': 'lb', 'lg': 'lg', 'li': 'li', 'ln': 'ln',\n 'lo': 'lo', 'lt': 'lt', 'lu': 'lu', 'lv': 'lv', 'mg': 'mg', 'mh': 'mh',\n 'mi': 'mi', 'mk': 'mk', 'ml': 'ml', 'mn': 'mn', 'mo': 'mo', 'mr': 'mr',\n 'ms': 'ms', 'mt': 'mt', 'my': 'my', 'na': 'na', 'nb': 'nb', 'nd': 'nd',\n 'ne': 'ne', 'ng': 'ng', 'nl': 'nl', 'nn': 'nn', 'no': 'no', 'nr': 'nr',\n 'nv': 'nv', 'ny': 'ny', 'oc': 'oc', 'oj': 'oj', 'om': 'om', 'or': 'or',\n 'os': 'os', 'pa': 'pa', 'pi': 'pi', 'pl': 'pl', 'ps': 'ps', 'pt': 'pt',\n 'qu': 'qu', 'rm': 'rm', 'rn': 'rn', 'ro': 'ro', 'ru': 'ru', 'rw': 'rw',\n 'sa': 'sa', 'sc': 'sc', 'sd': 'sd', 'se': 'se', 'sg': 'sg', 'sh': 'sh',\n 'si': 'si', 'sk': 'sk', 'sl': 'sl', 'sm': 'sm', 'sn': 'sn', 'so': 'so',\n 'sq': 'sq', 'sr': 'sr', 'ss': 'ss', 'st': 'st', 'su': 'su', 'sv': 'sv',\n 'sw': 'sw', 'ta': 'ta', 'te': 'te', 'tg': 'tg', 'th': 'th', 'ti': 'ti',\n 'tk': 'tk', 'tl': 'tl', 'tn': 'tn', 'to': 'to', 'tr': 'tr', 'ts': 'ts',\n 'tt': 'tt', 'tw': 'tw', 'ty': 'ty', 'ug': 'ug', 'uk': 'uk', 'ur': 'ur',\n 'uz': 'uz', 've': 've', 'vi': 'vi', 'vo': 'vo', 'wa': 'wa', 'wo': 'wo',\n 'xh': 'xh', 'yi': 'yi', 'yo': 'yo', 'za': 'za', 'zh': 'zh', 'zu': 'zu',\n 'aar': 'aar', 'abk': 'abk', 'ave': 'ave', 'afr': 'afr', 'aka': 'aka',\n 'amh': 'amh', 'arg': 'arg', 'ara': 'ara', 'asm': 'asm', 'ava': 'ava',\n 'aym': 'aym', 'aze': 'aze', 'bak': 'bak', 'bel': 'bel', 'bul': 'bul',\n 'bih': 'bih', 'bis': 'bis', 'bam': 'bam', 'ben': 'ben', 'tib': 'tib',\n 'bod': 'bod', 'bre': 'bre', 'bos': 'bos', 'cat': 'cat', 'che': 'che',\n 'cha': 'cha', 'cos': 'cos', 'cre': 'cre', 'cze': 'cze', 'ces': 'ces',\n 'chu': 'chu', 'chv': 'chv', 'wel': 'wel', 'cym': 'cym', 'dan': 'dan',\n 'ger': 'ger', 'deu': 'deu', 'div': 'div', 'dzo': 'dzo', 'ewe': 'ewe',\n 'gre': 'gre', 'ell': 'ell', 'eng': 'eng', 'epo': 'epo', 'spa': 'spa',\n 'est': 'est', 'baq': 'baq', 'eus': 'eus', 'per': 'per', 'fas': 'fas',\n 'ful': 'ful', 'fin': 'fin', 'fij': 'fij', 'fao': 'fao', 'fre': 'fre',\n 'fra': 'fra', 'fry': 'fry', 'gle': 'gle', 'gla': 'gla', 'glg': 'glg',\n 'grn': 'grn', 'guj': 'guj', 'glv': 'glv', 'hau': 'hau', 'heb': 'heb',\n 'hin': 'hin', 'hmo': 'hmo', 'hrv': 'hrv', 'hat': 'hat', 'hun': 'hun',\n 'arm': 'arm', 'hye': 'hye', 'her': 'her', 'ina': 'ina', 'ind': 'ind',\n 'ile': 'ile', 'ibo': 'ibo', 'iii': 'iii', 'ipk': 'ipk', 'ido': 'ido',\n 'ice': 'ice', 'isl': 'isl', 'ita': 'ita', 'iku': 'iku', 'jpn': 'jpn',\n 'jav': 'jav', 'geo': 'geo', 'kat': 'kat', 'kon': 'kon', 'kik': 'kik',\n 'kua': 'kua', 'kaz': 'kaz', 'kal': 'kal', 'khm': 'khm', 'kan': 'kan',\n 'kor': 'kor', 'kau': 'kau', 'kas': 'kas', 'kur': 'kur', 'kom': 'kom',\n 'cor': 'cor', 'kir': 'kir', 'lat': 'lat', 'ltz': 'ltz', 'lug': 'lug',\n 'lim': 'lim', 'lin': 'lin', 'lao': 'lao', 'lit': 'lit', 'lub': 'lub',\n 'lav': 'lav', 'mlg': 'mlg', 'mah': 'mah', 'mao': 'mao', 'mri': 'mri',\n 'mac': 'mac', 'mkd': 'mkd', 'mal': 'mal', 'mon': 'mon', 'mol': 'mol',\n 'mar': 'mar', 'may': 'may', 'msa': 'msa', 'mlt': 'mlt', 'bur': 'bur',\n 'mya': 'mya', 'nau': 'nau', 'nob': 'nob', 'nde': 'nde', 'nep': 'nep',\n 'ndo': 'ndo', 'dut': 'dut', 'nld': 'nld', 'nno': 'nno', 'nor': 'nor',\n 'nbl': 'nbl', 'nav': 'nav', 'nya': 'nya', 'oci': 'oci', 'oji': 'oji',\n 'orm': 'orm', 'ori': 'ori', 'oss': 'oss', 'pan': 'pan', 'pli': 'pli',\n 'pol': 'pol', 'pus': 'pus', 'por': 'por', 'que': 'que', 'roh': 'roh',\n 'run': 'run', 'rum': 'rum', 'ron': 'ron', 'rus': 'rus', 'kin': 'kin',\n 'san': 'san', 'srd': 'srd', 'snd': 'snd', 'sme': 'sme', 'sag': 'sag',\n 'slo': 'slo', 'sin': 'sin', 'slk': 'slk', 'slv': 'slv', 'smo': 'smo',\n 'sna': 'sna', 'som': 'som', 'alb': 'alb', 'sqi': 'sqi', 'srp': 'srp',\n 'ssw': 'ssw', 'sot': 'sot', 'sun': 'sun', 'swe': 'swe', 'swa': 'swa',\n 'tam': 'tam', 'tel': 'tel', 'tgk': 'tgk', 'tha': 'tha', 'tir': 'tir',\n 'tuk': 'tuk', 'tgl': 'tgl', 'tsn': 'tsn', 'ton': 'ton', 'tur': 'tur',\n 'tso': 'tso', 'tat': 'tat', 'twi': 'twi', 'tah': 'tah', 'uig': 'uig',\n 'ukr': 'ukr', 'urd': 'urd', 'uzb': 'uzb', 'ven': 'ven', 'vie': 'vie',\n 'vol': 'vol', 'wln': 'wln', 'wol': 'wol', 'xho': 'xho', 'yid': 'yid',\n 'yor': 'yor', 'zha': 'zha', 'chi': 'chi', 'zho': 'zho', 'zul': 'zul',\n};\n\nexport default ValidLanguages;\n","// @flow\n\nconst scorm12 = {\n CMIString256: '^.{0,255}$',\n CMIString4096: '^.{0,4096}$',\n CMITime: '^(?:[01]\\\\d|2[0123]):(?:[012345]\\\\d):(?:[012345]\\\\d)$', // eslint-disable-line\n CMITimespan: '^([0-9]{2,}):([0-9]{2}):([0-9]{2})(\\.[0-9]{1,2})?$', // eslint-disable-line\n CMIInteger: '^\\\\d+$',\n CMISInteger: '^-?([0-9]+)$',\n CMIDecimal: '^-?([0-9]{0,3})(\\.[0-9]*)?$', // eslint-disable-line\n CMIIdentifier: '^[\\\\u0021-\\\\u007E\\\\s]{0,255}$',\n CMIFeedback: '^.{0,255}$', // This must be redefined\n CMIIndex: '[._](\\\\d+).',\n\n // Vocabulary Data Type Definition\n CMIStatus: '^(passed|completed|failed|incomplete|browsed)$',\n CMIStatus2: '^(passed|completed|failed|incomplete|browsed|not attempted)$',\n CMIExit: '^(time-out|suspend|logout|)$',\n CMIType: '^(true-false|choice|fill-in|matching|performance|sequencing|likert|numeric)$',\n CMIResult: '^(correct|wrong|unanticipated|neutral|([0-9]{0,3})?(\\\\.[0-9]*)?)$', // eslint-disable-line\n NAVEvent: '^(previous|continue)$',\n\n // Data ranges\n score_range: '0#100',\n audio_range: '-1#100',\n speed_range: '-100#100',\n weighting_range: '-100#100',\n text_range: '-1#1',\n};\n\nconst aicc = {\n ...scorm12, ...{\n CMIIdentifier: '^\\\\w{1,255}$',\n },\n};\n\nconst scorm2004 = {\n CMIString200: '^[\\\\u0000-\\\\uFFFF]{0,200}$',\n CMIString250: '^[\\\\u0000-\\\\uFFFF]{0,250}$',\n CMIString1000: '^[\\\\u0000-\\\\uFFFF]{0,1000}$',\n CMIString4000: '^[\\\\u0000-\\\\uFFFF]{0,4000}$',\n CMIString64000: '^[\\\\u0000-\\\\uFFFF]{0,64000}$',\n CMILang: '^([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?$|^$', // eslint-disable-line\n CMILangString250: '^(\\{lang=([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?\\})?((?!\\{.*$).{0,250}$)?$', // eslint-disable-line\n CMILangcr: '^((\\{lang=([a-zA-Z]{2,3}|i|x)?(\\-[a-zA-Z0-9\\-]{2,8})?\\}))(.*?)$', // eslint-disable-line\n CMILangString250cr: '^((\\{lang=([a-zA-Z]{2,3}|i|x)?(\\-[a-zA-Z0-9\\-]{2,8})?\\})?(.{0,250})?)?$', // eslint-disable-line\n CMILangString4000: '^(\\{lang=([a-zA-Z]{2,3}|i|x)(\\-[a-zA-Z0-9\\-]{2,8})?\\})?((?!\\{.*$).{0,4000}$)?$', // eslint-disable-line\n CMITime: '^(19[7-9]{1}[0-9]{1}|20[0-2]{1}[0-9]{1}|203[0-8]{1})((-(0[1-9]{1}|1[0-2]{1}))((-(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1}))(T([0-1]{1}[0-9]{1}|2[0-3]{1})((:[0-5]{1}[0-9]{1})((:[0-5]{1}[0-9]{1})((\\\\.[0-9]{1,2})((Z|([+|-]([0-1]{1}[0-9]{1}|2[0-3]{1})))(:[0-5]{1}[0-9]{1})?)?)?)?)?)?)?)?$',\n CMITimespan: '^P(?:([.,\\\\d]+)Y)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)W)?(?:([.,\\\\d]+)D)?(?:T?(?:([.,\\\\d]+)H)?(?:([.,\\\\d]+)M)?(?:([.,\\\\d]+)S)?)?$',\n CMIInteger: '^\\\\d+$',\n CMISInteger: '^-?([0-9]+)$',\n CMIDecimal: '^-?([0-9]{1,5})(\\\\.[0-9]{1,18})?$',\n CMIIdentifier: '^\\\\S{1,250}[a-zA-Z0-9]$',\n CMIShortIdentifier: '^[\\\\w\\\\.\\\\-\\\\_]{1,250}$', // eslint-disable-line\n CMILongIdentifier: '^(?:(?!urn:)\\\\S{1,4000}|urn:[A-Za-z0-9-]{1,31}:\\\\S{1,4000}|.{1,4000})$', // need to re-examine this\n CMIFeedback: '^.*$', // This must be redefined\n CMIIndex: '[._](\\\\d+).',\n CMIIndexStore: '.N(\\\\d+).',\n\n // Vocabulary Data Type Definition\n CMICStatus: '^(completed|incomplete|not attempted|unknown)$',\n CMISStatus: '^(passed|failed|unknown)$',\n CMIExit: '^(time-out|suspend|logout|normal)$',\n CMIType: '^(true-false|choice|fill-in|long-fill-in|matching|performance|sequencing|likert|numeric|other)$',\n CMIResult: '^(correct|incorrect|unanticipated|neutral|-?([0-9]{1,4})(\\\\.[0-9]{1,18})?)$',\n NAVEvent: '^(previous|continue|exit|exitAll|abandon|abandonAll|suspendAll|\\{target=\\\\S{0,200}[a-zA-Z0-9]\\}choice|jump)$', // eslint-disable-line\n NAVBoolean: '^(unknown|true|false$)',\n NAVTarget: '^(previous|continue|choice.{target=\\\\S{0,200}[a-zA-Z0-9]})$',\n\n // Data ranges\n scaled_range: '-1#1',\n audio_range: '0#*',\n speed_range: '0#*',\n text_range: '-1#1',\n progress_range: '0#1',\n};\n\nconst Regex = {\n aicc: aicc,\n scorm12: scorm12,\n scorm2004: scorm2004,\n};\n\nexport default Regex;\n","// @flow\nimport Regex from './regex';\n\nconst scorm2004_regex = Regex.scorm2004;\n\nconst learner = {\n 'true-false': {\n format: '^true$|^false$',\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'choice': {\n format: scorm2004_regex.CMILongIdentifier,\n max: 36,\n delimiter: '[,]',\n unique: true,\n },\n 'fill-in': {\n format: scorm2004_regex.CMILangString250,\n max: 10,\n delimiter: '[,]',\n unique: false,\n },\n 'long-fill-in': {\n format: scorm2004_regex.CMILangString4000,\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'matching': {\n format: scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIShortIdentifier,\n max: 36,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n },\n 'performance': {\n format: '^$|' + scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIDecimal + '|^$|' +\n scorm2004_regex.CMIShortIdentifier,\n max: 250,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n },\n 'sequencing': {\n format: scorm2004_regex.CMIShortIdentifier,\n max: 36,\n delimiter: '[,]',\n unique: false,\n },\n 'likert': {\n format: scorm2004_regex.CMIShortIdentifier,\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'numeric': {\n format: scorm2004_regex.CMIDecimal,\n max: 1,\n delimiter: '',\n unique: false,\n },\n 'other': {\n format: scorm2004_regex.CMIString4000,\n max: 1,\n delimiter: '',\n unique: false,\n },\n};\n\nconst correct = {\n 'true-false': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: false,\n format: '^true$|^false$',\n limit: 1,\n },\n 'choice': {\n max: 36,\n delimiter: '[,]',\n unique: true,\n duplicate: false,\n format: scorm2004_regex.CMILongIdentifier,\n },\n 'fill-in': {\n max: 10,\n delimiter: '[,]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMILangString250cr,\n },\n 'long-fill-in': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: true,\n format: scorm2004_regex.CMILangString4000,\n },\n 'matching': {\n max: 36,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIShortIdentifier,\n },\n 'performance': {\n max: 250,\n delimiter: '[,]',\n delimiter2: '[.]',\n unique: false,\n duplicate: false,\n format: '^$|' + scorm2004_regex.CMIShortIdentifier,\n format2: scorm2004_regex.CMIDecimal + '|^$|' +\n scorm2004_regex.CMIShortIdentifier,\n },\n 'sequencing': {\n max: 36,\n delimiter: '[,]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n },\n 'likert': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIShortIdentifier,\n limit: 1,\n },\n 'numeric': {\n max: 2,\n delimiter: '[:]',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIDecimal,\n limit: 1,\n },\n 'other': {\n max: 1,\n delimiter: '',\n unique: false,\n duplicate: false,\n format: scorm2004_regex.CMIString4000,\n limit: 1,\n },\n};\n\nconst Responses = {\n learner: learner,\n correct: correct,\n};\n\nexport default Responses;\n","// @flow\n\nimport APIConstants from './constants/api_constants';\n\nconst scorm12_errors = APIConstants.scorm12.error_descriptions;\nconst aicc_errors = APIConstants.aicc.error_descriptions;\nconst scorm2004_errors = APIConstants.scorm2004.error_descriptions;\n\n/**\n * Base Validation Exception\n */\nexport class ValidationError extends Error {\n /**\n * Constructor to take in an error message and code\n * @param {number} errorCode\n * @param {string} errorMessage\n * @param {string} detailedMessage\n */\n constructor(errorCode: number, errorMessage: String, detailedMessage: String) {\n super(errorMessage);\n this.#errorCode = errorCode;\n this.#errorMessage = errorMessage;\n this.#detailedMessage = detailedMessage;\n }\n\n #errorCode;\n #errorMessage;\n #detailedMessage;\n\n /**\n * Getter for #errorCode\n * @return {number}\n */\n get errorCode() {\n return this.#errorCode;\n }\n\n /**\n * Getter for #errorMessage\n * @return {string}\n */\n get errorMessage() {\n return this.#errorMessage;\n }\n\n /**\n * Getter for #detailedMessage\n * @return {string}\n */\n get detailedMessage() {\n return this.#detailedMessage;\n }\n}\n\n/**\n * SCORM 1.2 Validation Error\n */\nexport class Scorm12ValidationError extends ValidationError {\n /**\n * Constructor to take in an error code\n * @param {number} errorCode\n */\n constructor(errorCode: number) {\n if ({}.hasOwnProperty.call(scorm12_errors, String(errorCode))) {\n super(errorCode, scorm12_errors[String(errorCode)].basicMessage, scorm12_errors[String(errorCode)].detailMessage);\n } else {\n super(101, scorm12_errors['101'].basicMessage, scorm12_errors['101'].detailMessage);\n }\n }\n}\n\n/**\n * AICC Validation Error\n */\nexport class AICCValidationError extends ValidationError {\n /**\n * Constructor to take in an error code\n * @param {number} errorCode\n */\n constructor(errorCode: number) {\n if ({}.hasOwnProperty.call(aicc_errors, String(errorCode))) {\n super(errorCode, aicc_errors[String(errorCode)].basicMessage, aicc_errors[String(errorCode)].detailMessage);\n } else {\n super(101, aicc_errors['101'].basicMessage, aicc_errors['101'].detailMessage);\n }\n }\n}\n\n/**\n * SCORM 2004 Validation Error\n */\nexport class Scorm2004ValidationError extends ValidationError {\n /**\n * Constructor to take in an error code\n * @param {number} errorCode\n */\n constructor(errorCode: number) {\n if ({}.hasOwnProperty.call(scorm2004_errors, String(errorCode))) {\n super(errorCode, scorm2004_errors[String(errorCode)].basicMessage, scorm2004_errors[String(errorCode)].detailMessage);\n } else {\n super(101, scorm2004_errors['101'].basicMessage, scorm2004_errors['101'].detailMessage);\n }\n }\n}\n","// @flow\nexport const SECONDS_PER_SECOND = 1.0;\nexport const SECONDS_PER_MINUTE = 60;\nexport const SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE;\nexport const SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;\n\nconst designations = [\n ['D', SECONDS_PER_DAY],\n ['H', SECONDS_PER_HOUR],\n ['M', SECONDS_PER_MINUTE],\n ['S', SECONDS_PER_SECOND],\n];\n\n/**\n * Converts a Number to a String of HH:MM:SS\n *\n * @param {Number} totalSeconds\n * @return {string}\n */\nexport function getSecondsAsHHMMSS(totalSeconds: Number) {\n // SCORM spec does not deal with negative durations, give zero back\n if (!totalSeconds || totalSeconds <= 0) {\n return '00:00:00';\n }\n\n const hours = Math.floor(totalSeconds / SECONDS_PER_HOUR);\n\n const dateObj = new Date(totalSeconds * 1000);\n const minutes = dateObj.getUTCMinutes();\n // make sure we add any possible decimal value\n const seconds = dateObj.getSeconds();\n const ms = totalSeconds % 1.0;\n let msStr = '';\n if (countDecimals(ms) > 0) {\n if (countDecimals(ms) > 2) {\n msStr = ms.toFixed(2);\n } else {\n msStr = String(ms);\n }\n msStr = '.' + msStr.split('.')[1];\n }\n\n return (hours + ':' + minutes + ':' + seconds).replace(/\\b\\d\\b/g,\n '0$&') + msStr;\n}\n\n/**\n * Calculate the number of seconds from ISO 8601 Duration\n *\n * @param {Number} seconds\n * @return {String}\n */\nexport function getSecondsAsISODuration(seconds: Number) {\n // SCORM spec does not deal with negative durations, give zero back\n if (!seconds || seconds <= 0) {\n return 'PT0S';\n }\n\n let duration = 'P';\n let remainder = seconds;\n\n designations.forEach(([sign, current_seconds]) => {\n let value = Math.floor(remainder / current_seconds);\n\n remainder = remainder % current_seconds;\n if (countDecimals(remainder) > 2) {\n remainder = Number(Number(remainder).toFixed(2));\n }\n // If we have anything left in the remainder, and we're currently adding\n // seconds to the duration, go ahead and add the decimal to the seconds\n if (sign === 'S' && remainder > 0) {\n value += remainder;\n }\n\n if (value) {\n if ((duration.indexOf('D') > 0 ||\n sign === 'H' || sign === 'M' || sign === 'S') &&\n duration.indexOf('T') === -1) {\n duration += 'T';\n }\n duration += `${value}${sign}`;\n }\n });\n\n return duration;\n}\n\n/**\n * Calculate the number of seconds from HH:MM:SS.DDDDDD\n *\n * @param {string} timeString\n * @param {RegExp} timeRegex\n * @return {number}\n */\nexport function getTimeAsSeconds(timeString: String, timeRegex: RegExp) {\n if (!timeString || typeof timeString !== 'string' ||\n !timeString.match(timeRegex)) {\n return 0;\n }\n const parts = timeString.split(':');\n const hours = Number(parts[0]);\n const minutes = Number(parts[1]);\n const seconds = Number(parts[2]);\n return (hours * 3600) + (minutes * 60) + seconds;\n}\n\n/**\n * Calculate the number of seconds from ISO 8601 Duration\n *\n * @param {string} duration\n * @param {RegExp} durationRegex\n * @return {number}\n */\nexport function getDurationAsSeconds(duration: String, durationRegex: RegExp) {\n if (!duration || !duration.match(durationRegex)) {\n return 0;\n }\n\n const [, years, months, , days, hours, minutes, seconds] = new RegExp(\n durationRegex).exec(duration) || [];\n\n let result = 0.0;\n\n result += (Number(seconds) * 1.0 || 0.0);\n result += (Number(minutes) * 60.0 || 0.0);\n result += (Number(hours) * 3600.0 || 0.0);\n result += (Number(days) * (60 * 60 * 24.0) || 0.0);\n result += (Number(years) * (60 * 60 * 24 * 365.0) || 0.0);\n\n return result;\n}\n\n/**\n * Adds together two ISO8601 Duration strings\n *\n * @param {string} first\n * @param {string} second\n * @param {RegExp} durationRegex\n * @return {string}\n */\nexport function addTwoDurations(\n first: String,\n second: String,\n durationRegex: RegExp) {\n return getSecondsAsISODuration(\n getDurationAsSeconds(first, durationRegex) +\n getDurationAsSeconds(second, durationRegex),\n );\n}\n\n/**\n * Add together two HH:MM:SS.DD strings\n *\n * @param {string} first\n * @param {string} second\n * @param {RegExp} timeRegex\n * @return {string}\n */\nexport function addHHMMSSTimeStrings(\n first: String,\n second: String,\n timeRegex: RegExp) {\n return getSecondsAsHHMMSS(\n getTimeAsSeconds(first, timeRegex) +\n getTimeAsSeconds(\n second, timeRegex),\n );\n}\n\n/**\n * Flatten a JSON object down to string paths for each values\n * @param {object} data\n * @return {object}\n */\nexport function flatten(data) {\n const result = {};\n\n /**\n * Recurse through the object\n * @param {*} cur\n * @param {*} prop\n */\n function recurse(cur, prop) {\n if (Object(cur) !== cur) {\n result[prop] = cur;\n } else if (Array.isArray(cur)) {\n for (let i = 0, l = cur.length; i < l; i++) {\n recurse(cur[i], prop + '[' + i + ']');\n if (l === 0) result[prop] = [];\n }\n } else {\n let isEmpty = true;\n for (const p in cur) {\n if ({}.hasOwnProperty.call(cur, p)) {\n isEmpty = false;\n recurse(cur[p], prop ? prop + '.' + p : p);\n }\n }\n if (isEmpty && prop) result[prop] = {};\n }\n }\n\n recurse(data, '');\n return result;\n}\n\n/**\n * Un-flatten a flat JSON object\n * @param {object} data\n * @return {object}\n */\nexport function unflatten(data) {\n 'use strict';\n if (Object(data) !== data || Array.isArray(data)) return data;\n const regex = /\\.?([^.[\\]]+)|\\[(\\d+)]/g;\n const result = {};\n for (const p in data) {\n if ({}.hasOwnProperty.call(data, p)) {\n let cur = result;\n let prop = '';\n let m = regex.exec(p);\n while (m) {\n cur = cur[prop] || (cur[prop] = (m[2] ? [] : {}));\n prop = m[2] || m[1];\n m = regex.exec(p);\n }\n cur[prop] = data[p];\n }\n }\n return result[''] || result;\n}\n\n/**\n * Counts the number of decimal places\n * @param {number} num\n * @return {number}\n */\nexport function countDecimals(num: number) {\n if (Math.floor(num) === num || String(num).indexOf('.') < 0) return 0;\n const parts = num.toString().split('.')[1];\n return parts.length || 0;\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import Scorm2004API from '../Scorm2004API';\n\nwindow.Scorm2004API = Scorm2004API;\n"],"names":["FUNC_ERROR_TEXT","NAN","symbolTag","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","parseInt","freeGlobal","global","Object","freeSelf","self","root","Function","objectProto","prototype","objectToString","toString","nativeMax","Math","max","nativeMin","min","now","Date","debounce","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","TypeError","toNumber","isObject","invokeFunc","time","args","thisArg","undefined","apply","leadingEdge","setTimeout","timerExpired","remainingWait","timeSinceLastCall","timeSinceLastInvoke","shouldInvoke","trailingEdge","cancel","clearTimeout","flush","debounced","isInvoking","arguments","value","type","isObjectLike","isSymbol","call","other","valueOf","replace","isBinary","test","slice","module","exports","CMIArray","ValidationError","ErrorCodes","APIConstants","unflatten","global_constants","scorm12_error_codes","scorm12","BaseAPI","error_codes","settings","autocommit","autocommitSeconds","asyncCommit","sendBeaconCommit","lmsCommitUrl","dataCommitFormat","commitRequestDataType","autoProgress","logLevel","LOG_LEVEL_ERROR","selfReportSessionTime","alwaysSendTotalTime","strict_errors","xhrHeaders","xhrWithCredentials","responseHandler","xhr","JSON","parse","responseText","hasOwnProperty","status","SCORM_TRUE","errorCode","SCORM_FALSE","requestHandler","commitObject","onLogMessage","messageLevel","logMessage","console","error","LOG_LEVEL_WARNING","warn","LOG_LEVEL_INFO","info","LOG_LEVEL_DEBUG","debug","log","currentState","STATE_NOT_INITIALIZED","lastErrorCode","listenerArray","apiLogLevel","callbackName","initializeMessage","terminationMessage","returnValue","isInitialized","throwSCORMError","INITIALIZED","isTerminated","TERMINATED","cmi","setStartTime","STATE_INITIALIZED","processListeners","apiLog","clearSCORMError","checkTerminated","checkState","TERMINATION_BEFORE_INIT","MULTIPLE_TERMINATION","STATE_TERMINATED","storeData","CMIElement","RETRIEVE_BEFORE_INIT","RETRIEVE_AFTER_TERM","getCMIValue","e","message","GENERAL","commitCallback","String","STORE_BEFORE_INIT","STORE_AFTER_TERM","setCMIValue","scheduleCommit","clearScheduledCommit","COMMIT_BEFORE_INIT","COMMIT_AFTER_TERM","CMIErrorCode","getLmsErrorMessageDetails","beforeInitError","afterTermError","isNotInitialized","functionName","formatMessage","baseLength","messageString","fillChars","length","i","CMIElementBaseLength","j","str","tester","match","refObject","attribute","getOwnPropertyDescriptor","getPrototypeOf","_errorNumber","_detail","Error","_CMIElement","_value","methodName","scorm2004","structure","split","foundFirstIndex","invalidErrorMessage","invalidErrorCode","UNDEFINED_DATA_MODEL","substr","_isTargetValid","READ_ONLY_ELEMENT","_checkObjectHasProperty","stringMatches","validateCorrectResponse","index","isNaN","item","childArray","newChild","getChildElement","initialized","initialize","push","_foundFirstIndex","uninitializedErrorMessage","target","VALUE_NOT_INITIALIZED","CHILDREN_ERROR","COUNT_ERROR","listenerName","callback","listenerFunctions","listenerSplit","removeIndex","findIndex","obj","splice","filter","listener","functionsMatch","listenerHasCMIElement","CMIElementsMatch","substring","indexOf","errorNumber","success","_calculateTotalTime","json","testPattern","a","c","a_pattern","a_match","c_match","a_num","Number","c_num","int_pattern","obj_pattern","keys","map","key","sort","b","d","forEach","element","loadFromJSON","startingData","currentCMIElement","constructor","stringify","renderCMIToJSONString","_terminateCommit","url","params","immediate","api","process","genericError","httpReq","XMLHttpRequest","open","header","setRequestHeader","withCredentials","onload","Array","send","join","headers","blob","Blob","navigator","sendBeacon","when","ScheduledCommit","API","wrapper","bind","commit","ADL","CMI","CMICommentsObject","CMIInteractionsCorrectResponsesObject","CMIInteractionsObject","CMIInteractionsObjectivesObject","CMIObjectivesObject","Utilities","Responses","ValidLanguages","Regex","scorm2004_constants","scorm2004_error_codes","correct_responses","correct","scorm2004_regex","Scorm2004API","finalSettings","mastery_override","correct_response","current_index","found","count","_count","adl","Initialize","lmsInitialize","Terminate","lmsTerminate","GetValue","lmsGetValue","SetValue","lmsSetValue","Commit","lmsCommit","GetLastError","lmsGetLastError","GetErrorString","lmsGetErrorString","GetDiagnostic","lmsGetDiagnostic","terminate","nav","request","getValue","setValue","getLastError","getErrorString","getDiagnostic","_commonSetCMIValue","parts","interaction","interactions","DEPENDENCY_NOT_ESTABLISHED","checkDuplicateChoiceResponse","response_type","checkValidResponseType","GENERAL_SET_FAILURE","interaction_type","nodes","delimiter","checkCorrectResponseValue","interaction_count","response","pattern","pattern_index","limit","duplicate","checkDuplicatedPattern","_commonGetCMIValue","detail","basicMessage","detailMessage","error_descriptions","formatRegex","RegExp","format","removeCorrectResponsePrefixes","delimiter2","values","matches","TYPE_MISMATCH","format2","unique","node","seenOrder","seenCase","seenLang","prefixRegex","langMatches","CMILangcr","lang","toLowerCase","newAPI","terminateCommit","cmiExport","renderCMIToJSONObject","total_time","getCurrentTotalTime","flattened","flatten","mode","credit","completion_threshold","progress_measure","completion_status","scaled_passing_score","score","scaled","success_status","navRequest","encodeURIComponent","renderCommitCMI","processHttpRequest","scorm12_constants","scorm12_regex","checkValidFormat","regexPattern","errorClass","allowEmptyString","checkValidRange","rangePattern","ranges","BaseCMI","getTime","CMIScore","score_children","score_range","invalidTypeCode","invalidRangeCode","decimalRegex","INVALID_SET_VALUE","VALUE_OUT_OF_RANGE","CMIDecimal","_children","raw","jsonString","children","Scorm2004ValidationError","Util","learner_responses","learner","throwReadOnlyError","throwWriteOnlyError","WRITE_ONLY_ELEMENT","throwTypeMismatchError","throwDependencyNotEstablishedError","throwGeneralSetError","check2004ValidFormat","check2004ValidRange","cmi_children","learner_preference","CMILearnerPreference","Scorm2004CMIScore","comments_from_learner","CMICommentsFromLearner","comments_from_lms","CMICommentsFromLMS","CMIInteractions","objectives","CMIObjectives","_version","CMICStatus","entry","exit","CMIExit","launch_data","learner_id","learner_name","location","CMIString1000","max_time_allowed","progress_range","session_time","CMITimespan","CMISStatus","suspend_data","CMIString64000","time_limit_action","sessionTime","startTime","start_time","seconds","getSecondsAsISODuration","addTwoDurations","student_preference_children","audio_level","audio_range","language","CMILang","delivery_speed","speed_range","audio_captioning","CMISInteger","text_range","interactions_children","objectives_children","comments_children","correct_responses_children","id","CMILongIdentifier","CMIType","timestamp","CMITime","weighting","learner_response","CMIResult","latency","description","CMILangString250","scaled_range","readOnlyAfterInit","comment","CMILangString4000","CMIString250","CMIFeedback","ADLNav","request_valid","ADLNavRequestValid","NAVEvent","_target","_","previous","continue","LOG_LEVEL_NONE","core_children","student_data_children","aicc","student_demographics_children","tries_children","attempt_records_children","paths_children","INITIALIZATION_FAILED","TERMINATION_FAILURE","ARGUMENT_ERROR","GENERAL_GET_FAILURE","GENERAL_COMMIT_FAILURE","UNIMPLEMENTED_ELEMENT","MULTIPLE_TERMINATIONS","CMIString256","CMIString4096","CMIInteger","CMIIdentifier","CMIIndex","CMIStatus","CMIStatus2","weighting_range","CMIString200","CMIString4000","CMILangString250cr","CMIShortIdentifier","CMIIndexStore","NAVBoolean","NAVTarget","scorm12_errors","aicc_errors","scorm2004_errors","errorMessage","detailedMessage","Scorm12ValidationError","AICCValidationError","SECONDS_PER_SECOND","SECONDS_PER_MINUTE","SECONDS_PER_HOUR","SECONDS_PER_DAY","designations","getSecondsAsHHMMSS","totalSeconds","hours","floor","dateObj","minutes","getUTCMinutes","getSeconds","ms","msStr","countDecimals","toFixed","duration","remainder","sign","current_seconds","getTimeAsSeconds","timeString","timeRegex","getDurationAsSeconds","durationRegex","exec","years","months","days","first","second","addHHMMSSTimeStrings","data","recurse","cur","prop","isArray","l","isEmpty","p","regex","m","num","window"],"sourceRoot":""}
\ No newline at end of file
diff --git a/dist/scorm2004.min.js b/dist/scorm2004.min.js
index 69de63c..159dbe0 100644
--- a/dist/scorm2004.min.js
+++ b/dist/scorm2004.min.js
@@ -1,6923 +1,40 @@
-(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i
- * Build: `lodash modularize exports="npm" -o ./`
- * Copyright jQuery Foundation and other contributors
- * Released under MIT license
- * Based on Underscore.js 1.8.3
- * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
- */
-
-/** Used as the `TypeError` message for "Functions" methods. */
-var FUNC_ERROR_TEXT = 'Expected a function';
-
-/** Used as references for various `Number` constants. */
-var NAN = 0 / 0;
-
-/** `Object#toString` result references. */
-var symbolTag = '[object Symbol]';
-
-/** Used to match leading and trailing whitespace. */
-var reTrim = /^\s+|\s+$/g;
-
-/** Used to detect bad signed hexadecimal string values. */
-var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
-
-/** Used to detect binary string values. */
-var reIsBinary = /^0b[01]+$/i;
-
-/** Used to detect octal string values. */
-var reIsOctal = /^0o[0-7]+$/i;
-
-/** Built-in method references without a dependency on `root`. */
-var freeParseInt = parseInt;
-
-/** Detect free variable `global` from Node.js. */
-var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
-
-/** Detect free variable `self`. */
-var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
-
-/** Used as a reference to the global object. */
-var root = freeGlobal || freeSelf || Function('return this')();
-
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
-
-/**
- * Used to resolve the
- * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
- * of values.
- */
-var objectToString = objectProto.toString;
-
-/* Built-in method references for those with the same name as other `lodash` methods. */
-var nativeMax = Math.max,
- nativeMin = Math.min;
-
-/**
- * Gets the timestamp of the number of milliseconds that have elapsed since
- * the Unix epoch (1 January 1970 00:00:00 UTC).
- *
- * @static
- * @memberOf _
- * @since 2.4.0
- * @category Date
- * @returns {number} Returns the timestamp.
- * @example
- *
- * _.defer(function(stamp) {
- * console.log(_.now() - stamp);
- * }, _.now());
- * // => Logs the number of milliseconds it took for the deferred invocation.
- */
-var now = function() {
- return root.Date.now();
-};
-
-/**
- * Creates a debounced function that delays invoking `func` until after `wait`
- * milliseconds have elapsed since the last time the debounced function was
- * invoked. The debounced function comes with a `cancel` method to cancel
- * delayed `func` invocations and a `flush` method to immediately invoke them.
- * Provide `options` to indicate whether `func` should be invoked on the
- * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
- * with the last arguments provided to the debounced function. Subsequent
- * calls to the debounced function return the result of the last `func`
- * invocation.
- *
- * **Note:** If `leading` and `trailing` options are `true`, `func` is
- * invoked on the trailing edge of the timeout only if the debounced function
- * is invoked more than once during the `wait` timeout.
- *
- * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
- * until to the next tick, similar to `setTimeout` with a timeout of `0`.
- *
- * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
- * for details over the differences between `_.debounce` and `_.throttle`.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Function
- * @param {Function} func The function to debounce.
- * @param {number} [wait=0] The number of milliseconds to delay.
- * @param {Object} [options={}] The options object.
- * @param {boolean} [options.leading=false]
- * Specify invoking on the leading edge of the timeout.
- * @param {number} [options.maxWait]
- * The maximum time `func` is allowed to be delayed before it's invoked.
- * @param {boolean} [options.trailing=true]
- * Specify invoking on the trailing edge of the timeout.
- * @returns {Function} Returns the new debounced function.
- * @example
- *
- * // Avoid costly calculations while the window size is in flux.
- * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
- *
- * // Invoke `sendMail` when clicked, debouncing subsequent calls.
- * jQuery(element).on('click', _.debounce(sendMail, 300, {
- * 'leading': true,
- * 'trailing': false
- * }));
- *
- * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
- * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
- * var source = new EventSource('/stream');
- * jQuery(source).on('message', debounced);
- *
- * // Cancel the trailing debounced invocation.
- * jQuery(window).on('popstate', debounced.cancel);
- */
-function debounce(func, wait, options) {
- var lastArgs,
- lastThis,
- maxWait,
- result,
- timerId,
- lastCallTime,
- lastInvokeTime = 0,
- leading = false,
- maxing = false,
- trailing = true;
-
- if (typeof func != 'function') {
- throw new TypeError(FUNC_ERROR_TEXT);
- }
- wait = toNumber(wait) || 0;
- if (isObject(options)) {
- leading = !!options.leading;
- maxing = 'maxWait' in options;
- maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
- trailing = 'trailing' in options ? !!options.trailing : trailing;
- }
-
- function invokeFunc(time) {
- var args = lastArgs,
- thisArg = lastThis;
-
- lastArgs = lastThis = undefined;
- lastInvokeTime = time;
- result = func.apply(thisArg, args);
- return result;
- }
-
- function leadingEdge(time) {
- // Reset any `maxWait` timer.
- lastInvokeTime = time;
- // Start the timer for the trailing edge.
- timerId = setTimeout(timerExpired, wait);
- // Invoke the leading edge.
- return leading ? invokeFunc(time) : result;
- }
-
- function remainingWait(time) {
- var timeSinceLastCall = time - lastCallTime,
- timeSinceLastInvoke = time - lastInvokeTime,
- result = wait - timeSinceLastCall;
-
- return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;
- }
-
- function shouldInvoke(time) {
- var timeSinceLastCall = time - lastCallTime,
- timeSinceLastInvoke = time - lastInvokeTime;
-
- // Either this is the first call, activity has stopped and we're at the
- // trailing edge, the system time has gone backwards and we're treating
- // it as the trailing edge, or we've hit the `maxWait` limit.
- return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
- (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
- }
-
- function timerExpired() {
- var time = now();
- if (shouldInvoke(time)) {
- return trailingEdge(time);
- }
- // Restart the timer.
- timerId = setTimeout(timerExpired, remainingWait(time));
- }
-
- function trailingEdge(time) {
- timerId = undefined;
-
- // Only invoke if we have `lastArgs` which means `func` has been
- // debounced at least once.
- if (trailing && lastArgs) {
- return invokeFunc(time);
- }
- lastArgs = lastThis = undefined;
- return result;
- }
-
- function cancel() {
- if (timerId !== undefined) {
- clearTimeout(timerId);
- }
- lastInvokeTime = 0;
- lastArgs = lastCallTime = lastThis = timerId = undefined;
- }
-
- function flush() {
- return timerId === undefined ? result : trailingEdge(now());
- }
-
- function debounced() {
- var time = now(),
- isInvoking = shouldInvoke(time);
-
- lastArgs = arguments;
- lastThis = this;
- lastCallTime = time;
-
- if (isInvoking) {
- if (timerId === undefined) {
- return leadingEdge(lastCallTime);
- }
- if (maxing) {
- // Handle invocations in a tight loop.
- timerId = setTimeout(timerExpired, wait);
- return invokeFunc(lastCallTime);
- }
- }
- if (timerId === undefined) {
- timerId = setTimeout(timerExpired, wait);
- }
- return result;
- }
- debounced.cancel = cancel;
- debounced.flush = flush;
- return debounced;
-}
-
-/**
- * Checks if `value` is the
- * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
- * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(_.noop);
- * // => true
- *
- * _.isObject(null);
- * // => false
- */
-function isObject(value) {
- var type = typeof value;
- return !!value && (type == 'object' || type == 'function');
-}
-
-/**
- * Checks if `value` is object-like. A value is object-like if it's not `null`
- * and has a `typeof` result of "object".
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- * @example
- *
- * _.isObjectLike({});
- * // => true
- *
- * _.isObjectLike([1, 2, 3]);
- * // => true
- *
- * _.isObjectLike(_.noop);
- * // => false
- *
- * _.isObjectLike(null);
- * // => false
- */
-function isObjectLike(value) {
- return !!value && typeof value == 'object';
-}
-
-/**
- * Checks if `value` is classified as a `Symbol` primitive or object.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
- * @example
- *
- * _.isSymbol(Symbol.iterator);
- * // => true
- *
- * _.isSymbol('abc');
- * // => false
- */
-function isSymbol(value) {
- return typeof value == 'symbol' ||
- (isObjectLike(value) && objectToString.call(value) == symbolTag);
-}
-
-/**
- * Converts `value` to a number.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to process.
- * @returns {number} Returns the number.
- * @example
- *
- * _.toNumber(3.2);
- * // => 3.2
- *
- * _.toNumber(Number.MIN_VALUE);
- * // => 5e-324
- *
- * _.toNumber(Infinity);
- * // => Infinity
- *
- * _.toNumber('3.2');
- * // => 3.2
- */
-function toNumber(value) {
- if (typeof value == 'number') {
- return value;
- }
- if (isSymbol(value)) {
- return NAN;
- }
- if (isObject(value)) {
- var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
- value = isObject(other) ? (other + '') : other;
- }
- if (typeof value != 'string') {
- return value === 0 ? value : +value;
- }
- value = value.replace(reTrim, '');
- var isBinary = reIsBinary.test(value);
- return (isBinary || reIsOctal.test(value))
- ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
- : (reIsBadHex.test(value) ? NAN : +value);
-}
-
-module.exports = debounce;
-
-}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{}],2:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _common = require("./cmi/common");
-
-var _exceptions = require("./exceptions");
-
-var _error_codes2 = _interopRequireDefault(require("./constants/error_codes"));
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-var _utilities = require("./utilities");
-
-var _lodash = _interopRequireDefault(require("lodash.debounce"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
-
-function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
-
-function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
-
-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; }
-
-function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
-
-function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
-
-function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
-
-function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
-
-function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-
-function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
-
-function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
-
-function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-
-var global_constants = _api_constants["default"].global;
-var scorm12_error_codes = _error_codes2["default"].scorm12;
-/**
- * Base API class for AICC, SCORM 1.2, and SCORM 2004. Should be considered
- * abstract, and never initialized on it's own.
- */
-
-var _timeout = /*#__PURE__*/new WeakMap();
-
-var _error_codes = /*#__PURE__*/new WeakMap();
-
-var _settings = /*#__PURE__*/new WeakMap();
-
-var BaseAPI = /*#__PURE__*/function () {
- /**
- * Constructor for Base API class. Sets some shared API fields, as well as
- * sets up options for the API.
- * @param {object} error_codes
- * @param {object} settings
- */
- function BaseAPI(error_codes, settings) {
- _classCallCheck(this, BaseAPI);
-
- _classPrivateFieldInitSpec(this, _timeout, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(this, _error_codes, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(this, _settings, {
- writable: true,
- value: {
- autocommit: false,
- autocommitSeconds: 10,
- asyncCommit: false,
- sendBeaconCommit: false,
- lmsCommitUrl: false,
- dataCommitFormat: 'json',
- // valid formats are 'json' or 'flattened', 'params'
- commitRequestDataType: 'application/json;charset=UTF-8',
- autoProgress: false,
- logLevel: global_constants.LOG_LEVEL_ERROR,
- selfReportSessionTime: false,
- alwaysSendTotalTime: false,
- strict_errors: true,
- xhrHeaders: {},
- xhrWithCredentials: false,
- responseHandler: function responseHandler(xhr) {
- var result;
-
- if (typeof xhr !== 'undefined') {
- result = JSON.parse(xhr.responseText);
-
- if (result === null || !{}.hasOwnProperty.call(result, 'result')) {
- result = {};
-
- if (xhr.status === 200) {
- result.result = global_constants.SCORM_TRUE;
- result.errorCode = 0;
- } else {
- result.result = global_constants.SCORM_FALSE;
- result.errorCode = 101;
- }
- }
- }
-
- return result;
- },
- onLogMessage: function onLogMessage(messageLevel, logMessage) {
- switch (messageLevel) {
- case global_constants.LOG_LEVEL_ERROR:
- console.error(logMessage);
- break;
-
- case global_constants.LOG_LEVEL_WARNING:
- console.warn(logMessage);
- break;
-
- case global_constants.LOG_LEVEL_INFO:
- console.info(logMessage);
- break;
-
- case global_constants.LOG_LEVEL_DEBUG:
- if (console.debug) {
- console.debug(logMessage);
- } else {
- console.log(logMessage);
- }
-
- break;
- }
- }
- }
- });
-
- _defineProperty(this, "cmi", void 0);
-
- _defineProperty(this, "startingData", void 0);
-
- if ((this instanceof BaseAPI ? this.constructor : void 0) === BaseAPI) {
- throw new TypeError('Cannot construct BaseAPI instances directly');
- }
-
- this.currentState = global_constants.STATE_NOT_INITIALIZED;
- this.lastErrorCode = 0;
- this.listenerArray = [];
-
- _classPrivateFieldSet(this, _timeout, null);
-
- _classPrivateFieldSet(this, _error_codes, error_codes);
-
- this.settings = settings;
- this.apiLogLevel = this.settings.logLevel;
- this.selfReportSessionTime = this.settings.selfReportSessionTime;
- }
- /**
- * Initialize the API
- * @param {string} callbackName
- * @param {string} initializeMessage
- * @param {string} terminationMessage
- * @return {string}
- */
-
-
- _createClass(BaseAPI, [{
- key: "initialize",
- value: function initialize(callbackName, initializeMessage, terminationMessage) {
- var returnValue = global_constants.SCORM_FALSE;
-
- if (this.isInitialized()) {
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).INITIALIZED, initializeMessage);
- } else if (this.isTerminated()) {
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).TERMINATED, terminationMessage);
- } else {
- if (this.selfReportSessionTime) {
- this.cmi.setStartTime();
- }
-
- this.currentState = global_constants.STATE_INITIALIZED;
- this.lastErrorCode = 0;
- returnValue = global_constants.SCORM_TRUE;
- this.processListeners(callbackName);
- }
-
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- this.clearSCORMError(returnValue);
- return returnValue;
- }
- /**
- * Getter for #error_codes
- * @return {object}
- */
-
- }, {
- key: "error_codes",
- get: function get() {
- return _classPrivateFieldGet(this, _error_codes);
- }
- /**
- * Getter for #settings
- * @return {object}
- */
-
- }, {
- key: "settings",
- get: function get() {
- return _classPrivateFieldGet(this, _settings);
- }
- /**
- * Setter for #settings
- * @param {object} settings
- */
- ,
- set: function set(settings) {
- _classPrivateFieldSet(this, _settings, _objectSpread(_objectSpread({}, _classPrivateFieldGet(this, _settings)), settings));
- }
- /**
- * Terminates the current run of the API
- * @param {string} callbackName
- * @param {boolean} checkTerminated
- * @return {string}
- */
-
- }, {
- key: "terminate",
- value: function terminate(callbackName, checkTerminated) {
- var returnValue = global_constants.SCORM_FALSE;
-
- if (this.checkState(checkTerminated, _classPrivateFieldGet(this, _error_codes).TERMINATION_BEFORE_INIT, _classPrivateFieldGet(this, _error_codes).MULTIPLE_TERMINATION)) {
- this.currentState = global_constants.STATE_TERMINATED;
- var result = this.storeData(true);
-
- if (!this.settings.sendBeaconCommit && !this.settings.asyncCommit && typeof result.errorCode !== 'undefined' && result.errorCode > 0) {
- this.throwSCORMError(result.errorCode);
- }
-
- returnValue = typeof result !== 'undefined' && result.result ? result.result : global_constants.SCORM_FALSE;
- if (checkTerminated) this.lastErrorCode = 0;
- returnValue = global_constants.SCORM_TRUE;
- this.processListeners(callbackName);
- }
-
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- this.clearSCORMError(returnValue);
- return returnValue;
- }
- /**
- * Get the value of the CMIElement.
- *
- * @param {string} callbackName
- * @param {boolean} checkTerminated
- * @param {string} CMIElement
- * @return {string}
- */
-
- }, {
- key: "getValue",
- value: function getValue(callbackName, checkTerminated, CMIElement) {
- var returnValue;
-
- if (this.checkState(checkTerminated, _classPrivateFieldGet(this, _error_codes).RETRIEVE_BEFORE_INIT, _classPrivateFieldGet(this, _error_codes).RETRIEVE_AFTER_TERM)) {
- if (checkTerminated) this.lastErrorCode = 0;
-
- try {
- returnValue = this.getCMIValue(CMIElement);
- } catch (e) {
- if (e instanceof _exceptions.ValidationError) {
- this.lastErrorCode = e.errorCode;
- returnValue = global_constants.SCORM_FALSE;
- } else {
- if (e.message) {
- console.error(e.message);
- } else {
- console.error(e);
- }
-
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).GENERAL);
- }
- }
-
- this.processListeners(callbackName, CMIElement);
- }
-
- this.apiLog(callbackName, CMIElement, ': returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- this.clearSCORMError(returnValue);
- return returnValue;
- }
- /**
- * Sets the value of the CMIElement.
- *
- * @param {string} callbackName
- * @param {string} commitCallback
- * @param {boolean} checkTerminated
- * @param {string} CMIElement
- * @param {*} value
- * @return {string}
- */
-
- }, {
- key: "setValue",
- value: function setValue(callbackName, commitCallback, checkTerminated, CMIElement, value) {
- if (value !== undefined) {
- value = String(value);
- }
-
- var returnValue = global_constants.SCORM_FALSE;
-
- if (this.checkState(checkTerminated, _classPrivateFieldGet(this, _error_codes).STORE_BEFORE_INIT, _classPrivateFieldGet(this, _error_codes).STORE_AFTER_TERM)) {
- if (checkTerminated) this.lastErrorCode = 0;
-
- try {
- returnValue = this.setCMIValue(CMIElement, value);
- } catch (e) {
- if (e instanceof _exceptions.ValidationError) {
- this.lastErrorCode = e.errorCode;
- returnValue = global_constants.SCORM_FALSE;
- } else {
- if (e.message) {
- console.error(e.message);
- } else {
- console.error(e);
- }
-
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).GENERAL);
- }
- }
-
- this.processListeners(callbackName, CMIElement, value);
- }
-
- if (returnValue === undefined) {
- returnValue = global_constants.SCORM_FALSE;
- } // If we didn't have any errors while setting the data, go ahead and
- // schedule a commit, if autocommit is turned on
-
-
- if (String(this.lastErrorCode) === '0') {
- if (this.settings.autocommit && !_classPrivateFieldGet(this, _timeout)) {
- this.scheduleCommit(this.settings.autocommitSeconds * 1000, commitCallback);
- }
- }
-
- this.apiLog(callbackName, CMIElement, ': ' + value + ': result: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- this.clearSCORMError(returnValue);
- return returnValue;
- }
- /**
- * Orders LMS to store all content parameters
- * @param {string} callbackName
- * @param {boolean} checkTerminated
- * @return {string}
- */
-
- }, {
- key: "commit",
- value: function commit(callbackName, checkTerminated) {
- this.clearScheduledCommit();
- var returnValue = global_constants.SCORM_FALSE;
-
- if (this.checkState(checkTerminated, _classPrivateFieldGet(this, _error_codes).COMMIT_BEFORE_INIT, _classPrivateFieldGet(this, _error_codes).COMMIT_AFTER_TERM)) {
- var result = this.storeData(false);
-
- if (!this.settings.sendBeaconCommit && !this.settings.asyncCommit && result.errorCode && result.errorCode > 0) {
- this.throwSCORMError(result.errorCode);
- }
-
- returnValue = typeof result !== 'undefined' && result.result ? result.result : global_constants.SCORM_FALSE;
- this.apiLog(callbackName, 'HttpRequest', ' Result: ' + returnValue, global_constants.LOG_LEVEL_DEBUG);
- if (checkTerminated) this.lastErrorCode = 0;
- this.processListeners(callbackName);
- }
-
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- this.clearSCORMError(returnValue);
- return returnValue;
- }
- /**
- * Returns last error code
- * @param {string} callbackName
- * @return {string}
- */
-
- }, {
- key: "getLastError",
- value: function getLastError(callbackName) {
- var returnValue = String(this.lastErrorCode);
- this.processListeners(callbackName);
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- return returnValue;
- }
- /**
- * Returns the errorNumber error description
- *
- * @param {string} callbackName
- * @param {(string|number)} CMIErrorCode
- * @return {string}
- */
-
- }, {
- key: "getErrorString",
- value: function getErrorString(callbackName, CMIErrorCode) {
- var returnValue = '';
-
- if (CMIErrorCode !== null && CMIErrorCode !== '') {
- returnValue = this.getLmsErrorMessageDetails(CMIErrorCode);
- this.processListeners(callbackName);
- }
-
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- return returnValue;
- }
- /**
- * Returns a comprehensive description of the errorNumber error.
- *
- * @param {string} callbackName
- * @param {(string|number)} CMIErrorCode
- * @return {string}
- */
-
- }, {
- key: "getDiagnostic",
- value: function getDiagnostic(callbackName, CMIErrorCode) {
- var returnValue = '';
-
- if (CMIErrorCode !== null && CMIErrorCode !== '') {
- returnValue = this.getLmsErrorMessageDetails(CMIErrorCode, true);
- this.processListeners(callbackName);
- }
-
- this.apiLog(callbackName, null, 'returned: ' + returnValue, global_constants.LOG_LEVEL_INFO);
- return returnValue;
- }
- /**
- * Checks the LMS state and ensures it has been initialized.
- *
- * @param {boolean} checkTerminated
- * @param {number} beforeInitError
- * @param {number} afterTermError
- * @return {boolean}
- */
-
- }, {
- key: "checkState",
- value: function checkState(checkTerminated, beforeInitError, afterTermError) {
- if (this.isNotInitialized()) {
- this.throwSCORMError(beforeInitError);
- return false;
- } else if (checkTerminated && this.isTerminated()) {
- this.throwSCORMError(afterTermError);
- return false;
- }
-
- return true;
- }
- /**
- * Logging for all SCORM actions
- *
- * @param {string} functionName
- * @param {string} CMIElement
- * @param {string} logMessage
- * @param {number}messageLevel
- */
-
- }, {
- key: "apiLog",
- value: function apiLog(functionName, CMIElement, logMessage, messageLevel) {
- logMessage = this.formatMessage(functionName, CMIElement, logMessage);
-
- if (messageLevel >= this.apiLogLevel) {
- this.settings.onLogMessage(messageLevel, logMessage);
- }
- }
- /**
- * Formats the SCORM messages for easy reading
- *
- * @param {string} functionName
- * @param {string} CMIElement
- * @param {string} message
- * @return {string}
- */
-
- }, {
- key: "formatMessage",
- value: function formatMessage(functionName, CMIElement, message) {
- var baseLength = 20;
- var messageString = '';
- messageString += functionName;
- var fillChars = baseLength - messageString.length;
-
- for (var i = 0; i < fillChars; i++) {
- messageString += ' ';
- }
-
- messageString += ': ';
-
- if (CMIElement) {
- var CMIElementBaseLength = 70;
- messageString += CMIElement;
- fillChars = CMIElementBaseLength - messageString.length;
-
- for (var j = 0; j < fillChars; j++) {
- messageString += ' ';
- }
- }
-
- if (message) {
- messageString += message;
- }
-
- return messageString;
- }
- /**
- * Checks to see if {str} contains {tester}
- *
- * @param {string} str String to check against
- * @param {string} tester String to check for
- * @return {boolean}
- */
-
- }, {
- key: "stringMatches",
- value: function stringMatches(str, tester) {
- return str && tester && str.match(tester);
- }
- /**
- * Check to see if the specific object has the given property
- * @param {*} refObject
- * @param {string} attribute
- * @return {boolean}
- * @private
- */
-
- }, {
- key: "_checkObjectHasProperty",
- value: function _checkObjectHasProperty(refObject, attribute) {
- return Object.hasOwnProperty.call(refObject, attribute) || Object.getOwnPropertyDescriptor(Object.getPrototypeOf(refObject), attribute) || attribute in refObject;
- }
- /**
- * Returns the message that corresponds to errorNumber
- * APIs that inherit BaseAPI should override this function
- *
- * @param {(string|number)} _errorNumber
- * @param {boolean} _detail
- * @return {string}
- * @abstract
- */
-
- }, {
- key: "getLmsErrorMessageDetails",
- value: function getLmsErrorMessageDetails(_errorNumber, _detail) {
- throw new Error('The getLmsErrorMessageDetails method has not been implemented');
- }
- /**
- * Gets the value for the specific element.
- * APIs that inherit BaseAPI should override this function
- *
- * @param {string} _CMIElement
- * @return {string}
- * @abstract
- */
-
- }, {
- key: "getCMIValue",
- value: function getCMIValue(_CMIElement) {
- throw new Error('The getCMIValue method has not been implemented');
- }
- /**
- * Sets the value for the specific element.
- * APIs that inherit BaseAPI should override this function
- *
- * @param {string} _CMIElement
- * @param {any} _value
- * @return {string}
- * @abstract
- */
-
- }, {
- key: "setCMIValue",
- value: function setCMIValue(_CMIElement, _value) {
- throw new Error('The setCMIValue method has not been implemented');
- }
- /**
- * Shared API method to set a valid for a given element.
- *
- * @param {string} methodName
- * @param {boolean} scorm2004
- * @param {string} CMIElement
- * @param {*} value
- * @return {string}
- */
-
- }, {
- key: "_commonSetCMIValue",
- value: function _commonSetCMIValue(methodName, scorm2004, CMIElement, value) {
- if (!CMIElement || CMIElement === '') {
- return global_constants.SCORM_FALSE;
- }
-
- var structure = CMIElement.split('.');
- var refObject = this;
- var returnValue = global_constants.SCORM_FALSE;
- var foundFirstIndex = false;
- var invalidErrorMessage = "The data model element passed to ".concat(methodName, " (").concat(CMIElement, ") is not a valid SCORM data model element.");
- var invalidErrorCode = scorm2004 ? _classPrivateFieldGet(this, _error_codes).UNDEFINED_DATA_MODEL : _classPrivateFieldGet(this, _error_codes).GENERAL;
-
- for (var i = 0; i < structure.length; i++) {
- var attribute = structure[i];
-
- if (i === structure.length - 1) {
- if (scorm2004 && attribute.substr(0, 8) === '{target=' && typeof refObject._isTargetValid == 'function') {
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).READ_ONLY_ELEMENT);
- } else if (!this._checkObjectHasProperty(refObject, attribute)) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- } else {
- if (this.isInitialized() && this.stringMatches(CMIElement, '\\.correct_responses\\.\\d+')) {
- this.validateCorrectResponse(CMIElement, value);
- }
-
- if (!scorm2004 || this.lastErrorCode === 0) {
- refObject[attribute] = value;
- returnValue = global_constants.SCORM_TRUE;
- }
- }
- } else {
- refObject = refObject[attribute];
-
- if (!refObject) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- break;
- }
-
- if (refObject instanceof _common.CMIArray) {
- var index = parseInt(structure[i + 1], 10); // SCO is trying to set an item on an array
-
- if (!isNaN(index)) {
- var item = refObject.childArray[index];
-
- if (item) {
- refObject = item;
- foundFirstIndex = true;
- } else {
- var newChild = this.getChildElement(CMIElement, value, foundFirstIndex);
- foundFirstIndex = true;
-
- if (!newChild) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- } else {
- if (refObject.initialized) newChild.initialize();
- refObject.childArray.push(newChild);
- refObject = newChild;
- }
- } // Have to update i value to skip the array position
-
-
- i++;
- }
- }
- }
- }
-
- if (returnValue === global_constants.SCORM_FALSE) {
- this.apiLog(methodName, null, "There was an error setting the value for: ".concat(CMIElement, ", value of: ").concat(value), global_constants.LOG_LEVEL_WARNING);
- }
-
- return returnValue;
- }
- /**
- * Abstract method for validating that a response is correct.
- *
- * @param {string} _CMIElement
- * @param {*} _value
- */
-
- }, {
- key: "validateCorrectResponse",
- value: function validateCorrectResponse(_CMIElement, _value) {// just a stub method
- }
- /**
- * Gets or builds a new child element to add to the array.
- * APIs that inherit BaseAPI should override this method.
- *
- * @param {string} _CMIElement - unused
- * @param {*} _value - unused
- * @param {boolean} _foundFirstIndex - unused
- * @return {*}
- * @abstract
- */
-
- }, {
- key: "getChildElement",
- value: function getChildElement(_CMIElement, _value, _foundFirstIndex) {
- throw new Error('The getChildElement method has not been implemented');
- }
- /**
- * Gets a value from the CMI Object
- *
- * @param {string} methodName
- * @param {boolean} scorm2004
- * @param {string} CMIElement
- * @return {*}
- */
-
- }, {
- key: "_commonGetCMIValue",
- value: function _commonGetCMIValue(methodName, scorm2004, CMIElement) {
- if (!CMIElement || CMIElement === '') {
- return '';
- }
-
- var structure = CMIElement.split('.');
- var refObject = this;
- var attribute = null;
- var uninitializedErrorMessage = "The data model element passed to ".concat(methodName, " (").concat(CMIElement, ") has not been initialized.");
- var invalidErrorMessage = "The data model element passed to ".concat(methodName, " (").concat(CMIElement, ") is not a valid SCORM data model element.");
- var invalidErrorCode = scorm2004 ? _classPrivateFieldGet(this, _error_codes).UNDEFINED_DATA_MODEL : _classPrivateFieldGet(this, _error_codes).GENERAL;
-
- for (var i = 0; i < structure.length; i++) {
- attribute = structure[i];
-
- if (!scorm2004) {
- if (i === structure.length - 1) {
- if (!this._checkObjectHasProperty(refObject, attribute)) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- return;
- }
- }
- } else {
- if (String(attribute).substr(0, 8) === '{target=' && typeof refObject._isTargetValid == 'function') {
- var target = String(attribute).substr(8, String(attribute).length - 9);
- return refObject._isTargetValid(target);
- } else if (!this._checkObjectHasProperty(refObject, attribute)) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- return;
- }
- }
-
- refObject = refObject[attribute];
-
- if (refObject === undefined) {
- this.throwSCORMError(invalidErrorCode, invalidErrorMessage);
- break;
- }
-
- if (refObject instanceof _common.CMIArray) {
- var index = parseInt(structure[i + 1], 10); // SCO is trying to set an item on an array
-
- if (!isNaN(index)) {
- var item = refObject.childArray[index];
-
- if (item) {
- refObject = item;
- } else {
- this.throwSCORMError(_classPrivateFieldGet(this, _error_codes).VALUE_NOT_INITIALIZED, uninitializedErrorMessage);
- break;
- } // Have to update i value to skip the array position
-
-
- i++;
- }
- }
- }
-
- if (refObject === null || refObject === undefined) {
- if (!scorm2004) {
- if (attribute === '_children') {
- this.throwSCORMError(scorm12_error_codes.CHILDREN_ERROR);
- } else if (attribute === '_count') {
- this.throwSCORMError(scorm12_error_codes.COUNT_ERROR);
- }
- }
- } else {
- return refObject;
- }
- }
- /**
- * Returns true if the API's current state is STATE_INITIALIZED
- *
- * @return {boolean}
- */
-
- }, {
- key: "isInitialized",
- value: function isInitialized() {
- return this.currentState === global_constants.STATE_INITIALIZED;
- }
- /**
- * Returns true if the API's current state is STATE_NOT_INITIALIZED
- *
- * @return {boolean}
- */
-
- }, {
- key: "isNotInitialized",
- value: function isNotInitialized() {
- return this.currentState === global_constants.STATE_NOT_INITIALIZED;
- }
- /**
- * Returns true if the API's current state is STATE_TERMINATED
- *
- * @return {boolean}
- */
-
- }, {
- key: "isTerminated",
- value: function isTerminated() {
- return this.currentState === global_constants.STATE_TERMINATED;
- }
- /**
- * Provides a mechanism for attaching to a specific SCORM event
- *
- * @param {string} listenerName
- * @param {function} callback
- */
-
- }, {
- key: "on",
- value: function on(listenerName, callback) {
- if (!callback) return;
- var listenerFunctions = listenerName.split(' ');
-
- for (var i = 0; i < listenerFunctions.length; i++) {
- var listenerSplit = listenerFunctions[i].split('.');
- if (listenerSplit.length === 0) return;
- var functionName = listenerSplit[0];
- var CMIElement = null;
-
- if (listenerSplit.length > 1) {
- CMIElement = listenerName.replace(functionName + '.', '');
- }
-
- this.listenerArray.push({
- functionName: functionName,
- CMIElement: CMIElement,
- callback: callback
- });
- this.apiLog('on', functionName, "Added event listener: ".concat(this.listenerArray.length), global_constants.LOG_LEVEL_INFO);
- }
- }
- /**
- * Provides a mechanism for detaching a specific SCORM event listener
- *
- * @param {string} listenerName
- * @param {function} callback
- */
-
- }, {
- key: "off",
- value: function off(listenerName, callback) {
- var _this = this;
-
- if (!callback) return;
- var listenerFunctions = listenerName.split(' ');
-
- var _loop = function _loop(i) {
- var listenerSplit = listenerFunctions[i].split('.');
- if (listenerSplit.length === 0) return {
- v: void 0
- };
- var functionName = listenerSplit[0];
- var CMIElement = null;
-
- if (listenerSplit.length > 1) {
- CMIElement = listenerName.replace(functionName + '.', '');
- }
-
- var removeIndex = _this.listenerArray.findIndex(function (obj) {
- return obj.functionName === functionName && obj.CMIElement === CMIElement && obj.callback === callback;
- });
-
- if (removeIndex !== -1) {
- _this.listenerArray.splice(removeIndex, 1);
-
- _this.apiLog('off', functionName, "Removed event listener: ".concat(_this.listenerArray.length), global_constants.LOG_LEVEL_INFO);
- }
- };
-
- for (var i = 0; i < listenerFunctions.length; i++) {
- var _ret = _loop(i);
-
- if (_typeof(_ret) === "object") return _ret.v;
- }
- }
- /**
- * Provides a mechanism for clearing all listeners from a specific SCORM event
- *
- * @param {string} listenerName
- */
-
- }, {
- key: "clear",
- value: function clear(listenerName) {
- var _this2 = this;
-
- var listenerFunctions = listenerName.split(' ');
-
- var _loop2 = function _loop2(i) {
- var listenerSplit = listenerFunctions[i].split('.');
- if (listenerSplit.length === 0) return {
- v: void 0
- };
- var functionName = listenerSplit[0];
- var CMIElement = null;
-
- if (listenerSplit.length > 1) {
- CMIElement = listenerName.replace(functionName + '.', '');
- }
-
- _this2.listenerArray = _this2.listenerArray.filter(function (obj) {
- return obj.functionName !== functionName && obj.CMIElement !== CMIElement;
- });
- };
-
- for (var i = 0; i < listenerFunctions.length; i++) {
- var _ret2 = _loop2(i);
-
- if (_typeof(_ret2) === "object") return _ret2.v;
- }
- }
- /**
- * Processes any 'on' listeners that have been created
- *
- * @param {string} functionName
- * @param {string} CMIElement
- * @param {*} value
- */
-
- }, {
- key: "processListeners",
- value: function processListeners(functionName, CMIElement, value) {
- this.apiLog(functionName, CMIElement, value);
-
- for (var i = 0; i < this.listenerArray.length; i++) {
- var listener = this.listenerArray[i];
- var functionsMatch = listener.functionName === functionName;
- var listenerHasCMIElement = !!listener.CMIElement;
- var CMIElementsMatch = false;
-
- if (CMIElement && listener.CMIElement && listener.CMIElement.substring(listener.CMIElement.length - 1) === '*') {
- CMIElementsMatch = CMIElement.indexOf(listener.CMIElement.substring(0, listener.CMIElement.length - 1)) === 0;
- } else {
- CMIElementsMatch = listener.CMIElement === CMIElement;
- }
-
- if (functionsMatch && (!listenerHasCMIElement || CMIElementsMatch)) {
- listener.callback(CMIElement, value);
- }
- }
- }
- /**
- * Throws a SCORM error
- *
- * @param {number} errorNumber
- * @param {string} message
- */
-
- }, {
- key: "throwSCORMError",
- value: function throwSCORMError(errorNumber, message) {
- if (!message) {
- message = this.getLmsErrorMessageDetails(errorNumber);
- }
-
- this.apiLog('throwSCORMError', null, errorNumber + ': ' + message, global_constants.LOG_LEVEL_ERROR);
- this.lastErrorCode = String(errorNumber);
- }
- /**
- * Clears the last SCORM error code on success.
- *
- * @param {string} success
- */
-
- }, {
- key: "clearSCORMError",
- value: function clearSCORMError(success) {
- if (success !== undefined && success !== global_constants.SCORM_FALSE) {
- this.lastErrorCode = 0;
- }
- }
- /**
- * Attempts to store the data to the LMS, logs data if no LMS configured
- * APIs that inherit BaseAPI should override this function
- *
- * @param {boolean} _calculateTotalTime
- * @return {string}
- * @abstract
- */
-
- }, {
- key: "storeData",
- value: function storeData(_calculateTotalTime) {
- throw new Error('The storeData method has not been implemented');
- }
- /**
- * Load the CMI from a flattened JSON object
- * @param {object} json
- * @param {string} CMIElement
- */
-
- }, {
- key: "loadFromFlattenedJSON",
- value: function loadFromFlattenedJSON(json, CMIElement) {
- var _this3 = this;
-
- if (!this.isNotInitialized()) {
- console.error('loadFromFlattenedJSON can only be called before the call to lmsInitialize.');
- return;
- }
- /**
- * Test match pattern.
- *
- * @param {string} a
- * @param {string} c
- * @param {RegExp} a_pattern
- * @return {number}
- */
-
-
- function testPattern(a, c, a_pattern) {
- var a_match = a.match(a_pattern);
- var c_match;
-
- if (a_match !== null && (c_match = c.match(a_pattern)) !== null) {
- var a_num = Number(a_match[2]);
- var c_num = Number(c_match[2]);
-
- if (a_num === c_num) {
- if (a_match[3] === 'id') {
- return -1;
- } else if (a_match[3] === 'type') {
- if (c_match[3] === 'id') {
- return 1;
- } else {
- return -1;
- }
- } else {
- return 1;
- }
- }
-
- return a_num - c_num;
- }
-
- return null;
- }
-
- var int_pattern = /^(cmi\.interactions\.)(\d+)\.(.*)$/;
- var obj_pattern = /^(cmi\.objectives\.)(\d+)\.(.*)$/;
- var result = Object.keys(json).map(function (key) {
- return [String(key), json[key]];
- }); // CMI interactions need to have id and type loaded before any other fields
-
- result.sort(function (_ref, _ref2) {
- var _ref3 = _slicedToArray(_ref, 2),
- a = _ref3[0],
- b = _ref3[1];
-
- var _ref4 = _slicedToArray(_ref2, 2),
- c = _ref4[0],
- d = _ref4[1];
-
- var test;
-
- if ((test = testPattern(a, c, int_pattern)) !== null) {
- return test;
- }
-
- if ((test = testPattern(a, c, obj_pattern)) !== null) {
- return test;
- }
-
- if (a < c) {
- return -1;
- }
-
- if (a > c) {
- return 1;
- }
-
- return 0;
- });
- var obj;
- result.forEach(function (element) {
- obj = {};
- obj[element[0]] = element[1];
-
- _this3.loadFromJSON((0, _utilities.unflatten)(obj), CMIElement);
- });
- }
- /**
- * Loads CMI data from a JSON object.
- *
- * @param {object} json
- * @param {string} CMIElement
- */
-
- }, {
- key: "loadFromJSON",
- value: function loadFromJSON(json, CMIElement) {
- if (!this.isNotInitialized()) {
- console.error('loadFromJSON can only be called before the call to lmsInitialize.');
- return;
- }
-
- CMIElement = CMIElement !== undefined ? CMIElement : 'cmi';
- this.startingData = json; // could this be refactored down to flatten(json) then setCMIValue on each?
-
- for (var key in json) {
- if ({}.hasOwnProperty.call(json, key) && json[key]) {
- var currentCMIElement = (CMIElement ? CMIElement + '.' : '') + key;
- var value = json[key];
-
- if (value['childArray']) {
- for (var i = 0; i < value['childArray'].length; i++) {
- this.loadFromJSON(value['childArray'][i], currentCMIElement + '.' + i);
- }
- } else if (value.constructor === Object) {
- this.loadFromJSON(value, currentCMIElement);
- } else {
- this.setCMIValue(currentCMIElement, value);
- }
- }
- }
- }
- /**
- * Render the CMI object to JSON for sending to an LMS.
- *
- * @return {string}
- */
-
- }, {
- key: "renderCMIToJSONString",
- value: function renderCMIToJSONString() {
- var cmi = this.cmi; // Do we want/need to return fields that have no set value?
- // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);
-
- return JSON.stringify({
- cmi: cmi
- });
- }
- /**
- * Returns a JS object representing the current cmi
- * @return {object}
- */
-
- }, {
- key: "renderCMIToJSONObject",
- value: function renderCMIToJSONObject() {
- // Do we want/need to return fields that have no set value?
- // return JSON.stringify({ cmi }, (k, v) => v === undefined ? null : v, 2);
- return JSON.parse(this.renderCMIToJSONString());
- }
- /**
- * Render the cmi object to the proper format for LMS commit
- * APIs that inherit BaseAPI should override this function
- *
- * @param {boolean} _terminateCommit
- * @return {*}
- * @abstract
- */
-
- }, {
- key: "renderCommitCMI",
- value: function renderCommitCMI(_terminateCommit) {
- throw new Error('The storeData method has not been implemented');
- }
- /**
- * Send the request to the LMS
- * @param {string} url
- * @param {object|Array} params
- * @param {boolean} immediate
- * @return {object}
- */
-
- }, {
- key: "processHttpRequest",
- value: function processHttpRequest(url, params) {
- var immediate = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
- var api = this;
-
- var process = function process(url, params, settings, error_codes) {
- var genericError = {
- 'result': global_constants.SCORM_FALSE,
- 'errorCode': error_codes.GENERAL
- };
- var result;
-
- if (!settings.sendBeaconCommit) {
- var httpReq = new XMLHttpRequest();
- httpReq.open('POST', url, settings.asyncCommit);
-
- if (Object.keys(settings.xhrHeaders).length) {
- Object.keys(settings.xhrHeaders).forEach(function (header) {
- httpReq.setRequestHeader(header, settings.xhrHeaders[header]);
- });
- }
-
- httpReq.withCredentials = settings.xhrWithCredentials;
-
- if (settings.asyncCommit) {
- httpReq.onload = function (e) {
- if (typeof settings.responseHandler === 'function') {
- result = settings.responseHandler(httpReq);
- } else {
- result = JSON.parse(httpReq.responseText);
- }
- };
- }
-
- try {
- if (params instanceof Array) {
- httpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
- httpReq.send(params.join('&'));
- } else {
- httpReq.setRequestHeader('Content-Type', settings.commitRequestDataType);
- httpReq.send(JSON.stringify(params));
- }
-
- if (!settings.asyncCommit) {
- if (typeof settings.responseHandler === 'function') {
- result = settings.responseHandler(httpReq);
- } else {
- result = JSON.parse(httpReq.responseText);
- }
- } else {
- result = {};
- result.result = global_constants.SCORM_TRUE;
- result.errorCode = 0;
- api.processListeners('CommitSuccess');
- return result;
- }
- } catch (e) {
- console.error(e);
- api.processListeners('CommitError');
- return genericError;
- }
- } else {
- try {
- var headers = {
- type: settings.commitRequestDataType
- };
- var blob;
-
- if (params instanceof Array) {
- blob = new Blob([params.join('&')], headers);
- } else {
- blob = new Blob([JSON.stringify(params)], headers);
- }
-
- result = {};
-
- if (navigator.sendBeacon(url, blob)) {
- result.result = global_constants.SCORM_TRUE;
- result.errorCode = 0;
- } else {
- result.result = global_constants.SCORM_FALSE;
- result.errorCode = 101;
- }
- } catch (e) {
- console.error(e);
- api.processListeners('CommitError');
- return genericError;
- }
- }
-
- if (typeof result === 'undefined') {
- api.processListeners('CommitError');
- return genericError;
- }
-
- if (result.result === true || result.result === global_constants.SCORM_TRUE) {
- api.processListeners('CommitSuccess');
- } else {
- api.processListeners('CommitError');
- }
-
- return result;
- };
-
- if (typeof _lodash["default"] !== 'undefined') {
- var debounced = (0, _lodash["default"])(process, 500);
- debounced(url, params, this.settings, this.error_codes); // if we're terminating, go ahead and commit immediately
-
- if (immediate) {
- debounced.flush();
- }
-
- return {
- result: global_constants.SCORM_TRUE,
- errorCode: 0
- };
- } else {
- return process(url, params, this.settings, this.error_codes);
- }
- }
- /**
- * Throws a SCORM error
- *
- * @param {number} when - the number of milliseconds to wait before committing
- * @param {string} callback - the name of the commit event callback
- */
-
- }, {
- key: "scheduleCommit",
- value: function scheduleCommit(when, callback) {
- _classPrivateFieldSet(this, _timeout, new ScheduledCommit(this, when, callback));
-
- this.apiLog('scheduleCommit', '', 'scheduled', global_constants.LOG_LEVEL_DEBUG);
- }
- /**
- * Clears and cancels any currently scheduled commits
- */
-
- }, {
- key: "clearScheduledCommit",
- value: function clearScheduledCommit() {
- if (_classPrivateFieldGet(this, _timeout)) {
- _classPrivateFieldGet(this, _timeout).cancel();
-
- _classPrivateFieldSet(this, _timeout, null);
-
- this.apiLog('clearScheduledCommit', '', 'cleared', global_constants.LOG_LEVEL_DEBUG);
- }
- }
- }]);
-
- return BaseAPI;
-}();
-/**
- * Private class that wraps a timeout call to the commit() function
- */
-
-
-exports["default"] = BaseAPI;
-
-var _API = /*#__PURE__*/new WeakMap();
-
-var _cancelled = /*#__PURE__*/new WeakMap();
-
-var _timeout2 = /*#__PURE__*/new WeakMap();
-
-var _callback = /*#__PURE__*/new WeakMap();
-
-var ScheduledCommit = /*#__PURE__*/function () {
- /**
- * Constructor for ScheduledCommit
- * @param {BaseAPI} API
- * @param {number} when
- * @param {string} callback
- */
- function ScheduledCommit(API, when, callback) {
- _classCallCheck(this, ScheduledCommit);
-
- _classPrivateFieldInitSpec(this, _API, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(this, _cancelled, {
- writable: true,
- value: false
- });
-
- _classPrivateFieldInitSpec(this, _timeout2, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(this, _callback, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldSet(this, _API, API);
-
- _classPrivateFieldSet(this, _timeout2, setTimeout(this.wrapper.bind(this), when));
-
- _classPrivateFieldSet(this, _callback, callback);
- }
- /**
- * Cancel any currently scheduled commit
- */
-
-
- _createClass(ScheduledCommit, [{
- key: "cancel",
- value: function cancel() {
- _classPrivateFieldSet(this, _cancelled, true);
-
- if (_classPrivateFieldGet(this, _timeout2)) {
- clearTimeout(_classPrivateFieldGet(this, _timeout2));
- }
- }
- /**
- * Wrap the API commit call to check if the call has already been cancelled
- */
-
- }, {
- key: "wrapper",
- value: function wrapper() {
- if (!_classPrivateFieldGet(this, _cancelled)) {
- _classPrivateFieldGet(this, _API).commit(_classPrivateFieldGet(this, _callback));
- }
- }
- }]);
-
- return ScheduledCommit;
-}();
-
-},{"./cmi/common":4,"./constants/api_constants":6,"./constants/error_codes":7,"./exceptions":11,"./utilities":13,"lodash.debounce":1}],3:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _BaseAPI2 = _interopRequireDefault(require("./BaseAPI"));
-
-var _scorm2004_cmi = require("./cmi/scorm2004_cmi");
-
-var Utilities = _interopRequireWildcard(require("./utilities"));
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("./constants/error_codes"));
-
-var _response_constants = _interopRequireDefault(require("./constants/response_constants"));
-
-var _language_constants = _interopRequireDefault(require("./constants/language_constants"));
-
-var _regex = _interopRequireDefault(require("./constants/regex"));
-
-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; }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
-
-function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
-
-function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
-
-function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
-
-function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-
-var scorm2004_constants = _api_constants["default"].scorm2004;
-var global_constants = _api_constants["default"].global;
-var scorm2004_error_codes = _error_codes["default"].scorm2004;
-var correct_responses = _response_constants["default"].correct;
-var scorm2004_regex = _regex["default"].scorm2004;
-/**
- * API class for SCORM 2004
- */
-
-var _version = /*#__PURE__*/new WeakMap();
-
-var Scorm2004API = /*#__PURE__*/function (_BaseAPI) {
- _inherits(Scorm2004API, _BaseAPI);
-
- var _super = _createSuper(Scorm2004API);
-
- /**
- * Constructor for SCORM 2004 API
- * @param {object} settings
- */
- function Scorm2004API(settings) {
- var _this;
-
- _classCallCheck(this, Scorm2004API);
-
- var finalSettings = _objectSpread(_objectSpread({}, {
- mastery_override: false
- }), settings);
-
- _this = _super.call(this, scorm2004_error_codes, finalSettings);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _version, {
- writable: true,
- value: void 0
- });
-
- _defineProperty(_assertThisInitialized(_this), "checkDuplicatedPattern", function (correct_response, current_index, value) {
- var found = false;
- var count = correct_response._count;
-
- for (var i = 0; i < count && !found; i++) {
- if (i !== current_index && correct_response.childArray[i] === value) {
- found = true;
- }
- }
-
- return found;
- });
-
- _this.cmi = new _scorm2004_cmi.CMI();
- _this.adl = new _scorm2004_cmi.ADL(); // Rename functions to match 2004 Spec and expose to modules
-
- _this.Initialize = _this.lmsInitialize;
- _this.Terminate = _this.lmsTerminate;
- _this.GetValue = _this.lmsGetValue;
- _this.SetValue = _this.lmsSetValue;
- _this.Commit = _this.lmsCommit;
- _this.GetLastError = _this.lmsGetLastError;
- _this.GetErrorString = _this.lmsGetErrorString;
- _this.GetDiagnostic = _this.lmsGetDiagnostic;
- return _this;
- }
- /**
- * Getter for #version
- * @return {string}
- */
-
-
- _createClass(Scorm2004API, [{
- key: "version",
- get: function get() {
- return _classPrivateFieldGet(this, _version);
- }
- /**
- * @return {string} bool
- */
-
- }, {
- key: "lmsInitialize",
- value: function lmsInitialize() {
- this.cmi.initialize();
- return this.initialize('Initialize');
- }
- /**
- * @return {string} bool
- */
-
- }, {
- key: "lmsTerminate",
- value: function lmsTerminate() {
- var result = this.terminate('Terminate', true);
-
- if (result === global_constants.SCORM_TRUE) {
- if (this.adl.nav.request !== '_none_') {
- switch (this.adl.nav.request) {
- case 'continue':
- this.processListeners('SequenceNext');
- break;
-
- case 'previous':
- this.processListeners('SequencePrevious');
- break;
-
- case 'choice':
- this.processListeners('SequenceChoice');
- break;
-
- case 'exit':
- this.processListeners('SequenceExit');
- break;
-
- case 'exitAll':
- this.processListeners('SequenceExitAll');
- break;
-
- case 'abandon':
- this.processListeners('SequenceAbandon');
- break;
-
- case 'abandonAll':
- this.processListeners('SequenceAbandonAll');
- break;
- }
- } else if (this.settings.autoProgress) {
- this.processListeners('SequenceNext');
- }
- }
-
- return result;
- }
- /**
- * @param {string} CMIElement
- * @return {string}
- */
-
- }, {
- key: "lmsGetValue",
- value: function lmsGetValue(CMIElement) {
- return this.getValue('GetValue', true, CMIElement);
- }
- /**
- * @param {string} CMIElement
- * @param {any} value
- * @return {string}
- */
-
- }, {
- key: "lmsSetValue",
- value: function lmsSetValue(CMIElement, value) {
- return this.setValue('SetValue', 'Commit', true, CMIElement, value);
- }
- /**
- * Orders LMS to store all content parameters
- *
- * @return {string} bool
- */
-
- }, {
- key: "lmsCommit",
- value: function lmsCommit() {
- return this.commit('Commit');
- }
- /**
- * Returns last error code
- *
- * @return {string}
- */
-
- }, {
- key: "lmsGetLastError",
- value: function lmsGetLastError() {
- return this.getLastError('GetLastError');
- }
- /**
- * Returns the errorNumber error description
- *
- * @param {(string|number)} CMIErrorCode
- * @return {string}
- */
-
- }, {
- key: "lmsGetErrorString",
- value: function lmsGetErrorString(CMIErrorCode) {
- return this.getErrorString('GetErrorString', CMIErrorCode);
- }
- /**
- * Returns a comprehensive description of the errorNumber error.
- *
- * @param {(string|number)} CMIErrorCode
- * @return {string}
- */
-
- }, {
- key: "lmsGetDiagnostic",
- value: function lmsGetDiagnostic(CMIErrorCode) {
- return this.getDiagnostic('GetDiagnostic', CMIErrorCode);
- }
- /**
- * Sets a value on the CMI Object
- *
- * @param {string} CMIElement
- * @param {any} value
- * @return {string}
- */
-
- }, {
- key: "setCMIValue",
- value: function setCMIValue(CMIElement, value) {
- return this._commonSetCMIValue('SetValue', true, CMIElement, value);
- }
- /**
- * Gets or builds a new child element to add to the array.
- *
- * @param {string} CMIElement
- * @param {any} value
- * @param {boolean} foundFirstIndex
- * @return {any}
- */
-
- }, {
- key: "getChildElement",
- value: function getChildElement(CMIElement, value, foundFirstIndex) {
- var newChild;
-
- if (this.stringMatches(CMIElement, 'cmi\\.objectives\\.\\d+')) {
- newChild = new _scorm2004_cmi.CMIObjectivesObject();
- } else if (foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+\\.correct_responses\\.\\d+')) {
- var parts = CMIElement.split('.');
- var index = Number(parts[2]);
- var interaction = this.cmi.interactions.childArray[index];
-
- if (this.isInitialized()) {
- if (!interaction.type) {
- this.throwSCORMError(scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);
- } else {
- this.checkDuplicateChoiceResponse(interaction, value);
- var response_type = correct_responses[interaction.type];
-
- if (response_type) {
- this.checkValidResponseType(response_type, value, interaction.type);
- } else {
- this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE, 'Incorrect Response Type: ' + interaction.type);
- }
- }
- }
-
- if (this.lastErrorCode === 0) {
- newChild = new _scorm2004_cmi.CMIInteractionsCorrectResponsesObject();
- }
- } else if (foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+\\.objectives\\.\\d+')) {
- newChild = new _scorm2004_cmi.CMIInteractionsObjectivesObject();
- } else if (!foundFirstIndex && this.stringMatches(CMIElement, 'cmi\\.interactions\\.\\d+')) {
- newChild = new _scorm2004_cmi.CMIInteractionsObject();
- } else if (this.stringMatches(CMIElement, 'cmi\\.comments_from_learner\\.\\d+')) {
- newChild = new _scorm2004_cmi.CMICommentsObject();
- } else if (this.stringMatches(CMIElement, 'cmi\\.comments_from_lms\\.\\d+')) {
- newChild = new _scorm2004_cmi.CMICommentsObject(true);
- }
-
- return newChild;
- }
- /**
- * Checks for valid response types
- * @param {object} response_type
- * @param {any} value
- * @param {string} interaction_type
- */
-
- }, {
- key: "checkValidResponseType",
- value: function checkValidResponseType(response_type, value, interaction_type) {
- var nodes = [];
-
- if (response_type !== null && response_type !== void 0 && response_type.delimiter) {
- nodes = String(value).split(response_type.delimiter);
- } else {
- nodes[0] = value;
- }
-
- if (nodes.length > 0 && nodes.length <= response_type.max) {
- this.checkCorrectResponseValue(interaction_type, nodes, value);
- } else if (nodes.length > response_type.max) {
- this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE, 'Data Model Element Pattern Too Long');
- }
- }
- /**
- * Checks for duplicate 'choice' responses.
- * @param {CMIInteractionsObject} interaction
- * @param {any} value
- */
-
- }, {
- key: "checkDuplicateChoiceResponse",
- value: function checkDuplicateChoiceResponse(interaction, value) {
- var interaction_count = interaction.correct_responses._count;
-
- if (interaction.type === 'choice') {
- for (var i = 0; i < interaction_count && this.lastErrorCode === 0; i++) {
- var response = interaction.correct_responses.childArray[i];
-
- if (response.pattern === value) {
- this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE);
- }
- }
- }
- }
- /**
- * Validate correct response.
- * @param {string} CMIElement
- * @param {*} value
- */
-
- }, {
- key: "validateCorrectResponse",
- value: function validateCorrectResponse(CMIElement, value) {
- var parts = CMIElement.split('.');
- var index = Number(parts[2]);
- var pattern_index = Number(parts[4]);
- var interaction = this.cmi.interactions.childArray[index];
- var interaction_count = interaction.correct_responses._count;
- this.checkDuplicateChoiceResponse(interaction, value);
- var response_type = correct_responses[interaction.type];
-
- if (typeof response_type.limit === 'undefined' || interaction_count <= response_type.limit) {
- this.checkValidResponseType(response_type, value, interaction.type);
-
- if (this.lastErrorCode === 0 && (!response_type.duplicate || !this.checkDuplicatedPattern(interaction.correct_responses, pattern_index, value)) || this.lastErrorCode === 0 && value === '') {// do nothing, we want the inverse
- } else {
- if (this.lastErrorCode === 0) {
- this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE, 'Data Model Element Pattern Already Exists');
- }
- }
- } else {
- this.throwSCORMError(scorm2004_error_codes.GENERAL_SET_FAILURE, 'Data Model Element Collection Limit Reached');
- }
- }
- /**
- * Gets a value from the CMI Object
- *
- * @param {string} CMIElement
- * @return {*}
- */
-
- }, {
- key: "getCMIValue",
- value: function getCMIValue(CMIElement) {
- return this._commonGetCMIValue('GetValue', true, CMIElement);
- }
- /**
- * Returns the message that corresponds to errorNumber.
- *
- * @param {(string|number)} errorNumber
- * @param {boolean} detail
- * @return {string}
- */
-
- }, {
- key: "getLmsErrorMessageDetails",
- value: function getLmsErrorMessageDetails(errorNumber, detail) {
- var basicMessage = '';
- var detailMessage = ''; // Set error number to string since inconsistent from modules if string or number
-
- errorNumber = String(errorNumber);
-
- if (scorm2004_constants.error_descriptions[errorNumber]) {
- basicMessage = scorm2004_constants.error_descriptions[errorNumber].basicMessage;
- detailMessage = scorm2004_constants.error_descriptions[errorNumber].detailMessage;
- }
-
- return detail ? detailMessage : basicMessage;
- }
- /**
- * Check to see if a correct_response value has been duplicated
- * @param {CMIArray} correct_response
- * @param {number} current_index
- * @param {*} value
- * @return {boolean}
- */
-
- }, {
- key: "checkCorrectResponseValue",
- value:
- /**
- * Checks for a valid correct_response value
- * @param {string} interaction_type
- * @param {Array} nodes
- * @param {*} value
- */
- function checkCorrectResponseValue(interaction_type, nodes, value) {
- var response = correct_responses[interaction_type];
- var formatRegex = new RegExp(response.format);
-
- for (var i = 0; i < nodes.length && this.lastErrorCode === 0; i++) {
- if (interaction_type.match('^(fill-in|long-fill-in|matching|performance|sequencing)$')) {
- nodes[i] = this.removeCorrectResponsePrefixes(nodes[i]);
- }
-
- if (response !== null && response !== void 0 && response.delimiter2) {
- var values = nodes[i].split(response.delimiter2);
-
- if (values.length === 2) {
- var matches = values[0].match(formatRegex);
-
- if (!matches) {
- this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);
- } else {
- if (!values[1].match(new RegExp(response.format2))) {
- this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);
- }
- }
- } else {
- this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);
- }
- } else {
- var _matches = nodes[i].match(formatRegex);
-
- if (!_matches && value !== '' || !_matches && interaction_type === 'true-false') {
- this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);
- } else {
- if (interaction_type === 'numeric' && nodes.length > 1) {
- if (Number(nodes[0]) > Number(nodes[1])) {
- this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);
- }
- } else {
- if (nodes[i] !== '' && response.unique) {
- for (var j = 0; j < i && this.lastErrorCode === 0; j++) {
- if (nodes[i] === nodes[j]) {
- this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);
- }
- }
- }
- }
- }
- }
- }
- }
- /**
- * Remove prefixes from correct_response
- * @param {string} node
- * @return {*}
- */
-
- }, {
- key: "removeCorrectResponsePrefixes",
- value: function removeCorrectResponsePrefixes(node) {
- var seenOrder = false;
- var seenCase = false;
- var seenLang = false;
- var prefixRegex = new RegExp('^({(lang|case_matters|order_matters)=([^}]+)})');
- var matches = node.match(prefixRegex);
- var langMatches = null;
-
- while (matches) {
- switch (matches[2]) {
- case 'lang':
- langMatches = node.match(scorm2004_regex.CMILangcr);
-
- if (langMatches) {
- var lang = langMatches[3];
-
- if (lang !== undefined && lang.length > 0) {
- if (_language_constants["default"][lang.toLowerCase()] === undefined) {
- this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);
- }
- }
- }
-
- seenLang = true;
- break;
-
- case 'case_matters':
- if (!seenLang && !seenOrder && !seenCase) {
- if (matches[3] !== 'true' && matches[3] !== 'false') {
- this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);
- }
- }
-
- seenCase = true;
- break;
-
- case 'order_matters':
- if (!seenCase && !seenLang && !seenOrder) {
- if (matches[3] !== 'true' && matches[3] !== 'false') {
- this.throwSCORMError(scorm2004_error_codes.TYPE_MISMATCH);
- }
- }
-
- seenOrder = true;
- break;
-
- default:
- break;
- }
-
- node = node.substr(matches[1].length);
- matches = node.match(prefixRegex);
- }
-
- return node;
- }
- /**
- * Replace the whole API with another
- * @param {Scorm2004API} newAPI
- */
-
- }, {
- key: "replaceWithAnotherScormAPI",
- value: function replaceWithAnotherScormAPI(newAPI) {
- // Data Model
- this.cmi = newAPI.cmi;
- this.adl = newAPI.adl;
- }
- /**
- * Render the cmi object to the proper format for LMS commit
- *
- * @param {boolean} terminateCommit
- * @return {object|Array}
- */
-
- }, {
- key: "renderCommitCMI",
- value: function renderCommitCMI(terminateCommit) {
- var cmiExport = this.renderCMIToJSONObject();
-
- if (terminateCommit) {
- cmiExport.cmi.total_time = this.cmi.getCurrentTotalTime();
- }
-
- var result = [];
- var flattened = Utilities.flatten(cmiExport);
-
- switch (this.settings.dataCommitFormat) {
- case 'flattened':
- return Utilities.flatten(cmiExport);
-
- case 'params':
- for (var item in flattened) {
- if ({}.hasOwnProperty.call(flattened, item)) {
- result.push("".concat(item, "=").concat(flattened[item]));
- }
- }
-
- return result;
-
- case 'json':
- default:
- return cmiExport;
- }
- }
- /**
- * Attempts to store the data to the LMS
- *
- * @param {boolean} terminateCommit
- * @return {string}
- */
-
- }, {
- key: "storeData",
- value: function storeData(terminateCommit) {
- var _this$startingData, _this$startingData$ad, _this$startingData$ad2;
-
- if (terminateCommit) {
- if (this.cmi.mode === 'normal') {
- if (this.cmi.credit === 'credit') {
- if (this.cmi.completion_threshold && this.cmi.progress_measure) {
- if (this.cmi.progress_measure >= this.cmi.completion_threshold) {
- console.debug('Setting Completion Status: Completed');
- this.cmi.completion_status = 'completed';
- } else {
- console.debug('Setting Completion Status: Incomplete');
- this.cmi.completion_status = 'incomplete';
- }
- }
-
- if (this.cmi.scaled_passing_score && this.cmi.score.scaled) {
- if (this.cmi.score.scaled >= this.cmi.scaled_passing_score) {
- console.debug('Setting Success Status: Passed');
- this.cmi.success_status = 'passed';
- } else {
- console.debug('Setting Success Status: Failed');
- this.cmi.success_status = 'failed';
- }
- }
- }
- }
- }
-
- var navRequest = false;
-
- if (this.adl.nav.request !== ((_this$startingData = this.startingData) === null || _this$startingData === void 0 ? void 0 : (_this$startingData$ad = _this$startingData.adl) === null || _this$startingData$ad === void 0 ? void 0 : (_this$startingData$ad2 = _this$startingData$ad.nav) === null || _this$startingData$ad2 === void 0 ? void 0 : _this$startingData$ad2.request) && this.adl.nav.request !== '_none_') {
- this.adl.nav.request = encodeURIComponent(this.adl.nav.request);
- navRequest = true;
- }
-
- var commitObject = this.renderCommitCMI(terminateCommit || this.settings.alwaysSendTotalTime);
-
- if (this.apiLogLevel === global_constants.LOG_LEVEL_DEBUG) {
- console.debug('Commit (terminated: ' + (terminateCommit ? 'yes' : 'no') + '): ');
- console.debug(commitObject);
- }
-
- if (this.settings.lmsCommitUrl) {
- var result = this.processHttpRequest(this.settings.lmsCommitUrl, commitObject, terminateCommit); // check if this is a sequencing call, and then call the necessary JS
-
- {
- if (navRequest && result.navRequest !== undefined && result.navRequest !== '') {
- Function("\"use strict\";(() => { ".concat(result.navRequest, " })()"))();
- }
- }
- return result;
- } else {
- return global_constants.SCORM_TRUE;
- }
- }
- }]);
-
- return Scorm2004API;
-}(_BaseAPI2["default"]);
-
-exports["default"] = Scorm2004API;
-
-},{"./BaseAPI":2,"./cmi/scorm2004_cmi":5,"./constants/api_constants":6,"./constants/error_codes":7,"./constants/language_constants":8,"./constants/regex":9,"./constants/response_constants":10,"./utilities":13}],4:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.CMIScore = exports.CMIArray = exports.BaseCMI = void 0;
-exports.checkValidFormat = checkValidFormat;
-exports.checkValidRange = checkValidRange;
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
-
-function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
-
-function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-
-function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
-
-function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
-
-function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-
-var scorm12_constants = _api_constants["default"].scorm12;
-var scorm12_regex = _regex["default"].scorm12;
-var scorm12_error_codes = _error_codes["default"].scorm12;
-/**
- * Check if the value matches the proper format. If not, throw proper error code.
- *
- * @param {string} value
- * @param {string} regexPattern
- * @param {number} errorCode
- * @param {class} errorClass
- * @param {boolean} allowEmptyString
- * @return {boolean}
- */
-
-function checkValidFormat(value, regexPattern, errorCode, errorClass, allowEmptyString) {
- var formatRegex = new RegExp(regexPattern);
- var matches = value.match(formatRegex);
-
- if (allowEmptyString && value === '') {
- return true;
- }
-
- if (value === undefined || !matches || matches[0] === '') {
- throw new errorClass.prototype.constructor(errorCode);
- }
-
- return true;
-}
-/**
- * Check if the value matches the proper range. If not, throw proper error code.
- *
- * @param {*} value
- * @param {string} rangePattern
- * @param {number} errorCode
- * @param {class} errorClass
- * @return {boolean}
- */
-
-
-function checkValidRange(value, rangePattern, errorCode, errorClass) {
- var ranges = rangePattern.split('#');
- value = value * 1.0;
-
- if (value >= ranges[0]) {
- if (ranges[1] === '*' || value <= ranges[1]) {
- return true;
- } else {
- throw new errorClass.prototype.constructor(errorCode);
- }
- } else {
- throw new errorClass.prototype.constructor(errorCode);
- }
-}
-/**
- * Base class for API cmi objects
- */
-
-
-var _initialized = /*#__PURE__*/new WeakMap();
-
-var _start_time = /*#__PURE__*/new WeakMap();
-
-var BaseCMI = /*#__PURE__*/function () {
- /**
- * Constructor for BaseCMI, just marks the class as abstract
- */
- function BaseCMI() {
- _classCallCheck(this, BaseCMI);
-
- _defineProperty(this, "jsonString", false);
-
- _classPrivateFieldInitSpec(this, _initialized, {
- writable: true,
- value: false
- });
-
- _classPrivateFieldInitSpec(this, _start_time, {
- writable: true,
- value: void 0
- });
-
- if ((this instanceof BaseCMI ? this.constructor : void 0) === BaseCMI) {
- throw new TypeError('Cannot construct BaseCMI instances directly');
- }
- }
- /**
- * Getter for #initialized
- * @return {boolean}
- */
-
-
- _createClass(BaseCMI, [{
- key: "initialized",
- get: function get() {
- return _classPrivateFieldGet(this, _initialized);
- }
- /**
- * Getter for #start_time
- * @return {Number}
- */
-
- }, {
- key: "start_time",
- get: function get() {
- return _classPrivateFieldGet(this, _start_time);
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
- }, {
- key: "initialize",
- value: function initialize() {
- _classPrivateFieldSet(this, _initialized, true);
- }
- /**
- * Called when the player should override the 'session_time' provided by
- * the module
- */
-
- }, {
- key: "setStartTime",
- value: function setStartTime() {
- _classPrivateFieldSet(this, _start_time, new Date().getTime());
- }
- }]);
-
- return BaseCMI;
-}();
-/**
- * Base class for cmi *.score objects
- */
-
-
-exports.BaseCMI = BaseCMI;
-
-var _children2 = /*#__PURE__*/new WeakMap();
-
-var _score_range = /*#__PURE__*/new WeakMap();
-
-var _invalid_error_code = /*#__PURE__*/new WeakMap();
-
-var _invalid_type_code = /*#__PURE__*/new WeakMap();
-
-var _invalid_range_code = /*#__PURE__*/new WeakMap();
-
-var _decimal_regex = /*#__PURE__*/new WeakMap();
-
-var _error_class = /*#__PURE__*/new WeakMap();
-
-var _raw = /*#__PURE__*/new WeakMap();
-
-var _min = /*#__PURE__*/new WeakMap();
-
-var _max = /*#__PURE__*/new WeakMap();
-
-var CMIScore = /*#__PURE__*/function (_BaseCMI) {
- _inherits(CMIScore, _BaseCMI);
-
- var _super = _createSuper(CMIScore);
-
- /**
- * Constructor for *.score
- * @param {string} score_children
- * @param {string} score_range
- * @param {string} max
- * @param {number} invalidErrorCode
- * @param {number} invalidTypeCode
- * @param {number} invalidRangeCode
- * @param {string} decimalRegex
- * @param {class} errorClass
- */
- function CMIScore(_ref) {
- var _this;
-
- var score_children = _ref.score_children,
- score_range = _ref.score_range,
- max = _ref.max,
- invalidErrorCode = _ref.invalidErrorCode,
- invalidTypeCode = _ref.invalidTypeCode,
- invalidRangeCode = _ref.invalidRangeCode,
- decimalRegex = _ref.decimalRegex,
- errorClass = _ref.errorClass;
-
- _classCallCheck(this, CMIScore);
-
- _this = _super.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _children2, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _score_range, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _invalid_error_code, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _invalid_type_code, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _invalid_range_code, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _decimal_regex, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _error_class, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _raw, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _min, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _max, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _children2, score_children || scorm12_constants.score_children);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _score_range, !score_range ? false : scorm12_regex.score_range);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _max, max || max === '' ? max : '100');
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _invalid_error_code, invalidErrorCode || scorm12_error_codes.INVALID_SET_VALUE);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _invalid_type_code, invalidTypeCode || scorm12_error_codes.TYPE_MISMATCH);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _invalid_range_code, invalidRangeCode || scorm12_error_codes.VALUE_OUT_OF_RANGE);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _decimal_regex, decimalRegex || scorm12_regex.CMIDecimal);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _error_class, errorClass);
-
- return _this;
- }
-
- _createClass(CMIScore, [{
- key: "_children",
- get:
- /**
- * Getter for _children
- * @return {string}
- * @private
- */
- function get() {
- return _classPrivateFieldGet(this, _children2);
- }
- /**
- * Setter for _children. Just throws an error.
- * @param {string} _children
- * @private
- */
- ,
- set: function set(_children) {
- throw new (_classPrivateFieldGet(this, _error_class).prototype.constructor)(_classPrivateFieldGet(this, _invalid_error_code));
- }
- /**
- * Getter for #raw
- * @return {string}
- */
-
- }, {
- key: "raw",
- get: function get() {
- return _classPrivateFieldGet(this, _raw);
- }
- /**
- * Setter for #raw
- * @param {string} raw
- */
- ,
- set: function set(raw) {
- if (checkValidFormat(raw, _classPrivateFieldGet(this, _decimal_regex), _classPrivateFieldGet(this, _invalid_type_code), _classPrivateFieldGet(this, _error_class)) && (!_classPrivateFieldGet(this, _score_range) || checkValidRange(raw, _classPrivateFieldGet(this, _score_range), _classPrivateFieldGet(this, _invalid_range_code), _classPrivateFieldGet(this, _error_class)))) {
- _classPrivateFieldSet(this, _raw, raw);
- }
- }
- /**
- * Getter for #min
- * @return {string}
- */
-
- }, {
- key: "min",
- get: function get() {
- return _classPrivateFieldGet(this, _min);
- }
- /**
- * Setter for #min
- * @param {string} min
- */
- ,
- set: function set(min) {
- if (checkValidFormat(min, _classPrivateFieldGet(this, _decimal_regex), _classPrivateFieldGet(this, _invalid_type_code), _classPrivateFieldGet(this, _error_class)) && (!_classPrivateFieldGet(this, _score_range) || checkValidRange(min, _classPrivateFieldGet(this, _score_range), _classPrivateFieldGet(this, _invalid_range_code), _classPrivateFieldGet(this, _error_class)))) {
- _classPrivateFieldSet(this, _min, min);
- }
- }
- /**
- * Getter for #max
- * @return {string}
- */
-
- }, {
- key: "max",
- get: function get() {
- return _classPrivateFieldGet(this, _max);
- }
- /**
- * Setter for #max
- * @param {string} max
- */
- ,
- set: function set(max) {
- if (checkValidFormat(max, _classPrivateFieldGet(this, _decimal_regex), _classPrivateFieldGet(this, _invalid_type_code), _classPrivateFieldGet(this, _error_class)) && (!_classPrivateFieldGet(this, _score_range) || checkValidRange(max, _classPrivateFieldGet(this, _score_range), _classPrivateFieldGet(this, _invalid_range_code), _classPrivateFieldGet(this, _error_class)))) {
- _classPrivateFieldSet(this, _max, max);
- }
- }
- /**
- * toJSON for *.score
- * @return {{min: string, max: string, raw: string}}
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'raw': this.raw,
- 'min': this.min,
- 'max': this.max
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIScore;
-}(BaseCMI);
-/**
- * Base class for cmi *.n objects
- */
-
-
-exports.CMIScore = CMIScore;
-
-var _errorCode = /*#__PURE__*/new WeakMap();
-
-var _errorClass = /*#__PURE__*/new WeakMap();
-
-var _children3 = /*#__PURE__*/new WeakMap();
-
-var CMIArray = /*#__PURE__*/function (_BaseCMI2) {
- _inherits(CMIArray, _BaseCMI2);
-
- var _super2 = _createSuper(CMIArray);
-
- /**
- * Constructor cmi *.n arrays
- * @param {string} children
- * @param {number} errorCode
- * @param {class} errorClass
- */
- function CMIArray(_ref2) {
- var _this2;
-
- var children = _ref2.children,
- errorCode = _ref2.errorCode,
- errorClass = _ref2.errorClass;
-
- _classCallCheck(this, CMIArray);
-
- _this2 = _super2.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _errorCode, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _errorClass, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _children3, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldSet(_assertThisInitialized(_this2), _children3, children);
-
- _classPrivateFieldSet(_assertThisInitialized(_this2), _errorCode, errorCode);
-
- _classPrivateFieldSet(_assertThisInitialized(_this2), _errorClass, errorClass);
-
- _this2.childArray = [];
- return _this2;
- }
-
- _createClass(CMIArray, [{
- key: "_children",
- get:
- /**
- * Getter for _children
- * @return {*}
- */
- function get() {
- return _classPrivateFieldGet(this, _children3);
- }
- /**
- * Setter for _children. Just throws an error.
- * @param {string} _children
- */
- ,
- set: function set(_children) {
- throw new (_classPrivateFieldGet(this, _errorClass).prototype.constructor)(_classPrivateFieldGet(this, _errorCode));
- }
- /**
- * Getter for _count
- * @return {number}
- */
-
- }, {
- key: "_count",
- get: function get() {
- return this.childArray.length;
- }
- /**
- * Setter for _count. Just throws an error.
- * @param {number} _count
- */
- ,
- set: function set(_count) {
- throw new (_classPrivateFieldGet(this, _errorClass).prototype.constructor)(_classPrivateFieldGet(this, _errorCode));
- }
- /**
- * toJSON for *.n arrays
- * @return {object}
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {};
-
- for (var i = 0; i < this.childArray.length; i++) {
- result[i + ''] = this.childArray[i];
- }
-
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIArray;
-}(BaseCMI);
-
-exports.CMIArray = CMIArray;
-
-},{"../constants/api_constants":6,"../constants/error_codes":7,"../constants/regex":9}],5:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.CMIObjectivesObject = exports.CMIInteractionsObjectivesObject = exports.CMIInteractionsObject = exports.CMIInteractionsCorrectResponsesObject = exports.CMICommentsObject = exports.CMI = exports.ADL = void 0;
-
-var _common = require("./common");
-
-var _api_constants = _interopRequireDefault(require("../constants/api_constants"));
-
-var _regex = _interopRequireDefault(require("../constants/regex"));
-
-var _error_codes = _interopRequireDefault(require("../constants/error_codes"));
-
-var _response_constants = _interopRequireDefault(require("../constants/response_constants"));
-
-var _exceptions = require("../exceptions");
-
-var Util = _interopRequireWildcard(require("../utilities"));
-
-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; }
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _get() { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(arguments.length < 3 ? target : receiver); } return desc.value; }; } return _get.apply(this, arguments); }
-
-function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
-
-function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
-
-function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
-
-function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-
-function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
-
-function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
-
-function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-
-var scorm2004_constants = _api_constants["default"].scorm2004;
-var scorm2004_error_codes = _error_codes["default"].scorm2004;
-var learner_responses = _response_constants["default"].learner;
-var scorm2004_regex = _regex["default"].scorm2004;
-/**
- * Helper method for throwing Read Only error
- */
-
-function throwReadOnlyError() {
- throw new _exceptions.Scorm2004ValidationError(scorm2004_error_codes.READ_ONLY_ELEMENT);
-}
-/**
- * Helper method for throwing Write Only error
- */
-
-
-function throwWriteOnlyError() {
- throw new _exceptions.Scorm2004ValidationError(scorm2004_error_codes.WRITE_ONLY_ELEMENT);
-}
-/**
- * Helper method for throwing Type Mismatch error
- */
-
-
-function throwTypeMismatchError() {
- throw new _exceptions.Scorm2004ValidationError(scorm2004_error_codes.TYPE_MISMATCH);
-}
-/**
- * Helper method for throwing Dependency Not Established error
- */
-
-
-function throwDependencyNotEstablishedError() {
- throw new _exceptions.Scorm2004ValidationError(scorm2004_error_codes.DEPENDENCY_NOT_ESTABLISHED);
-}
-/**
- * Helper method for throwing Dependency Not Established error
- */
-
-
-function throwGeneralSetError() {
- throw new _exceptions.Scorm2004ValidationError(scorm2004_error_codes.GENERAL_SET_FAILURE);
-}
-/**
- * Helper method, no reason to have to pass the same error codes every time
- * @param {*} value
- * @param {string} regexPattern
- * @param {boolean} allowEmptyString
- * @return {boolean}
- */
-
-
-function check2004ValidFormat(value, regexPattern, allowEmptyString) {
- return (0, _common.checkValidFormat)(value, regexPattern, scorm2004_error_codes.TYPE_MISMATCH, _exceptions.Scorm2004ValidationError, allowEmptyString);
-}
-/**
- * Helper method, no reason to have to pass the same error codes every time
- * @param {*} value
- * @param {string} rangePattern
- * @return {boolean}
- */
-
-
-function check2004ValidRange(value, rangePattern) {
- return (0, _common.checkValidRange)(value, rangePattern, scorm2004_error_codes.VALUE_OUT_OF_RANGE, _exceptions.Scorm2004ValidationError);
-}
-/**
- * Class representing cmi object for SCORM 2004
- */
-
-
-var _version2 = /*#__PURE__*/new WeakMap();
-
-var _children2 = /*#__PURE__*/new WeakMap();
-
-var _completion_status = /*#__PURE__*/new WeakMap();
-
-var _completion_threshold = /*#__PURE__*/new WeakMap();
-
-var _credit = /*#__PURE__*/new WeakMap();
-
-var _entry = /*#__PURE__*/new WeakMap();
-
-var _exit = /*#__PURE__*/new WeakMap();
-
-var _launch_data = /*#__PURE__*/new WeakMap();
-
-var _learner_id = /*#__PURE__*/new WeakMap();
-
-var _learner_name = /*#__PURE__*/new WeakMap();
-
-var _location = /*#__PURE__*/new WeakMap();
-
-var _max_time_allowed = /*#__PURE__*/new WeakMap();
-
-var _mode = /*#__PURE__*/new WeakMap();
-
-var _progress_measure = /*#__PURE__*/new WeakMap();
-
-var _scaled_passing_score = /*#__PURE__*/new WeakMap();
-
-var _session_time = /*#__PURE__*/new WeakMap();
-
-var _success_status = /*#__PURE__*/new WeakMap();
-
-var _suspend_data = /*#__PURE__*/new WeakMap();
-
-var _time_limit_action = /*#__PURE__*/new WeakMap();
-
-var _total_time = /*#__PURE__*/new WeakMap();
-
-var CMI = /*#__PURE__*/function (_BaseCMI) {
- _inherits(CMI, _BaseCMI);
-
- var _super = _createSuper(CMI);
-
- /**
- * Constructor for the SCORM 2004 cmi object
- * @param {boolean} initialized
- */
- function CMI(initialized) {
- var _this;
-
- _classCallCheck(this, CMI);
-
- _this = _super.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _version2, {
- writable: true,
- value: '1.0'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _children2, {
- writable: true,
- value: scorm2004_constants.cmi_children
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _completion_status, {
- writable: true,
- value: 'unknown'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _completion_threshold, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _credit, {
- writable: true,
- value: 'credit'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _entry, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _exit, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _launch_data, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _learner_id, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _learner_name, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _location, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _max_time_allowed, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _mode, {
- writable: true,
- value: 'normal'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _progress_measure, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _scaled_passing_score, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _session_time, {
- writable: true,
- value: 'PT0H0M0S'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _success_status, {
- writable: true,
- value: 'unknown'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _suspend_data, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _time_limit_action, {
- writable: true,
- value: 'continue,no message'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _total_time, {
- writable: true,
- value: ''
- });
-
- _this.learner_preference = new CMILearnerPreference();
- _this.score = new Scorm2004CMIScore();
- _this.comments_from_learner = new CMICommentsFromLearner();
- _this.comments_from_lms = new CMICommentsFromLMS();
- _this.interactions = new CMIInteractions();
- _this.objectives = new CMIObjectives();
- if (initialized) _this.initialize();
- return _this;
- }
-
- _createClass(CMI, [{
- key: "initialize",
- value:
- /**
- * Called when the API has been initialized after the CMI has been created
- */
- function initialize() {
- var _this$learner_prefere, _this$score, _this$comments_from_l, _this$comments_from_l2, _this$interactions, _this$objectives;
-
- _get(_getPrototypeOf(CMI.prototype), "initialize", this).call(this);
-
- (_this$learner_prefere = this.learner_preference) === null || _this$learner_prefere === void 0 ? void 0 : _this$learner_prefere.initialize();
- (_this$score = this.score) === null || _this$score === void 0 ? void 0 : _this$score.initialize();
- (_this$comments_from_l = this.comments_from_learner) === null || _this$comments_from_l === void 0 ? void 0 : _this$comments_from_l.initialize();
- (_this$comments_from_l2 = this.comments_from_lms) === null || _this$comments_from_l2 === void 0 ? void 0 : _this$comments_from_l2.initialize();
- (_this$interactions = this.interactions) === null || _this$interactions === void 0 ? void 0 : _this$interactions.initialize();
- (_this$objectives = this.objectives) === null || _this$objectives === void 0 ? void 0 : _this$objectives.initialize();
- }
- /**
- * Getter for #_version
- * @return {string}
- * @private
- */
-
- }, {
- key: "_version",
- get: function get() {
- return _classPrivateFieldGet(this, _version2);
- }
- /**
- * Setter for #_version. Just throws an error.
- * @param {string} _version
- * @private
- */
- ,
- set: function set(_version) {
- throwReadOnlyError();
- }
- /**
- * Getter for #_children
- * @return {string}
- * @private
- */
-
- }, {
- key: "_children",
- get: function get() {
- return _classPrivateFieldGet(this, _children2);
- }
- /**
- * Setter for #_children. Just throws an error.
- * @param {number} _children
- * @private
- */
- ,
- set: function set(_children) {
- throwReadOnlyError();
- }
- /**
- * Getter for #completion_status
- * @return {string}
- */
-
- }, {
- key: "completion_status",
- get: function get() {
- return _classPrivateFieldGet(this, _completion_status);
- }
- /**
- * Setter for #completion_status
- * @param {string} completion_status
- */
- ,
- set: function set(completion_status) {
- if (check2004ValidFormat(completion_status, scorm2004_regex.CMICStatus)) {
- _classPrivateFieldSet(this, _completion_status, completion_status);
- }
- }
- /**
- * Getter for #completion_threshold
- * @return {string}
- */
-
- }, {
- key: "completion_threshold",
- get: function get() {
- return _classPrivateFieldGet(this, _completion_threshold);
- }
- /**
- * Setter for #completion_threshold. Can only be called before initialization.
- * @param {string} completion_threshold
- */
- ,
- set: function set(completion_threshold) {
- !this.initialized ? _classPrivateFieldSet(this, _completion_threshold, completion_threshold) : throwReadOnlyError();
- }
- /**
- * Setter for #credit
- * @return {string}
- */
-
- }, {
- key: "credit",
- get: function get() {
- return _classPrivateFieldGet(this, _credit);
- }
- /**
- * Setter for #credit. Can only be called before initialization.
- * @param {string} credit
- */
- ,
- set: function set(credit) {
- !this.initialized ? _classPrivateFieldSet(this, _credit, credit) : throwReadOnlyError();
- }
- /**
- * Getter for #entry
- * @return {string}
- */
-
- }, {
- key: "entry",
- get: function get() {
- return _classPrivateFieldGet(this, _entry);
- }
- /**
- * Setter for #entry. Can only be called before initialization.
- * @param {string} entry
- */
- ,
- set: function set(entry) {
- !this.initialized ? _classPrivateFieldSet(this, _entry, entry) : throwReadOnlyError();
- }
- /**
- * Getter for #exit. Should only be called during JSON export.
- * @return {string}
- */
-
- }, {
- key: "exit",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _exit);
- }
- /**
- * Getter for #exit
- * @param {string} exit
- */
- ,
- set: function set(exit) {
- if (check2004ValidFormat(exit, scorm2004_regex.CMIExit, true)) {
- _classPrivateFieldSet(this, _exit, exit);
- }
- }
- /**
- * Getter for #launch_data
- * @return {string}
- */
-
- }, {
- key: "launch_data",
- get: function get() {
- return _classPrivateFieldGet(this, _launch_data);
- }
- /**
- * Setter for #launch_data. Can only be called before initialization.
- * @param {string} launch_data
- */
- ,
- set: function set(launch_data) {
- !this.initialized ? _classPrivateFieldSet(this, _launch_data, launch_data) : throwReadOnlyError();
- }
- /**
- * Getter for #learner_id
- * @return {string}
- */
-
- }, {
- key: "learner_id",
- get: function get() {
- return _classPrivateFieldGet(this, _learner_id);
- }
- /**
- * Setter for #learner_id. Can only be called before initialization.
- * @param {string} learner_id
- */
- ,
- set: function set(learner_id) {
- !this.initialized ? _classPrivateFieldSet(this, _learner_id, learner_id) : throwReadOnlyError();
- }
- /**
- * Getter for #learner_name
- * @return {string}
- */
-
- }, {
- key: "learner_name",
- get: function get() {
- return _classPrivateFieldGet(this, _learner_name);
- }
- /**
- * Setter for #learner_name. Can only be called before initialization.
- * @param {string} learner_name
- */
- ,
- set: function set(learner_name) {
- !this.initialized ? _classPrivateFieldSet(this, _learner_name, learner_name) : throwReadOnlyError();
- }
- /**
- * Getter for #location
- * @return {string}
- */
-
- }, {
- key: "location",
- get: function get() {
- return _classPrivateFieldGet(this, _location);
- }
- /**
- * Setter for #location
- * @param {string} location
- */
- ,
- set: function set(location) {
- if (check2004ValidFormat(location, scorm2004_regex.CMIString1000)) {
- _classPrivateFieldSet(this, _location, location);
- }
- }
- /**
- * Getter for #max_time_allowed
- * @return {string}
- */
-
- }, {
- key: "max_time_allowed",
- get: function get() {
- return _classPrivateFieldGet(this, _max_time_allowed);
- }
- /**
- * Setter for #max_time_allowed. Can only be called before initialization.
- * @param {string} max_time_allowed
- */
- ,
- set: function set(max_time_allowed) {
- !this.initialized ? _classPrivateFieldSet(this, _max_time_allowed, max_time_allowed) : throwReadOnlyError();
- }
- /**
- * Getter for #mode
- * @return {string}
- */
-
- }, {
- key: "mode",
- get: function get() {
- return _classPrivateFieldGet(this, _mode);
- }
- /**
- * Setter for #mode. Can only be called before initialization.
- * @param {string} mode
- */
- ,
- set: function set(mode) {
- !this.initialized ? _classPrivateFieldSet(this, _mode, mode) : throwReadOnlyError();
- }
- /**
- * Getter for #progress_measure
- * @return {string}
- */
-
- }, {
- key: "progress_measure",
- get: function get() {
- return _classPrivateFieldGet(this, _progress_measure);
- }
- /**
- * Setter for #progress_measure
- * @param {string} progress_measure
- */
- ,
- set: function set(progress_measure) {
- if (check2004ValidFormat(progress_measure, scorm2004_regex.CMIDecimal) && check2004ValidRange(progress_measure, scorm2004_regex.progress_range)) {
- _classPrivateFieldSet(this, _progress_measure, progress_measure);
- }
- }
- /**
- * Getter for #scaled_passing_score
- * @return {string}
- */
-
- }, {
- key: "scaled_passing_score",
- get: function get() {
- return _classPrivateFieldGet(this, _scaled_passing_score);
- }
- /**
- * Setter for #scaled_passing_score. Can only be called before initialization.
- * @param {string} scaled_passing_score
- */
- ,
- set: function set(scaled_passing_score) {
- !this.initialized ? _classPrivateFieldSet(this, _scaled_passing_score, scaled_passing_score) : throwReadOnlyError();
- }
- /**
- * Getter for #session_time. Should only be called during JSON export.
- * @return {string}
- */
-
- }, {
- key: "session_time",
- get: function get() {
- return !this.jsonString ? throwWriteOnlyError() : _classPrivateFieldGet(this, _session_time);
- }
- /**
- * Setter for #session_time
- * @param {string} session_time
- */
- ,
- set: function set(session_time) {
- if (check2004ValidFormat(session_time, scorm2004_regex.CMITimespan)) {
- _classPrivateFieldSet(this, _session_time, session_time);
- }
- }
- /**
- * Getter for #success_status
- * @return {string}
- */
-
- }, {
- key: "success_status",
- get: function get() {
- return _classPrivateFieldGet(this, _success_status);
- }
- /**
- * Setter for #success_status
- * @param {string} success_status
- */
- ,
- set: function set(success_status) {
- if (check2004ValidFormat(success_status, scorm2004_regex.CMISStatus)) {
- _classPrivateFieldSet(this, _success_status, success_status);
- }
- }
- /**
- * Getter for #suspend_data
- * @return {string}
- */
-
- }, {
- key: "suspend_data",
- get: function get() {
- return _classPrivateFieldGet(this, _suspend_data);
- }
- /**
- * Setter for #suspend_data
- * @param {string} suspend_data
- */
- ,
- set: function set(suspend_data) {
- if (check2004ValidFormat(suspend_data, scorm2004_regex.CMIString64000, true)) {
- _classPrivateFieldSet(this, _suspend_data, suspend_data);
- }
- }
- /**
- * Getter for #time_limit_action
- * @return {string}
- */
-
- }, {
- key: "time_limit_action",
- get: function get() {
- return _classPrivateFieldGet(this, _time_limit_action);
- }
- /**
- * Setter for #time_limit_action. Can only be called before initialization.
- * @param {string} time_limit_action
- */
- ,
- set: function set(time_limit_action) {
- !this.initialized ? _classPrivateFieldSet(this, _time_limit_action, time_limit_action) : throwReadOnlyError();
- }
- /**
- * Getter for #total_time
- * @return {string}
- */
-
- }, {
- key: "total_time",
- get: function get() {
- return _classPrivateFieldGet(this, _total_time);
- }
- /**
- * Setter for #total_time. Can only be called before initialization.
- * @param {string} total_time
- */
- ,
- set: function set(total_time) {
- !this.initialized ? _classPrivateFieldSet(this, _total_time, total_time) : throwReadOnlyError();
- }
- /**
- * Adds the current session time to the existing total time.
- *
- * @return {string} ISO8601 Duration
- */
-
- }, {
- key: "getCurrentTotalTime",
- value: function getCurrentTotalTime() {
- var sessionTime = _classPrivateFieldGet(this, _session_time);
-
- var startTime = this.start_time;
-
- if (typeof startTime !== 'undefined' && startTime !== null) {
- var seconds = new Date().getTime() - startTime;
- sessionTime = Util.getSecondsAsISODuration(seconds / 1000);
- }
-
- return Util.addTwoDurations(_classPrivateFieldGet(this, _total_time), sessionTime, scorm2004_regex.CMITimespan);
- }
- /**
- * toJSON for cmi
- *
- * @return {
- * {
- * comments_from_learner: CMICommentsFromLearner,
- * comments_from_lms: CMICommentsFromLMS,
- * completion_status: string,
- * completion_threshold: string,
- * credit: string,
- * entry: string,
- * exit: string,
- * interactions: CMIInteractions,
- * launch_data: string,
- * learner_id: string,
- * learner_name: string,
- * learner_preference: CMILearnerPreference,
- * location: string,
- * max_time_allowed: string,
- * mode: string,
- * objectives: CMIObjectives,
- * progress_measure: string,
- * scaled_passing_score: string,
- * score: Scorm2004CMIScore,
- * session_time: string,
- * success_status: string,
- * suspend_data: string,
- * time_limit_action: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'comments_from_learner': this.comments_from_learner,
- 'comments_from_lms': this.comments_from_lms,
- 'completion_status': this.completion_status,
- 'completion_threshold': this.completion_threshold,
- 'credit': this.credit,
- 'entry': this.entry,
- 'exit': this.exit,
- 'interactions': this.interactions,
- 'launch_data': this.launch_data,
- 'learner_id': this.learner_id,
- 'learner_name': this.learner_name,
- 'learner_preference': this.learner_preference,
- 'location': this.location,
- 'max_time_allowed': this.max_time_allowed,
- 'mode': this.mode,
- 'objectives': this.objectives,
- 'progress_measure': this.progress_measure,
- 'scaled_passing_score': this.scaled_passing_score,
- 'score': this.score,
- 'session_time': this.session_time,
- 'success_status': this.success_status,
- 'suspend_data': this.suspend_data,
- 'time_limit_action': this.time_limit_action
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMI;
-}(_common.BaseCMI);
-/**
- * Class for SCORM 2004's cmi.learner_preference object
- */
-
-
-exports.CMI = CMI;
-
-var _children3 = /*#__PURE__*/new WeakMap();
-
-var _audio_level = /*#__PURE__*/new WeakMap();
-
-var _language = /*#__PURE__*/new WeakMap();
-
-var _delivery_speed = /*#__PURE__*/new WeakMap();
-
-var _audio_captioning = /*#__PURE__*/new WeakMap();
-
-var CMILearnerPreference = /*#__PURE__*/function (_BaseCMI2) {
- _inherits(CMILearnerPreference, _BaseCMI2);
-
- var _super2 = _createSuper(CMILearnerPreference);
-
- /**
- * Constructor for cmi.learner_preference
- */
- function CMILearnerPreference() {
- var _this2;
-
- _classCallCheck(this, CMILearnerPreference);
-
- _this2 = _super2.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _children3, {
- writable: true,
- value: scorm2004_constants.student_preference_children
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _audio_level, {
- writable: true,
- value: '1'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _language, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _delivery_speed, {
- writable: true,
- value: '1'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this2), _audio_captioning, {
- writable: true,
- value: '0'
- });
-
- return _this2;
- }
- /**
- * Getter for #_children
- * @return {string}
- * @private
- */
-
-
- _createClass(CMILearnerPreference, [{
- key: "_children",
- get: function get() {
- return _classPrivateFieldGet(this, _children3);
- }
- /**
- * Setter for #_children. Just throws an error.
- * @param {string} _children
- * @private
- */
- ,
- set: function set(_children) {
- throwReadOnlyError();
- }
- /**
- * Getter for #audio_level
- * @return {string}
- */
-
- }, {
- key: "audio_level",
- get: function get() {
- return _classPrivateFieldGet(this, _audio_level);
- }
- /**
- * Setter for #audio_level
- * @param {string} audio_level
- */
- ,
- set: function set(audio_level) {
- if (check2004ValidFormat(audio_level, scorm2004_regex.CMIDecimal) && check2004ValidRange(audio_level, scorm2004_regex.audio_range)) {
- _classPrivateFieldSet(this, _audio_level, audio_level);
- }
- }
- /**
- * Getter for #language
- * @return {string}
- */
-
- }, {
- key: "language",
- get: function get() {
- return _classPrivateFieldGet(this, _language);
- }
- /**
- * Setter for #language
- * @param {string} language
- */
- ,
- set: function set(language) {
- if (check2004ValidFormat(language, scorm2004_regex.CMILang)) {
- _classPrivateFieldSet(this, _language, language);
- }
- }
- /**
- * Getter for #delivery_speed
- * @return {string}
- */
-
- }, {
- key: "delivery_speed",
- get: function get() {
- return _classPrivateFieldGet(this, _delivery_speed);
- }
- /**
- * Setter for #delivery_speed
- * @param {string} delivery_speed
- */
- ,
- set: function set(delivery_speed) {
- if (check2004ValidFormat(delivery_speed, scorm2004_regex.CMIDecimal) && check2004ValidRange(delivery_speed, scorm2004_regex.speed_range)) {
- _classPrivateFieldSet(this, _delivery_speed, delivery_speed);
- }
- }
- /**
- * Getter for #audio_captioning
- * @return {string}
- */
-
- }, {
- key: "audio_captioning",
- get: function get() {
- return _classPrivateFieldGet(this, _audio_captioning);
- }
- /**
- * Setter for #audio_captioning
- * @param {string} audio_captioning
- */
- ,
- set: function set(audio_captioning) {
- if (check2004ValidFormat(audio_captioning, scorm2004_regex.CMISInteger) && check2004ValidRange(audio_captioning, scorm2004_regex.text_range)) {
- _classPrivateFieldSet(this, _audio_captioning, audio_captioning);
- }
- }
- /**
- * toJSON for cmi.learner_preference
- *
- * @return {
- * {
- * audio_level: string,
- * language: string,
- * delivery_speed: string,
- * audio_captioning: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'audio_level': this.audio_level,
- 'language': this.language,
- 'delivery_speed': this.delivery_speed,
- 'audio_captioning': this.audio_captioning
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMILearnerPreference;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 2004's cmi.interactions object
- */
-
-
-var CMIInteractions = /*#__PURE__*/function (_CMIArray) {
- _inherits(CMIInteractions, _CMIArray);
-
- var _super3 = _createSuper(CMIInteractions);
-
- /**
- * Constructor for cmi.objectives Array
- */
- function CMIInteractions() {
- _classCallCheck(this, CMIInteractions);
-
- return _super3.call(this, {
- children: scorm2004_constants.interactions_children,
- errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError
- });
- }
-
- return _createClass(CMIInteractions);
-}(_common.CMIArray);
-/**
- * Class representing SCORM 2004's cmi.objectives object
- */
-
-
-var CMIObjectives = /*#__PURE__*/function (_CMIArray2) {
- _inherits(CMIObjectives, _CMIArray2);
-
- var _super4 = _createSuper(CMIObjectives);
-
- /**
- * Constructor for cmi.objectives Array
- */
- function CMIObjectives() {
- _classCallCheck(this, CMIObjectives);
-
- return _super4.call(this, {
- children: scorm2004_constants.objectives_children,
- errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError
- });
- }
-
- return _createClass(CMIObjectives);
-}(_common.CMIArray);
-/**
- * Class representing SCORM 2004's cmi.comments_from_lms object
- */
-
-
-var CMICommentsFromLMS = /*#__PURE__*/function (_CMIArray3) {
- _inherits(CMICommentsFromLMS, _CMIArray3);
-
- var _super5 = _createSuper(CMICommentsFromLMS);
-
- /**
- * Constructor for cmi.comments_from_lms Array
- */
- function CMICommentsFromLMS() {
- _classCallCheck(this, CMICommentsFromLMS);
-
- return _super5.call(this, {
- children: scorm2004_constants.comments_children,
- errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError
- });
- }
-
- return _createClass(CMICommentsFromLMS);
-}(_common.CMIArray);
-/**
- * Class representing SCORM 2004's cmi.comments_from_learner object
- */
-
-
-var CMICommentsFromLearner = /*#__PURE__*/function (_CMIArray4) {
- _inherits(CMICommentsFromLearner, _CMIArray4);
-
- var _super6 = _createSuper(CMICommentsFromLearner);
-
- /**
- * Constructor for cmi.comments_from_learner Array
- */
- function CMICommentsFromLearner() {
- _classCallCheck(this, CMICommentsFromLearner);
-
- return _super6.call(this, {
- children: scorm2004_constants.comments_children,
- errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError
- });
- }
-
- return _createClass(CMICommentsFromLearner);
-}(_common.CMIArray);
-/**
- * Class for SCORM 2004's cmi.interaction.n object
- */
-
-
-var _id = /*#__PURE__*/new WeakMap();
-
-var _type = /*#__PURE__*/new WeakMap();
-
-var _timestamp = /*#__PURE__*/new WeakMap();
-
-var _weighting = /*#__PURE__*/new WeakMap();
-
-var _learner_response = /*#__PURE__*/new WeakMap();
-
-var _result = /*#__PURE__*/new WeakMap();
-
-var _latency = /*#__PURE__*/new WeakMap();
-
-var _description = /*#__PURE__*/new WeakMap();
-
-var CMIInteractionsObject = /*#__PURE__*/function (_BaseCMI3) {
- _inherits(CMIInteractionsObject, _BaseCMI3);
-
- var _super7 = _createSuper(CMIInteractionsObject);
-
- /**
- * Constructor for cmi.interaction.n
- */
- function CMIInteractionsObject() {
- var _this3;
-
- _classCallCheck(this, CMIInteractionsObject);
-
- _this3 = _super7.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _id, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _type, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _timestamp, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _weighting, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _learner_response, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _result, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _latency, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this3), _description, {
- writable: true,
- value: ''
- });
-
- _this3.objectives = new _common.CMIArray({
- errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError,
- children: scorm2004_constants.objectives_children
- });
- _this3.correct_responses = new _common.CMIArray({
- errorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- errorClass: _exceptions.Scorm2004ValidationError,
- children: scorm2004_constants.correct_responses_children
- });
- return _this3;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(CMIInteractionsObject, [{
- key: "initialize",
- value: function initialize() {
- var _this$objectives2, _this$correct_respons;
-
- _get(_getPrototypeOf(CMIInteractionsObject.prototype), "initialize", this).call(this);
-
- (_this$objectives2 = this.objectives) === null || _this$objectives2 === void 0 ? void 0 : _this$objectives2.initialize();
- (_this$correct_respons = this.correct_responses) === null || _this$correct_respons === void 0 ? void 0 : _this$correct_respons.initialize();
- }
- /**
- * Getter for #id
- * @return {string}
- */
-
- }, {
- key: "id",
- get: function get() {
- return _classPrivateFieldGet(this, _id);
- }
- /**
- * Setter for #id
- * @param {string} id
- */
- ,
- set: function set(id) {
- if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) {
- _classPrivateFieldSet(this, _id, id);
- }
- }
- /**
- * Getter for #type
- * @return {string}
- */
-
- }, {
- key: "type",
- get: function get() {
- return _classPrivateFieldGet(this, _type);
- }
- /**
- * Setter for #type
- * @param {string} type
- */
- ,
- set: function set(type) {
- if (this.initialized && _classPrivateFieldGet(this, _id) === '') {
- throwDependencyNotEstablishedError();
- } else {
- if (check2004ValidFormat(type, scorm2004_regex.CMIType)) {
- _classPrivateFieldSet(this, _type, type);
- }
- }
- }
- /**
- * Getter for #timestamp
- * @return {string}
- */
-
- }, {
- key: "timestamp",
- get: function get() {
- return _classPrivateFieldGet(this, _timestamp);
- }
- /**
- * Setter for #timestamp
- * @param {string} timestamp
- */
- ,
- set: function set(timestamp) {
- if (this.initialized && _classPrivateFieldGet(this, _id) === '') {
- throwDependencyNotEstablishedError();
- } else {
- if (check2004ValidFormat(timestamp, scorm2004_regex.CMITime)) {
- _classPrivateFieldSet(this, _timestamp, timestamp);
- }
- }
- }
- /**
- * Getter for #weighting
- * @return {string}
- */
-
- }, {
- key: "weighting",
- get: function get() {
- return _classPrivateFieldGet(this, _weighting);
- }
- /**
- * Setter for #weighting
- * @param {string} weighting
- */
- ,
- set: function set(weighting) {
- if (this.initialized && _classPrivateFieldGet(this, _id) === '') {
- throwDependencyNotEstablishedError();
- } else {
- if (check2004ValidFormat(weighting, scorm2004_regex.CMIDecimal)) {
- _classPrivateFieldSet(this, _weighting, weighting);
- }
- }
- }
- /**
- * Getter for #learner_response
- * @return {string}
- */
-
- }, {
- key: "learner_response",
- get: function get() {
- return _classPrivateFieldGet(this, _learner_response);
- }
- /**
- * Setter for #learner_response. Does type validation to make sure response
- * matches SCORM 2004's spec
- * @param {string} learner_response
- */
- ,
- set: function set(learner_response) {
- if (this.initialized && (_classPrivateFieldGet(this, _type) === '' || _classPrivateFieldGet(this, _id) === '')) {
- throwDependencyNotEstablishedError();
- } else {
- var nodes = [];
- var response_type = learner_responses[this.type];
-
- if (response_type) {
- if (response_type !== null && response_type !== void 0 && response_type.delimiter) {
- nodes = learner_response.split(response_type.delimiter);
- } else {
- nodes[0] = learner_response;
- }
-
- if (nodes.length > 0 && nodes.length <= response_type.max) {
- var formatRegex = new RegExp(response_type.format);
-
- for (var i = 0; i < nodes.length; i++) {
- if (response_type !== null && response_type !== void 0 && response_type.delimiter2) {
- var values = nodes[i].split(response_type.delimiter2);
-
- if (values.length === 2) {
- if (!values[0].match(formatRegex)) {
- throwTypeMismatchError();
- } else {
- if (!values[1].match(new RegExp(response_type.format2))) {
- throwTypeMismatchError();
- }
- }
- } else {
- throwTypeMismatchError();
- }
- } else {
- if (!nodes[i].match(formatRegex)) {
- throwTypeMismatchError();
- } else {
- if (nodes[i] !== '' && response_type.unique) {
- for (var j = 0; j < i; j++) {
- if (nodes[i] === nodes[j]) {
- throwTypeMismatchError();
- }
- }
- }
- }
- }
- }
- } else {
- throwGeneralSetError();
- }
-
- _classPrivateFieldSet(this, _learner_response, learner_response);
- } else {
- throwTypeMismatchError();
- }
- }
- }
- /**
- * Getter for #result
- * @return {string}
- */
-
- }, {
- key: "result",
- get: function get() {
- return _classPrivateFieldGet(this, _result);
- }
- /**
- * Setter for #result
- * @param {string} result
- */
- ,
- set: function set(result) {
- if (check2004ValidFormat(result, scorm2004_regex.CMIResult)) {
- _classPrivateFieldSet(this, _result, result);
- }
- }
- /**
- * Getter for #latency
- * @return {string}
- */
-
- }, {
- key: "latency",
- get: function get() {
- return _classPrivateFieldGet(this, _latency);
- }
- /**
- * Setter for #latency
- * @param {string} latency
- */
- ,
- set: function set(latency) {
- if (this.initialized && _classPrivateFieldGet(this, _id) === '') {
- throwDependencyNotEstablishedError();
- } else {
- if (check2004ValidFormat(latency, scorm2004_regex.CMITimespan)) {
- _classPrivateFieldSet(this, _latency, latency);
- }
- }
- }
- /**
- * Getter for #description
- * @return {string}
- */
-
- }, {
- key: "description",
- get: function get() {
- return _classPrivateFieldGet(this, _description);
- }
- /**
- * Setter for #description
- * @param {string} description
- */
- ,
- set: function set(description) {
- if (this.initialized && _classPrivateFieldGet(this, _id) === '') {
- throwDependencyNotEstablishedError();
- } else {
- if (check2004ValidFormat(description, scorm2004_regex.CMILangString250, true)) {
- _classPrivateFieldSet(this, _description, description);
- }
- }
- }
- /**
- * toJSON for cmi.interactions.n
- *
- * @return {
- * {
- * id: string,
- * type: string,
- * objectives: CMIArray,
- * timestamp: string,
- * correct_responses: CMIArray,
- * weighting: string,
- * learner_response: string,
- * result: string,
- * latency: string,
- * description: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'id': this.id,
- 'type': this.type,
- 'objectives': this.objectives,
- 'timestamp': this.timestamp,
- 'weighting': this.weighting,
- 'learner_response': this.learner_response,
- 'result': this.result,
- 'latency': this.latency,
- 'description': this.description,
- 'correct_responses': this.correct_responses
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIInteractionsObject;
-}(_common.BaseCMI);
-/**
- * Class for SCORM 2004's cmi.objectives.n object
- */
-
-
-exports.CMIInteractionsObject = CMIInteractionsObject;
-
-var _id2 = /*#__PURE__*/new WeakMap();
-
-var _success_status2 = /*#__PURE__*/new WeakMap();
-
-var _completion_status2 = /*#__PURE__*/new WeakMap();
-
-var _progress_measure2 = /*#__PURE__*/new WeakMap();
-
-var _description2 = /*#__PURE__*/new WeakMap();
-
-var CMIObjectivesObject = /*#__PURE__*/function (_BaseCMI4) {
- _inherits(CMIObjectivesObject, _BaseCMI4);
-
- var _super8 = _createSuper(CMIObjectivesObject);
-
- /**
- * Constructor for cmi.objectives.n
- */
- function CMIObjectivesObject() {
- var _this4;
-
- _classCallCheck(this, CMIObjectivesObject);
-
- _this4 = _super8.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _id2, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _success_status2, {
- writable: true,
- value: 'unknown'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _completion_status2, {
- writable: true,
- value: 'unknown'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _progress_measure2, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this4), _description2, {
- writable: true,
- value: ''
- });
-
- _this4.score = new Scorm2004CMIScore();
- return _this4;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(CMIObjectivesObject, [{
- key: "initialize",
- value: function initialize() {
- var _this$score2;
-
- _get(_getPrototypeOf(CMIObjectivesObject.prototype), "initialize", this).call(this);
-
- (_this$score2 = this.score) === null || _this$score2 === void 0 ? void 0 : _this$score2.initialize();
- }
- /**
- * Getter for #id
- * @return {string}
- */
-
- }, {
- key: "id",
- get: function get() {
- return _classPrivateFieldGet(this, _id2);
- }
- /**
- * Setter for #id
- * @param {string} id
- */
- ,
- set: function set(id) {
- if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) {
- _classPrivateFieldSet(this, _id2, id);
- }
- }
- /**
- * Getter for #success_status
- * @return {string}
- */
-
- }, {
- key: "success_status",
- get: function get() {
- return _classPrivateFieldGet(this, _success_status2);
- }
- /**
- * Setter for #success_status
- * @param {string} success_status
- */
- ,
- set: function set(success_status) {
- if (this.initialized && _classPrivateFieldGet(this, _id2) === '') {
- throwDependencyNotEstablishedError();
- } else {
- if (check2004ValidFormat(success_status, scorm2004_regex.CMISStatus)) {
- _classPrivateFieldSet(this, _success_status2, success_status);
- }
- }
- }
- /**
- * Getter for #completion_status
- * @return {string}
- */
-
- }, {
- key: "completion_status",
- get: function get() {
- return _classPrivateFieldGet(this, _completion_status2);
- }
- /**
- * Setter for #completion_status
- * @param {string} completion_status
- */
- ,
- set: function set(completion_status) {
- if (this.initialized && _classPrivateFieldGet(this, _id2) === '') {
- throwDependencyNotEstablishedError();
- } else {
- if (check2004ValidFormat(completion_status, scorm2004_regex.CMICStatus)) {
- _classPrivateFieldSet(this, _completion_status2, completion_status);
- }
- }
- }
- /**
- * Getter for #progress_measure
- * @return {string}
- */
-
- }, {
- key: "progress_measure",
- get: function get() {
- return _classPrivateFieldGet(this, _progress_measure2);
- }
- /**
- * Setter for #progress_measure
- * @param {string} progress_measure
- */
- ,
- set: function set(progress_measure) {
- if (this.initialized && _classPrivateFieldGet(this, _id2) === '') {
- throwDependencyNotEstablishedError();
- } else {
- if (check2004ValidFormat(progress_measure, scorm2004_regex.CMIDecimal) && check2004ValidRange(progress_measure, scorm2004_regex.progress_range)) {
- _classPrivateFieldSet(this, _progress_measure2, progress_measure);
- }
- }
- }
- /**
- * Getter for #description
- * @return {string}
- */
-
- }, {
- key: "description",
- get: function get() {
- return _classPrivateFieldGet(this, _description2);
- }
- /**
- * Setter for #description
- * @param {string} description
- */
- ,
- set: function set(description) {
- if (this.initialized && _classPrivateFieldGet(this, _id2) === '') {
- throwDependencyNotEstablishedError();
- } else {
- if (check2004ValidFormat(description, scorm2004_regex.CMILangString250, true)) {
- _classPrivateFieldSet(this, _description2, description);
- }
- }
- }
- /**
- * toJSON for cmi.objectives.n
- *
- * @return {
- * {
- * id: string,
- * success_status: string,
- * completion_status: string,
- * progress_measure: string,
- * description: string,
- * score: Scorm2004CMIScore
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'id': this.id,
- 'success_status': this.success_status,
- 'completion_status': this.completion_status,
- 'progress_measure': this.progress_measure,
- 'description': this.description,
- 'score': this.score
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIObjectivesObject;
-}(_common.BaseCMI);
-/**
- * Class for SCORM 2004's cmi *.score object
- */
-
-
-exports.CMIObjectivesObject = CMIObjectivesObject;
-
-var _scaled = /*#__PURE__*/new WeakMap();
-
-var Scorm2004CMIScore = /*#__PURE__*/function (_CMIScore) {
- _inherits(Scorm2004CMIScore, _CMIScore);
-
- var _super9 = _createSuper(Scorm2004CMIScore);
-
- /**
- * Constructor for cmi *.score
- */
- function Scorm2004CMIScore() {
- var _this5;
-
- _classCallCheck(this, Scorm2004CMIScore);
-
- _this5 = _super9.call(this, {
- score_children: scorm2004_constants.score_children,
- max: '',
- invalidErrorCode: scorm2004_error_codes.READ_ONLY_ELEMENT,
- invalidTypeCode: scorm2004_error_codes.TYPE_MISMATCH,
- invalidRangeCode: scorm2004_error_codes.VALUE_OUT_OF_RANGE,
- decimalRegex: scorm2004_regex.CMIDecimal,
- errorClass: _exceptions.Scorm2004ValidationError
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this5), _scaled, {
- writable: true,
- value: ''
- });
-
- return _this5;
- }
- /**
- * Getter for #scaled
- * @return {string}
- */
-
-
- _createClass(Scorm2004CMIScore, [{
- key: "scaled",
- get: function get() {
- return _classPrivateFieldGet(this, _scaled);
- }
- /**
- * Setter for #scaled
- * @param {string} scaled
- */
- ,
- set: function set(scaled) {
- if (check2004ValidFormat(scaled, scorm2004_regex.CMIDecimal) && check2004ValidRange(scaled, scorm2004_regex.scaled_range)) {
- _classPrivateFieldSet(this, _scaled, scaled);
- }
- }
- /**
- * toJSON for cmi *.score
- *
- * @return {
- * {
- * scaled: string,
- * raw: string,
- * min: string,
- * max: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'scaled': this.scaled,
- 'raw': _get(_getPrototypeOf(Scorm2004CMIScore.prototype), "raw", this),
- 'min': _get(_getPrototypeOf(Scorm2004CMIScore.prototype), "min", this),
- 'max': _get(_getPrototypeOf(Scorm2004CMIScore.prototype), "max", this)
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return Scorm2004CMIScore;
-}(_common.CMIScore);
-/**
- * Class representing SCORM 2004's cmi.comments_from_learner.n and cmi.comments_from_lms.n object
- */
-
-
-var _comment = /*#__PURE__*/new WeakMap();
-
-var _location2 = /*#__PURE__*/new WeakMap();
-
-var _timestamp2 = /*#__PURE__*/new WeakMap();
-
-var _readOnlyAfterInit = /*#__PURE__*/new WeakMap();
-
-var CMICommentsObject = /*#__PURE__*/function (_BaseCMI5) {
- _inherits(CMICommentsObject, _BaseCMI5);
-
- var _super10 = _createSuper(CMICommentsObject);
-
- /**
- * Constructor for cmi.comments_from_learner.n and cmi.comments_from_lms.n
- * @param {boolean} readOnlyAfterInit
- */
- function CMICommentsObject() {
- var _this6;
-
- var readOnlyAfterInit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
-
- _classCallCheck(this, CMICommentsObject);
-
- _this6 = _super10.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _comment, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _location2, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _timestamp2, {
- writable: true,
- value: ''
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this6), _readOnlyAfterInit, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldSet(_assertThisInitialized(_this6), _comment, '');
-
- _classPrivateFieldSet(_assertThisInitialized(_this6), _location2, '');
-
- _classPrivateFieldSet(_assertThisInitialized(_this6), _timestamp2, '');
-
- _classPrivateFieldSet(_assertThisInitialized(_this6), _readOnlyAfterInit, readOnlyAfterInit);
-
- return _this6;
- }
- /**
- * Getter for #comment
- * @return {string}
- */
-
-
- _createClass(CMICommentsObject, [{
- key: "comment",
- get: function get() {
- return _classPrivateFieldGet(this, _comment);
- }
- /**
- * Setter for #comment
- * @param {string} comment
- */
- ,
- set: function set(comment) {
- if (this.initialized && _classPrivateFieldGet(this, _readOnlyAfterInit)) {
- throwReadOnlyError();
- } else {
- if (check2004ValidFormat(comment, scorm2004_regex.CMILangString4000, true)) {
- _classPrivateFieldSet(this, _comment, comment);
- }
- }
- }
- /**
- * Getter for #location
- * @return {string}
- */
-
- }, {
- key: "location",
- get: function get() {
- return _classPrivateFieldGet(this, _location2);
- }
- /**
- * Setter for #location
- * @param {string} location
- */
- ,
- set: function set(location) {
- if (this.initialized && _classPrivateFieldGet(this, _readOnlyAfterInit)) {
- throwReadOnlyError();
- } else {
- if (check2004ValidFormat(location, scorm2004_regex.CMIString250)) {
- _classPrivateFieldSet(this, _location2, location);
- }
- }
- }
- /**
- * Getter for #timestamp
- * @return {string}
- */
-
- }, {
- key: "timestamp",
- get: function get() {
- return _classPrivateFieldGet(this, _timestamp2);
- }
- /**
- * Setter for #timestamp
- * @param {string} timestamp
- */
- ,
- set: function set(timestamp) {
- if (this.initialized && _classPrivateFieldGet(this, _readOnlyAfterInit)) {
- throwReadOnlyError();
- } else {
- if (check2004ValidFormat(timestamp, scorm2004_regex.CMITime)) {
- _classPrivateFieldSet(this, _timestamp2, timestamp);
- }
- }
- }
- /**
- * toJSON for cmi.comments_from_learner.n object
- * @return {
- * {
- * comment: string,
- * location: string,
- * timestamp: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'comment': this.comment,
- 'location': this.location,
- 'timestamp': this.timestamp
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMICommentsObject;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 2004's cmi.interactions.n.objectives.n object
- */
-
-
-exports.CMICommentsObject = CMICommentsObject;
-
-var _id3 = /*#__PURE__*/new WeakMap();
-
-var CMIInteractionsObjectivesObject = /*#__PURE__*/function (_BaseCMI6) {
- _inherits(CMIInteractionsObjectivesObject, _BaseCMI6);
-
- var _super11 = _createSuper(CMIInteractionsObjectivesObject);
-
- /**
- * Constructor for cmi.interactions.n.objectives.n
- */
- function CMIInteractionsObjectivesObject() {
- var _this7;
-
- _classCallCheck(this, CMIInteractionsObjectivesObject);
-
- _this7 = _super11.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this7), _id3, {
- writable: true,
- value: ''
- });
-
- return _this7;
- }
- /**
- * Getter for #id
- * @return {string}
- */
-
-
- _createClass(CMIInteractionsObjectivesObject, [{
- key: "id",
- get: function get() {
- return _classPrivateFieldGet(this, _id3);
- }
- /**
- * Setter for #id
- * @param {string} id
- */
- ,
- set: function set(id) {
- if (check2004ValidFormat(id, scorm2004_regex.CMILongIdentifier)) {
- _classPrivateFieldSet(this, _id3, id);
- }
- }
- /**
- * toJSON for cmi.interactions.n.objectives.n
- * @return {
- * {
- * id: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'id': this.id
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIInteractionsObjectivesObject;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 2004's cmi.interactions.n.correct_responses.n object
- */
-
-
-exports.CMIInteractionsObjectivesObject = CMIInteractionsObjectivesObject;
-
-var _pattern = /*#__PURE__*/new WeakMap();
-
-var CMIInteractionsCorrectResponsesObject = /*#__PURE__*/function (_BaseCMI7) {
- _inherits(CMIInteractionsCorrectResponsesObject, _BaseCMI7);
-
- var _super12 = _createSuper(CMIInteractionsCorrectResponsesObject);
-
- /**
- * Constructor for cmi.interactions.n.correct_responses.n
- */
- function CMIInteractionsCorrectResponsesObject() {
- var _this8;
-
- _classCallCheck(this, CMIInteractionsCorrectResponsesObject);
-
- _this8 = _super12.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this8), _pattern, {
- writable: true,
- value: ''
- });
-
- return _this8;
- }
- /**
- * Getter for #pattern
- * @return {string}
- */
-
-
- _createClass(CMIInteractionsCorrectResponsesObject, [{
- key: "pattern",
- get: function get() {
- return _classPrivateFieldGet(this, _pattern);
- }
- /**
- * Setter for #pattern
- * @param {string} pattern
- */
- ,
- set: function set(pattern) {
- if (check2004ValidFormat(pattern, scorm2004_regex.CMIFeedback)) {
- _classPrivateFieldSet(this, _pattern, pattern);
- }
- }
- /**
- * toJSON cmi.interactions.n.correct_responses.n object
- * @return {
- * {
- * pattern: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'pattern': this.pattern
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return CMIInteractionsCorrectResponsesObject;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 2004's adl object
- */
-
-
-exports.CMIInteractionsCorrectResponsesObject = CMIInteractionsCorrectResponsesObject;
-
-var ADL = /*#__PURE__*/function (_BaseCMI8) {
- _inherits(ADL, _BaseCMI8);
-
- var _super13 = _createSuper(ADL);
-
- /**
- * Constructor for adl
- */
- function ADL() {
- var _this9;
-
- _classCallCheck(this, ADL);
-
- _this9 = _super13.call(this);
- _this9.nav = new ADLNav();
- return _this9;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(ADL, [{
- key: "initialize",
- value: function initialize() {
- var _this$nav;
-
- _get(_getPrototypeOf(ADL.prototype), "initialize", this).call(this);
-
- (_this$nav = this.nav) === null || _this$nav === void 0 ? void 0 : _this$nav.initialize();
- }
- /**
- * toJSON for adl
- * @return {
- * {
- * nav: {
- * request: string
- * }
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'nav': this.nav
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return ADL;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 2004's adl.nav object
- */
-
-
-exports.ADL = ADL;
-
-var _request = /*#__PURE__*/new WeakMap();
-
-var ADLNav = /*#__PURE__*/function (_BaseCMI9) {
- _inherits(ADLNav, _BaseCMI9);
-
- var _super14 = _createSuper(ADLNav);
-
- /**
- * Constructor for adl.nav
- */
- function ADLNav() {
- var _this10;
-
- _classCallCheck(this, ADLNav);
-
- _this10 = _super14.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this10), _request, {
- writable: true,
- value: '_none_'
- });
-
- _this10.request_valid = new ADLNavRequestValid();
- return _this10;
- }
- /**
- * Called when the API has been initialized after the CMI has been created
- */
-
-
- _createClass(ADLNav, [{
- key: "initialize",
- value: function initialize() {
- var _this$request_valid;
-
- _get(_getPrototypeOf(ADLNav.prototype), "initialize", this).call(this);
-
- (_this$request_valid = this.request_valid) === null || _this$request_valid === void 0 ? void 0 : _this$request_valid.initialize();
- }
- /**
- * Getter for #request
- * @return {string}
- */
-
- }, {
- key: "request",
- get: function get() {
- return _classPrivateFieldGet(this, _request);
- }
- /**
- * Setter for #request
- * @param {string} request
- */
- ,
- set: function set(request) {
- if (check2004ValidFormat(request, scorm2004_regex.NAVEvent)) {
- _classPrivateFieldSet(this, _request, request);
- }
- }
- /**
- * toJSON for adl.nav
- *
- * @return {
- * {
- * request: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'request': this.request
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return ADLNav;
-}(_common.BaseCMI);
-/**
- * Class representing SCORM 2004's adl.nav.request_valid object
- */
-
-
-var _continue = /*#__PURE__*/new WeakMap();
-
-var _previous = /*#__PURE__*/new WeakMap();
-
-var ADLNavRequestValid = /*#__PURE__*/function (_BaseCMI10) {
- _inherits(ADLNavRequestValid, _BaseCMI10);
-
- var _super15 = _createSuper(ADLNavRequestValid);
-
- /**
- * Constructor for adl.nav.request_valid
- */
- function ADLNavRequestValid() {
- var _this11;
-
- _classCallCheck(this, ADLNavRequestValid);
-
- _this11 = _super15.call(this);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this11), _continue, {
- writable: true,
- value: 'unknown'
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this11), _previous, {
- writable: true,
- value: 'unknown'
- });
-
- _defineProperty(_assertThisInitialized(_this11), "choice", /*#__PURE__*/function () {
- function _class2() {
- _classCallCheck(this, _class2);
-
- _defineProperty(this, "_isTargetValid", function (_target) {
- return 'unknown';
- });
- }
-
- return _createClass(_class2);
- }());
-
- _defineProperty(_assertThisInitialized(_this11), "jump", /*#__PURE__*/function () {
- function _class4() {
- _classCallCheck(this, _class4);
-
- _defineProperty(this, "_isTargetValid", function (_target) {
- return 'unknown';
- });
- }
-
- return _createClass(_class4);
- }());
-
- return _this11;
- }
- /**
- * Getter for #continue
- * @return {string}
- */
-
-
- _createClass(ADLNavRequestValid, [{
- key: "continue",
- get: function get() {
- return _classPrivateFieldGet(this, _continue);
- }
- /**
- * Setter for #continue. Just throws an error.
- * @param {*} _
- */
- ,
- set: function set(_) {
- throwReadOnlyError();
- }
- /**
- * Getter for #previous
- * @return {string}
- */
-
- }, {
- key: "previous",
- get: function get() {
- return _classPrivateFieldGet(this, _previous);
- }
- /**
- * Setter for #previous. Just throws an error.
- * @param {*} _
- */
- ,
- set: function set(_) {
- throwReadOnlyError();
- }
- /**
- * toJSON for adl.nav.request_valid
- *
- * @return {
- * {
- * previous: string,
- * continue: string
- * }
- * }
- */
-
- }, {
- key: "toJSON",
- value: function toJSON() {
- this.jsonString = true;
- var result = {
- 'previous': this.previous,
- 'continue': this["continue"]
- };
- delete this.jsonString;
- return result;
- }
- }]);
-
- return ADLNavRequestValid;
-}(_common.BaseCMI);
-
-},{"../constants/api_constants":6,"../constants/error_codes":7,"../constants/regex":9,"../constants/response_constants":10,"../exceptions":11,"../utilities":13,"./common":4}],6:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-var global = {
- SCORM_TRUE: 'true',
- SCORM_FALSE: 'false',
- STATE_NOT_INITIALIZED: 0,
- STATE_INITIALIZED: 1,
- STATE_TERMINATED: 2,
- LOG_LEVEL_DEBUG: 1,
- LOG_LEVEL_INFO: 2,
- LOG_LEVEL_WARNING: 3,
- LOG_LEVEL_ERROR: 4,
- LOG_LEVEL_NONE: 5
-};
-var scorm12 = {
- // Children lists
- cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions',
- core_children: 'student_id,student_name,lesson_location,credit,lesson_status,entry,score,total_time,lesson_mode,exit,session_time',
- score_children: 'raw,min,max',
- comments_children: 'content,location,time',
- objectives_children: 'id,score,status',
- correct_responses_children: 'pattern',
- student_data_children: 'mastery_score,max_time_allowed,time_limit_action',
- student_preference_children: 'audio,language,speed,text',
- interactions_children: 'id,objectives,time,type,correct_responses,weighting,student_response,result,latency',
- error_descriptions: {
- '101': {
- basicMessage: 'General Exception',
- detailMessage: 'No specific error code exists to describe the error. Use LMSGetDiagnostic for more information'
- },
- '201': {
- basicMessage: 'Invalid argument error',
- detailMessage: 'Indicates that an argument represents an invalid data model element or is otherwise incorrect.'
- },
- '202': {
- basicMessage: 'Element cannot have children',
- detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in "_children" for a data model element that does not support the "_children" suffix.'
- },
- '203': {
- basicMessage: 'Element not an array - cannot have count',
- detailMessage: 'Indicates that LMSGetValue was called with a data model element name that ends in "_count" for a data model element that does not support the "_count" suffix.'
- },
- '301': {
- basicMessage: 'Not initialized',
- detailMessage: 'Indicates that an API call was made before the call to lmsInitialize.'
- },
- '401': {
- basicMessage: 'Not implemented error',
- detailMessage: 'The data model element indicated in a call to LMSGetValue or LMSSetValue is valid, but was not implemented by this LMS. SCORM 1.2 defines a set of data model elements as being optional for an LMS to implement.'
- },
- '402': {
- basicMessage: 'Invalid set value, element is a keyword',
- detailMessage: 'Indicates that LMSSetValue was called on a data model element that represents a keyword (elements that end in "_children" and "_count").'
- },
- '403': {
- basicMessage: 'Element is read only',
- detailMessage: 'LMSSetValue was called with a data model element that can only be read.'
- },
- '404': {
- basicMessage: 'Element is write only',
- detailMessage: 'LMSGetValue was called on a data model element that can only be written to.'
- },
- '405': {
- basicMessage: 'Incorrect Data Type',
- detailMessage: 'LMSSetValue was called with a value that is not consistent with the data format of the supplied data model element.'
- },
- '407': {
- basicMessage: 'Element Value Out Of Range',
- detailMessage: 'The numeric value supplied to a LMSSetValue call is outside of the numeric range allowed for the supplied data model element.'
- },
- '408': {
- basicMessage: 'Data Model Dependency Not Established',
- detailMessage: 'Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.'
- }
- }
-};
-
-var aicc = _objectSpread(_objectSpread({}, scorm12), {
- cmi_children: 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions,evaluation',
- student_preference_children: 'audio,language,lesson_type,speed,text,text_color,text_location,text_size,video,windows',
- student_data_children: 'attempt_number,tries,mastery_score,max_time_allowed,time_limit_action',
- student_demographics_children: 'city,class,company,country,experience,familiar_name,instructor_name,title,native_language,state,street_address,telephone,years_experience',
- tries_children: 'time,status,score',
- attempt_records_children: 'score,lesson_status',
- paths_children: 'location_id,date,time,status,why_left,time_in_element'
-});
-
-var scorm2004 = {
- // Children lists
- cmi_children: '_version,comments_from_learner,comments_from_lms,completion_status,credit,entry,exit,interactions,launch_data,learner_id,learner_name,learner_preference,location,max_time_allowed,mode,objectives,progress_measure,scaled_passing_score,score,session_time,success_status,suspend_data,time_limit_action,total_time',
- comments_children: 'comment,timestamp,location',
- score_children: 'max,raw,scaled,min',
- objectives_children: 'progress_measure,completion_status,success_status,description,score,id',
- correct_responses_children: 'pattern',
- student_data_children: 'mastery_score,max_time_allowed,time_limit_action',
- student_preference_children: 'audio_level,audio_captioning,delivery_speed,language',
- interactions_children: 'id,type,objectives,timestamp,correct_responses,weighting,learner_response,result,latency,description',
- error_descriptions: {
- '0': {
- basicMessage: 'No Error',
- detailMessage: 'No error occurred, the previous API call was successful.'
- },
- '101': {
- basicMessage: 'General Exception',
- detailMessage: 'No specific error code exists to describe the error. Use GetDiagnostic for more information.'
- },
- '102': {
- basicMessage: 'General Initialization Failure',
- detailMessage: 'Call to Initialize failed for an unknown reason.'
- },
- '103': {
- basicMessage: 'Already Initialized',
- detailMessage: 'Call to Initialize failed because Initialize was already called.'
- },
- '104': {
- basicMessage: 'Content Instance Terminated',
- detailMessage: 'Call to Initialize failed because Terminate was already called.'
- },
- '111': {
- basicMessage: 'General Termination Failure',
- detailMessage: 'Call to Terminate failed for an unknown reason.'
- },
- '112': {
- basicMessage: 'Termination Before Initialization',
- detailMessage: 'Call to Terminate failed because it was made before the call to Initialize.'
- },
- '113': {
- basicMessage: 'Termination After Termination',
- detailMessage: 'Call to Terminate failed because Terminate was already called.'
- },
- '122': {
- basicMessage: 'Retrieve Data Before Initialization',
- detailMessage: 'Call to GetValue failed because it was made before the call to Initialize.'
- },
- '123': {
- basicMessage: 'Retrieve Data After Termination',
- detailMessage: 'Call to GetValue failed because it was made after the call to Terminate.'
- },
- '132': {
- basicMessage: 'Store Data Before Initialization',
- detailMessage: 'Call to SetValue failed because it was made before the call to Initialize.'
- },
- '133': {
- basicMessage: 'Store Data After Termination',
- detailMessage: 'Call to SetValue failed because it was made after the call to Terminate.'
- },
- '142': {
- basicMessage: 'Commit Before Initialization',
- detailMessage: 'Call to Commit failed because it was made before the call to Initialize.'
- },
- '143': {
- basicMessage: 'Commit After Termination',
- detailMessage: 'Call to Commit failed because it was made after the call to Terminate.'
- },
- '201': {
- basicMessage: 'General Argument Error',
- detailMessage: 'An invalid argument was passed to an API method (usually indicates that Initialize, Commit or Terminate did not receive the expected empty string argument.'
- },
- '301': {
- basicMessage: 'General Get Failure',
- detailMessage: 'Indicates a failed GetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.'
- },
- '351': {
- basicMessage: 'General Set Failure',
- detailMessage: 'Indicates a failed SetValue call where no other specific error code is applicable. Use GetDiagnostic for more information.'
- },
- '391': {
- basicMessage: 'General Commit Failure',
- detailMessage: 'Indicates a failed Commit call where no other specific error code is applicable. Use GetDiagnostic for more information.'
- },
- '401': {
- basicMessage: 'Undefined Data Model Element',
- detailMessage: 'The data model element name passed to GetValue or SetValue is not a valid SCORM data model element.'
- },
- '402': {
- basicMessage: 'Unimplemented Data Model Element',
- detailMessage: 'The data model element indicated in a call to GetValue or SetValue is valid, but was not implemented by this LMS. In SCORM 2004, this error would indicate an LMS that is not fully SCORM conformant.'
- },
- '403': {
- basicMessage: 'Data Model Element Value Not Initialized',
- detailMessage: 'Attempt to read a data model element that has not been initialized by the LMS or through a SetValue call. This error condition is often reached during normal execution of a SCO.'
- },
- '404': {
- basicMessage: 'Data Model Element Is Read Only',
- detailMessage: 'SetValue was called with a data model element that can only be read.'
- },
- '405': {
- basicMessage: 'Data Model Element Is Write Only',
- detailMessage: 'GetValue was called on a data model element that can only be written to.'
- },
- '406': {
- basicMessage: 'Data Model Element Type Mismatch',
- detailMessage: 'SetValue was called with a value that is not consistent with the data format of the supplied data model element.'
- },
- '407': {
- basicMessage: 'Data Model Element Value Out Of Range',
- detailMessage: 'The numeric value supplied to a SetValue call is outside of the numeric range allowed for the supplied data model element.'
- },
- '408': {
- basicMessage: 'Data Model Dependency Not Established',
- detailMessage: 'Some data model elements cannot be set until another data model element was set. This error condition indicates that the prerequisite element was not set before the dependent element.'
- }
- }
-};
-var APIConstants = {
- global: global,
- scorm12: scorm12,
- aicc: aicc,
- scorm2004: scorm2004
-};
-var _default = APIConstants;
-exports["default"] = _default;
-
-},{}],7:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-var global = {
- GENERAL: 101,
- INITIALIZATION_FAILED: 101,
- INITIALIZED: 101,
- TERMINATED: 101,
- TERMINATION_FAILURE: 101,
- TERMINATION_BEFORE_INIT: 101,
- MULTIPLE_TERMINATION: 101,
- RETRIEVE_BEFORE_INIT: 101,
- RETRIEVE_AFTER_TERM: 101,
- STORE_BEFORE_INIT: 101,
- STORE_AFTER_TERM: 101,
- COMMIT_BEFORE_INIT: 101,
- COMMIT_AFTER_TERM: 101,
- ARGUMENT_ERROR: 101,
- CHILDREN_ERROR: 101,
- COUNT_ERROR: 101,
- GENERAL_GET_FAILURE: 101,
- GENERAL_SET_FAILURE: 101,
- GENERAL_COMMIT_FAILURE: 101,
- UNDEFINED_DATA_MODEL: 101,
- UNIMPLEMENTED_ELEMENT: 101,
- VALUE_NOT_INITIALIZED: 101,
- INVALID_SET_VALUE: 101,
- READ_ONLY_ELEMENT: 101,
- WRITE_ONLY_ELEMENT: 101,
- TYPE_MISMATCH: 101,
- VALUE_OUT_OF_RANGE: 101,
- DEPENDENCY_NOT_ESTABLISHED: 101
-};
-
-var scorm12 = _objectSpread(_objectSpread({}, global), {
- RETRIEVE_BEFORE_INIT: 301,
- STORE_BEFORE_INIT: 301,
- COMMIT_BEFORE_INIT: 301,
- ARGUMENT_ERROR: 201,
- CHILDREN_ERROR: 202,
- COUNT_ERROR: 203,
- UNDEFINED_DATA_MODEL: 401,
- UNIMPLEMENTED_ELEMENT: 401,
- VALUE_NOT_INITIALIZED: 301,
- INVALID_SET_VALUE: 402,
- READ_ONLY_ELEMENT: 403,
- WRITE_ONLY_ELEMENT: 404,
- TYPE_MISMATCH: 405,
- VALUE_OUT_OF_RANGE: 407,
- DEPENDENCY_NOT_ESTABLISHED: 408
-});
-
-var scorm2004 = _objectSpread(_objectSpread({}, global), {
- INITIALIZATION_FAILED: 102,
- INITIALIZED: 103,
- TERMINATED: 104,
- TERMINATION_FAILURE: 111,
- TERMINATION_BEFORE_INIT: 112,
- MULTIPLE_TERMINATIONS: 113,
- RETRIEVE_BEFORE_INIT: 122,
- RETRIEVE_AFTER_TERM: 123,
- STORE_BEFORE_INIT: 132,
- STORE_AFTER_TERM: 133,
- COMMIT_BEFORE_INIT: 142,
- COMMIT_AFTER_TERM: 143,
- ARGUMENT_ERROR: 201,
- GENERAL_GET_FAILURE: 301,
- GENERAL_SET_FAILURE: 351,
- GENERAL_COMMIT_FAILURE: 391,
- UNDEFINED_DATA_MODEL: 401,
- UNIMPLEMENTED_ELEMENT: 402,
- VALUE_NOT_INITIALIZED: 403,
- READ_ONLY_ELEMENT: 404,
- WRITE_ONLY_ELEMENT: 405,
- TYPE_MISMATCH: 406,
- VALUE_OUT_OF_RANGE: 407,
- DEPENDENCY_NOT_ESTABLISHED: 408
-});
-
-var ErrorCodes = {
- scorm12: scorm12,
- scorm2004: scorm2004
-};
-var _default = ErrorCodes;
-exports["default"] = _default;
-
-},{}],8:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-var ValidLanguages = {
- 'aa': 'aa',
- 'ab': 'ab',
- 'ae': 'ae',
- 'af': 'af',
- 'ak': 'ak',
- 'am': 'am',
- 'an': 'an',
- 'ar': 'ar',
- 'as': 'as',
- 'av': 'av',
- 'ay': 'ay',
- 'az': 'az',
- 'ba': 'ba',
- 'be': 'be',
- 'bg': 'bg',
- 'bh': 'bh',
- 'bi': 'bi',
- 'bm': 'bm',
- 'bn': 'bn',
- 'bo': 'bo',
- 'br': 'br',
- 'bs': 'bs',
- 'ca': 'ca',
- 'ce': 'ce',
- 'ch': 'ch',
- 'co': 'co',
- 'cr': 'cr',
- 'cs': 'cs',
- 'cu': 'cu',
- 'cv': 'cv',
- 'cy': 'cy',
- 'da': 'da',
- 'de': 'de',
- 'dv': 'dv',
- 'dz': 'dz',
- 'ee': 'ee',
- 'el': 'el',
- 'en': 'en',
- 'eo': 'eo',
- 'es': 'es',
- 'et': 'et',
- 'eu': 'eu',
- 'fa': 'fa',
- 'ff': 'ff',
- 'fi': 'fi',
- 'fj': 'fj',
- 'fo': 'fo',
- 'fr': 'fr',
- 'fy': 'fy',
- 'ga': 'ga',
- 'gd': 'gd',
- 'gl': 'gl',
- 'gn': 'gn',
- 'gu': 'gu',
- 'gv': 'gv',
- 'ha': 'ha',
- 'he': 'he',
- 'hi': 'hi',
- 'ho': 'ho',
- 'hr': 'hr',
- 'ht': 'ht',
- 'hu': 'hu',
- 'hy': 'hy',
- 'hz': 'hz',
- 'ia': 'ia',
- 'id': 'id',
- 'ie': 'ie',
- 'ig': 'ig',
- 'ii': 'ii',
- 'ik': 'ik',
- 'io': 'io',
- 'is': 'is',
- 'it': 'it',
- 'iu': 'iu',
- 'ja': 'ja',
- 'jv': 'jv',
- 'ka': 'ka',
- 'kg': 'kg',
- 'ki': 'ki',
- 'kj': 'kj',
- 'kk': 'kk',
- 'kl': 'kl',
- 'km': 'km',
- 'kn': 'kn',
- 'ko': 'ko',
- 'kr': 'kr',
- 'ks': 'ks',
- 'ku': 'ku',
- 'kv': 'kv',
- 'kw': 'kw',
- 'ky': 'ky',
- 'la': 'la',
- 'lb': 'lb',
- 'lg': 'lg',
- 'li': 'li',
- 'ln': 'ln',
- 'lo': 'lo',
- 'lt': 'lt',
- 'lu': 'lu',
- 'lv': 'lv',
- 'mg': 'mg',
- 'mh': 'mh',
- 'mi': 'mi',
- 'mk': 'mk',
- 'ml': 'ml',
- 'mn': 'mn',
- 'mo': 'mo',
- 'mr': 'mr',
- 'ms': 'ms',
- 'mt': 'mt',
- 'my': 'my',
- 'na': 'na',
- 'nb': 'nb',
- 'nd': 'nd',
- 'ne': 'ne',
- 'ng': 'ng',
- 'nl': 'nl',
- 'nn': 'nn',
- 'no': 'no',
- 'nr': 'nr',
- 'nv': 'nv',
- 'ny': 'ny',
- 'oc': 'oc',
- 'oj': 'oj',
- 'om': 'om',
- 'or': 'or',
- 'os': 'os',
- 'pa': 'pa',
- 'pi': 'pi',
- 'pl': 'pl',
- 'ps': 'ps',
- 'pt': 'pt',
- 'qu': 'qu',
- 'rm': 'rm',
- 'rn': 'rn',
- 'ro': 'ro',
- 'ru': 'ru',
- 'rw': 'rw',
- 'sa': 'sa',
- 'sc': 'sc',
- 'sd': 'sd',
- 'se': 'se',
- 'sg': 'sg',
- 'sh': 'sh',
- 'si': 'si',
- 'sk': 'sk',
- 'sl': 'sl',
- 'sm': 'sm',
- 'sn': 'sn',
- 'so': 'so',
- 'sq': 'sq',
- 'sr': 'sr',
- 'ss': 'ss',
- 'st': 'st',
- 'su': 'su',
- 'sv': 'sv',
- 'sw': 'sw',
- 'ta': 'ta',
- 'te': 'te',
- 'tg': 'tg',
- 'th': 'th',
- 'ti': 'ti',
- 'tk': 'tk',
- 'tl': 'tl',
- 'tn': 'tn',
- 'to': 'to',
- 'tr': 'tr',
- 'ts': 'ts',
- 'tt': 'tt',
- 'tw': 'tw',
- 'ty': 'ty',
- 'ug': 'ug',
- 'uk': 'uk',
- 'ur': 'ur',
- 'uz': 'uz',
- 've': 've',
- 'vi': 'vi',
- 'vo': 'vo',
- 'wa': 'wa',
- 'wo': 'wo',
- 'xh': 'xh',
- 'yi': 'yi',
- 'yo': 'yo',
- 'za': 'za',
- 'zh': 'zh',
- 'zu': 'zu',
- 'aar': 'aar',
- 'abk': 'abk',
- 'ave': 'ave',
- 'afr': 'afr',
- 'aka': 'aka',
- 'amh': 'amh',
- 'arg': 'arg',
- 'ara': 'ara',
- 'asm': 'asm',
- 'ava': 'ava',
- 'aym': 'aym',
- 'aze': 'aze',
- 'bak': 'bak',
- 'bel': 'bel',
- 'bul': 'bul',
- 'bih': 'bih',
- 'bis': 'bis',
- 'bam': 'bam',
- 'ben': 'ben',
- 'tib': 'tib',
- 'bod': 'bod',
- 'bre': 'bre',
- 'bos': 'bos',
- 'cat': 'cat',
- 'che': 'che',
- 'cha': 'cha',
- 'cos': 'cos',
- 'cre': 'cre',
- 'cze': 'cze',
- 'ces': 'ces',
- 'chu': 'chu',
- 'chv': 'chv',
- 'wel': 'wel',
- 'cym': 'cym',
- 'dan': 'dan',
- 'ger': 'ger',
- 'deu': 'deu',
- 'div': 'div',
- 'dzo': 'dzo',
- 'ewe': 'ewe',
- 'gre': 'gre',
- 'ell': 'ell',
- 'eng': 'eng',
- 'epo': 'epo',
- 'spa': 'spa',
- 'est': 'est',
- 'baq': 'baq',
- 'eus': 'eus',
- 'per': 'per',
- 'fas': 'fas',
- 'ful': 'ful',
- 'fin': 'fin',
- 'fij': 'fij',
- 'fao': 'fao',
- 'fre': 'fre',
- 'fra': 'fra',
- 'fry': 'fry',
- 'gle': 'gle',
- 'gla': 'gla',
- 'glg': 'glg',
- 'grn': 'grn',
- 'guj': 'guj',
- 'glv': 'glv',
- 'hau': 'hau',
- 'heb': 'heb',
- 'hin': 'hin',
- 'hmo': 'hmo',
- 'hrv': 'hrv',
- 'hat': 'hat',
- 'hun': 'hun',
- 'arm': 'arm',
- 'hye': 'hye',
- 'her': 'her',
- 'ina': 'ina',
- 'ind': 'ind',
- 'ile': 'ile',
- 'ibo': 'ibo',
- 'iii': 'iii',
- 'ipk': 'ipk',
- 'ido': 'ido',
- 'ice': 'ice',
- 'isl': 'isl',
- 'ita': 'ita',
- 'iku': 'iku',
- 'jpn': 'jpn',
- 'jav': 'jav',
- 'geo': 'geo',
- 'kat': 'kat',
- 'kon': 'kon',
- 'kik': 'kik',
- 'kua': 'kua',
- 'kaz': 'kaz',
- 'kal': 'kal',
- 'khm': 'khm',
- 'kan': 'kan',
- 'kor': 'kor',
- 'kau': 'kau',
- 'kas': 'kas',
- 'kur': 'kur',
- 'kom': 'kom',
- 'cor': 'cor',
- 'kir': 'kir',
- 'lat': 'lat',
- 'ltz': 'ltz',
- 'lug': 'lug',
- 'lim': 'lim',
- 'lin': 'lin',
- 'lao': 'lao',
- 'lit': 'lit',
- 'lub': 'lub',
- 'lav': 'lav',
- 'mlg': 'mlg',
- 'mah': 'mah',
- 'mao': 'mao',
- 'mri': 'mri',
- 'mac': 'mac',
- 'mkd': 'mkd',
- 'mal': 'mal',
- 'mon': 'mon',
- 'mol': 'mol',
- 'mar': 'mar',
- 'may': 'may',
- 'msa': 'msa',
- 'mlt': 'mlt',
- 'bur': 'bur',
- 'mya': 'mya',
- 'nau': 'nau',
- 'nob': 'nob',
- 'nde': 'nde',
- 'nep': 'nep',
- 'ndo': 'ndo',
- 'dut': 'dut',
- 'nld': 'nld',
- 'nno': 'nno',
- 'nor': 'nor',
- 'nbl': 'nbl',
- 'nav': 'nav',
- 'nya': 'nya',
- 'oci': 'oci',
- 'oji': 'oji',
- 'orm': 'orm',
- 'ori': 'ori',
- 'oss': 'oss',
- 'pan': 'pan',
- 'pli': 'pli',
- 'pol': 'pol',
- 'pus': 'pus',
- 'por': 'por',
- 'que': 'que',
- 'roh': 'roh',
- 'run': 'run',
- 'rum': 'rum',
- 'ron': 'ron',
- 'rus': 'rus',
- 'kin': 'kin',
- 'san': 'san',
- 'srd': 'srd',
- 'snd': 'snd',
- 'sme': 'sme',
- 'sag': 'sag',
- 'slo': 'slo',
- 'sin': 'sin',
- 'slk': 'slk',
- 'slv': 'slv',
- 'smo': 'smo',
- 'sna': 'sna',
- 'som': 'som',
- 'alb': 'alb',
- 'sqi': 'sqi',
- 'srp': 'srp',
- 'ssw': 'ssw',
- 'sot': 'sot',
- 'sun': 'sun',
- 'swe': 'swe',
- 'swa': 'swa',
- 'tam': 'tam',
- 'tel': 'tel',
- 'tgk': 'tgk',
- 'tha': 'tha',
- 'tir': 'tir',
- 'tuk': 'tuk',
- 'tgl': 'tgl',
- 'tsn': 'tsn',
- 'ton': 'ton',
- 'tur': 'tur',
- 'tso': 'tso',
- 'tat': 'tat',
- 'twi': 'twi',
- 'tah': 'tah',
- 'uig': 'uig',
- 'ukr': 'ukr',
- 'urd': 'urd',
- 'uzb': 'uzb',
- 'ven': 'ven',
- 'vie': 'vie',
- 'vol': 'vol',
- 'wln': 'wln',
- 'wol': 'wol',
- 'xho': 'xho',
- 'yid': 'yid',
- 'yor': 'yor',
- 'zha': 'zha',
- 'chi': 'chi',
- 'zho': 'zho',
- 'zul': 'zul'
-};
-var _default = ValidLanguages;
-exports["default"] = _default;
-
-},{}],9:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
-
-function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
-
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
-
-var scorm12 = {
- CMIString256: '^.{0,255}$',
- CMIString4096: '^.{0,4096}$',
- CMITime: '^(?:[01]\\d|2[0123]):(?:[012345]\\d):(?:[012345]\\d)$',
- // eslint-disable-line
- CMITimespan: '^([0-9]{2,}):([0-9]{2}):([0-9]{2})(\.[0-9]{1,2})?$',
- // eslint-disable-line
- CMIInteger: '^\\d+$',
- CMISInteger: '^-?([0-9]+)$',
- CMIDecimal: '^-?([0-9]{0,3})(\.[0-9]*)?$',
- // eslint-disable-line
- CMIIdentifier: "^[\\u0021-\\u007E\\s]{0,255}$",
- CMIFeedback: '^.{0,255}$',
- // This must be redefined
- CMIIndex: '[._](\\d+).',
- // Vocabulary Data Type Definition
- CMIStatus: '^(passed|completed|failed|incomplete|browsed)$',
- CMIStatus2: '^(passed|completed|failed|incomplete|browsed|not attempted)$',
- CMIExit: '^(time-out|suspend|logout|)$',
- CMIType: '^(true-false|choice|fill-in|matching|performance|sequencing|likert|numeric)$',
- CMIResult: '^(correct|wrong|unanticipated|neutral|([0-9]{0,3})?(\\.[0-9]*)?)$',
- // eslint-disable-line
- NAVEvent: '^(previous|continue)$',
- // Data ranges
- score_range: '0#100',
- audio_range: '-1#100',
- speed_range: '-100#100',
- weighting_range: '-100#100',
- text_range: '-1#1'
-};
-
-var aicc = _objectSpread(_objectSpread({}, scorm12), {
- CMIIdentifier: '^\\w{1,255}$'
-});
-
-var scorm2004 = {
- CMIString200: "^[\\u0000-\\uFFFF]{0,200}$",
- CMIString250: "^[\\u0000-\\uFFFF]{0,250}$",
- CMIString1000: "^[\\u0000-\\uFFFF]{0,1000}$",
- CMIString4000: "^[\\u0000-\\uFFFF]{0,4000}$",
- CMIString64000: "^[\\u0000-\\uFFFF]{0,64000}$",
- CMILang: '^([a-zA-Z]{2,3}|i|x)(\-[a-zA-Z0-9\-]{2,8})?$|^$',
- // eslint-disable-line
- CMILangString250: '^(\{lang=([a-zA-Z]{2,3}|i|x)(\-[a-zA-Z0-9\-]{2,8})?\})?((?!\{.*$).{0,250}$)?$',
- // eslint-disable-line
- CMILangcr: '^((\{lang=([a-zA-Z]{2,3}|i|x)?(\-[a-zA-Z0-9\-]{2,8})?\}))(.*?)$',
- // eslint-disable-line
- CMILangString250cr: '^((\{lang=([a-zA-Z]{2,3}|i|x)?(\-[a-zA-Z0-9\-]{2,8})?\})?(.{0,250})?)?$',
- // eslint-disable-line
- CMILangString4000: '^(\{lang=([a-zA-Z]{2,3}|i|x)(\-[a-zA-Z0-9\-]{2,8})?\})?((?!\{.*$).{0,4000}$)?$',
- // eslint-disable-line
- CMITime: '^(19[7-9]{1}[0-9]{1}|20[0-2]{1}[0-9]{1}|203[0-8]{1})((-(0[1-9]{1}|1[0-2]{1}))((-(0[1-9]{1}|[1-2]{1}[0-9]{1}|3[0-1]{1}))(T([0-1]{1}[0-9]{1}|2[0-3]{1})((:[0-5]{1}[0-9]{1})((:[0-5]{1}[0-9]{1})((\\.[0-9]{1,2})((Z|([+|-]([0-1]{1}[0-9]{1}|2[0-3]{1})))(:[0-5]{1}[0-9]{1})?)?)?)?)?)?)?)?$',
- CMITimespan: '^P(?:([.,\\d]+)Y)?(?:([.,\\d]+)M)?(?:([.,\\d]+)W)?(?:([.,\\d]+)D)?(?:T?(?:([.,\\d]+)H)?(?:([.,\\d]+)M)?(?:([.,\\d]+)S)?)?$',
- CMIInteger: '^\\d+$',
- CMISInteger: '^-?([0-9]+)$',
- CMIDecimal: '^-?([0-9]{1,5})(\\.[0-9]{1,18})?$',
- CMIIdentifier: '^\\S{1,250}[a-zA-Z0-9]$',
- CMIShortIdentifier: '^[\\w\\.\\-\\_]{1,250}$',
- // eslint-disable-line
- CMILongIdentifier: '^(?:(?!urn:)\\S{1,4000}|urn:[A-Za-z0-9-]{1,31}:\\S{1,4000}|.{1,4000})$',
- // need to re-examine this
- CMIFeedback: '^.*$',
- // This must be redefined
- CMIIndex: '[._](\\d+).',
- CMIIndexStore: '.N(\\d+).',
- // Vocabulary Data Type Definition
- CMICStatus: '^(completed|incomplete|not attempted|unknown)$',
- CMISStatus: '^(passed|failed|unknown)$',
- CMIExit: '^(time-out|suspend|logout|normal)$',
- CMIType: '^(true-false|choice|fill-in|long-fill-in|matching|performance|sequencing|likert|numeric|other)$',
- CMIResult: '^(correct|incorrect|unanticipated|neutral|-?([0-9]{1,4})(\\.[0-9]{1,18})?)$',
- NAVEvent: '^(previous|continue|exit|exitAll|abandon|abandonAll|suspendAll|\{target=\\S{0,200}[a-zA-Z0-9]\}choice|jump)$',
- // eslint-disable-line
- NAVBoolean: '^(unknown|true|false$)',
- NAVTarget: '^(previous|continue|choice.{target=\\S{0,200}[a-zA-Z0-9]})$',
- // Data ranges
- scaled_range: '-1#1',
- audio_range: '0#*',
- speed_range: '0#*',
- text_range: '-1#1',
- progress_range: '0#1'
-};
-var Regex = {
- aicc: aicc,
- scorm12: scorm12,
- scorm2004: scorm2004
-};
-var _default = Regex;
-exports["default"] = _default;
-
-},{}],10:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports["default"] = void 0;
-
-var _regex = _interopRequireDefault(require("./regex"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-var scorm2004_regex = _regex["default"].scorm2004;
-var learner = {
- 'true-false': {
- format: '^true$|^false$',
- max: 1,
- delimiter: '',
- unique: false
- },
- 'choice': {
- format: scorm2004_regex.CMILongIdentifier,
- max: 36,
- delimiter: '[,]',
- unique: true
- },
- 'fill-in': {
- format: scorm2004_regex.CMILangString250,
- max: 10,
- delimiter: '[,]',
- unique: false
- },
- 'long-fill-in': {
- format: scorm2004_regex.CMILangString4000,
- max: 1,
- delimiter: '',
- unique: false
- },
- 'matching': {
- format: scorm2004_regex.CMIShortIdentifier,
- format2: scorm2004_regex.CMIShortIdentifier,
- max: 36,
- delimiter: '[,]',
- delimiter2: '[.]',
- unique: false
- },
- 'performance': {
- format: '^$|' + scorm2004_regex.CMIShortIdentifier,
- format2: scorm2004_regex.CMIDecimal + '|^$|' + scorm2004_regex.CMIShortIdentifier,
- max: 250,
- delimiter: '[,]',
- delimiter2: '[.]',
- unique: false
- },
- 'sequencing': {
- format: scorm2004_regex.CMIShortIdentifier,
- max: 36,
- delimiter: '[,]',
- unique: false
- },
- 'likert': {
- format: scorm2004_regex.CMIShortIdentifier,
- max: 1,
- delimiter: '',
- unique: false
- },
- 'numeric': {
- format: scorm2004_regex.CMIDecimal,
- max: 1,
- delimiter: '',
- unique: false
- },
- 'other': {
- format: scorm2004_regex.CMIString4000,
- max: 1,
- delimiter: '',
- unique: false
- }
-};
-var correct = {
- 'true-false': {
- max: 1,
- delimiter: '',
- unique: false,
- duplicate: false,
- format: '^true$|^false$',
- limit: 1
- },
- 'choice': {
- max: 36,
- delimiter: '[,]',
- unique: true,
- duplicate: false,
- format: scorm2004_regex.CMILongIdentifier
- },
- 'fill-in': {
- max: 10,
- delimiter: '[,]',
- unique: false,
- duplicate: false,
- format: scorm2004_regex.CMILangString250cr
- },
- 'long-fill-in': {
- max: 1,
- delimiter: '',
- unique: false,
- duplicate: true,
- format: scorm2004_regex.CMILangString4000
- },
- 'matching': {
- max: 36,
- delimiter: '[,]',
- delimiter2: '[.]',
- unique: false,
- duplicate: false,
- format: scorm2004_regex.CMIShortIdentifier,
- format2: scorm2004_regex.CMIShortIdentifier
- },
- 'performance': {
- max: 250,
- delimiter: '[,]',
- delimiter2: '[.]',
- unique: false,
- duplicate: false,
- format: '^$|' + scorm2004_regex.CMIShortIdentifier,
- format2: scorm2004_regex.CMIDecimal + '|^$|' + scorm2004_regex.CMIShortIdentifier
- },
- 'sequencing': {
- max: 36,
- delimiter: '[,]',
- unique: false,
- duplicate: false,
- format: scorm2004_regex.CMIShortIdentifier
- },
- 'likert': {
- max: 1,
- delimiter: '',
- unique: false,
- duplicate: false,
- format: scorm2004_regex.CMIShortIdentifier,
- limit: 1
- },
- 'numeric': {
- max: 2,
- delimiter: '[:]',
- unique: false,
- duplicate: false,
- format: scorm2004_regex.CMIDecimal,
- limit: 1
- },
- 'other': {
- max: 1,
- delimiter: '',
- unique: false,
- duplicate: false,
- format: scorm2004_regex.CMIString4000,
- limit: 1
- }
-};
-var Responses = {
- learner: learner,
- correct: correct
-};
-var _default = Responses;
-exports["default"] = _default;
-
-},{"./regex":9}],11:[function(require,module,exports){
-"use strict";
-
-function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.ValidationError = exports.Scorm2004ValidationError = exports.Scorm12ValidationError = exports.AICCValidationError = void 0;
-
-var _api_constants = _interopRequireDefault(require("./constants/api_constants"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); }
-
-function _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); }
-
-function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
-
-function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
-
-function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
-
-function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
-
-function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
-
-function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
-
-function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
-
-function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
-
-var scorm12_errors = _api_constants["default"].scorm12.error_descriptions;
-var aicc_errors = _api_constants["default"].aicc.error_descriptions;
-var scorm2004_errors = _api_constants["default"].scorm2004.error_descriptions;
-/**
- * Base Validation Exception
- */
-
-var _errorCode = /*#__PURE__*/new WeakMap();
-
-var _errorMessage = /*#__PURE__*/new WeakMap();
-
-var _detailedMessage = /*#__PURE__*/new WeakMap();
-
-var ValidationError = /*#__PURE__*/function (_Error) {
- _inherits(ValidationError, _Error);
-
- var _super = _createSuper(ValidationError);
-
- /**
- * Constructor to take in an error message and code
- * @param {number} errorCode
- * @param {string} errorMessage
- * @param {string} detailedMessage
- */
- function ValidationError(errorCode, errorMessage, detailedMessage) {
- var _this;
-
- _classCallCheck(this, ValidationError);
-
- _this = _super.call(this, errorMessage);
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _errorCode, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _errorMessage, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldInitSpec(_assertThisInitialized(_this), _detailedMessage, {
- writable: true,
- value: void 0
- });
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _errorCode, errorCode);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _errorMessage, errorMessage);
-
- _classPrivateFieldSet(_assertThisInitialized(_this), _detailedMessage, detailedMessage);
-
- return _this;
- }
-
- _createClass(ValidationError, [{
- key: "errorCode",
- get:
- /**
- * Getter for #errorCode
- * @return {number}
- */
- function get() {
- return _classPrivateFieldGet(this, _errorCode);
- }
- /**
- * Getter for #errorMessage
- * @return {string}
- */
-
- }, {
- key: "errorMessage",
- get: function get() {
- return _classPrivateFieldGet(this, _errorMessage);
- }
- /**
- * Getter for #detailedMessage
- * @return {string}
- */
-
- }, {
- key: "detailedMessage",
- get: function get() {
- return _classPrivateFieldGet(this, _detailedMessage);
- }
- }]);
-
- return ValidationError;
-}( /*#__PURE__*/_wrapNativeSuper(Error));
-/**
- * SCORM 1.2 Validation Error
- */
-
-
-exports.ValidationError = ValidationError;
-
-var Scorm12ValidationError = /*#__PURE__*/function (_ValidationError) {
- _inherits(Scorm12ValidationError, _ValidationError);
-
- var _super2 = _createSuper(Scorm12ValidationError);
-
- /**
- * Constructor to take in an error code
- * @param {number} errorCode
- */
- function Scorm12ValidationError(errorCode) {
- var _this2;
-
- _classCallCheck(this, Scorm12ValidationError);
-
- if ({}.hasOwnProperty.call(scorm12_errors, String(errorCode))) {
- _this2 = _super2.call(this, errorCode, scorm12_errors[String(errorCode)].basicMessage, scorm12_errors[String(errorCode)].detailMessage);
- } else {
- _this2 = _super2.call(this, 101, scorm12_errors['101'].basicMessage, scorm12_errors['101'].detailMessage);
- }
-
- return _possibleConstructorReturn(_this2);
- }
-
- return _createClass(Scorm12ValidationError);
-}(ValidationError);
-/**
- * AICC Validation Error
- */
-
-
-exports.Scorm12ValidationError = Scorm12ValidationError;
-
-var AICCValidationError = /*#__PURE__*/function (_ValidationError2) {
- _inherits(AICCValidationError, _ValidationError2);
-
- var _super3 = _createSuper(AICCValidationError);
-
- /**
- * Constructor to take in an error code
- * @param {number} errorCode
- */
- function AICCValidationError(errorCode) {
- var _this3;
-
- _classCallCheck(this, AICCValidationError);
-
- if ({}.hasOwnProperty.call(aicc_errors, String(errorCode))) {
- _this3 = _super3.call(this, errorCode, aicc_errors[String(errorCode)].basicMessage, aicc_errors[String(errorCode)].detailMessage);
- } else {
- _this3 = _super3.call(this, 101, aicc_errors['101'].basicMessage, aicc_errors['101'].detailMessage);
- }
-
- return _possibleConstructorReturn(_this3);
- }
-
- return _createClass(AICCValidationError);
-}(ValidationError);
-/**
- * SCORM 2004 Validation Error
- */
-
-
-exports.AICCValidationError = AICCValidationError;
-
-var Scorm2004ValidationError = /*#__PURE__*/function (_ValidationError3) {
- _inherits(Scorm2004ValidationError, _ValidationError3);
-
- var _super4 = _createSuper(Scorm2004ValidationError);
-
- /**
- * Constructor to take in an error code
- * @param {number} errorCode
- */
- function Scorm2004ValidationError(errorCode) {
- var _this4;
-
- _classCallCheck(this, Scorm2004ValidationError);
-
- if ({}.hasOwnProperty.call(scorm2004_errors, String(errorCode))) {
- _this4 = _super4.call(this, errorCode, scorm2004_errors[String(errorCode)].basicMessage, scorm2004_errors[String(errorCode)].detailMessage);
- } else {
- _this4 = _super4.call(this, 101, scorm2004_errors['101'].basicMessage, scorm2004_errors['101'].detailMessage);
- }
-
- return _possibleConstructorReturn(_this4);
- }
-
- return _createClass(Scorm2004ValidationError);
-}(ValidationError);
-
-exports.Scorm2004ValidationError = Scorm2004ValidationError;
-
-},{"./constants/api_constants":6}],12:[function(require,module,exports){
-"use strict";
-
-var _Scorm2004API = _interopRequireDefault(require("../Scorm2004API"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
-
-window.Scorm2004API = _Scorm2004API["default"];
-
-},{"../Scorm2004API":3}],13:[function(require,module,exports){
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.SECONDS_PER_SECOND = exports.SECONDS_PER_MINUTE = exports.SECONDS_PER_HOUR = exports.SECONDS_PER_DAY = void 0;
-exports.addHHMMSSTimeStrings = addHHMMSSTimeStrings;
-exports.addTwoDurations = addTwoDurations;
-exports.countDecimals = countDecimals;
-exports.flatten = flatten;
-exports.getDurationAsSeconds = getDurationAsSeconds;
-exports.getSecondsAsHHMMSS = getSecondsAsHHMMSS;
-exports.getSecondsAsISODuration = getSecondsAsISODuration;
-exports.getTimeAsSeconds = getTimeAsSeconds;
-exports.unflatten = unflatten;
-
-function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
-
-function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
-
-function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
-
-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; }
-
-function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
-
-function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
-
-var SECONDS_PER_SECOND = 1.0;
-exports.SECONDS_PER_SECOND = SECONDS_PER_SECOND;
-var SECONDS_PER_MINUTE = 60;
-exports.SECONDS_PER_MINUTE = SECONDS_PER_MINUTE;
-var SECONDS_PER_HOUR = 60 * SECONDS_PER_MINUTE;
-exports.SECONDS_PER_HOUR = SECONDS_PER_HOUR;
-var SECONDS_PER_DAY = 24 * SECONDS_PER_HOUR;
-exports.SECONDS_PER_DAY = SECONDS_PER_DAY;
-var designations = [['D', SECONDS_PER_DAY], ['H', SECONDS_PER_HOUR], ['M', SECONDS_PER_MINUTE], ['S', SECONDS_PER_SECOND]];
-/**
- * Converts a Number to a String of HH:MM:SS
- *
- * @param {Number} totalSeconds
- * @return {string}
- */
-
-function getSecondsAsHHMMSS(totalSeconds) {
- // SCORM spec does not deal with negative durations, give zero back
- if (!totalSeconds || totalSeconds <= 0) {
- return '00:00:00';
- }
-
- var hours = Math.floor(totalSeconds / SECONDS_PER_HOUR);
- var dateObj = new Date(totalSeconds * 1000);
- var minutes = dateObj.getUTCMinutes(); // make sure we add any possible decimal value
-
- var seconds = dateObj.getSeconds();
- var ms = totalSeconds % 1.0;
- var msStr = '';
-
- if (countDecimals(ms) > 0) {
- if (countDecimals(ms) > 2) {
- msStr = ms.toFixed(2);
- } else {
- msStr = String(ms);
- }
-
- msStr = '.' + msStr.split('.')[1];
- }
-
- return (hours + ':' + minutes + ':' + seconds).replace(/\b\d\b/g, '0$&') + msStr;
-}
-/**
- * Calculate the number of seconds from ISO 8601 Duration
- *
- * @param {Number} seconds
- * @return {String}
- */
-
-
-function getSecondsAsISODuration(seconds) {
- // SCORM spec does not deal with negative durations, give zero back
- if (!seconds || seconds <= 0) {
- return 'PT0S';
- }
-
- var duration = 'P';
- var remainder = seconds;
- designations.forEach(function (_ref) {
- var _ref2 = _slicedToArray(_ref, 2),
- sign = _ref2[0],
- current_seconds = _ref2[1];
-
- var value = Math.floor(remainder / current_seconds);
- remainder = remainder % current_seconds;
-
- if (countDecimals(remainder) > 2) {
- remainder = Number(Number(remainder).toFixed(2));
- } // If we have anything left in the remainder, and we're currently adding
- // seconds to the duration, go ahead and add the decimal to the seconds
-
-
- if (sign === 'S' && remainder > 0) {
- value += remainder;
- }
-
- if (value) {
- if ((duration.indexOf('D') > 0 || sign === 'H' || sign === 'M' || sign === 'S') && duration.indexOf('T') === -1) {
- duration += 'T';
- }
-
- duration += "".concat(value).concat(sign);
- }
- });
- return duration;
-}
-/**
- * Calculate the number of seconds from HH:MM:SS.DDDDDD
- *
- * @param {string} timeString
- * @param {RegExp} timeRegex
- * @return {number}
- */
-
-
-function getTimeAsSeconds(timeString, timeRegex) {
- if (!timeString || typeof timeString !== 'string' || !timeString.match(timeRegex)) {
- return 0;
- }
-
- var parts = timeString.split(':');
- var hours = Number(parts[0]);
- var minutes = Number(parts[1]);
- var seconds = Number(parts[2]);
- return hours * 3600 + minutes * 60 + seconds;
-}
-/**
- * Calculate the number of seconds from ISO 8601 Duration
- *
- * @param {string} duration
- * @param {RegExp} durationRegex
- * @return {number}
- */
-
-
-function getDurationAsSeconds(duration, durationRegex) {
- if (!duration || !duration.match(durationRegex)) {
- return 0;
- }
-
- var _ref3 = new RegExp(durationRegex).exec(duration) || [],
- _ref4 = _slicedToArray(_ref3, 8),
- years = _ref4[1],
- months = _ref4[2],
- days = _ref4[4],
- hours = _ref4[5],
- minutes = _ref4[6],
- seconds = _ref4[7];
-
- var result = 0.0;
- result += Number(seconds) * 1.0 || 0.0;
- result += Number(minutes) * 60.0 || 0.0;
- result += Number(hours) * 3600.0 || 0.0;
- result += Number(days) * (60 * 60 * 24.0) || 0.0;
- result += Number(years) * (60 * 60 * 24 * 365.0) || 0.0;
- return result;
-}
-/**
- * Adds together two ISO8601 Duration strings
- *
- * @param {string} first
- * @param {string} second
- * @param {RegExp} durationRegex
- * @return {string}
- */
-
-
-function addTwoDurations(first, second, durationRegex) {
- return getSecondsAsISODuration(getDurationAsSeconds(first, durationRegex) + getDurationAsSeconds(second, durationRegex));
-}
-/**
- * Add together two HH:MM:SS.DD strings
- *
- * @param {string} first
- * @param {string} second
- * @param {RegExp} timeRegex
- * @return {string}
- */
-
-
-function addHHMMSSTimeStrings(first, second, timeRegex) {
- return getSecondsAsHHMMSS(getTimeAsSeconds(first, timeRegex) + getTimeAsSeconds(second, timeRegex));
-}
-/**
- * Flatten a JSON object down to string paths for each values
- * @param {object} data
- * @return {object}
- */
-
-
-function flatten(data) {
- var result = {};
- /**
- * Recurse through the object
- * @param {*} cur
- * @param {*} prop
- */
-
- function recurse(cur, prop) {
- if (Object(cur) !== cur) {
- result[prop] = cur;
- } else if (Array.isArray(cur)) {
- for (var i = 0, l = cur.length; i < l; i++) {
- recurse(cur[i], prop + '[' + i + ']');
- if (l === 0) result[prop] = [];
- }
- } else {
- var isEmpty = true;
-
- for (var p in cur) {
- if ({}.hasOwnProperty.call(cur, p)) {
- isEmpty = false;
- recurse(cur[p], prop ? prop + '.' + p : p);
- }
- }
-
- if (isEmpty && prop) result[prop] = {};
- }
- }
-
- recurse(data, '');
- return result;
-}
-/**
- * Un-flatten a flat JSON object
- * @param {object} data
- * @return {object}
- */
-
-
-function unflatten(data) {
- 'use strict';
-
- if (Object(data) !== data || Array.isArray(data)) return data;
- var regex = /\.?([^.[\]]+)|\[(\d+)]/g;
- var result = {};
-
- for (var p in data) {
- if ({}.hasOwnProperty.call(data, p)) {
- var cur = result;
- var prop = '';
- var m = regex.exec(p);
-
- while (m) {
- cur = cur[prop] || (cur[prop] = m[2] ? [] : {});
- prop = m[2] || m[1];
- m = regex.exec(p);
- }
-
- cur[prop] = data[p];
- }
- }
-
- return result[''] || result;
-}
-/**
- * Counts the number of decimal places
- * @param {number} num
- * @return {number}
- */
-
-
-function countDecimals(num) {
- if (Math.floor(num) === num || String(num).indexOf('.') < 0) return 0;
- var parts = num.toString().split('.')[1];
- return parts.length || 0;
-}
-
-},{}]},{},[12]);
+!function(){var r={"./node_modules/lodash.debounce/index.js":
+/*!***********************************************!*\
+ !*** ./node_modules/lodash.debounce/index.js ***!
+ \***********************************************/function(e,s,t){function r(e){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function v(){return f.Date.now()}var n=NaN,i="[object Symbol]",o=/^\s+|\s+$/g,a=/^[-+]0x[0-9a-f]+$/i,l=/^0b[01]+$/i,c=/^0o[0-7]+$/i,u=parseInt,t="object"==(void 0===t.g?"undefined":r(t.g))&&t.g&&t.g.Object===Object&&t.g,h="object"==("undefined"==typeof self?"undefined":r(self))&&self&&self.Object===Object&&self,f=t||h||Function("return this")(),d=Object.prototype.toString,b=Math.max,M=Math.min;function E(e){var t=r(e);return e&&("object"==t||"function"==t)}function m(e){return"symbol"==r(e)||!!(t=e)&&"object"==r(t)&&d.call(e)==i;var t}function _(e){if("number"==typeof e)return e;if(m(e))return n;if("string"!=typeof(e=E(e)?E(t="function"==typeof e.valueOf?e.valueOf():e)?t+"":t:e))return 0===e?e:+e;e=e.replace(o,"");var t=l.test(e);return t||c.test(e)?u(e.slice(2),t?2:8):a.test(e)?n:+e}e.exports=function(h,r,e){var n,i,o,a,s,l,c=0,f=!1,u=!1,t=!0;if("function"!=typeof h)throw new TypeError("Expected a function");function d(e){var t=n,r=i;return n=i=void 0,c=e,a=h.apply(r,t)}function m(e){var t=e-l;return void 0===l||r<=t||t<0||u&&o<=e-c}function p(){var e,t=v();if(m(t))return g(t);s=setTimeout(p,(e=r-((t=t)-l),u?M(e,o-(t-c)):e))}function g(e){return s=void 0,t&&n?d(e):(n=i=void 0,a)}function y(){var e=v(),t=m(e);if(n=arguments,i=this,l=e,t){if(void 0===s)return c=e=l,s=setTimeout(p,r),f?d(e):a;if(u)return s=setTimeout(p,r),d(l)}return void 0===s&&(s=setTimeout(p,r)),a}return r=_(r)||0,E(e)&&(f=!!e.leading,u="maxWait"in e,o=u?b(_(e.maxWait)||0,r):o,t="trailing"in e?!!e.trailing:t),y.cancel=function(){void 0!==s&&clearTimeout(s),n=l=i=s=void(c=0)},y.flush=function(){return void 0===s?a:g(v())},y}},"./src/BaseAPI.js":
+/*!************************!*\
+ !*** ./src/BaseAPI.js ***!
+ \************************/function(r,e,t){"use strict";t.r(e),t.d(e,{default:function(){return T}});var p=t(/*! ./cmi/common */"./src/cmi/common.js"),l=t(/*! ./exceptions */"./src/exceptions.js"),e=t(/*! ./constants/error_codes */"./src/constants/error_codes.js"),c=t(/*! ./constants/api_constants */"./src/constants/api_constants.js"),u=t(/*! ./utilities */"./src/utilities.js"),h=t(/*! lodash.debounce */"./node_modules/lodash.debounce/index.js"),g=t.n(h);function y(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,i,o=[],a=!0,s=!1;try{for(r=r.call(e);!(a=(n=r.next()).done)&&(o.push(n.value),!t||o.length!==t);a=!0);}catch(e){s=!0,i=e}finally{try{a||null==r.return||r.return()}finally{if(s)throw i}}return o}}(e,t)||function(e,t){if(e){if("string"==typeof e)return v(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Map"===(r="Object"===r&&e.constructor?e.constructor.name:r)||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?v(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function v(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r=this.apiLogLevel&&this.settings.onLogMessage(n,r)}},{key:"formatMessage",value:function(e,t,r){for(var n="",i=20-(n+=e).length,o=0;oe.max&&this.throwSCORMError(u.GENERAL_SET_FAILURE,"Data Model Element Pattern Too Long")}},{key:"checkDuplicateChoiceResponse",value:function(e,t){var r=e.correct_responses._count;if("choice"===e.type)for(var n=0;nNumber(t[1])&&this.throwSCORMError(u.TYPE_MISMATCH);else if(""!==t[o]&&n.unique)for(var s=0;s=this.cmi.completion_threshold?(console.debug("Setting Completion Status: Completed"),this.cmi.completion_status="completed"):(console.debug("Setting Completion Status: Incomplete"),this.cmi.completion_status="incomplete")),this.cmi.scaled_passing_score&&this.cmi.score.scaled&&(this.cmi.score.scaled>=this.cmi.scaled_passing_score?(console.debug("Setting Success Status: Passed"),this.cmi.success_status="passed"):(console.debug("Setting Success Status: Failed"),this.cmi.success_status="failed")));var t,r,n=!1,i=(this.adl.nav.request!==(null===(i=this.startingData)||void 0===i||null===(r=i.adl)||void 0===r||null===(t=r.nav)||void 0===t?void 0:t.request)&&"_none_"!==this.adl.nav.request&&(this.adl.nav.request=encodeURIComponent(this.adl.nav.request),n=!0),this.renderCommitCMI(e||this.settings.alwaysSendTotalTime));return this.apiLogLevel===c.LOG_LEVEL_DEBUG&&(console.debug("Commit (terminated: "+(e?"yes":"no")+"): "),console.debug(i)),this.settings.lmsCommitUrl?(r=this.processHttpRequest(this.settings.lmsCommitUrl,i,e),n&&void 0!==r.navRequest&&""!==r.navRequest&&Function('"use strict";(() => { '.concat(r.navRequest," })()"))(),r):c.SCORM_TRUE}}])&&v(t.prototype,e),r&&v(t,r),Object.defineProperty(t,"prototype",{writable:!1}),i}(e.default)},"./src/cmi/common.js":
+/*!***************************!*\
+ !*** ./src/cmi/common.js ***!
+ \***************************/function(r,n,e){"use strict";e.r(n),e.d(n,{checkValidFormat:function(){return I},checkValidRange:function(){return O},BaseCMI:function(){return k},CMIScore:function(){return D},CMIArray:function(){return z}});var n=e(/*! ../constants/api_constants */"./src/constants/api_constants.js"),i=e(/*! ../constants/error_codes */"./src/constants/error_codes.js"),e=e(/*! ../constants/regex */"./src/constants/regex.js");function o(e){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&s(e,t)}function s(e,t){return(s=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function l(r){var n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}();return function(){var e,t=c(r),t=(e=n?(e=c(this).constructor,Reflect.construct(t,arguments,e)):t.apply(this,arguments),this);if(e&&("object"===o(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return h(t)}}function h(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function c(e){return(c=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function E(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){for(var r=0;r=t[0]){if("*"===t[1]||e<=t[1])return!0;throw new n.prototype.constructor(r)}throw new n.prototype.constructor(r)}var C=new WeakMap,T=new WeakMap,k=function(){function n(){var e,t,r;if(E(this,n),r=!(t="jsonString"),t in(e=this)?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,f(this,C,{writable:!0,value:!1}),f(this,T,{writable:!0,value:void 0}),(this instanceof n?this.constructor:void 0)===n)throw new TypeError("Cannot construct BaseCMI instances directly")}return _(n,[{key:"initialized",get:function(){return t(this,C)}},{key:"start_time",get:function(){return t(this,T)}},{key:"initialize",value:function(){d(this,C,!0)}},{key:"setStartTime",value:function(){d(this,T,(new Date).getTime())}}]),n}(),R=new WeakMap,m=new WeakMap,L=new WeakMap,p=new WeakMap,g=new WeakMap,y=new WeakMap,v=new WeakMap,j=new WeakMap,A=new WeakMap,N=new WeakMap,D=function(){a(u,k);var c=l(u);function u(e){var t,r=e.score_children,n=e.score_range,i=e.max,o=e.invalidErrorCode,a=e.invalidTypeCode,s=e.invalidRangeCode,l=e.decimalRegex,e=e.errorClass;return E(this,u),f(h(t=c.call(this)),R,{writable:!0,value:void 0}),f(h(t),m,{writable:!0,value:void 0}),f(h(t),L,{writable:!0,value:void 0}),f(h(t),p,{writable:!0,value:void 0}),f(h(t),g,{writable:!0,value:void 0}),f(h(t),y,{writable:!0,value:void 0}),f(h(t),v,{writable:!0,value:void 0}),f(h(t),j,{writable:!0,value:""}),f(h(t),A,{writable:!0,value:""}),f(h(t),N,{writable:!0,value:void 0}),d(h(t),R,r||M.score_children),d(h(t),m,!!n&&w.score_range),d(h(t),N,i||""===i?i:"100"),d(h(t),L,o||S.INVALID_SET_VALUE),d(h(t),p,a||S.TYPE_MISMATCH),d(h(t),g,s||S.VALUE_OUT_OF_RANGE),d(h(t),y,l||w.CMIDecimal),d(h(t),v,e),t}return _(u,[{key:"_children",get:function(){return t(this,R)},set:function(e){throw new(t(this,v).prototype.constructor)(t(this,L))}},{key:"raw",get:function(){return t(this,j)},set:function(e){!I(e,t(this,y),t(this,p),t(this,v))||t(this,m)&&!O(e,t(this,m),t(this,g),t(this,v))||d(this,j,e)}},{key:"min",get:function(){return t(this,A)},set:function(e){!I(e,t(this,y),t(this,p),t(this,v))||t(this,m)&&!O(e,t(this,m),t(this,g),t(this,v))||d(this,A,e)}},{key:"max",get:function(){return t(this,N)},set:function(e){!I(e,t(this,y),t(this,p),t(this,v))||t(this,m)&&!O(e,t(this,m),t(this,g),t(this,v))||d(this,N,e)}},{key:"toJSON",value:function(){this.jsonString=!0;var e={raw:this.raw,min:this.min,max:this.max};return delete this.jsonString,e}}]),u}(),P=new WeakMap,x=new WeakMap,V=new WeakMap,z=function(){a(o,k);var i=l(o);function o(e){var t,r=e.children,n=e.errorCode,e=e.errorClass;return E(this,o),f(h(t=i.call(this)),P,{writable:!0,value:void 0}),f(h(t),x,{writable:!0,value:void 0}),f(h(t),V,{writable:!0,value:void 0}),d(h(t),V,r),d(h(t),P,n),d(h(t),x,e),t.childArray=[],t}return _(o,[{key:"_children",get:function(){return t(this,V)},set:function(e){throw new(t(this,x).prototype.constructor)(t(this,P))}},{key:"_count",get:function(){return this.childArray.length},set:function(e){throw new(t(this,x).prototype.constructor)(t(this,P))}},{key:"toJSON",value:function(){this.jsonString=!0;for(var e={},t=0;te.length)&&(t=e.length);for(var r=0,n=new Array(t);r 1%",
+ "edge >= 16",
+ "safari >= 9",
+ "firefox >= 57",
+ "ie >= 11",
+ "ios >= 9",
+ "chrome >= 49"
+ ],
"directories": {
"test": "test"
},
@@ -19,18 +28,15 @@
"@types/chai": "^4.3.0",
"@types/mocha": "^9.1.0",
"babel-eslint": "^11.0.0-beta.2",
+ "babel-loader": "^8.2.3",
"babelify": "^10.0.0",
"browserify": "^17.0.0",
"chai": "^4.3.6",
"eslint": "^8.8.0",
"eslint-config-google": "^0.14.0",
"eslint-plugin-import": "^2.25.4",
+ "eslint-webpack-plugin": "^3.1.1",
"fetch-pretender": "^1.5.0",
- "grunt": "^1.4.1",
- "grunt-browserify": "^6.0.0",
- "grunt-cli": "^1.4.3",
- "grunt-contrib-watch": "^1.1.0",
- "grunt-mocha-test": "^0.13.3",
"jsdoc": "^3.6.10",
"jsdoc-babel": "^0.5.0",
"lodash.debounce": "^4.0.8",
@@ -40,11 +46,13 @@
"mochawesome": "^7.0.1",
"nyc": "^15.1.0",
"sinon": "^13.0.1",
- "uglifyify": "^5.0.2"
+ "uglifyjs-webpack-plugin": "^2.2.0",
+ "webpack": "^5.68.0",
+ "webpack-cli": "^4.9.2"
},
"scripts": {
"test": "./node_modules/.bin/mocha --require @babel/register --bdd --recursive --reporter list",
- "compile": "./node_modules/.bin/grunt default",
+ "compile": "./node_modules/.bin/webpack --bail --config webpack.js",
"fix": "./node_modules/.bin/eslint ./src --fix"
},
"repository": {
diff --git a/webpack.js b/webpack.js
new file mode 100644
index 0000000..9de8837
--- /dev/null
+++ b/webpack.js
@@ -0,0 +1,78 @@
+const path = require('path');
+const webpack = require('webpack');
+const ESLintPlugin = require('eslint-webpack-plugin');
+const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
+
+const JSLoader = {
+ test: /\.js$/i,
+ use: {
+ loader: 'babel-loader',
+ options: {
+ presets: [
+ [
+ '@babel/preset-env',
+ {
+ 'corejs': '3',
+ 'useBuiltIns': 'entry',
+ 'targets': {
+ 'browsers': [
+ 'edge >= 16',
+ 'safari >= 9',
+ 'firefox >= 57',
+ 'ie >= 11',
+ 'ios >= 9',
+ 'chrome >= 49',
+ ],
+ },
+ },
+ ],
+ ['@babel/preset-flow'],
+ ],
+ plugins: [
+ '@babel/plugin-proposal-class-properties',
+ '@babel/plugin-proposal-private-methods',
+ '@babel/plugin-proposal-optional-chaining',
+ ],
+ },
+ },
+};
+
+module.exports = {
+ mode: 'development',
+ devtool: 'source-map',
+ entry: {
+ 'aicc': './src/exports/aicc.js',
+ 'scorm12': './src/exports/scorm12.js',
+ 'scorm2004': './src/exports/scorm2004.js',
+ 'scorm-again': './src/exports/scorm-again.js',
+ 'aicc.min': './src/exports/aicc.js',
+ 'scorm12.min': './src/exports/scorm12.js',
+ 'scorm2004.min': './src/exports/scorm2004.js',
+ 'scorm-again.min': './src/exports/scorm-again.js',
+ },
+ target: ['web', 'es5'],
+ module: {
+ rules: [
+ JSLoader,
+ ],
+ },
+ output: {
+ path: path.resolve(__dirname, 'dist'),
+ environment: {
+ arrowFunction: false,
+ },
+ },
+ optimization: {
+ minimize: true,
+ minimizer: [new UglifyJsPlugin({
+ include: /\.min\.js$/,
+ })],
+ },
+ plugins: [
+ new ESLintPlugin({
+ overrideConfigFile: path.resolve(__dirname, '.eslintrc.js'),
+ context: path.resolve(__dirname, '../src'),
+ files: '**/*.js',
+ }),
+ ],
+};
diff --git a/yarn.lock b/yarn.lock
index 857ef29..27c2ed6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1303,6 +1303,11 @@
"@babel/helper-validator-identifier" "^7.16.7"
to-fast-properties "^2.0.0"
+"@discoveryjs/json-ext@^0.5.0":
+ version "0.5.6"
+ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz#d5e0706cf8c6acd8c6032f8d54070af261bbbb2f"
+ integrity sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==
+
"@eslint/eslintrc@^1.0.5":
version "1.0.5"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.0.5.tgz#33f1b838dbf1f923bfa517e008362b78ddbbf318"
@@ -1411,6 +1416,45 @@
resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.0.tgz#23509ebc1fa32f1b4d50d6a66c4032d5b8eaabdc"
integrity sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw==
+"@types/eslint-scope@^3.7.0":
+ version "3.7.3"
+ resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224"
+ integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==
+ dependencies:
+ "@types/eslint" "*"
+ "@types/estree" "*"
+
+"@types/eslint@*":
+ version "8.4.1"
+ resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.1.tgz#c48251553e8759db9e656de3efc846954ac32304"
+ integrity sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==
+ dependencies:
+ "@types/estree" "*"
+ "@types/json-schema" "*"
+
+"@types/eslint@^7.28.2":
+ version "7.29.0"
+ resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.29.0.tgz#e56ddc8e542815272720bb0b4ccc2aff9c3e1c78"
+ integrity sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==
+ dependencies:
+ "@types/estree" "*"
+ "@types/json-schema" "*"
+
+"@types/estree@*":
+ version "0.0.51"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40"
+ integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==
+
+"@types/estree@^0.0.50":
+ version "0.0.50"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83"
+ integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==
+
+"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8":
+ version "7.0.9"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d"
+ integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==
+
"@types/json5@^0.0.29":
version "0.0.29"
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
@@ -1439,18 +1483,163 @@
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.0.tgz#baf17ab2cca3fcce2d322ebc30454bff487efad5"
integrity sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg==
+"@types/node@*":
+ version "17.0.17"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.17.tgz#a8ddf6e0c2341718d74ee3dc413a13a042c45a0c"
+ integrity sha512-e8PUNQy1HgJGV3iU/Bp2+D/DXh3PYeyli8LgIwsQcs1Ar1LoaWHSIT6Rw+H2rNJmiq6SNWiDytfx8+gYj7wDHw==
+
"@ungap/promise-all-settled@1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44"
integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==
-JSONStream@^0.10.0:
- version "0.10.0"
- resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-0.10.0.tgz#74349d0d89522b71f30f0a03ff9bd20ca6f12ac0"
- integrity sha1-dDSdDYlSK3HzDwoD/5vSDKbxKsA=
+"@webassemblyjs/ast@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7"
+ integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==
dependencies:
- jsonparse "0.0.5"
- through ">=2.2.7 <3"
+ "@webassemblyjs/helper-numbers" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+
+"@webassemblyjs/floating-point-hex-parser@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f"
+ integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==
+
+"@webassemblyjs/helper-api-error@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16"
+ integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==
+
+"@webassemblyjs/helper-buffer@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5"
+ integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==
+
+"@webassemblyjs/helper-numbers@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae"
+ integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==
+ dependencies:
+ "@webassemblyjs/floating-point-hex-parser" "1.11.1"
+ "@webassemblyjs/helper-api-error" "1.11.1"
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/helper-wasm-bytecode@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1"
+ integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==
+
+"@webassemblyjs/helper-wasm-section@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a"
+ integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-buffer" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/wasm-gen" "1.11.1"
+
+"@webassemblyjs/ieee754@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614"
+ integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==
+ dependencies:
+ "@xtuc/ieee754" "^1.2.0"
+
+"@webassemblyjs/leb128@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5"
+ integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==
+ dependencies:
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/utf8@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff"
+ integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==
+
+"@webassemblyjs/wasm-edit@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6"
+ integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-buffer" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/helper-wasm-section" "1.11.1"
+ "@webassemblyjs/wasm-gen" "1.11.1"
+ "@webassemblyjs/wasm-opt" "1.11.1"
+ "@webassemblyjs/wasm-parser" "1.11.1"
+ "@webassemblyjs/wast-printer" "1.11.1"
+
+"@webassemblyjs/wasm-gen@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76"
+ integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/ieee754" "1.11.1"
+ "@webassemblyjs/leb128" "1.11.1"
+ "@webassemblyjs/utf8" "1.11.1"
+
+"@webassemblyjs/wasm-opt@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2"
+ integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-buffer" "1.11.1"
+ "@webassemblyjs/wasm-gen" "1.11.1"
+ "@webassemblyjs/wasm-parser" "1.11.1"
+
+"@webassemblyjs/wasm-parser@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199"
+ integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-api-error" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/ieee754" "1.11.1"
+ "@webassemblyjs/leb128" "1.11.1"
+ "@webassemblyjs/utf8" "1.11.1"
+
+"@webassemblyjs/wast-printer@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0"
+ integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@xtuc/long" "4.2.2"
+
+"@webpack-cli/configtest@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.1.tgz#9f53b1b7946a6efc2a749095a4f450e2932e8356"
+ integrity sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==
+
+"@webpack-cli/info@^1.4.1":
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.1.tgz#2360ea1710cbbb97ff156a3f0f24556e0fc1ebea"
+ integrity sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==
+ dependencies:
+ envinfo "^7.7.3"
+
+"@webpack-cli/serve@^1.6.1":
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.1.tgz#0de2875ac31b46b6c5bb1ae0a7d7f0ba5678dffe"
+ integrity sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==
+
+"@xtuc/ieee754@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
+ integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
+
+"@xtuc/long@4.2.2":
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
+ integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
JSONStream@^1.0.3:
version "1.3.5"
@@ -1460,10 +1649,10 @@ JSONStream@^1.0.3:
jsonparse "^1.2.0"
through ">=2.2.7 <3"
-abbrev@1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
- integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+acorn-import-assertions@^1.7.6:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9"
+ integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==
acorn-jsx@^5.3.1:
version "5.3.1"
@@ -1489,7 +1678,7 @@ acorn@^7.0.0:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
-acorn@^8.7.0:
+acorn@^8.4.1, acorn@^8.7.0:
version "8.7.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf"
integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==
@@ -1502,7 +1691,17 @@ aggregate-error@^3.0.0:
clean-stack "^2.0.0"
indent-string "^4.0.0"
-ajv@^6.10.0, ajv@^6.12.4:
+ajv-errors@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
+ integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
+
+ajv-keywords@^3.1.0, ajv-keywords@^3.5.2:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
+ integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
+
+ajv@^6.1.0, ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -1541,14 +1740,6 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0:
dependencies:
color-convert "^2.0.1"
-anymatch@^3.1.0, anymatch@~3.1.2:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
- integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
- dependencies:
- normalize-path "^3.0.0"
- picomatch "^2.0.4"
-
anymatch@~3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
@@ -1557,6 +1748,14 @@ anymatch@~3.1.1:
normalize-path "^3.0.0"
picomatch "^2.0.4"
+anymatch@~3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
append-transform@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12"
@@ -1564,6 +1763,11 @@ append-transform@^2.0.0:
dependencies:
default-require-extensions "^3.0.0"
+aproba@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+ integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
+
archy@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
@@ -1581,11 +1785,6 @@ argparse@^2.0.1:
resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
-array-each@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f"
- integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8=
-
array-filter@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83"
@@ -1602,11 +1801,6 @@ array-includes@^3.1.4:
get-intrinsic "^1.1.1"
is-string "^1.0.7"
-array-slice@^1.0.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4"
- integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==
-
array.prototype.flat@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13"
@@ -1639,23 +1833,6 @@ assertion-error@^1.1.0:
resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
-async@^1.5.2:
- version "1.5.2"
- resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
- integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
-
-async@^2.5.0, async@^2.6.0:
- version "2.6.3"
- resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
- integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
- dependencies:
- lodash "^4.17.14"
-
-async@~3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720"
- integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==
-
available-typed-arrays@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz#6b098ca9d8039079ee3f77f7b783c4480ba513f5"
@@ -1672,6 +1849,16 @@ babel-eslint@^11.0.0-beta.2:
eslint-visitor-keys "^1.1.0"
semver "^6.3.0"
+babel-loader@^8.2.3:
+ version "8.2.3"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.3.tgz#8986b40f1a64cacfcb4b8429320085ef68b1342d"
+ integrity sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==
+ dependencies:
+ find-cache-dir "^3.3.1"
+ loader-utils "^1.4.0"
+ make-dir "^3.1.0"
+ schema-utils "^2.6.5"
+
babel-plugin-dynamic-import-node@^2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
@@ -1718,12 +1905,17 @@ base64-js@^1.0.2:
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+big.js@^5.2.2:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
+ integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
+
binary-extensions@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
-bluebird@^3.7.2:
+bluebird@^3.5.5, bluebird@^3.7.2:
version "3.7.2"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
@@ -1738,16 +1930,6 @@ bn.js@^5.0.0, bn.js@^5.1.1:
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b"
integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==
-body@^5.1.0:
- version "5.1.0"
- resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069"
- integrity sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=
- dependencies:
- continuable-cache "^0.3.1"
- error "^7.0.0"
- raw-body "~1.1.0"
- safe-json-parse "~1.0.1"
-
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@@ -1804,15 +1986,6 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4:
inherits "^2.0.1"
safe-buffer "^5.0.1"
-browserify-cache-api@^3.0.0:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/browserify-cache-api/-/browserify-cache-api-3.0.1.tgz#96247e853f068fd6e0d45cc73f0bb2cd9778ef02"
- integrity sha1-liR+hT8Gj9bg1FzHPwuyzZd47wI=
- dependencies:
- async "^1.5.2"
- through2 "^2.0.0"
- xtend "^4.0.0"
-
browserify-cipher@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
@@ -1832,16 +2005,6 @@ browserify-des@^1.0.0:
inherits "^2.0.1"
safe-buffer "^5.1.2"
-browserify-incremental@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/browserify-incremental/-/browserify-incremental-3.1.1.tgz#0713cb7587247a632a9f08cf1bd169b878b62a8a"
- integrity sha1-BxPLdYckemMqnwjPG9FpuHi2Koo=
- dependencies:
- JSONStream "^0.10.0"
- browserify-cache-api "^3.0.0"
- through2 "^2.0.0"
- xtend "^4.0.0"
-
browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
version "4.1.0"
resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
@@ -1971,10 +2134,26 @@ builtin-status-codes@^3.0.0:
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
-bytes@1:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8"
- integrity sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=
+cacache@^12.0.2:
+ version "12.0.4"
+ resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c"
+ integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==
+ dependencies:
+ bluebird "^3.5.5"
+ chownr "^1.1.1"
+ figgy-pudding "^3.5.1"
+ glob "^7.1.4"
+ graceful-fs "^4.1.15"
+ infer-owner "^1.0.3"
+ lru-cache "^5.1.1"
+ mississippi "^3.0.0"
+ mkdirp "^0.5.1"
+ move-concurrently "^1.0.1"
+ promise-inflight "^1.0.1"
+ rimraf "^2.6.3"
+ ssri "^6.0.1"
+ unique-filename "^1.1.1"
+ y18n "^4.0.0"
cached-path-relative@^1.0.0, cached-path-relative@^1.0.2:
version "1.0.2"
@@ -2053,7 +2232,7 @@ chalk@^2.0.0:
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
-chalk@^4.0.0, chalk@^4.1.0, chalk@~4.1.0:
+chalk@^4.0.0, chalk@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
@@ -2109,6 +2288,16 @@ chokidar@^3.4.0:
optionalDependencies:
fsevents "~2.3.1"
+chownr@^1.1.1:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+ integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
+chrome-trace-event@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
+ integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
+
cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
@@ -2178,10 +2367,10 @@ colorette@^1.2.2:
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94"
integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==
-colors@~1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
- integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM=
+colorette@^2.0.14:
+ version "2.0.16"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da"
+ integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==
combine-source-map@^0.8.0, combine-source-map@~0.8.0:
version "0.8.0"
@@ -2193,7 +2382,7 @@ combine-source-map@^0.8.0, combine-source-map@~0.8.0:
lodash.memoize "~3.0.3"
source-map "~0.5.3"
-commander@^2.19.0:
+commander@^2.20.0:
version "2.20.3"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
@@ -2203,6 +2392,11 @@ commander@^4.0.1:
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
+commander@^7.0.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
+ integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
+
commondir@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
@@ -2213,7 +2407,7 @@ concat-map@0.0.1:
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
-concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0:
+concat-stream@^1.5.0, concat-stream@^1.6.0, concat-stream@^1.6.1, concat-stream@~1.6.0:
version "1.6.2"
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
@@ -2233,11 +2427,6 @@ constants-browserify@~1.0.0:
resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
-continuable-cache@^0.3.1:
- version "0.3.1"
- resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f"
- integrity sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=
-
convert-source-map@^1.1.0, convert-source-map@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
@@ -2250,6 +2439,18 @@ convert-source-map@~1.1.0:
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860"
integrity sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=
+copy-concurrently@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
+ integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==
+ dependencies:
+ aproba "^1.1.1"
+ fs-write-stream-atomic "^1.0.8"
+ iferr "^0.1.5"
+ mkdirp "^0.5.1"
+ rimraf "^2.5.4"
+ run-queue "^1.0.0"
+
core-js-compat@^3.20.0, core-js-compat@^3.20.2:
version "3.20.2"
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.20.2.tgz#d1ff6936c7330959b46b2e08b122a8b14e26140b"
@@ -2299,7 +2500,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
safe-buffer "^5.0.1"
sha.js "^2.4.8"
-cross-spawn@^7.0.0, cross-spawn@^7.0.2:
+cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
@@ -2330,6 +2531,11 @@ crypto-browserify@^3.0.0:
randombytes "^2.0.0"
randomfill "^1.0.3"
+cyclist@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
+ integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
+
dash-ast@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/dash-ast/-/dash-ast-1.0.0.tgz#12029ba5fb2f8aa6f0a861795b23c1b4b6c27d37"
@@ -2340,11 +2546,6 @@ dateformat@^4.5.1:
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5"
integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==
-dateformat@~3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
- integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
-
debug@4.3.3:
version "4.3.3"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
@@ -2359,7 +2560,7 @@ debug@^2.2.0, debug@^2.6.9:
dependencies:
ms "2.0.0"
-debug@^3.1.0, debug@^3.2.7:
+debug@^3.2.7:
version "3.2.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
@@ -2439,11 +2640,6 @@ des.js@^1.0.0:
inherits "^2.0.1"
minimalistic-assert "^1.0.0"
-detect-file@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
- integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
-
detective@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b"
@@ -2493,6 +2689,16 @@ duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2:
dependencies:
readable-stream "^2.0.2"
+duplexify@^3.4.2, duplexify@^3.6.0:
+ version "3.7.1"
+ resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
+ integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
+ dependencies:
+ end-of-stream "^1.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+ stream-shift "^1.0.0"
+
electron-to-chromium@^1.3.723:
version "1.3.740"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.740.tgz#e38b7d2b848f632191b643e6dabca51be2162922"
@@ -2521,17 +2727,42 @@ emoji-regex@^8.0.0:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+emojis-list@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
+ integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
+enhanced-resolve@^5.8.3:
+ version "5.9.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.0.tgz#49ac24953ac8452ed8fed2ef1340fc8e043667ee"
+ integrity sha512-weDYmzbBygL7HzGGS26M3hGQx68vehdEg6VUmqSOaFzXExFqlnKuSvsEJCVGQHScS8CQMbrAqftT+AzzHNt/YA==
+ dependencies:
+ graceful-fs "^4.2.4"
+ tapable "^2.2.0"
+
entities@~2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5"
integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==
-error@^7.0.0:
- version "7.2.1"
- resolved "https://registry.yarnpkg.com/error/-/error-7.2.1.tgz#eab21a4689b5f684fc83da84a0e390de82d94894"
- integrity sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==
+envinfo@^7.7.3:
+ version "7.8.1"
+ resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475"
+ integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==
+
+errno@~0.1.7:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
+ integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
dependencies:
- string-template "~0.2.1"
+ prr "~1.0.1"
es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2:
version "1.18.0-next.2"
@@ -2579,6 +2810,11 @@ es-abstract@^1.19.0, es-abstract@^1.19.1:
string.prototype.trimstart "^1.0.4"
unbox-primitive "^1.0.1"
+es-module-lexer@^0.9.0:
+ version "0.9.3"
+ resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19"
+ integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==
+
es-to-primitive@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
@@ -2666,6 +2902,14 @@ eslint-scope@5.0.0:
esrecurse "^4.1.0"
estraverse "^4.1.1"
+eslint-scope@5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
+ integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^4.1.1"
+
eslint-scope@^7.1.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.0.tgz#c1f6ea30ac583031f203d65c73e723b01298f153"
@@ -2701,6 +2945,17 @@ eslint-visitor-keys@^3.2.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz#6fbb166a6798ee5991358bc2daa1ba76cc1254a1"
integrity sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==
+eslint-webpack-plugin@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-3.1.1.tgz#83dad2395e5f572d6f4d919eedaa9cf902890fcb"
+ integrity sha512-xSucskTN9tOkfW7so4EaiFIkulWLXwCB/15H917lR6pTv0Zot6/fetFucmENRb7J5whVSFKIvwnrnsa78SG2yg==
+ dependencies:
+ "@types/eslint" "^7.28.2"
+ jest-worker "^27.3.1"
+ micromatch "^4.0.4"
+ normalize-path "^3.0.0"
+ schema-utils "^3.1.1"
+
eslint@^8.8.0:
version "8.8.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.8.0.tgz#9762b49abad0cb4952539ffdb0a046392e571a2d"
@@ -2785,16 +3040,16 @@ esutils@^2.0.2:
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
-eventemitter2@~0.4.13:
- version "0.4.14"
- resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab"
- integrity sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=
-
events@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379"
integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==
+events@^3.2.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
@@ -2803,22 +3058,20 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
md5.js "^1.3.4"
safe-buffer "^5.1.1"
-exit@~0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
- integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=
-
-expand-tilde@^2.0.0, expand-tilde@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
- integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=
+execa@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
+ integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
dependencies:
- homedir-polyfill "^1.0.1"
-
-extend@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
- integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+ cross-spawn "^7.0.3"
+ get-stream "^6.0.0"
+ human-signals "^2.1.0"
+ is-stream "^2.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^4.0.1"
+ onetime "^5.1.2"
+ signal-exit "^3.0.3"
+ strip-final-newline "^2.0.0"
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
@@ -2840,12 +3093,10 @@ fast-safe-stringify@^2.0.7:
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743"
integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==
-faye-websocket@~0.10.0:
- version "0.10.0"
- resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
- integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=
- dependencies:
- websocket-driver ">=0.5.1"
+fastest-levenshtein@^1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2"
+ integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==
fetch-pretender@^1.5.0:
version "1.5.0"
@@ -2861,6 +3112,11 @@ fetchme@^2.0.0:
resolved "https://registry.yarnpkg.com/fetchme/-/fetchme-2.1.0.tgz#c3b66322572e20544f6c2c475991551faa85ae5f"
integrity sha1-w7ZjIlcuIFRPbCxHWZFVH6qFrl8=
+figgy-pudding@^3.5.1:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e"
+ integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==
+
file-entry-cache@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
@@ -2875,7 +3131,7 @@ fill-range@^7.0.1:
dependencies:
to-regex-range "^5.0.1"
-find-cache-dir@^2.0.0:
+find-cache-dir@^2.0.0, find-cache-dir@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7"
integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==
@@ -2893,6 +3149,15 @@ find-cache-dir@^3.2.0:
make-dir "^3.0.2"
pkg-dir "^4.1.0"
+find-cache-dir@^3.3.1:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b"
+ integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^3.0.2"
+ pkg-dir "^4.1.0"
+
find-up@5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
@@ -2923,39 +3188,6 @@ find-up@^4.0.0, find-up@^4.1.0:
locate-path "^5.0.0"
path-exists "^4.0.0"
-findup-sync@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0"
- integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==
- dependencies:
- detect-file "^1.0.0"
- is-glob "^4.0.0"
- micromatch "^4.0.2"
- resolve-dir "^1.0.1"
-
-findup-sync@~0.3.0:
- version "0.3.0"
- resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16"
- integrity sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=
- dependencies:
- glob "~5.0.0"
-
-fined@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b"
- integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==
- dependencies:
- expand-tilde "^2.0.2"
- is-plain-object "^2.0.3"
- object.defaults "^1.1.0"
- object.pick "^1.2.0"
- parse-filepath "^1.0.1"
-
-flagged-respawn@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41"
- integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==
-
flat-cache@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
@@ -2974,17 +3206,13 @@ flatted@^3.1.0:
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469"
integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==
-for-in@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
- integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
-
-for-own@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b"
- integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=
+flush-write-stream@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8"
+ integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==
dependencies:
- for-in "^1.0.1"
+ inherits "^2.0.3"
+ readable-stream "^2.3.6"
foreach@^2.0.5:
version "2.0.5"
@@ -2999,6 +3227,14 @@ foreground-child@^2.0.0:
cross-spawn "^7.0.0"
signal-exit "^3.0.2"
+from2@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+ integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+
fromentries@^1.2.0:
version "1.3.2"
resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a"
@@ -3018,6 +3254,16 @@ fs-readdir-recursive@^1.1.0:
resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27"
integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==
+fs-write-stream-atomic@^1.0.8:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
+ integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=
+ dependencies:
+ graceful-fs "^4.1.2"
+ iferr "^0.1.5"
+ imurmurhash "^0.1.4"
+ readable-stream "1 || 2"
+
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
@@ -3043,13 +3289,6 @@ functional-red-black-tree@^1.0.1:
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
-gaze@^1.1.0:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
- integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==
- dependencies:
- globule "^1.0.0"
-
gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2:
version "1.0.0-beta.2"
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
@@ -3084,6 +3323,11 @@ get-package-type@^0.1.0:
resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
+get-stream@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
+ integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+
get-symbol-description@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
@@ -3092,11 +3336,6 @@ get-symbol-description@^1.0.0:
call-bind "^1.0.2"
get-intrinsic "^1.1.1"
-getobject@~1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/getobject/-/getobject-1.0.1.tgz#17d86a05913c15d173a5bcf8662dc7c7ac5ce147"
- integrity sha512-tj18lLe+917AACr6BdVoUuHnBPTVd9BEJp1vxnMZ58ztNvuxz9Ufa+wf3g37tlGITH35jggwZ2d9lcgHJJgXfQ==
-
glob-parent@^6.0.1:
version "6.0.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
@@ -3111,6 +3350,11 @@ glob-parent@~5.1.0, glob-parent@~5.1.2:
dependencies:
is-glob "^4.0.1"
+glob-to-regexp@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
+ integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
+
glob@7.2.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
@@ -3123,7 +3367,7 @@ glob@7.2.0:
once "^1.3.0"
path-is-absolute "^1.0.0"
-glob@^7.0.0, glob@^7.1.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1, glob@~7.1.6:
+glob@^7.0.0, glob@^7.1.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
version "7.1.6"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
@@ -3135,37 +3379,6 @@ glob@^7.0.0, glob@^7.1.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, gl
once "^1.3.0"
path-is-absolute "^1.0.0"
-glob@~5.0.0:
- version "5.0.15"
- resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
- integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=
- dependencies:
- inflight "^1.0.4"
- inherits "2"
- minimatch "2 || 3"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-global-modules@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
- integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==
- dependencies:
- global-prefix "^1.0.1"
- is-windows "^1.0.1"
- resolve-dir "^1.0.0"
-
-global-prefix@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
- integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=
- dependencies:
- expand-tilde "^2.0.2"
- homedir-polyfill "^1.0.1"
- ini "^1.3.4"
- is-windows "^1.0.1"
- which "^1.2.14"
-
globals@^11.1.0:
version "11.12.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
@@ -3185,21 +3398,12 @@ globals@^13.9.0:
dependencies:
type-fest "^0.20.2"
-globule@^1.0.0:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.2.tgz#d8bdd9e9e4eef8f96e245999a5dee7eb5d8529c4"
- integrity sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==
- dependencies:
- glob "~7.1.1"
- lodash "~4.17.10"
- minimatch "~3.0.2"
-
graceful-fs@^4.1.15, graceful-fs@^4.1.6:
version "4.2.6"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
-graceful-fs@^4.2.0:
+graceful-fs@^4.1.2, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
version "4.2.9"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
@@ -3209,105 +3413,6 @@ growl@1.10.5:
resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
-grunt-browserify@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/grunt-browserify/-/grunt-browserify-6.0.0.tgz#81ef10b6da9346d61d086fa7c5f0df64f206efe6"
- integrity sha512-m130pTVFEsxQZ+dJQd287TrnUI5VvEKJ+MmPjMF/7bVJBTBRWhJlYVFgBOYLZMUykfk1RWXfQ2sAQu5NuXumvg==
- dependencies:
- async "^2.5.0"
- browserify "^17.0.0"
- browserify-incremental "^3.1.1"
- glob "^7.1.2"
- lodash "^4.17.4"
- resolve "^1.1.6"
- watchify "^4.0.0"
-
-grunt-cli@^1.4.3, grunt-cli@~1.4.2:
- version "1.4.3"
- resolved "https://registry.yarnpkg.com/grunt-cli/-/grunt-cli-1.4.3.tgz#22c9f1a3d2780bf9b0d206e832e40f8f499175ff"
- integrity sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==
- dependencies:
- grunt-known-options "~2.0.0"
- interpret "~1.1.0"
- liftup "~3.0.1"
- nopt "~4.0.1"
- v8flags "~3.2.0"
-
-grunt-contrib-watch@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz#c143ca5b824b288a024b856639a5345aedb78ed4"
- integrity sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg==
- dependencies:
- async "^2.6.0"
- gaze "^1.1.0"
- lodash "^4.17.10"
- tiny-lr "^1.1.1"
-
-grunt-known-options@~2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/grunt-known-options/-/grunt-known-options-2.0.0.tgz#cac641e897f9a0a680b8c9839803d35f3325103c"
- integrity sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==
-
-grunt-legacy-log-utils@~2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz#49a8c7dc74051476dcc116c32faf9db8646856ef"
- integrity sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==
- dependencies:
- chalk "~4.1.0"
- lodash "~4.17.19"
-
-grunt-legacy-log@~3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz#1c6eaf92371ea415af31ea84ce50d434ef6d39c4"
- integrity sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==
- dependencies:
- colors "~1.1.2"
- grunt-legacy-log-utils "~2.1.0"
- hooker "~0.2.3"
- lodash "~4.17.19"
-
-grunt-legacy-util@~2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz#0f929d13a2faf9988c9917c82bff609e2d9ba255"
- integrity sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==
- dependencies:
- async "~3.2.0"
- exit "~0.1.2"
- getobject "~1.0.0"
- hooker "~0.2.3"
- lodash "~4.17.21"
- underscore.string "~3.3.5"
- which "~2.0.2"
-
-grunt-mocha-test@^0.13.3:
- version "0.13.3"
- resolved "https://registry.yarnpkg.com/grunt-mocha-test/-/grunt-mocha-test-0.13.3.tgz#9028472b615bda6ddeaa7b30a5a164e9805de005"
- integrity sha512-zQGEsi3d+ViPPi7/4jcj78afKKAKiAA5n61pknQYi25Ugik+aNOuRmiOkmb8mN2CeG8YxT+YdT1H1Q7B/eNkoQ==
- dependencies:
- hooker "^0.2.3"
- mkdirp "^0.5.0"
-
-grunt@^1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/grunt/-/grunt-1.4.1.tgz#7d1e17db1f9c8108777f7273d6b9359755576f50"
- integrity sha512-ZXIYXTsAVrA7sM+jZxjQdrBOAg7DyMUplOMhTaspMRExei+fD0BTwdWXnn0W5SXqhb/Q/nlkzXclSi3IH55PIA==
- dependencies:
- dateformat "~3.0.3"
- eventemitter2 "~0.4.13"
- exit "~0.1.2"
- findup-sync "~0.3.0"
- glob "~7.1.6"
- grunt-cli "~1.4.2"
- grunt-known-options "~2.0.0"
- grunt-legacy-log "~3.0.0"
- grunt-legacy-util "~2.0.1"
- iconv-lite "~0.4.13"
- js-yaml "~3.14.0"
- minimatch "~3.0.4"
- mkdirp "~1.0.4"
- nopt "~3.0.6"
- rimraf "~3.0.2"
-
has-bigints@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
@@ -3393,11 +3498,6 @@ homedir-polyfill@^1.0.1:
dependencies:
parse-passwd "^1.0.0"
-hooker@^0.2.3, hooker@~0.2.3:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/hooker/-/hooker-0.2.3.tgz#b834f723cc4a242aa65963459df6d984c5d3d959"
- integrity sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=
-
html-escaper@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
@@ -3408,28 +3508,26 @@ htmlescape@^1.1.0:
resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351"
integrity sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=
-http-parser-js@>=0.5.1:
- version "0.5.3"
- resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz#01d2709c79d41698bb01d4decc5e9da4e4a033d9"
- integrity sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==
-
https-browserify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
-iconv-lite@~0.4.13:
- version "0.4.24"
- resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
- integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
- dependencies:
- safer-buffer ">= 2.1.2 < 3"
+human-signals@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
+ integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
ieee754@^1.1.4:
version "1.2.1"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+iferr@^0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
+ integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
+
ignore@^4.0.6:
version "4.0.6"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
@@ -3448,6 +3546,14 @@ import-fresh@^3.0.0, import-fresh@^3.2.1:
parent-module "^1.0.0"
resolve-from "^4.0.0"
+import-local@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
+ integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
+ dependencies:
+ pkg-dir "^4.2.0"
+ resolve-cwd "^3.0.0"
+
imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
@@ -3458,6 +3564,11 @@ indent-string@^4.0.0:
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
+infer-owner@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
+ integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
+
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
@@ -3476,11 +3587,6 @@ inherits@2.0.1:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
-ini@^1.3.4:
- version "1.3.8"
- resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
- integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
-
inline-source-map@~0.6.0:
version "0.6.2"
resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5"
@@ -3513,18 +3619,10 @@ internal-slot@^1.0.3:
has "^1.0.3"
side-channel "^1.0.4"
-interpret@~1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
- integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=
-
-is-absolute@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576"
- integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==
- dependencies:
- is-relative "^1.0.0"
- is-windows "^1.0.1"
+interpret@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
+ integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
is-arguments@^1.0.4:
version "1.1.0"
@@ -3635,7 +3733,7 @@ is-plain-obj@^2.1.0:
resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287"
integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
-is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+is-plain-object@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
@@ -3658,13 +3756,6 @@ is-regex@^1.1.4:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
-is-relative@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d"
- integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==
- dependencies:
- is-unc-path "^1.0.0"
-
is-shared-array-buffer@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6"
@@ -3717,13 +3808,6 @@ is-typedarray@^1.0.0:
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
-is-unc-path@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d"
- integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==
- dependencies:
- unc-path-regex "^0.1.2"
-
is-unicode-supported@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
@@ -3736,11 +3820,16 @@ is-weakref@^1.0.1:
dependencies:
call-bind "^1.0.0"
-is-windows@^1.0.1, is-windows@^1.0.2:
+is-windows@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+is-wsl@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
+ integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
+
isarray@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
@@ -3756,7 +3845,7 @@ isexe@^2.0.0:
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
-isobject@^3.0.0, isobject@^3.0.1:
+isobject@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
@@ -3822,6 +3911,15 @@ istanbul-reports@^3.0.2:
html-escaper "^2.0.0"
istanbul-lib-report "^3.0.0"
+jest-worker@^27.3.1, jest-worker@^27.4.5:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
+ integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^8.0.0"
+
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -3834,7 +3932,7 @@ js-yaml@4.1.0, js-yaml@^4.1.0:
dependencies:
argparse "^2.0.1"
-js-yaml@^3.13.1, js-yaml@~3.14.0:
+js-yaml@^3.13.1:
version "3.14.1"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
@@ -3893,6 +3991,11 @@ jsesc@~0.5.0:
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
+json-parse-better-errors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+ integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
+
json-schema-traverse@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
@@ -3931,11 +4034,6 @@ jsonfile@^6.0.1:
optionalDependencies:
graceful-fs "^4.1.6"
-jsonparse@0.0.5:
- version "0.0.5"
- resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-0.0.5.tgz#330542ad3f0a654665b778f3eb2d9a9fa507ac64"
- integrity sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=
-
jsonparse@^1.2.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
@@ -3972,20 +4070,6 @@ levn@^0.4.1:
prelude-ls "^1.2.1"
type-check "~0.4.0"
-liftup@~3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/liftup/-/liftup-3.0.1.tgz#1cb81aff0f368464ed3a5f1a7286372d6b1a60ce"
- integrity sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==
- dependencies:
- extend "^3.0.2"
- findup-sync "^4.0.0"
- fined "^1.2.0"
- flagged-respawn "^1.0.1"
- is-plain-object "^2.0.4"
- object.map "^1.0.1"
- rechoir "^0.7.0"
- resolve "^1.19.0"
-
linkify-it@^3.0.1:
version "3.0.3"
resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e"
@@ -3993,10 +4077,19 @@ linkify-it@^3.0.1:
dependencies:
uc.micro "^1.0.1"
-livereload-js@^2.3.0:
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.4.0.tgz#447c31cf1ea9ab52fc20db615c5ddf678f78009c"
- integrity sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==
+loader-runner@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384"
+ integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==
+
+loader-utils@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
+ integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
+ dependencies:
+ big.js "^5.2.2"
+ emojis-list "^3.0.0"
+ json5 "^1.0.1"
locate-path@^2.0.0:
version "2.0.0"
@@ -4073,7 +4166,7 @@ lodash.merge@^4.6.2:
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
-lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.4, lodash@~4.17.10, lodash@~4.17.19, lodash@~4.17.21:
+lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -4100,6 +4193,13 @@ loupe@^2.3.1:
dependencies:
get-func-name "^2.0.0"
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
make-dir@^2.0.0, make-dir@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
@@ -4108,25 +4208,13 @@ make-dir@^2.0.0, make-dir@^2.1.0:
pify "^4.0.1"
semver "^5.6.0"
-make-dir@^3.0.0, make-dir@^3.0.2:
+make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
dependencies:
semver "^6.0.0"
-make-iterator@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6"
- integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==
- dependencies:
- kind-of "^6.0.2"
-
-map-cache@^0.2.0:
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
- integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
-
markdown-it-anchor@^8.4.1:
version "8.4.1"
resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.4.1.tgz#29e560593f5edb80b25fdab8b23f93ef8a91b31e"
@@ -4171,7 +4259,12 @@ mdurl@^1.0.1:
resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=
-micromatch@^4.0.2:
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+micromatch@^4.0.4:
version "4.0.4"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
@@ -4187,6 +4280,23 @@ miller-rabin@^4.0.0:
bn.js "^4.0.0"
brorand "^1.0.1"
+mime-db@1.51.0:
+ version "1.51.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c"
+ integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==
+
+mime-types@^2.1.27:
+ version "2.1.34"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24"
+ integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==
+ dependencies:
+ mime-db "1.51.0"
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
@@ -4197,7 +4307,7 @@ minimalistic-crypto-utils@^1.0.1:
resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
-"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2, minimatch@~3.0.4:
+minimatch@3.0.4, minimatch@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
@@ -4209,19 +4319,35 @@ minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+mississippi@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
+ integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==
+ dependencies:
+ concat-stream "^1.5.0"
+ duplexify "^3.4.2"
+ end-of-stream "^1.1.0"
+ flush-write-stream "^1.0.0"
+ from2 "^2.1.0"
+ parallel-transform "^1.1.0"
+ pump "^3.0.0"
+ pumpify "^1.3.3"
+ stream-each "^1.1.0"
+ through2 "^2.0.0"
+
mkdirp-classic@^0.5.2:
version "0.5.3"
resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
-mkdirp@^0.5.0, mkdirp@~0.5.1:
+mkdirp@^0.5.1, mkdirp@~0.5.1:
version "0.5.5"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
dependencies:
minimist "^1.2.5"
-mkdirp@^1.0.4, mkdirp@~1.0.4:
+mkdirp@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
@@ -4322,6 +4448,18 @@ module-deps@^6.2.3:
through2 "^2.0.0"
xtend "^4.0.0"
+move-concurrently@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
+ integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=
+ dependencies:
+ aproba "^1.1.1"
+ copy-concurrently "^1.0.0"
+ fs-write-stream-atomic "^1.0.8"
+ mkdirp "^0.5.1"
+ rimraf "^2.5.4"
+ run-queue "^1.0.3"
+
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@@ -4347,6 +4485,11 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
+neo-async@^2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+ integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+
nise@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.1.tgz#ac4237e0d785ecfcb83e20f389185975da5c31f3"
@@ -4388,26 +4531,18 @@ node-releases@^2.0.1:
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5"
integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==
-nopt@~3.0.6:
- version "3.0.6"
- resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
- integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
- dependencies:
- abbrev "1"
-
-nopt@~4.0.1:
- version "4.0.3"
- resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48"
- integrity sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==
- dependencies:
- abbrev "1"
- osenv "^0.1.4"
-
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+npm-run-path@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+ integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+ dependencies:
+ path-key "^3.0.0"
+
nyc@^15.1.0:
version "15.1.0"
resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02"
@@ -4441,7 +4576,7 @@ nyc@^15.1.0:
test-exclude "^6.0.0"
yargs "^15.0.2"
-object-assign@^4.1.0, object-assign@^4.1.1:
+object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
@@ -4471,16 +4606,6 @@ object.assign@^4.1.0, object.assign@^4.1.2:
has-symbols "^1.0.1"
object-keys "^1.1.1"
-object.defaults@^1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf"
- integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=
- dependencies:
- array-each "^1.0.1"
- array-slice "^1.0.0"
- for-own "^1.0.0"
- isobject "^3.0.0"
-
object.getownpropertydescriptors@^2.0.3:
version "2.1.1"
resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz#0dfda8d108074d9c563e80490c883b6661091544"
@@ -4490,21 +4615,6 @@ object.getownpropertydescriptors@^2.0.3:
define-properties "^1.1.3"
es-abstract "^1.18.0-next.1"
-object.map@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37"
- integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=
- dependencies:
- for-own "^1.0.0"
- make-iterator "^1.0.0"
-
-object.pick@^1.2.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
- integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
- dependencies:
- isobject "^3.0.1"
-
object.values@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac"
@@ -4514,13 +4624,20 @@ object.values@^1.1.5:
define-properties "^1.1.3"
es-abstract "^1.19.1"
-once@^1.3.0:
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
dependencies:
wrappy "1"
+onetime@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
opener@^1.5.2:
version "1.5.2"
resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598"
@@ -4543,31 +4660,6 @@ os-browserify@~0.3.0:
resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=
-os-homedir@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
- integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
-
-os-tmpdir@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
- integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
-
-osenv@^0.1.4:
- version "0.1.5"
- resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
- integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
- dependencies:
- os-homedir "^1.0.0"
- os-tmpdir "^1.0.0"
-
-outpipe@^1.1.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2"
- integrity sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=
- dependencies:
- shell-quote "^1.4.2"
-
p-limit@^1.1.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
@@ -4649,6 +4741,15 @@ pako@~1.0.5:
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
+parallel-transform@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc"
+ integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==
+ dependencies:
+ cyclist "^1.0.1"
+ inherits "^2.0.3"
+ readable-stream "^2.1.5"
+
parent-module@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
@@ -4674,15 +4775,6 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5:
pbkdf2 "^3.0.3"
safe-buffer "^5.1.1"
-parse-filepath@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891"
- integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=
- dependencies:
- is-absolute "^1.0.0"
- map-cache "^0.2.0"
- path-root "^0.1.1"
-
parse-passwd@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
@@ -4708,7 +4800,7 @@ path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
-path-key@^3.1.0:
+path-key@^3.0.0, path-key@^3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
@@ -4723,18 +4815,6 @@ path-platform@~0.11.15:
resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2"
integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=
-path-root-regex@^0.1.0:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d"
- integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=
-
-path-root@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7"
- integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=
- dependencies:
- path-root-regex "^0.1.0"
-
path-to-regexp@^1.7.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a"
@@ -4797,7 +4877,7 @@ pkg-dir@^3.0.0:
dependencies:
find-up "^3.0.0"
-pkg-dir@^4.1.0:
+pkg-dir@^4.1.0, pkg-dir@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
@@ -4826,6 +4906,11 @@ process@~0.11.0:
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
+promise-inflight@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+ integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
+
prop-types@^15.7.2:
version "15.7.2"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
@@ -4835,6 +4920,11 @@ prop-types@^15.7.2:
object-assign "^4.1.1"
react-is "^16.8.1"
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+ integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
+
public-encrypt@^4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
@@ -4847,6 +4937,31 @@ public-encrypt@^4.0.0:
randombytes "^2.0.1"
safe-buffer "^5.1.2"
+pump@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
+ integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+pump@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+ integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+pumpify@^1.3.3:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
+ integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
+ dependencies:
+ duplexify "^3.6.0"
+ inherits "^2.0.3"
+ pump "^2.0.0"
+
punycode@1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
@@ -4862,11 +4977,6 @@ punycode@^2.1.0:
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
-qs@^6.4.0:
- version "6.9.6"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee"
- integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==
-
querystring-es3@~0.2.0:
version "0.2.1"
resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
@@ -4892,14 +5002,6 @@ randomfill@^1.0.3:
randombytes "^2.0.5"
safe-buffer "^5.1.0"
-raw-body@~1.1.0:
- version "1.1.7"
- resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425"
- integrity sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=
- dependencies:
- bytes "1"
- string_decoder "0.10"
-
react-is@^16.8.1:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
@@ -4912,16 +5014,7 @@ read-only-stream@^2.0.0:
dependencies:
readable-stream "^2.0.2"
-readable-stream@3, readable-stream@^3.5.0, readable-stream@^3.6.0:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
- integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
- dependencies:
- inherits "^2.0.3"
- string_decoder "^1.1.1"
- util-deprecate "^1.0.1"
-
-readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@~2.3.6:
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.6, readable-stream@~2.3.6:
version "2.3.7"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
@@ -4934,6 +5027,15 @@ readable-stream@^2.0.2, readable-stream@^2.2.2, readable-stream@~2.3.6:
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
+readable-stream@^3.5.0, readable-stream@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
readdirp@~3.5.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e"
@@ -5032,13 +5134,12 @@ requizzle@^0.2.3:
dependencies:
lodash "^4.17.14"
-resolve-dir@^1.0.0, resolve-dir@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
- integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=
+resolve-cwd@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
+ integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
dependencies:
- expand-tilde "^2.0.0"
- global-modules "^1.0.0"
+ resolve-from "^5.0.0"
resolve-from@^4.0.0:
version "4.0.0"
@@ -5050,7 +5151,7 @@ resolve-from@^5.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
-resolve@^1.1.4, resolve@^1.1.6, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.4.0, resolve@^1.9.0:
+resolve@^1.1.4, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.4.0, resolve@^1.9.0:
version "1.20.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
@@ -5058,7 +5159,14 @@ resolve@^1.1.4, resolve@^1.1.6, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.
is-core-module "^2.2.0"
path-parse "^1.0.6"
-rimraf@^3.0.0, rimraf@^3.0.2, rimraf@~3.0.2:
+rimraf@^2.5.4, rimraf@^2.6.3:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
+rimraf@^3.0.0, rimraf@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
@@ -5078,7 +5186,14 @@ route-recognizer@^0.1.9:
resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.1.11.tgz#810d8e5702abb4056d6dcb8e865c5685e7c14eb7"
integrity sha1-gQ2OVwKrtAVtbcuOhlxWhefBTrc=
-safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
+run-queue@^1.0.0, run-queue@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
+ integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=
+ dependencies:
+ aproba "^1.1.1"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@@ -5088,16 +5203,38 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1:
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
-safe-json-parse@~1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57"
- integrity sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=
-
-"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0:
+safer-buffer@^2.1.0:
version "2.1.2"
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+schema-utils@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
+ integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==
+ dependencies:
+ ajv "^6.1.0"
+ ajv-errors "^1.0.0"
+ ajv-keywords "^3.1.0"
+
+schema-utils@^2.6.5:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7"
+ integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==
+ dependencies:
+ "@types/json-schema" "^7.0.5"
+ ajv "^6.12.4"
+ ajv-keywords "^3.5.2"
+
+schema-utils@^3.1.0, schema-utils@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281"
+ integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==
+ dependencies:
+ "@types/json-schema" "^7.0.8"
+ ajv "^6.12.5"
+ ajv-keywords "^3.5.2"
+
semver@7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
@@ -5113,13 +5250,18 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
-serialize-javascript@6.0.0:
+serialize-javascript@6.0.0, serialize-javascript@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==
dependencies:
randombytes "^2.1.0"
+serialize-javascript@^1.7.0:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb"
+ integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==
+
set-blocking@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
@@ -5159,7 +5301,7 @@ shebang-regex@^3.0.0:
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
-shell-quote@^1.4.2, shell-quote@^1.6.1:
+shell-quote@^1.6.1:
version "1.7.2"
resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2"
integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==
@@ -5178,6 +5320,11 @@ signal-exit@^3.0.2:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
+signal-exit@^3.0.3:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
simple-concat@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
@@ -5200,7 +5347,12 @@ slash@^2.0.0:
resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
-source-map-support@^0.5.16, source-map-support@~0.5.10:
+source-list-map@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
+ integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
+
+source-map-support@^0.5.16:
version "0.5.19"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
@@ -5208,6 +5360,14 @@ source-map-support@^0.5.16, source-map-support@~0.5.10:
buffer-from "^1.0.0"
source-map "^0.6.0"
+source-map-support@~0.5.20:
+ version "0.5.21"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
source-map@^0.5.0, source-map@~0.5.3:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
@@ -5218,6 +5378,11 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+source-map@~0.7.2:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
+ integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
+
spawn-wrap@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e"
@@ -5230,16 +5395,18 @@ spawn-wrap@^2.0.0:
signal-exit "^3.0.2"
which "^2.0.1"
-sprintf-js@^1.0.3:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
- integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==
-
sprintf-js@~1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+ssri@^6.0.1:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5"
+ integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==
+ dependencies:
+ figgy-pudding "^3.5.1"
+
stream-browserify@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-3.0.0.tgz#22b0a2850cdf6503e73085da1fc7b7d0c2122f2f"
@@ -5256,6 +5423,14 @@ stream-combiner2@^1.1.1:
duplexer2 "~0.1.0"
readable-stream "^2.0.2"
+stream-each@^1.1.0:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae"
+ integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==
+ dependencies:
+ end-of-stream "^1.1.0"
+ stream-shift "^1.0.0"
+
stream-http@^3.0.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.1.1.tgz#0370a8017cf8d050b9a8554afe608f043eaff564"
@@ -5266,6 +5441,11 @@ stream-http@^3.0.0:
readable-stream "^3.6.0"
xtend "^4.0.2"
+stream-shift@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
+ integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
+
stream-splicer@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.1.tgz#0b13b7ee2b5ac7e0609a7463d83899589a363fcd"
@@ -5274,11 +5454,6 @@ stream-splicer@^2.0.0:
inherits "^2.0.1"
readable-stream "^2.0.2"
-string-template@~0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add"
- integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=
-
string-width@^4.1.0, string-width@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
@@ -5329,11 +5504,6 @@ string.prototype.trimstart@^1.0.4:
call-bind "^1.0.2"
define-properties "^1.1.3"
-string_decoder@0.10:
- version "0.10.31"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
- integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
-
string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
@@ -5372,6 +5542,11 @@ strip-bom@^4.0.0:
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
+strip-final-newline@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+ integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
@@ -5384,7 +5559,7 @@ subarg@^1.0.0:
dependencies:
minimist "^1.1.0"
-supports-color@8.1.1:
+supports-color@8.1.1, supports-color@^8.0.0:
version "8.1.1"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
@@ -5417,6 +5592,11 @@ taffydb@2.6.2:
resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.6.2.tgz#7cbcb64b5a141b6a2efc2c5d2c67b4e150b2a268"
integrity sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=
+tapable@^2.1.1, tapable@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
+ integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
+
tcomb-validation@^3.3.0:
version "3.4.1"
resolved "https://registry.yarnpkg.com/tcomb-validation/-/tcomb-validation-3.4.1.tgz#a7696ec176ce56a081d9e019f8b732a5a8894b65"
@@ -5429,14 +5609,25 @@ tcomb@^3.0.0, tcomb@^3.2.17:
resolved "https://registry.yarnpkg.com/tcomb/-/tcomb-3.2.29.tgz#32404fe9456d90c2cf4798682d37439f1ccc386c"
integrity sha512-di2Hd1DB2Zfw6StGv861JoAF5h/uQVu/QJp2g8KVbtfKnoHdBQl5M32YWq6mnSYBQ1vFFrns5B1haWJL7rKaOQ==
-terser@^3.7.5:
- version "3.17.0"
- resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2"
- integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==
+terser-webpack-plugin@^5.1.3:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54"
+ integrity sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==
dependencies:
- commander "^2.19.0"
- source-map "~0.6.1"
- source-map-support "~0.5.10"
+ jest-worker "^27.4.5"
+ schema-utils "^3.1.1"
+ serialize-javascript "^6.0.0"
+ source-map "^0.6.1"
+ terser "^5.7.2"
+
+terser@^5.7.2:
+ version "5.10.0"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc"
+ integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==
+ dependencies:
+ commander "^2.20.0"
+ source-map "~0.7.2"
+ source-map-support "~0.5.20"
test-exclude@^6.0.0:
version "6.0.0"
@@ -5460,14 +5651,7 @@ through2@^2.0.0:
readable-stream "~2.3.6"
xtend "~4.0.1"
-through2@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764"
- integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==
- dependencies:
- readable-stream "3"
-
-"through@>=2.2.7 <3", through@~2.3.4:
+"through@>=2.2.7 <3":
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
@@ -5479,18 +5663,6 @@ timers-browserify@^1.0.1:
dependencies:
process "~0.11.0"
-tiny-lr@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.1.tgz#9fa547412f238fedb068ee295af8b682c98b2aab"
- integrity sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==
- dependencies:
- body "^5.1.0"
- debug "^3.1.0"
- faye-websocket "~0.10.0"
- livereload-js "^2.3.0"
- object-assign "^4.1.0"
- qs "^6.4.0"
-
to-fast-properties@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
@@ -5557,16 +5729,25 @@ uc.micro@^1.0.1, uc.micro@^1.0.5:
resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==
-uglifyify@^5.0.2:
- version "5.0.2"
- resolved "https://registry.yarnpkg.com/uglifyify/-/uglifyify-5.0.2.tgz#7d0269885e09faa963208a9ec6721afcaf45fc50"
- integrity sha512-NcSk6pgoC+IgwZZ2tVLVHq+VNKSvLPlLkF5oUiHPVOJI0s/OlSVYEGXG9PCAH0hcyFZLyvt4KBdPAQBRlVDn1Q==
+uglify-js@^3.6.0:
+ version "3.15.1"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.15.1.tgz#9403dc6fa5695a6172a91bc983ea39f0f7c9086d"
+ integrity sha512-FAGKF12fWdkpvNJZENacOH0e/83eG6JyVQyanIJaBXCN1J11TUQv1T1/z8S+Z0CG0ZPk1nPcreF/c7lrTd0TEQ==
+
+uglifyjs-webpack-plugin@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.2.0.tgz#e75bc80e7f1937f725954c9b4c5a1e967ea9d0d7"
+ integrity sha512-mHSkufBmBuJ+KHQhv5H0MXijtsoA1lynJt1lXOaotja8/I0pR4L9oGaPIZw+bQBOFittXZg9OC1sXSGO9D9ZYg==
dependencies:
- convert-source-map "~1.1.0"
- minimatch "^3.0.2"
- terser "^3.7.5"
- through "~2.3.4"
- xtend "^4.0.1"
+ cacache "^12.0.2"
+ find-cache-dir "^2.1.0"
+ is-wsl "^1.1.0"
+ schema-utils "^1.0.0"
+ serialize-javascript "^1.7.0"
+ source-map "^0.6.1"
+ uglify-js "^3.6.0"
+ webpack-sources "^1.4.0"
+ worker-farm "^1.7.0"
umd@^3.0.0:
version "3.0.3"
@@ -5583,11 +5764,6 @@ unbox-primitive@^1.0.1:
has-symbols "^1.0.2"
which-boxed-primitive "^1.0.2"
-unc-path-regex@^0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
- integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo=
-
undeclared-identifiers@^1.1.2:
version "1.1.3"
resolved "https://registry.yarnpkg.com/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz#9254c1d37bdac0ac2b52de4b6722792d2a91e30f"
@@ -5599,14 +5775,6 @@ undeclared-identifiers@^1.1.2:
simple-concat "^1.0.0"
xtend "^4.0.1"
-underscore.string@~3.3.5:
- version "3.3.5"
- resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023"
- integrity sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==
- dependencies:
- sprintf-js "^1.0.3"
- util-deprecate "^1.0.2"
-
underscore@~1.13.2:
version "1.13.2"
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.2.tgz#276cea1e8b9722a8dbed0100a407dda572125881"
@@ -5635,6 +5803,20 @@ unicode-property-aliases-ecmascript@^1.0.4:
resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4"
integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==
+unique-filename@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
+ integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
+ dependencies:
+ unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c"
+ integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==
+ dependencies:
+ imurmurhash "^0.1.4"
+
universalify@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
@@ -5655,7 +5837,7 @@ url@~0.11.0:
punycode "1.3.2"
querystring "0.2.0"
-util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
@@ -5694,7 +5876,7 @@ v8-compile-cache@^2.0.3:
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132"
integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==
-v8flags@^3.1.1, v8flags@~3.2.0:
+v8flags@^3.1.1:
version "3.2.0"
resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656"
integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==
@@ -5711,32 +5893,82 @@ vm-browserify@^1.0.0:
resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
-watchify@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/watchify/-/watchify-4.0.0.tgz#53b002d51e7b0eb640b851bb4de517a689973392"
- integrity sha512-2Z04dxwoOeNxa11qzWumBTgSAohTC0+ScuY7XMenPnH+W2lhTcpEOJP4g2EIG/SWeLadPk47x++Yh+8BqPM/lA==
+watchpack@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25"
+ integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==
dependencies:
- anymatch "^3.1.0"
- browserify "^17.0.0"
- chokidar "^3.4.0"
- defined "^1.0.0"
- outpipe "^1.1.0"
- through2 "^4.0.2"
- xtend "^4.0.2"
+ glob-to-regexp "^0.4.1"
+ graceful-fs "^4.1.2"
-websocket-driver@>=0.5.1:
- version "0.7.4"
- resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760"
- integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==
+webpack-cli@^4.9.2:
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d"
+ integrity sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==
dependencies:
- http-parser-js ">=0.5.1"
- safe-buffer ">=5.1.0"
- websocket-extensions ">=0.1.1"
+ "@discoveryjs/json-ext" "^0.5.0"
+ "@webpack-cli/configtest" "^1.1.1"
+ "@webpack-cli/info" "^1.4.1"
+ "@webpack-cli/serve" "^1.6.1"
+ colorette "^2.0.14"
+ commander "^7.0.0"
+ execa "^5.0.0"
+ fastest-levenshtein "^1.0.12"
+ import-local "^3.0.2"
+ interpret "^2.2.0"
+ rechoir "^0.7.0"
+ webpack-merge "^5.7.3"
-websocket-extensions@>=0.1.1:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42"
- integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==
+webpack-merge@^5.7.3:
+ version "5.8.0"
+ resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61"
+ integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==
+ dependencies:
+ clone-deep "^4.0.1"
+ wildcard "^2.0.0"
+
+webpack-sources@^1.4.0:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
+ integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
+ dependencies:
+ source-list-map "^2.0.0"
+ source-map "~0.6.1"
+
+webpack-sources@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
+ integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
+
+webpack@^5.68.0:
+ version "5.68.0"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.68.0.tgz#a653a58ed44280062e47257f260117e4be90d560"
+ integrity sha512-zUcqaUO0772UuuW2bzaES2Zjlm/y3kRBQDVFVCge+s2Y8mwuUTdperGaAv65/NtRL/1zanpSJOq/MD8u61vo6g==
+ dependencies:
+ "@types/eslint-scope" "^3.7.0"
+ "@types/estree" "^0.0.50"
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/wasm-edit" "1.11.1"
+ "@webassemblyjs/wasm-parser" "1.11.1"
+ acorn "^8.4.1"
+ acorn-import-assertions "^1.7.6"
+ browserslist "^4.14.5"
+ chrome-trace-event "^1.0.2"
+ enhanced-resolve "^5.8.3"
+ es-module-lexer "^0.9.0"
+ eslint-scope "5.1.1"
+ events "^3.2.0"
+ glob-to-regexp "^0.4.1"
+ graceful-fs "^4.2.9"
+ json-parse-better-errors "^1.0.2"
+ loader-runner "^4.2.0"
+ mime-types "^2.1.27"
+ neo-async "^2.6.2"
+ schema-utils "^3.1.0"
+ tapable "^2.1.1"
+ terser-webpack-plugin "^5.1.3"
+ watchpack "^2.3.1"
+ webpack-sources "^3.2.3"
which-boxed-primitive@^1.0.2:
version "1.0.2"
@@ -5767,25 +5999,30 @@ which-typed-array@^1.1.2:
has-symbols "^1.0.1"
is-typed-array "^1.1.3"
-which@2.0.2, which@^2.0.1, which@~2.0.2:
+which@2.0.2, which@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
dependencies:
isexe "^2.0.0"
-which@^1.2.14:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
- integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
- dependencies:
- isexe "^2.0.0"
+wildcard@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec"
+ integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==
word-wrap@^1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+worker-farm@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"
+ integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==
+ dependencies:
+ errno "~0.1.7"
+
workerpool@6.2.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b"
@@ -5854,6 +6091,11 @@ y18n@^5.0.5:
resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18"
integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
yargs-parser@20.2.4:
version "20.2.4"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54"