clientnode 4.0.1436 → 4.0.1438
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Lock.js +83 -94
- package/dist/Logger.js +163 -715
- package/dist/Semaphore.js +46 -81
- package/dist/array.js +337 -568
- package/dist/cli.js +37 -71
- package/dist/constants.js +110 -209
- package/dist/context.js +25 -229
- package/dist/cookie.js +48 -226
- package/dist/data-transfer.js +166 -725
- package/dist/datetime.js +241 -1059
- package/dist/domNode.js +277 -441
- package/dist/expression/evaluators.js +234 -1112
- package/dist/expression/helper.js +82 -135
- package/dist/expression/index.js +10 -1245
- package/dist/expression/indicator-functions.js +21 -239
- package/dist/expression/type.js +4 -34
- package/dist/filesystem.js +323 -309
- package/dist/function.js +51 -125
- package/dist/index.js +26 -2709
- package/dist/indicators.js +68 -440
- package/dist/module.js +98 -163
- package/dist/number.js +25 -423
- package/dist/object.js +774 -852
- package/dist/process.js +38 -245
- package/dist/property-types.js +96 -157
- package/dist/scope.js +56 -1825
- package/dist/string.js +603 -909
- package/dist/test-helper.js +171 -541
- package/dist/type.js +8 -37
- package/dist/utility.js +91 -336
- package/package.json +9 -10
- package/dist/Lock.d.ts +0 -39
- package/dist/Logger.d.ts +0 -102
- package/dist/Semaphore.d.ts +0 -29
- package/dist/array.d.ts +0 -150
- package/dist/bundle/Lock.js +0 -111
- package/dist/bundle/Logger.js +0 -705
- package/dist/bundle/Semaphore.js +0 -100
- package/dist/bundle/array.js +0 -648
- package/dist/bundle/cli.js +0 -85
- package/dist/bundle/constants.js +0 -225
- package/dist/bundle/context.js +0 -243
- package/dist/bundle/cookie.js +0 -262
- package/dist/bundle/data-transfer.js +0 -741
- package/dist/bundle/datetime.js +0 -1064
- package/dist/bundle/domNode.js +0 -471
- package/dist/bundle/expression/evaluators.js +0 -1115
- package/dist/bundle/expression/helper.js +0 -106
- package/dist/bundle/expression/index.js +0 -1223
- package/dist/bundle/expression/indicator-functions.js +0 -235
- package/dist/bundle/expression/type.js +0 -50
- package/dist/bundle/filesystem.js +0 -374
- package/dist/bundle/function.js +0 -105
- package/dist/bundle/index.js +0 -2686
- package/dist/bundle/indicators.js +0 -459
- package/dist/bundle/module.js +0 -180
- package/dist/bundle/number.js +0 -425
- package/dist/bundle/object.js +0 -1004
- package/dist/bundle/process.js +0 -275
- package/dist/bundle/property-types.js +0 -167
- package/dist/bundle/scope.js +0 -1808
- package/dist/bundle/string.js +0 -1095
- package/dist/bundle/test-helper.js +0 -690
- package/dist/bundle/type.js +0 -50
- package/dist/bundle/utility.js +0 -362
- package/dist/cli.d.ts +0 -31
- package/dist/compatible/Lock.js +0 -111
- package/dist/compatible/Logger.js +0 -705
- package/dist/compatible/Semaphore.js +0 -100
- package/dist/compatible/array.js +0 -648
- package/dist/compatible/cli.js +0 -85
- package/dist/compatible/constants.js +0 -225
- package/dist/compatible/context.js +0 -243
- package/dist/compatible/cookie.js +0 -262
- package/dist/compatible/data-transfer.js +0 -741
- package/dist/compatible/datetime.js +0 -1064
- package/dist/compatible/domNode.js +0 -471
- package/dist/compatible/expression/evaluators.js +0 -1115
- package/dist/compatible/expression/helper.js +0 -106
- package/dist/compatible/expression/index.js +0 -1223
- package/dist/compatible/expression/indicator-functions.js +0 -235
- package/dist/compatible/expression/type.js +0 -50
- package/dist/compatible/filesystem.js +0 -374
- package/dist/compatible/function.js +0 -105
- package/dist/compatible/index.js +0 -2686
- package/dist/compatible/indicators.js +0 -459
- package/dist/compatible/module.js +0 -180
- package/dist/compatible/number.js +0 -425
- package/dist/compatible/object.js +0 -1004
- package/dist/compatible/process.js +0 -275
- package/dist/compatible/property-types.js +0 -167
- package/dist/compatible/scope.js +0 -1808
- package/dist/compatible/string.js +0 -1095
- package/dist/compatible/test-helper.js +0 -690
- package/dist/compatible/type.js +0 -50
- package/dist/compatible/utility.js +0 -362
- package/dist/constants.d.ts +0 -99
- package/dist/context.d.ts +0 -8
- package/dist/cookie.d.ts +0 -31
- package/dist/data-transfer.d.ts +0 -45
- package/dist/datetime.d.ts +0 -37
- package/dist/domNode.d.ts +0 -82
- package/dist/expression/evaluators.d.ts +0 -55
- package/dist/expression/helper.d.ts +0 -4
- package/dist/expression/index.d.ts +0 -7
- package/dist/expression/indicator-functions.d.ts +0 -14
- package/dist/expression/type.d.ts +0 -70
- package/dist/filesystem.d.ts +0 -143
- package/dist/function.d.ts +0 -20
- package/dist/index.d.ts +0 -23
- package/dist/indicators.d.ts +0 -68
- package/dist/module.d.ts +0 -8
- package/dist/number.d.ts +0 -35
- package/dist/object.d.ts +0 -231
- package/dist/process.d.ts +0 -22
- package/dist/property-types.d.ts +0 -460
- package/dist/scope.d.ts +0 -44
- package/dist/string.d.ts +0 -312
- package/dist/test/Lock.d.ts +0 -1
- package/dist/test/Logger.d.ts +0 -1
- package/dist/test/Semaphore.d.ts +0 -1
- package/dist/test/array.d.ts +0 -1
- package/dist/test/cookie.d.ts +0 -1
- package/dist/test/data-transfer.d.ts +0 -1
- package/dist/test/datetime.d.ts +0 -1
- package/dist/test/domNode.d.ts +0 -1
- package/dist/test/expression/evaluators.d.ts +0 -1
- package/dist/test/expression/helper.d.ts +0 -1
- package/dist/test/expression/indicator-functions.d.ts +0 -1
- package/dist/test/filesystem.d.ts +0 -1
- package/dist/test/function.d.ts +0 -1
- package/dist/test/indicators.d.ts +0 -1
- package/dist/test/number.d.ts +0 -1
- package/dist/test/object.d.ts +0 -1
- package/dist/test/process.d.ts +0 -1
- package/dist/test/property-types.d.ts +0 -1
- package/dist/test/scope.d.ts +0 -1
- package/dist/test/string.d.ts +0 -1
- package/dist/test/utility.d.ts +0 -1
- package/dist/test-helper.d.ts +0 -143
- package/dist/type.d.ts +0 -230
- package/dist/utility.d.ts +0 -44
package/dist/array.js
CHANGED
|
@@ -1,83 +1,9 @@
|
|
|
1
|
-
'use strict';if(typeof module!=='undefined'&&module!==null&&eval('typeof require')!=='undefined'&&eval('require')!==null&&'main'in eval('require')&&eval('typeof require.main')!=='undefined'&&eval('require.main')!==null){var ORIGINAL_MAIN_MODULE=module;if(module!==eval('require.main')&&'paths'in module&&'paths'in eval('require.main')&&typeof __dirname!=='undefined'&&__dirname!==null)module.paths=eval('require.main.paths').concat(module.paths.filter(function(path){return eval('require.main.paths').includes(path)}))};if(typeof window==='undefined'||window===null)var window=(typeof global==='undefined'||global===null)?{}:global;(function webpackUniversalModuleDefinition(root, factory) {
|
|
2
|
-
if(typeof exports === 'object' && typeof module === 'object')
|
|
3
|
-
module.exports = factory(require("core-js/modules/es.array.includes.js"), require("core-js/modules/es.regexp.flags.js"));
|
|
4
|
-
else if(typeof define === 'function' && define.amd)
|
|
5
|
-
define(["core-js/modules/es.array.includes.js", "core-js/modules/es.regexp.flags.js"], factory);
|
|
6
|
-
else {
|
|
7
|
-
var a = typeof exports === 'object' ? factory(require("core-js/modules/es.array.includes.js"), require("core-js/modules/es.regexp.flags.js")) : factory(root["core-js/modules/es.array.includes.js"], root["core-js/modules/es.regexp.flags.js"]);
|
|
8
|
-
for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
|
|
9
|
-
}
|
|
10
|
-
})(this, function(__WEBPACK_EXTERNAL_MODULE__0__, __WEBPACK_EXTERNAL_MODULE__8__) {
|
|
11
|
-
return /******/ (function() { // webpackBootstrap
|
|
12
|
-
/******/ "use strict";
|
|
13
|
-
/******/ var __webpack_modules__ = ([
|
|
14
|
-
/* 0 */
|
|
15
|
-
/***/ (function(module) {
|
|
16
|
-
|
|
17
|
-
module.exports = __WEBPACK_EXTERNAL_MODULE__0__;
|
|
18
|
-
|
|
19
|
-
/***/ }),
|
|
20
|
-
/* 1 */
|
|
21
|
-
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
22
|
-
|
|
23
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
24
|
-
/* harmony export */ CLASS_TO_TYPE_MAPPING: function() { return /* binding */ CLASS_TO_TYPE_MAPPING; },
|
|
25
|
-
/* harmony export */ PLAIN_OBJECT_PROTOTYPES: function() { return /* binding */ PLAIN_OBJECT_PROTOTYPES; }
|
|
26
|
-
/* harmony export */ });
|
|
27
|
-
/* unused harmony exports DEFAULT_ENCODING, CLOSE_EVENT_NAMES, CONSOLE_METHODS, VALUE_COPY_SYMBOL, IGNORE_NULL_AND_UNDEFINED_SYMBOL, ABBREVIATIONS, ANIMATION_END_EVENT_NAMES, KEY_CODES, KEYBOARD_CODES, LOCALES, SPECIAL_REGEX_SEQUENCES, TRANSITION_END_EVENT_NAMES */
|
|
28
1
|
// #!/usr/bin/env babel-node
|
|
29
2
|
// -*- coding: utf-8 -*-
|
|
30
|
-
/** @module
|
|
31
|
-
|
|
32
|
-
[Project page](https://torben.website/clientnode)
|
|
33
|
-
|
|
34
|
-
Copyright Torben Sickert (info["~at~"]torben.website) 16.12.2012
|
|
35
|
-
|
|
36
|
-
License
|
|
37
|
-
-------
|
|
38
|
-
|
|
39
|
-
This library written by Torben Sickert stands under a creative commons
|
|
40
|
-
naming 3.0 unported license.
|
|
41
|
-
See https://creativecommons.org/licenses/by/3.0/deed.de
|
|
42
|
-
endregion
|
|
43
|
-
*/var DEFAULT_ENCODING="utf8";var CLOSE_EVENT_NAMES=(/* unused pure expression or super */ null && (["close","exit","SIGINT","SIGTERM","SIGQUIT","uncaughtException"]));var CONSOLE_METHODS=(/* unused pure expression or super */ null && (["debug","error","info","log","warn"]));var VALUE_COPY_SYMBOL=Symbol.for("clientnodeValue");var IGNORE_NULL_AND_UNDEFINED_SYMBOL=Symbol.for("clientnodeIgnoreNullAndUndefined");// Lists all known abbreviation for proper camel case to delimited and back
|
|
44
|
-
// conversion.
|
|
45
|
-
var ABBREVIATIONS=(/* unused pure expression or super */ null && (["html","id","url","us","de","api","href"]));// Saves a string with all css3 browser specific animation end event names.
|
|
46
|
-
var ANIMATION_END_EVENT_NAMES="animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd";// String representation to object type name mapping.
|
|
47
|
-
var CLASS_TO_TYPE_MAPPING={"[object Array]":"array","[object Boolean]":"boolean","[object Date]":"date","[object Error]":"error","[object Function]":"function","[object Map]":"map","[object Number]":"number","[object Object]":"object","[object RegExp]":"regexp","[object Set]":"set","[object String]":"string"};// Saves a mapping from key codes to their corresponding name.
|
|
48
|
-
var KEY_CODES=(/* unused pure expression or super */ null && ({BACKSPACE:8,SPACE:32,TAB:9,DELETE:46,ENTER:13,COMMA:188,PERIOD:190,END:35,ESCAPE:27,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,HOME:36,NUMPAD_ADD:107,NUMPAD_SUBTRACT:109,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,PAGE_UP:33,PAGE_DOWN:34,UP:38,DOWN:40,LEFT:37,RIGHT:39}));var KEYBOARD_CODES=(/* unused pure expression or super */ null && ({BACKSPACE:"Backspace",SPACE:"Space",TAB:"Tab",DELETE:"Delete",ENTER:"Enter",COMMA:"Comma",PERIOD:"Period",END:"End",ESCAPE:"Escape",F1:"F1",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",F10:"F10",F11:"F111",F12:"F12",HOME:"Home",NUMPAD_ADD:"NumpadAdd",NUMPAD_SUBTRACT:"NumpadSubtract",NUMPAD_DECIMAL:"NumpadDecimal",NUMPAD_DIVIDE:"NumpadDivide",NUMPAD_ENTER:"NumpadEnter",NUMPAD_MULTIPLY:"NumpadMultiply",PAGE_UP:"PageUp",PAGE_DOWN:"PageUp",UP:"ArrowUp",DOWN:"ArrowDown",LEFT:"ArrowLeft",RIGHT:"ArrowUp"}));var LOCALES=(/* unused pure expression or super */ null && ([]));var PLAIN_OBJECT_PROTOTYPES=[Object.prototype];// A list of special regular expression symbols.
|
|
49
|
-
var SPECIAL_REGEX_SEQUENCES=(/* unused pure expression or super */ null && (["-","[","]","(",")","^","$","*","+",".","{","}"]));// Saves a string with all css3 browser specific transition end event names.
|
|
50
|
-
var TRANSITION_END_EVENT_NAMES="transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd";
|
|
3
|
+
/** @module array */
|
|
4
|
+
'use strict';
|
|
51
5
|
|
|
52
|
-
|
|
53
|
-
/* 2 */,
|
|
54
|
-
/* 3 */
|
|
55
|
-
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
56
|
-
|
|
57
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
58
|
-
/* harmony export */ determineType: function() { return /* binding */ determineType; }
|
|
59
|
-
/* harmony export */ });
|
|
60
|
-
/* unused harmony exports addDynamicGetterAndSetter, convertCircularObjectToJSON, convertMapToPlainObject, convertPlainObjectToMap, convertSubstringInPlainObject, copy, equals, evaluateDynamicData, evaluateAsyncDynamicData, removeKeysInEvaluation, extend, getProxyHandler, mask, modifyObject, removeKeyPrefixes, represent, sort, unwrapProxy */
|
|
61
|
-
/* unused harmony import specifier */ var VALUE_COPY_SYMBOL;
|
|
62
|
-
/* unused harmony import specifier */ var IGNORE_NULL_AND_UNDEFINED_SYMBOL;
|
|
63
|
-
/* unused harmony import specifier */ var isMap;
|
|
64
|
-
/* unused harmony import specifier */ var isSet;
|
|
65
|
-
/* unused harmony import specifier */ var isObject;
|
|
66
|
-
/* unused harmony import specifier */ var isPlainObject;
|
|
67
|
-
/* unused harmony import specifier */ var isFunction;
|
|
68
|
-
/* unused harmony import specifier */ var isProxy;
|
|
69
|
-
/* unused harmony import specifier */ var isNumeric;
|
|
70
|
-
/* unused harmony import specifier */ var isNotANumber;
|
|
71
|
-
/* unused harmony import specifier */ var evaluateAndThrowError;
|
|
72
|
-
/* unused harmony import specifier */ var escapeRegularExpressions;
|
|
73
|
-
/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);
|
|
74
|
-
/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);
|
|
75
|
-
/* harmony import */ var core_js_modules_es_regexp_flags_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8);
|
|
76
|
-
/* harmony import */ var core_js_modules_es_regexp_flags_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_regexp_flags_js__WEBPACK_IMPORTED_MODULE_1__);
|
|
77
|
-
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1);
|
|
78
|
-
// #!/usr/bin/env babel-node
|
|
79
|
-
// -*- coding: utf-8 -*-
|
|
80
|
-
/** @module object *//* !
|
|
6
|
+
/* !
|
|
81
7
|
region header
|
|
82
8
|
[Project page](https://torben.website/clientnode)
|
|
83
9
|
|
|
@@ -90,472 +16,116 @@ var TRANSITION_END_EVENT_NAMES="transitionend webkitTransitionEnd oTransitionEnd
|
|
|
90
16
|
naming 3.0 unported license.
|
|
91
17
|
See https://creativecommons.org/licenses/by/3.0/deed.de
|
|
92
18
|
endregion
|
|
93
|
-
*/
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
* @param setterWrapper - Function to wrap each property set.
|
|
98
|
-
* @param methodNames - Method names to perform actions on the given
|
|
99
|
-
* object.
|
|
100
|
-
* @param deep - Indicates to perform a deep wrapping of specified types.
|
|
101
|
-
* @param typesToExtend - Types which should be extended (Checks are
|
|
102
|
-
* performed via "value instanceof type".).
|
|
103
|
-
* @returns Returns given object wrapped with a dynamic getter proxy.
|
|
104
|
-
*/var _addDynamicGetterAndSetter=function addDynamicGetterAndSetter(object,getterWrapper,setterWrapper,methodNames,deep,typesToExtend){if(getterWrapper===void 0){getterWrapper=null}if(setterWrapper===void 0){setterWrapper=null}if(methodNames===void 0){methodNames={}}if(deep===void 0){deep=true}if(typesToExtend===void 0){typesToExtend=[Object]}if(deep&&_typeof(object)==="object")if(Array.isArray(object)){var index=0;var _iterator=_createForOfIteratorHelper(object),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var value=_step.value;object[index]=_addDynamicGetterAndSetter(value,getterWrapper,setterWrapper,methodNames,deep);index+=1}}catch(err){_iterator.e(err)}finally{_iterator.f()}}else if(isMap(object)){var _iterator2=_createForOfIteratorHelper(object),_step2;try{for(_iterator2.s();!(_step2=_iterator2.n()).done;){var _step2$value=_slicedToArray(_step2.value,2),key=_step2$value[0],_value=_step2$value[1];object.set(key,_addDynamicGetterAndSetter(_value,getterWrapper,setterWrapper,methodNames,deep))}}catch(err){_iterator2.e(err)}finally{_iterator2.f()}}else if(isSet(object)){var cache=[];var _iterator3=_createForOfIteratorHelper(object),_step3;try{for(_iterator3.s();!(_step3=_iterator3.n()).done;){var _value3=_step3.value;object.delete(_value3);cache.push(_addDynamicGetterAndSetter(_value3,getterWrapper,setterWrapper,methodNames,deep))}}catch(err){_iterator3.e(err)}finally{_iterator3.f()}for(var _i=0,_cache=cache;_i<_cache.length;_i++){var _value2=_cache[_i];object.add(_value2)}}else if(object!==null)for(var _i2=0,_Object$entries=Object.entries(object);_i2<_Object$entries.length;_i2++){var _Object$entries$_i=_slicedToArray(_Object$entries[_i2],2),_key=_Object$entries$_i[0],_value4=_Object$entries$_i[1];object[_key]=_addDynamicGetterAndSetter(_value4,getterWrapper,setterWrapper,methodNames,deep)}if(getterWrapper||setterWrapper){var _iterator4=_createForOfIteratorHelper(typesToExtend),_step4;try{var _loop=function _loop(){var type=_step4.value;if(isObject(object)&&object instanceof type){var defaultHandler=getProxyHandler(object,methodNames);var handler=getProxyHandler(object,methodNames);if(getterWrapper)handler.get=function(_target,name){if(name==="__target__")return object;if(name==="__revoke__")return function(){revoke();return object};if(typeof object[name]==="function")return object[name];return getterWrapper(defaultHandler.get(proxy,name),name,object)};if(setterWrapper)handler.set=function(_target,name,value){return defaultHandler.set(proxy,name,setterWrapper(name,value,object))};var _Proxy$revocable=Proxy.revocable({},handler),proxy=_Proxy$revocable.proxy,revoke=_Proxy$revocable.revoke;return{v:proxy}}},_ret;for(_iterator4.s();!(_step4=_iterator4.n()).done;){_ret=_loop();if(_ret)return _ret.v}}catch(err){_iterator4.e(err)}finally{_iterator4.f()}}return object};/**
|
|
105
|
-
* Converts given object into its serialized JSON representation by
|
|
106
|
-
* replacing circular references with a given provided value.
|
|
107
|
-
*
|
|
108
|
-
* This method traverses given object recursively and tracks of seen and
|
|
109
|
-
* already serialized structures to reuse generated strings or mark a
|
|
110
|
-
* circular reference.
|
|
111
|
-
* @param object - Object to serialize.
|
|
112
|
-
* @param determineCircularReferenceValue - Callback to create a fallback
|
|
113
|
-
* value depending on given redundant value.
|
|
114
|
-
* @param numberOfSpaces - Number of spaces to use for string formatting.
|
|
115
|
-
* @returns The formatted JSON string.
|
|
116
|
-
*/var convertCircularObjectToJSON=function convertCircularObjectToJSON(object,determineCircularReferenceValue,numberOfSpaces){if(determineCircularReferenceValue===void 0){determineCircularReferenceValue=function determineCircularReferenceValue(serializedValue){return serializedValue!==null&&serializedValue!==void 0?serializedValue:"__circularReference__"}}if(numberOfSpaces===void 0){numberOfSpaces=0}var seenObjects=new Map;var stringifier=function stringifier(object){var _replacer=function replacer(key,value){if(isObject(value)){var _seenObjects$get;if(seenObjects.has(value))return determineCircularReferenceValue((_seenObjects$get=seenObjects.get(value))!==null&&_seenObjects$get!==void 0?_seenObjects$get:null,key,value,seenObjects);// NOTE: Set before traversing deeper to detect cycles.
|
|
117
|
-
seenObjects.set(value,null);var result;if(Array.isArray(value)){result=[];var _iterator5=_createForOfIteratorHelper(value),_step5;try{for(_iterator5.s();!(_step5=_iterator5.n()).done;){var item=_step5.value;result.push(_replacer(null,item))}}catch(err){_iterator5.e(err)}finally{_iterator5.f()}}else{result={};for(var _i3=0,_Object$entries2=Object.entries(value);_i3<_Object$entries2.length;_i3++){var _Object$entries2$_i=_slicedToArray(_Object$entries2[_i3],2),name=_Object$entries2$_i[0],subValue=_Object$entries2$_i[1];result[name]=_replacer(name,subValue)}}seenObjects.set(value,result);return result}return value};return JSON.stringify(object,_replacer,numberOfSpaces)};return stringifier(object)};/**
|
|
118
|
-
* Converts given map and all nested found maps objects to corresponding
|
|
119
|
-
* object.
|
|
120
|
-
* @param object - Map to convert to.
|
|
121
|
-
* @param deep - Indicates whether to perform a recursive conversion.
|
|
122
|
-
* @returns Given map as object.
|
|
123
|
-
*/var _convertMapToPlainObject=function convertMapToPlainObject(object,deep){if(deep===void 0){deep=true}if(_typeof(object)==="object"){if(isMap(object)){var newObject={};var _iterator6=_createForOfIteratorHelper(object),_step6;try{for(_iterator6.s();!(_step6=_iterator6.n()).done;){var _step6$value=_slicedToArray(_step6.value,2),key=_step6$value[0],value=_step6$value[1];if(deep)value=_convertMapToPlainObject(value,deep);if(["number","string"].includes(_typeof(key)))newObject[String(key)]=value}}catch(err){_iterator6.e(err)}finally{_iterator6.f()}return newObject}if(deep)if(isPlainObject(object))for(var _i4=0,_Object$entries3=Object.entries(object);_i4<_Object$entries3.length;_i4++){var _Object$entries3$_i=_slicedToArray(_Object$entries3[_i4],2),_key2=_Object$entries3$_i[0],_value5=_Object$entries3$_i[1];object[_key2]=_convertMapToPlainObject(_value5,deep)}else if(Array.isArray(object)){var index=0;for(var _i5=0,_arr=object;_i5<_arr.length;_i5++){var _value6=_arr[_i5];object[index]=_convertMapToPlainObject(_value6,deep);index+=1}}else if(isSet(object)){var cache=[];var _iterator7=_createForOfIteratorHelper(object),_step7;try{for(_iterator7.s();!(_step7=_iterator7.n()).done;){var _value8=_step7.value;object.delete(_value8);cache.push(_convertMapToPlainObject(_value8,deep))}}catch(err){_iterator7.e(err)}finally{_iterator7.f()}for(var _i6=0,_cache2=cache;_i6<_cache2.length;_i6++){var _value7=_cache2[_i6];object.add(_value7)}}}return object};/**
|
|
124
|
-
* Converts given plain object and all nested found objects to
|
|
125
|
-
* corresponding map.
|
|
126
|
-
* @param object - Object to convert to.
|
|
127
|
-
* @param deep - Indicates whether to perform a recursive conversion.
|
|
128
|
-
* @returns Given object as map.
|
|
129
|
-
*/var _convertPlainObjectToMap=function convertPlainObjectToMap(object,deep){if(deep===void 0){deep=true}if(_typeof(object)==="object"){if(isPlainObject(object)){var newObject=new Map;for(var _i7=0,_Object$entries4=Object.entries(object);_i7<_Object$entries4.length;_i7++){var _Object$entries4$_i=_slicedToArray(_Object$entries4[_i7],2),key=_Object$entries4$_i[0],value=_Object$entries4$_i[1];if(deep)object[key]=_convertPlainObjectToMap(value,deep);newObject.set(key,object[key])}return newObject}if(deep)if(Array.isArray(object)){var index=0;for(var _i8=0,_arr2=object;_i8<_arr2.length;_i8++){var _value9=_arr2[_i8];object[index]=_convertPlainObjectToMap(_value9,deep);index+=1}}else if(isMap(object)){var _iterator8=_createForOfIteratorHelper(object),_step8;try{for(_iterator8.s();!(_step8=_iterator8.n()).done;){var _step8$value=_slicedToArray(_step8.value,2),_key3=_step8$value[0],_value0=_step8$value[1];object.set(_key3,_convertPlainObjectToMap(_value0,deep))}}catch(err){_iterator8.e(err)}finally{_iterator8.f()}}else if(isSet(object)){var cache=[];var _iterator9=_createForOfIteratorHelper(object),_step9;try{for(_iterator9.s();!(_step9=_iterator9.n()).done;){var _value10=_step9.value;object.delete(_value10);cache.push(_convertPlainObjectToMap(_value10,deep))}}catch(err){_iterator9.e(err)}finally{_iterator9.f()}for(var _i9=0,_cache3=cache;_i9<_cache3.length;_i9++){var _value1=_cache3[_i9];object.add(_value1)}}}return object};/**
|
|
130
|
-
* Replaces given pattern in each value in given object recursively with
|
|
131
|
-
* given string replacement.
|
|
132
|
-
* @param object - Object to convert substrings in.
|
|
133
|
-
* @param pattern - Regular expression to replace.
|
|
134
|
-
* @param replacement - String to use as replacement for found patterns.
|
|
135
|
-
* @returns Converted object with replaced patterns.
|
|
136
|
-
*/var _convertSubstringInPlainObject=function convertSubstringInPlainObject(object,pattern,replacement){for(var _i0=0,_Object$entries5=Object.entries(object);_i0<_Object$entries5.length;_i0++){var _Object$entries5$_i=_slicedToArray(_Object$entries5[_i0],2),key=_Object$entries5$_i[0],value=_Object$entries5$_i[1];if(isPlainObject(value))object[key]=_convertSubstringInPlainObject(value,pattern,replacement);else if(typeof value==="string")object[key]=value.replace(pattern,replacement)}return object};/* eslint-disable jsdoc/require-description-complete-sentence *//**
|
|
137
|
-
* Copies given object (of any type) into optionally given destination.
|
|
138
|
-
* @param source - Object to copy.
|
|
139
|
-
* @param copyBlobs - Determines whether to copy blobs as well.
|
|
140
|
-
* @param recursionLimit - Specifies how deep we should traverse into given
|
|
141
|
-
* object recursively.
|
|
142
|
-
* @param recursionEndValue - Indicates which value to use for recursion ends.
|
|
143
|
-
* Usually a reference to corresponding source value will be used.
|
|
144
|
-
* @param destination - Target to copy source to.
|
|
145
|
-
* @param cyclic - Indicates whether known sub structures should be copied or
|
|
146
|
-
* referenced (if "true" endless loops can occur if source has cyclic
|
|
147
|
-
* structures).
|
|
148
|
-
* @param knownReferences - Used to avoid traversing loops and not to copy
|
|
149
|
-
* references e.g. to objects not to copy (e.g. symbol polyfills).
|
|
150
|
-
* @param recursionLevel - Internally used to track current recursion level in
|
|
151
|
-
* given source data structure.
|
|
152
|
-
* @returns Value "true" if both objects are equal and "false" otherwise.
|
|
153
|
-
*/var _copy=function copy(source,copyBlobs,recursionLimit,recursionEndValue,destination,cyclic,knownReferences,recursionLevel){if(copyBlobs===void 0){copyBlobs=false}if(recursionLimit===void 0){recursionLimit=-1}if(recursionEndValue===void 0){recursionEndValue=VALUE_COPY_SYMBOL}if(destination===void 0){destination=null}if(cyclic===void 0){cyclic=false}if(knownReferences===void 0){knownReferences=[]}if(recursionLevel===void 0){recursionLevel=0}/* eslint-enable jsdoc/require-description-complete-sentence */if(isObject(source))if(destination){if(source===destination)throw new Error("Can't copy because source and destination are "+"identical.");if(!cyclic&&![undefined,null].includes(source)){var index=knownReferences.indexOf(source);if(index!==-1)return knownReferences[index];knownReferences.push(source)}var copyValue=function copyValue(value){if(recursionLimit!==-1&&recursionLimit<recursionLevel+1)return recursionEndValue===VALUE_COPY_SYMBOL?value:recursionEndValue;var result=_copy(value,copyBlobs,recursionLimit,recursionEndValue,null,cyclic,knownReferences,recursionLevel+1);if(!cyclic&&![undefined,null].includes(value)&&_typeof(value)==="object")knownReferences.push(value);return result};if(Array.isArray(source)){var _iterator0=_createForOfIteratorHelper(source),_step0;try{for(_iterator0.s();!(_step0=_iterator0.n()).done;){var item=_step0.value;destination.push(copyValue(item))}}catch(err){_iterator0.e(err)}finally{_iterator0.f()}}else if(source instanceof Map){var _iterator1=_createForOfIteratorHelper(source),_step1;try{for(_iterator1.s();!(_step1=_iterator1.n()).done;){var _step1$value=_slicedToArray(_step1.value,2),key=_step1$value[0],value=_step1$value[1];destination.set(key,copyValue(value))}}catch(err){_iterator1.e(err)}finally{_iterator1.f()}}else if(source instanceof Set){var _iterator10=_createForOfIteratorHelper(source),_step10;try{for(_iterator10.s();!(_step10=_iterator10.n()).done;){var _value11=_step10.value;destination.add(copyValue(_value11))}}catch(err){_iterator10.e(err)}finally{_iterator10.f()}}else for(var _i1=0,_Object$entries6=Object.entries(source);_i1<_Object$entries6.length;_i1++){var _Object$entries6$_i=_slicedToArray(_Object$entries6[_i1],2),_key4=_Object$entries6$_i[0],_value12=_Object$entries6$_i[1];try{destination[_key4]=copyValue(_value12)}catch(error){throw new Error("Failed to copy property value object \""+"".concat(_key4,"\": ").concat(_represent(error)),{cause:error})}}}else{if(Array.isArray(source))return _copy(source,copyBlobs,recursionLimit,recursionEndValue,[],cyclic,knownReferences,recursionLevel);if(source instanceof Map)return _copy(source,copyBlobs,recursionLimit,recursionEndValue,new Map,cyclic,knownReferences,recursionLevel);if(source instanceof Set)return _copy(source,copyBlobs,recursionLimit,recursionEndValue,new Set,cyclic,knownReferences,recursionLevel);if(source instanceof Date)return new Date(source.getTime());if(source instanceof RegExp){var modifier=/[^/]*$/.exec(source.toString());destination=new RegExp(source.source,modifier?modifier[0]:undefined);destination.lastIndex=source.lastIndex;return destination}if(typeof Blob!=="undefined"&&source instanceof Blob)return copyBlobs?source.slice(0,source.size,source.type):source;return _copy(source,copyBlobs,recursionLimit,recursionEndValue,{},cyclic,knownReferences,recursionLevel)}return destination||source};/**
|
|
154
|
-
* Determine the internal JavaScript [[Class]] of an object.
|
|
155
|
-
* @param value - Value to analyze.
|
|
156
|
-
* @returns Name of determined type.
|
|
157
|
-
*/var determineType=function determineType(value){if([null,undefined].includes(value))return String(value);var type=_typeof(value);if(["function","object"].includes(type)&&"toString"in value){var stringRepresentation=Object.prototype.toString.call(value);if(Object.prototype.hasOwnProperty.call(_constants__WEBPACK_IMPORTED_MODULE_2__.CLASS_TO_TYPE_MAPPING,stringRepresentation))return _constants__WEBPACK_IMPORTED_MODULE_2__.CLASS_TO_TYPE_MAPPING[stringRepresentation]}return type};/**
|
|
158
|
-
* Returns true if given items are equal for given property list. If
|
|
159
|
-
* property list isn't set all properties will be checked. All keys which
|
|
160
|
-
* starts with one of the exception prefixes will be omitted.
|
|
161
|
-
* @param firstValue - First object to compare.
|
|
162
|
-
* @param secondValue - Second object to compare.
|
|
163
|
-
* @param givenOptions - Options to define how to compare.
|
|
164
|
-
* @param givenOptions.properties - Property names to check. Check all if
|
|
165
|
-
* "null" is selected (default).
|
|
166
|
-
* @param givenOptions.deep - Recursion depth negative values means
|
|
167
|
-
* infinitely deep (default).
|
|
168
|
-
* @param givenOptions.exceptionPrefixes - Property prefixes which
|
|
169
|
-
* indicates properties to ignore.
|
|
170
|
-
* @param givenOptions.ignoreFunctions - Indicates whether functions have
|
|
171
|
-
* to be identical to interpret is as equal. If set to "true" two functions
|
|
172
|
-
* will be assumed to be equal (default).
|
|
173
|
-
* @param givenOptions.compareBlobs - Indicates whether binary data should
|
|
174
|
-
* be converted to a base64 string to compare their content. Makes this
|
|
175
|
-
* function asynchronous in browsers and potentially takes a lot of
|
|
176
|
-
* resources.
|
|
177
|
-
* @returns Value "true" if both objects are equal and "false" otherwise.
|
|
178
|
-
* If "compareBlobs" is activated, and we're running in a browser like
|
|
179
|
-
* environment and binary data is given, then a promise wrapping the
|
|
180
|
-
* determined boolean values is returned.
|
|
181
|
-
*/var _equals=function equals(firstValue,secondValue,givenOptions){if(givenOptions===void 0){givenOptions={}}var options=_objectSpread({compareBlobs:false,deep:-1,exceptionPrefixes:[],ignoreFunctions:true,properties:null,returnReasonIfNotEqual:false},givenOptions);if(options.ignoreFunctions&&isFunction(firstValue)&&isFunction(secondValue)||firstValue===secondValue||isNotANumber(firstValue)&&isNotANumber(secondValue)||firstValue instanceof RegExp&&secondValue instanceof RegExp&&firstValue.toString()===secondValue.toString()&&firstValue.flags.split("").sort().join("")===secondValue.flags.split("").sort().join("")||firstValue instanceof Date&&secondValue instanceof Date&&(isNaN(firstValue.getTime())&&isNaN(secondValue.getTime())||!isNaN(firstValue.getTime())&&!isNaN(secondValue.getTime())&&firstValue.getTime()===secondValue.getTime())||options.compareBlobs&&eval("typeof Buffer")!=="undefined"&&Object.prototype.hasOwnProperty.call(eval("Buffer"),"isBuffer")&&firstValue instanceof eval("Buffer")&&secondValue instanceof eval("Buffer")&&firstValue.toString("base64")===secondValue.toString("base64"))return true;if(options.compareBlobs&&typeof Blob!=="undefined"&&firstValue instanceof Blob&&secondValue instanceof Blob)return new Promise(function(resolve){var values=[];for(var _i10=0,_arr3=[firstValue,secondValue];_i10<_arr3.length;_i10++){var value=_arr3[_i10];var fileReader=new FileReader;fileReader.onload=function(event){if(event.target===null)values.push(null);else values.push(event.target.result);if(values.length===2)if(values[0]===values[1])resolve(true);else resolve(options.returnReasonIfNotEqual?">>> Blob(".concat(_represent(values[0]),") !== ")+"Blob(".concat(_represent(values[1]),")"):false)};fileReader.readAsDataURL(value)}});if(isPlainObject(firstValue)&&isPlainObject(secondValue)&&!(firstValue instanceof RegExp||secondValue instanceof RegExp)||Array.isArray(firstValue)&&Array.isArray(secondValue)&&firstValue.length===secondValue.length||determineType(firstValue)===determineType(secondValue)&&["map","set"].includes(determineType(firstValue))&&firstValue.size===secondValue.size){var promises=[];for(var _i11=0,_arr4=[[firstValue,secondValue],[secondValue,firstValue]];_i11<_arr4.length;_i11++){var _arr4$_i=_slicedToArray(_arr4[_i11],2),first=_arr4$_i[0],second=_arr4$_i[1];var firstIsArray=Array.isArray(first);if(firstIsArray&&(!Array.isArray(second)||first.length!==second.length))return options.returnReasonIfNotEqual?".length":false;var firstIsMap=isMap(first);if(firstIsMap&&(!isMap(second)||first.size!==second.size))return options.returnReasonIfNotEqual?".size":false;var firstIsSet=isSet(first);if(firstIsSet&&(!isSet(second)||first.size!==second.size))return options.returnReasonIfNotEqual?".size":false;if(firstIsArray){var index=0;var _loop2=function _loop2(){var value=_arr5[_i12];if(options.deep!==0){var result=_equals(value,second[index],_objectSpread(_objectSpread({},options),{},{deep:options.deep-1}));if(!result)return{v:false};var currentIndex=index;var determineResult=function determineResult(result){var _$$result$;return typeof result==="string"?"[".concat(String(currentIndex),"]")+((_$$result$={"[":"",">":" "}[result[0]])!==null&&_$$result$!==void 0?_$$result$:".")+result:result};if(Object.prototype.hasOwnProperty.call(result,"then"))promises.push(result.then(determineResult));if(typeof result==="string")return{v:determineResult(result)}}index+=1},_ret2;for(var _i12=0,_arr5=first;_i12<_arr5.length;_i12++){_ret2=_loop2();if(_ret2)return _ret2.v}}else if(firstIsMap){var _iterator11=_createForOfIteratorHelper(first),_step11;try{var _loop3=function _loop3(){var _step11$value=_slicedToArray(_step11.value,2),key=_step11$value[0],value=_step11$value[1];if(options.deep!==0){var result=_equals(value,second.get(key),_objectSpread(_objectSpread({},options),{},{deep:options.deep-1}));if(!result)return{v:false};var determineResult=function determineResult(result){var _$$result$2;return typeof result==="string"?"get(".concat(_represent(key),")")+((_$$result$2={"[":"",">":" "}[result[0]])!==null&&_$$result$2!==void 0?_$$result$2:".")+result:result};if(Object.prototype.hasOwnProperty.call(result,"then"))promises.push(result.then(determineResult));if(typeof result==="string")return{v:determineResult(result)}}},_ret3;for(_iterator11.s();!(_step11=_iterator11.n()).done;){_ret3=_loop3();if(_ret3)return _ret3.v}}catch(err){_iterator11.e(err)}finally{_iterator11.f()}}else if(firstIsSet){var _iterator12=_createForOfIteratorHelper(first),_step12;try{var _loop4=function _loop4(){var value=_step12.value;if(options.deep!==0){var equal=false;var subPromises=[];/*
|
|
182
|
-
NOTE: Check if their exists at least one being
|
|
183
|
-
equally.
|
|
184
|
-
*/var _iterator13=_createForOfIteratorHelper(second),_step13;try{for(_iterator13.s();!(_step13=_iterator13.n()).done;){var _secondValue=_step13.value;var result=_equals(value,_secondValue,_objectSpread(_objectSpread({},options),{},{deep:options.deep-1}));if(typeof result==="boolean"){if(result){equal=true;break}}else subPromises.push(result)}}catch(err){_iterator13.e(err)}finally{_iterator13.f()}var determineResult=function determineResult(equal){return equal?true:options.returnReasonIfNotEqual?">>> {-> ".concat(_represent(value)," not found}"):false};if(equal)/*
|
|
185
|
-
NOTE: We do not have to wait for promises to be
|
|
186
|
-
resolved when one match could be found.
|
|
187
|
-
*/return 0;// continue
|
|
188
|
-
if(subPromises.length)promises.push(new Promise(function(resolve){Promise.all(subPromises).then(function(results){resolve(determineResult(results.some(function(result){return result})))},function(){// Do nothing.
|
|
189
|
-
})}));return{v:determineResult(false)}}},_ret4;for(_iterator12.s();!(_step12=_iterator12.n()).done;){_ret4=_loop4();if(_ret4===0)continue;if(_ret4)return _ret4.v}}catch(err){_iterator12.e(err)}finally{_iterator12.f()}}else{var _loop5=function _loop5(){var _Object$entries7$_i=_slicedToArray(_Object$entries7[_i13],2),key=_Object$entries7$_i[0],value=_Object$entries7$_i[1];if(options.properties&&!options.properties.includes(key))return 0;// break
|
|
190
|
-
var doBreak=false;var _iterator14=_createForOfIteratorHelper(options.exceptionPrefixes),_step14;try{for(_iterator14.s();!(_step14=_iterator14.n()).done;){var exceptionPrefix=_step14.value;if(key.startsWith(exceptionPrefix)){doBreak=true;break}}}catch(err){_iterator14.e(err)}finally{_iterator14.f()}if(doBreak)return 0;// break
|
|
191
|
-
if(options.deep!==0){var result=_equals(value,second[key],_objectSpread(_objectSpread({},options),{},{deep:options.deep-1}));if(!result)return{v:false};var determineResult=function determineResult(result){var _$$result$3;return typeof result==="string"?key+((_$$result$3={"[":"",">":" "}[result[0]])!==null&&_$$result$3!==void 0?_$$result$3:".")+result:result};if(Object.prototype.hasOwnProperty.call(result,"then"))promises.push(result.then(determineResult));if(typeof result==="string")return{v:determineResult(result)}}},_ret5;for(var _i13=0,_Object$entries7=Object.entries(first);_i13<_Object$entries7.length;_i13++){_ret5=_loop5();if(_ret5===0)break;if(_ret5)return _ret5.v}}}if(promises.length)return new Promise(function(resolve){Promise.all(promises).then(function(results){var _iterator15=_createForOfIteratorHelper(results),_step15;try{for(_iterator15.s();!(_step15=_iterator15.n()).done;){var result=_step15.value;if(!result||typeof result==="string"){resolve(result);break}}}catch(err){_iterator15.e(err)}finally{_iterator15.f()}resolve(true)},function(){// Do nothing.
|
|
192
|
-
})});return true}return options.returnReasonIfNotEqual?">>> ".concat(_represent(firstValue)," !== ").concat(_represent(secondValue)):false};/**
|
|
193
|
-
* Wraps given data structure into proxies recursively to evaluate and resolve
|
|
194
|
-
* each get request to data having an object with indicating keys and replaces
|
|
195
|
-
* that object with corresponding evaluated values. All nested objects are
|
|
196
|
-
* wrapped with a proxy to resolve chains of referencing expressions as well.
|
|
197
|
-
* @param object - Given mapping to resolve.
|
|
198
|
-
* @param givenOptions - Options to configure evaluation.
|
|
199
|
-
* @param givenOptions.scope - Scope to use evaluate again.
|
|
200
|
-
* @param givenOptions.selfReferenceName - Name to use for reference to given
|
|
201
|
-
* object.
|
|
202
|
-
* @param givenOptions.expressionIndicatorKey - Indicator property name to mark
|
|
203
|
-
* a value to evaluate.
|
|
204
|
-
* @param givenOptions.executionIndicatorKey - Indicator property name to mark
|
|
205
|
-
* a value to evaluate.
|
|
206
|
-
* @returns Evaluated given mapping.
|
|
207
|
-
*/var evaluateDynamicData=function evaluateDynamicData(object,givenOptions){if(givenOptions===void 0){givenOptions={}}var options=_objectSpread({scope:{},selfReferenceName:"self",expressionIndicatorKey:"__evaluate__",executionIndicatorKey:"__execute__"},givenOptions);if(_typeof(object)!=="object"||object===null)return object;if(!(options.selfReferenceName in options.scope))options.scope[options.selfReferenceName]=object;var internalEvaluateAndThrowError=function internalEvaluateAndThrowError(code,type){if(type===void 0){type=options.expressionIndicatorKey}return evaluateAndThrowError(code,options.scope,type===options.executionIndicatorKey)};var _addProxyRecursively=function addProxyRecursively(data){if(_typeof(data)!=="object"||data===null||typeof Proxy==="undefined")return data;for(var _i14=0,_Object$entries8=Object.entries(data);_i14<_Object$entries8.length;_i14++){var _Object$entries8$_i=_slicedToArray(_Object$entries8[_i14],2),key=_Object$entries8$_i[0],givenValue=_Object$entries8$_i[1];if(key!=="__target__"&&isObject(givenValue)){var value=givenValue;_addProxyRecursively(value);// NOTE: We only wrap needed objects for performance reasons.
|
|
208
|
-
if(Object.prototype.hasOwnProperty.call(value,options.expressionIndicatorKey)||Object.prototype.hasOwnProperty.call(value,options.executionIndicatorKey)){var backup=value;data[key]=new Proxy(value,{get:function get(target,key){if(key==="__target__")return target;if(key==="hasOwnProperty")return target[key];/*
|
|
209
|
-
NOTE: Very complicated section, do only
|
|
210
|
-
changes while having good tests.
|
|
211
|
-
*/for(var _i15=0,_arr6=[options.expressionIndicatorKey,options.executionIndicatorKey];_i15<_arr6.length;_i15++){var type=_arr6[_i15];if(key===type&&typeof target[key]==="string")return _resolve(internalEvaluateAndThrowError(target[key],type))}var resolvedTarget=_resolve(target);if(key==="toString"){var result=internalEvaluateAndThrowError(resolvedTarget);return result[key].bind(result)}if(typeof key!=="string"){var _result$key;var _result=internalEvaluateAndThrowError(resolvedTarget);if((_result$key=_result[key])!==null&&_result$key!==void 0&&_result$key.bind)return _result[key].bind(_result);return _result[key]}for(var _i16=0,_arr7=[options.expressionIndicatorKey,options.executionIndicatorKey];_i16<_arr7.length;_i16++){var _type=_arr7[_i16];if(Object.prototype.hasOwnProperty.call(target,_type))return internalEvaluateAndThrowError(resolvedTarget,_type)[key]}return resolvedTarget[key];// End of complicated stuff.
|
|
212
|
-
},ownKeys:function ownKeys(target){for(var _i17=0,_arr8=[options.expressionIndicatorKey,options.executionIndicatorKey];_i17<_arr8.length;_i17++){var type=_arr8[_i17];if(Object.prototype.hasOwnProperty.call(target,type))return Object.getOwnPropertyNames(_resolve(internalEvaluateAndThrowError(target[type],type)))}return Object.getOwnPropertyNames(target)}});/*
|
|
213
|
-
NOTE: Known proxy polyfills does not provide the
|
|
214
|
-
"__target__" api.
|
|
215
|
-
*/if(!data[key].__target__)data[key].__target__=backup}}}return data};var _resolve=function resolve(data){if(isObject(data)){if(isProxy(data)){// NOTE: We have to skip "ownKeys" proxy trap here.
|
|
216
|
-
for(var _i18=0,_arr9=[options.expressionIndicatorKey,options.executionIndicatorKey];_i18<_arr9.length;_i18++){var type=_arr9[_i18];if(Object.prototype.hasOwnProperty.call(data,type))return data[type]}data=data.__target__}for(var _i19=0,_Object$entries9=Object.entries(data);_i19<_Object$entries9.length;_i19++){var _Object$entries9$_i=_slicedToArray(_Object$entries9[_i19],2),key=_Object$entries9$_i[0],value=_Object$entries9$_i[1];if([options.expressionIndicatorKey,options.executionIndicatorKey].includes(key)){if(typeof Proxy==="undefined")return _resolve(internalEvaluateAndThrowError(value));return value}data[key]=_resolve(value)}}return data};options.scope.resolve=_resolve;var _removeProxyRecursively=function removeProxyRecursively(data){if(isObject(data))for(var _i20=0,_Object$entries0=Object.entries(data);_i20<_Object$entries0.length;_i20++){var _Object$entries0$_i=_slicedToArray(_Object$entries0[_i20],2),key=_Object$entries0$_i[0],value=_Object$entries0$_i[1];if(key!=="__target__"&&value!==null&&["function","undefined"].includes(_typeof(value))){var target=value.__target__;if(typeof target!=="undefined")data[key]=target;_removeProxyRecursively(value)}}return data};if(Object.prototype.hasOwnProperty.call(object,options.expressionIndicatorKey))return internalEvaluateAndThrowError(object[options.expressionIndicatorKey]);else if(Object.prototype.hasOwnProperty.call(object,options.executionIndicatorKey))return internalEvaluateAndThrowError(object[options.executionIndicatorKey],options.executionIndicatorKey);return _removeProxyRecursively(_resolve(_addProxyRecursively(object)))};/**
|
|
217
|
-
* Searches for indicating keys and replaces that data with corresponding
|
|
218
|
-
* evaluated and promise resolved value.
|
|
219
|
-
* @param data - Given mapping to resolve.
|
|
220
|
-
* @param givenOptions - Options to configure evaluation.
|
|
221
|
-
* @param givenOptions.scope - Scope to use evaluate again.
|
|
222
|
-
* @param givenOptions.selfReferenceName - Name to use for reference to given
|
|
223
|
-
* object.
|
|
224
|
-
* @param givenOptions.expressionIndicatorKey - Indicator property name to mark
|
|
225
|
-
* a value to evaluate.
|
|
226
|
-
* @param givenOptions.executionIndicatorKey - Indicator property name to mark
|
|
227
|
-
* a value to evaluate.
|
|
228
|
-
* @returns Evaluated given mapping.
|
|
229
|
-
*/var _evaluateAsyncDynamicData=/*#__PURE__*/(/* unused pure expression or super */ null && (function(){var _evaluateAsyncDynamicData2=_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(data,givenOptions){var options,result,_i21,_Object$entries1,_Object$entries1$_i,key,value;return _regenerator().w(function(_context){while(1)switch(_context.n){case 0:if(givenOptions===void 0){givenOptions={}}options=_objectSpread({scope:{},selfReferenceName:"self",expressionIndicatorKey:"__await_evaluate__",executionIndicatorKey:"__await_execute__"},givenOptions);if(!(_typeof(data)!=="object"||data===null)){_context.n=1;break}return _context.a(2,data);case 1:if(!(options.selfReferenceName in options.scope))options.scope[options.selfReferenceName]=data;result=data;_i21=0,_Object$entries1=Object.entries(data);case 2:if(!(_i21<_Object$entries1.length)){_context.n=6;break}_Object$entries1$_i=_slicedToArray(_Object$entries1[_i21],2),key=_Object$entries1$_i[0],value=_Object$entries1$_i[1];if(![options.expressionIndicatorKey,options.executionIndicatorKey].includes(key)){_context.n=4;break}_context.n=3;return evaluateAndThrowError(value,options.scope,key===options.executionIndicatorKey);case 3:result[key]=_context.v;_context.n=5;break;case 4:if(!isPlainObject(value)){_context.n=5;break}_context.n=5;return _evaluateAsyncDynamicData(value,options);case 5:_i21++;_context.n=2;break;case 6:return _context.a(2,result)}},_callee)}));function evaluateAsyncDynamicData(_x,_x2){return _evaluateAsyncDynamicData2.apply(this,arguments)}return evaluateAsyncDynamicData}()));/**
|
|
230
|
-
* Removes properties in objects where a dynamic indicator lives.
|
|
231
|
-
* @param data - Object to traverse recursively.
|
|
232
|
-
* @param expressionIndicators - Property key to remove.
|
|
233
|
-
* @returns Given object with removed properties.
|
|
234
|
-
*/var _removeKeysInEvaluation=function removeKeysInEvaluation(data,expressionIndicators){if(expressionIndicators===void 0){expressionIndicators=["__evaluate__","__execute__"]}for(var _i22=0,_Object$entries10=Object.entries(data);_i22<_Object$entries10.length;_i22++){var _Object$entries10$_i=_slicedToArray(_Object$entries10[_i22],2),key=_Object$entries10$_i[0],value=_Object$entries10$_i[1];if(!expressionIndicators.includes(key)&&expressionIndicators.some(function(name){return Object.prototype.hasOwnProperty.call(data,name)}))delete data[key];else if(isPlainObject(value))_removeKeysInEvaluation(value,expressionIndicators)}return data};/**
|
|
235
|
-
* Extends given target object with given sources object. As target and
|
|
236
|
-
* sources many expandable types are allowed but target and sources have to
|
|
237
|
-
* come from the same type.
|
|
238
|
-
* @param targetOrDeepIndicator - Maybe the target or deep indicator.
|
|
239
|
-
* @param targetOrSource - Target or source object; depending on first
|
|
240
|
-
* argument.
|
|
241
|
-
* @param additionalSources - Source objects to extend into target.
|
|
242
|
-
* @returns Returns given target extended with all given sources.
|
|
243
|
-
*/var _extend=function extend(targetOrDeepIndicator,targetOrSource){var deep=false;for(var _len=arguments.length,additionalSources=new Array(_len>2?_len-2:0),_key5=2;_key5<_len;_key5++){additionalSources[_key5-2]=arguments[_key5]}var sources=additionalSources;var target;if(targetOrDeepIndicator===IGNORE_NULL_AND_UNDEFINED_SYMBOL||typeof targetOrDeepIndicator==="boolean"){// Handle a deep copy situation and skip deep indicator and target.
|
|
244
|
-
deep=targetOrDeepIndicator;target=targetOrSource}else{target=targetOrDeepIndicator;if(isObject(targetOrSource))sources=[targetOrSource].concat(_toConsumableArray(sources));else if(targetOrSource!==undefined)target=targetOrSource}var mergeValue=function mergeValue(targetValue,value){if(value===targetValue)return targetValue;// Traverse recursively if we're merging plain objects or maps.
|
|
245
|
-
if(deep&&value&&(isPlainObject(value)||isMap(value))){var clone;if(isMap(value))clone=targetValue&&isMap(targetValue)?targetValue:new Map;else clone=targetValue&&isPlainObject(targetValue)?targetValue:{};return _extend(deep,clone,value)}return value};var _iterator16=_createForOfIteratorHelper(sources),_step16;try{for(_iterator16.s();!(_step16=_iterator16.n()).done;){var source=_step16.value;var targetType=_typeof(target);var sourceType=_typeof(source);if(isMap(target))targetType+=" Map";if(isMap(source))sourceType+=" Map";if(targetType===sourceType&&target!==source){if(isMap(target)&&isMap(source)){var _iterator17=_createForOfIteratorHelper(source),_step17;try{for(_iterator17.s();!(_step17=_iterator17.n()).done;){var _step17$value=_slicedToArray(_step17.value,2),key=_step17$value[0],value=_step17$value[1];target.set(key,mergeValue(target.get(key),value))}}catch(err){_iterator17.e(err)}finally{_iterator17.f()}}else if(isObject(target)&&!Array.isArray(target)&&!(typeof Blob!=="undefined"&&target instanceof Blob)&&isObject(source)&&!Array.isArray(source)&&!(typeof Blob!=="undefined"&&source instanceof Blob)){for(var _i23=0,_Object$entries11=Object.entries(source);_i23<_Object$entries11.length;_i23++){var _Object$entries11$_i=_slicedToArray(_Object$entries11[_i23],2),_key6=_Object$entries11$_i[0],_value13=_Object$entries11$_i[1];if(!(deep===IGNORE_NULL_AND_UNDEFINED_SYMBOL&&[null,undefined].includes(_value13)))target[_key6]=mergeValue(target[_key6],_value13)}}else target=source;}else target=source}}catch(err){_iterator16.e(err)}finally{_iterator16.f()}return target};/**
|
|
246
|
-
* Generates a proxy handler which forwards all operations to given object
|
|
247
|
-
* as there wouldn't be a proxy.
|
|
248
|
-
* @param target - Object to proxy.
|
|
249
|
-
* @param methodNames - Mapping of operand name to object specific method
|
|
250
|
-
* name.
|
|
251
|
-
* @returns Determined proxy handler.
|
|
252
|
-
*/var getProxyHandler=function getProxyHandler(target,methodNames){if(methodNames===void 0){methodNames={}}methodNames=_objectSpread({delete:"[]",get:"[]",has:"[]",set:"[]"},methodNames);return{deleteProperty:function deleteProperty(_targetObject,key){if(methodNames.delete==="[]"&&typeof key==="string")delete target[key];else return target[methodNames.delete](key);return true},get:function get(_targetObject,key){if(methodNames.get==="[]"&&typeof key==="string")return target[key];return target[methodNames.get](key)},has:function has(_targetObject,key){if(methodNames.has==="[]")return key in target;return target[methodNames.has](key)},set:function set(_targetObject,key,value){if(methodNames.set==="[]"&&typeof key==="string")target[key]=value;else return target[methodNames.set](key,value);return true}}};/**
|
|
253
|
-
* Slices all properties from given object which does not match provided
|
|
254
|
-
* object mask. Items can be explicitly whitelisted via "include" mask
|
|
255
|
-
* configuration or black listed via "exclude" mask configuration.
|
|
256
|
-
* @param object - Object to slice.
|
|
257
|
-
* @param maskConfiguration - Mask configuration.
|
|
258
|
-
* @returns Given but sliced object. If (nested) object will be modified a
|
|
259
|
-
* flat copy of that object will be returned.
|
|
260
|
-
*/var _mask=function mask(object,maskConfiguration){maskConfiguration=_objectSpread({exclude:false,include:true},maskConfiguration);if(maskConfiguration.exclude===true||Array.isArray(maskConfiguration.exclude)&&maskConfiguration.exclude.length===0||maskConfiguration.include===false||_typeof(object)!=="object")return{};var exclude=Array.isArray(maskConfiguration.exclude)?maskConfiguration.exclude.reduce(function(mask,key){return _objectSpread(_objectSpread({},mask),{},_defineProperty({},key,true))},{}):maskConfiguration.exclude;var include=Array.isArray(maskConfiguration.include)?maskConfiguration.include.reduce(function(mask,key){return _objectSpread(_objectSpread({},mask),{},_defineProperty({},key,true))},{}):maskConfiguration.include;var result={};if(isPlainObject(include)){for(var _i24=0,_Object$entries12=Object.entries(include);_i24<_Object$entries12.length;_i24++){var _Object$entries12$_i=_slicedToArray(_Object$entries12[_i24],2),key=_Object$entries12$_i[0],value=_Object$entries12$_i[1];if(Object.prototype.hasOwnProperty.call(object,key))if(value===true)result[key]=object[key];else if((isPlainObject(value)||Array.isArray(value)&&value.length)&&_typeof(object[key])==="object")result[key]=_mask(object[key],{include:value})}}else// In this branch "mask.include === true" holds.
|
|
261
|
-
result=object;if(isPlainObject(exclude)){var useCopy=false;var copy=_objectSpread({},result);for(var _i25=0,_Object$entries13=Object.entries(exclude);_i25<_Object$entries13.length;_i25++){var _Object$entries13$_i=_slicedToArray(_Object$entries13[_i25],2),_key7=_Object$entries13$_i[0],_value14=_Object$entries13$_i[1];if(Object.prototype.hasOwnProperty.call(copy,_key7))if(_value14===true){useCopy=true;delete copy[_key7]}else if((isPlainObject(_value14)||Array.isArray(_value14)&&_value14.length)&&_typeof(copy[_key7])==="object"){var current=copy[_key7];copy[_key7]=_mask(copy[_key7],{exclude:_value14});if(copy[_key7]!==current)useCopy=true}}if(useCopy)result=copy}return result};/**
|
|
262
|
-
* Modifies given target corresponding to given source and removes source
|
|
263
|
-
* modification infos.
|
|
264
|
-
* @param target - Object to modify.
|
|
265
|
-
* @param source - Source object to load modifications from.
|
|
266
|
-
* @param removeIndicatorKey - Indicator property name or value to mark a
|
|
267
|
-
* value to remove from object or list.
|
|
268
|
-
* @param prependIndicatorKey - Indicator property name to mark a value to
|
|
269
|
-
* prepend to target list.
|
|
270
|
-
* @param appendIndicatorKey - Indicator property name to mark a value to
|
|
271
|
-
* append to target list.
|
|
272
|
-
* @param positionPrefix - Indicates a prefix to use a value on given
|
|
273
|
-
* position to add or remove.
|
|
274
|
-
* @param positionSuffix - Indicates a suffix to use a value on given
|
|
275
|
-
* position to add or remove.
|
|
276
|
-
* @param parentSource - Source context to remove modification info from
|
|
277
|
-
* (usually only needed internally).
|
|
278
|
-
* @param parentKey - Source key in given source context to remove
|
|
279
|
-
* modification info from (usually only needed internally).
|
|
280
|
-
* @returns Given target modified with given source.
|
|
281
|
-
*/var _modifyObject=function modifyObject(target,source,removeIndicatorKey,prependIndicatorKey,appendIndicatorKey,positionPrefix,positionSuffix,parentSource,parentKey){if(removeIndicatorKey===void 0){removeIndicatorKey="__remove__"}if(prependIndicatorKey===void 0){prependIndicatorKey="__prepend__"}if(appendIndicatorKey===void 0){appendIndicatorKey="__append__"}if(positionPrefix===void 0){positionPrefix="__"}if(positionSuffix===void 0){positionSuffix="__"}if(parentSource===void 0){parentSource=null}if(parentKey===void 0){parentKey=null}if(isMap(source)&&isMap(target)){var _iterator18=_createForOfIteratorHelper(source),_step18;try{for(_iterator18.s();!(_step18=_iterator18.n()).done;){var _step18$value=_slicedToArray(_step18.value,2),key=_step18$value[0],value=_step18$value[1];if(target.has(key))_modifyObject(target.get(key),value,removeIndicatorKey,prependIndicatorKey,appendIndicatorKey,positionPrefix,positionSuffix,source,key)}}catch(err){_iterator18.e(err)}finally{_iterator18.f()}}else if(isObject(source)&&isObject(target))for(var _i26=0,_Object$entries14=Object.entries(source);_i26<_Object$entries14.length;_i26++){var _Object$entries14$_i=_slicedToArray(_Object$entries14[_i26],2),_key8=_Object$entries14$_i[0],sourceValue=_Object$entries14$_i[1];var index=NaN;if(Array.isArray(target)&&_key8.startsWith(positionPrefix)&&_key8.endsWith(positionSuffix)){index=parseInt(_key8.substring(positionPrefix.length,_key8.length-positionSuffix.length),10);if(index<0||index>=target.length)index=NaN}if([removeIndicatorKey,prependIndicatorKey,appendIndicatorKey].includes(_key8)||!isNaN(index)){if(Array.isArray(target)){if(_key8===removeIndicatorKey){var values=[].concat(sourceValue);var _iterator19=_createForOfIteratorHelper(values),_step19;try{for(_iterator19.s();!(_step19=_iterator19.n()).done;){var _value15=_step19.value;if(typeof _value15==="string"&&_value15.startsWith(positionPrefix)&&_value15.endsWith(positionSuffix))target.splice(parseInt(_value15.substring(positionPrefix.length,_value15.length-positionSuffix.length),10),1);else if(target.includes(_value15))target.splice(target.indexOf(_value15),1);else if(typeof _value15==="number"&&_value15<target.length)target.splice(_value15,1)}}catch(err){_iterator19.e(err)}finally{_iterator19.f()}}else if(_key8===appendIndicatorKey)target=target.concat(sourceValue);else if(_key8===prependIndicatorKey)target=[].concat(sourceValue).concat(target);else if(isObject(target[index])&&isObject(sourceValue))_extend(true,_modifyObject(target[index],sourceValue,removeIndicatorKey,prependIndicatorKey,appendIndicatorKey,positionPrefix,positionSuffix),target[index],sourceValue);else target[index]=sourceValue;}else if(_key8===removeIndicatorKey){var _iterator20=_createForOfIteratorHelper([].concat(sourceValue)),_step20;try{for(_iterator20.s();!(_step20=_iterator20.n()).done;){var _value16=_step20.value;if(typeof _value16==="string"&&Object.prototype.hasOwnProperty.call(target,_value16))delete target[_value16]}}catch(err){_iterator20.e(err)}finally{_iterator20.f()}}delete source[_key8];if(parentSource&&typeof parentKey==="string")delete parentSource[parentKey]}else if(target!==null&&Object.prototype.hasOwnProperty.call(target,_key8))target[_key8]=_modifyObject(target[_key8],sourceValue,removeIndicatorKey,prependIndicatorKey,appendIndicatorKey,positionPrefix,positionSuffix,source,_key8)}return target};/**
|
|
282
|
-
* Removes given key from given object recursively.
|
|
283
|
-
* @param object - Object to process.
|
|
284
|
-
* @param keys - List of keys to remove.
|
|
285
|
-
* @returns Processed given object.
|
|
286
|
-
*/var _removeKeyPrefixes=function removeKeyPrefixes(object,keys){if(keys===void 0){keys="#"}var resolvedKeys=[].concat(keys);if(Array.isArray(object)){var index=0;var _iterator21=_createForOfIteratorHelper(object.slice()),_step21;try{for(_iterator21.s();!(_step21=_iterator21.n()).done;){var subObject=_step21.value;var skip=false;if(typeof subObject==="string"){var _iterator22=_createForOfIteratorHelper(resolvedKeys),_step22;try{for(_iterator22.s();!(_step22=_iterator22.n()).done;){var key=_step22.value;if(subObject.startsWith("".concat(key,":"))){object.splice(index,1);skip=true;break}}}catch(err){_iterator22.e(err)}finally{_iterator22.f()}if(skip)continue}object[index]=_removeKeyPrefixes(subObject,resolvedKeys);index+=1}}catch(err){_iterator21.e(err)}finally{_iterator21.f()}}else if(isSet(object)){var _iterator23=_createForOfIteratorHelper(new Set(object)),_step23;try{for(_iterator23.s();!(_step23=_iterator23.n()).done;){var _subObject=_step23.value;var _skip=false;if(typeof _subObject==="string"){var _iterator24=_createForOfIteratorHelper(resolvedKeys),_step24;try{for(_iterator24.s();!(_step24=_iterator24.n()).done;){var _key9=_step24.value;if(_subObject.startsWith("".concat(_key9,":"))){object.delete(_subObject);_skip=true;break}}}catch(err){_iterator24.e(err)}finally{_iterator24.f()}if(_skip)continue}_removeKeyPrefixes(_subObject,resolvedKeys)}}catch(err){_iterator23.e(err)}finally{_iterator23.f()}}else if(isMap(object)){var _iterator25=_createForOfIteratorHelper(new Map(object)),_step25;try{for(_iterator25.s();!(_step25=_iterator25.n()).done;){var _step25$value=_slicedToArray(_step25.value,2),_key0=_step25$value[0],_subObject2=_step25$value[1];var _skip2=false;if(typeof _key0==="string"){var _iterator26=_createForOfIteratorHelper(resolvedKeys),_step26;try{for(_iterator26.s();!(_step26=_iterator26.n()).done;){var resolvedKey=_step26.value;var escapedKey=escapeRegularExpressions(resolvedKey);if(new RegExp("^".concat(escapedKey,"[0-9]*$")).test(_key0)){object.delete(_key0);_skip2=true;break}}}catch(err){_iterator26.e(err)}finally{_iterator26.f()}if(_skip2)continue}object.set(_key0,_removeKeyPrefixes(_subObject2,resolvedKeys))}}catch(err){_iterator25.e(err)}finally{_iterator25.f()}}else if(isObject(object))for(var _i27=0,_Object$entries15=Object.entries(Object.assign({},object));_i27<_Object$entries15.length;_i27++){var _Object$entries15$_i=_slicedToArray(_Object$entries15[_i27],2),_key1=_Object$entries15$_i[0],value=_Object$entries15$_i[1];var _skip3=false;var _iterator27=_createForOfIteratorHelper(resolvedKeys),_step27;try{for(_iterator27.s();!(_step27=_iterator27.n()).done;){var _resolvedKey=_step27.value;var _escapedKey=escapeRegularExpressions(_resolvedKey);if(new RegExp("^".concat(_escapedKey,"[0-9]*$")).test(_key1)){delete object[_key1];_skip3=true;break}}}catch(err){_iterator27.e(err)}finally{_iterator27.f()}if(_skip3)continue;object[_key1]=_removeKeyPrefixes(value,resolvedKeys)}return object};/**
|
|
287
|
-
* Represents given object as formatted string.
|
|
288
|
-
* @param object - Object to represent.
|
|
289
|
-
* @param maximumLengthOfLists - Maximum number of array item to render.
|
|
290
|
-
* @param indention - String (usually whitespaces) to use as indention.
|
|
291
|
-
* @param initialIndention - String (usually whitespaces) to use as
|
|
292
|
-
* additional indention for the first object traversing level.
|
|
293
|
-
* @param maximumNumberOfLevelsReachedIdentifier - Replacement for objects
|
|
294
|
-
* which are out of specified bounds to traverse.
|
|
295
|
-
* @param numberOfLevels - Specifies number of levels to traverse given
|
|
296
|
-
* data structure.
|
|
297
|
-
* @returns Representation string.
|
|
298
|
-
*/var _represent=function represent(object,maximumLengthOfLists,indention,initialIndention,maximumNumberOfLevelsReachedIdentifier,numberOfLevels){if(maximumLengthOfLists===void 0){maximumLengthOfLists=30}if(indention===void 0){indention=" "}if(initialIndention===void 0){initialIndention=""}if(maximumNumberOfLevelsReachedIdentifier===void 0){maximumNumberOfLevelsReachedIdentifier="__maximum_number_of_levels_reached__"}if(numberOfLevels===void 0){numberOfLevels=8}if(numberOfLevels===0)return String(maximumNumberOfLevelsReachedIdentifier);if(object===null)return"null";if(object===undefined)return"undefined";if(typeof object==="string")return"\"".concat(object.replace(/\n/g,"\n".concat(initialIndention)),"\"");if(isNumeric(object)||typeof object==="boolean")return String(object);if(object instanceof Date)return object.toISOString();if(Array.isArray(object)){var _result2="[";var _firstSeen=false;var _counter=1;var _iterator28=_createForOfIteratorHelper(object),_step28;try{for(_iterator28.s();!(_step28=_iterator28.n()).done;){var item=_step28.value;if(_counter>maximumLengthOfLists){_result2+="\n".concat(initialIndention,"...");break}if(_firstSeen)_result2+=",";_result2+="\n".concat(initialIndention).concat(indention)+_represent(item,maximumLengthOfLists,indention,"".concat(initialIndention).concat(indention),maximumNumberOfLevelsReachedIdentifier,numberOfLevels-1);_firstSeen=true;_counter+=1}}catch(err){_iterator28.e(err)}finally{_iterator28.f()}if(_firstSeen)_result2+="\n".concat(initialIndention);_result2+="]";return _result2}if(isMap(object)){var _result3="";var _firstSeen2=false;var _counter2=1;var _iterator29=_createForOfIteratorHelper(object),_step29;try{for(_iterator29.s();!(_step29=_iterator29.n()).done;){var _step29$value=_slicedToArray(_step29.value,2),key=_step29$value[0],_item=_step29$value[1];if(_counter2>maximumLengthOfLists){_result3+=",\n".concat(initialIndention,"...");break}if(_firstSeen2)_result3+=",\n".concat(initialIndention).concat(indention);_result3+=_represent(key,maximumLengthOfLists,indention,"".concat(initialIndention).concat(indention),maximumNumberOfLevelsReachedIdentifier,numberOfLevels-1)+" -> "+_represent(_item,maximumLengthOfLists,indention,"".concat(initialIndention).concat(indention),maximumNumberOfLevelsReachedIdentifier,numberOfLevels-1);_firstSeen2=true;_counter2+=1}}catch(err){_iterator29.e(err)}finally{_iterator29.f()}if(!_firstSeen2)_result3="EmptyMap";return _result3}if(isSet(object)){var _result4="{";var _firstSeen3=false;var _counter3=1;var _iterator30=_createForOfIteratorHelper(object),_step30;try{for(_iterator30.s();!(_step30=_iterator30.n()).done;){var _item2=_step30.value;if(_counter3>maximumLengthOfLists){_result4+=",\n".concat(initialIndention,"...");break}if(_firstSeen3)_result4+=",";_result4+="\n".concat(initialIndention).concat(indention)+_represent(_item2,maximumLengthOfLists,indention,"".concat(initialIndention).concat(indention),maximumNumberOfLevelsReachedIdentifier,numberOfLevels-1);_firstSeen3=true;_counter3+=1}}catch(err){_iterator30.e(err)}finally{_iterator30.f()}if(_firstSeen3)_result4+="\n".concat(initialIndention,"}");else _result4="EmptySet";return _result4}if(isFunction(object))return"__function__";var result="{";var keys=Object.getOwnPropertyNames(object).sort();var firstSeen=false;var counter=1;var _iterator31=_createForOfIteratorHelper(keys),_step31;try{for(_iterator31.s();!(_step31=_iterator31.n()).done;){var _key10=_step31.value;if(counter>maximumLengthOfLists){result+=",\n".concat(initialIndention,"...");break}if(firstSeen)result+=",";result+="\n".concat(initialIndention).concat(indention).concat(_key10,": ")+_represent(object[_key10],maximumLengthOfLists,indention,"".concat(initialIndention).concat(indention),maximumNumberOfLevelsReachedIdentifier,numberOfLevels-1);firstSeen=true;counter+=1}}catch(err){_iterator31.e(err)}finally{_iterator31.f()}if(firstSeen)result+="\n".concat(initialIndention);result+="}";return result};/**
|
|
299
|
-
* Sort given objects keys.
|
|
300
|
-
* @param object - Object which keys should be sorted.
|
|
301
|
-
* @returns Sorted list of given keys.
|
|
302
|
-
*/var sort=function sort(object){var keys=[];if(Array.isArray(object))for(var index=0;index<object.length;index++)keys.push(index);else if(_typeof(object)==="object")if(isMap(object)){var _iterator32=_createForOfIteratorHelper(object),_step32;try{for(_iterator32.s();!(_step32=_iterator32.n()).done;){var keyValuePair=_step32.value;keys.push(keyValuePair[0])}}catch(err){_iterator32.e(err)}finally{_iterator32.f()}}else if(object!==null)for(var _i28=0,_Object$keys=Object.keys(object);_i28<_Object$keys.length;_i28++){var key=_Object$keys[_i28];keys.push(key)}return keys.sort()};/**
|
|
303
|
-
* Removes a proxy from given data structure recursively.
|
|
304
|
-
* @param object - Object to proxy.
|
|
305
|
-
* @param seenObjects - Tracks all already processed objects to avoid
|
|
306
|
-
* endless loops (usually only needed for internal purpose).
|
|
307
|
-
* @returns Returns given object unwrapped from a dynamic proxy.
|
|
308
|
-
*/var _unwrapProxy=function unwrapProxy(object,seenObjects){if(seenObjects===void 0){seenObjects=new Set}if(isObject(object)){if(seenObjects.has(object))return object;try{if(isFunction(object.__revoke__)){if(isProxy(object))object=object.__target__;object.__revoke__()}}catch(_unused){return object}finally{seenObjects.add(object)}if(Array.isArray(object)){var index=0;var _iterator33=_createForOfIteratorHelper(object),_step33;try{for(_iterator33.s();!(_step33=_iterator33.n()).done;){var value=_step33.value;object[index]=_unwrapProxy(value,seenObjects);index+=1}}catch(err){_iterator33.e(err)}finally{_iterator33.f()}}else if(isMap(object)){var _iterator34=_createForOfIteratorHelper(object),_step34;try{for(_iterator34.s();!(_step34=_iterator34.n()).done;){var _step34$value=_slicedToArray(_step34.value,2),key=_step34$value[0],_value17=_step34$value[1];object.set(key,_unwrapProxy(_value17,seenObjects))}}catch(err){_iterator34.e(err)}finally{_iterator34.f()}}else if(isSet(object)){var cache=[];var _iterator35=_createForOfIteratorHelper(object),_step35;try{for(_iterator35.s();!(_step35=_iterator35.n()).done;){var _value19=_step35.value;object.delete(_value19);cache.push(_unwrapProxy(_value19,seenObjects))}}catch(err){_iterator35.e(err)}finally{_iterator35.f()}for(var _i29=0,_cache4=cache;_i29<_cache4.length;_i29++){var _value18=_cache4[_i29];object.add(_value18)}}else for(var _i30=0,_Object$entries16=Object.entries(object);_i30<_Object$entries16.length;_i30++){var _Object$entries16$_i=_slicedToArray(_Object$entries16[_i30],2),_key11=_Object$entries16$_i[0],_value20=_Object$entries16$_i[1];object[_key11]=_unwrapProxy(_value20,seenObjects)}}return object};
|
|
309
|
-
|
|
310
|
-
/***/ }),
|
|
311
|
-
/* 4 */
|
|
312
|
-
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
313
|
-
|
|
314
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
315
|
-
/* harmony export */ isArrayLike: function() { return /* binding */ isArrayLike; },
|
|
316
|
-
/* harmony export */ isPlainObject: function() { return /* binding */ isPlainObject; }
|
|
317
|
-
/* harmony export */ });
|
|
318
|
-
/* unused harmony exports isNumeric, isWindow, isAnyMatching, isObject, isSet, isMap, isProxy, isFunction */
|
|
319
|
-
/* unused harmony import specifier */ var determineType;
|
|
320
|
-
/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);
|
|
321
|
-
/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);
|
|
322
|
-
/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1);
|
|
323
|
-
/* harmony import */ var _object__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);
|
|
324
|
-
// #!/usr/bin/env babel-node
|
|
325
|
-
// -*- coding: utf-8 -*-
|
|
326
|
-
/** @module indicators *//* !
|
|
327
|
-
region header
|
|
328
|
-
[Project page](https://torben.website/clientnode)
|
|
329
|
-
|
|
330
|
-
Copyright Torben Sickert (info["~at~"]torben.website) 16.12.2012
|
|
19
|
+
*/
|
|
20
|
+
import "core-js/modules/es.array.includes.js";
|
|
21
|
+
import "core-js/modules/es.array.push.js";
|
|
22
|
+
import { isArrayLike, isPlainObject } from "./indicators.js";
|
|
331
23
|
|
|
332
|
-
|
|
333
|
-
-------
|
|
334
|
-
|
|
335
|
-
This library written by Torben Sickert stands under a creative commons
|
|
336
|
-
naming 3.0 unported license.
|
|
337
|
-
See https://creativecommons.org/licenses/by/3.0/deed.de
|
|
338
|
-
endregion
|
|
339
|
-
*/function _createForOfIteratorHelper(r,e){var t="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(!t){if(Array.isArray(r)||(t=_unsupportedIterableToArray(r))||e&&r&&"number"==typeof r.length){t&&(r=t);var _n=0,F=function F(){};return{s:F,n:function n(){return _n>=r.length?{done:!0}:{done:!1,value:r[_n++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function s(){t=t.call(r)},n:function n(){var r=t.next();return a=r.done,r},e:function e(r){u=!0,o=r},f:function f(){try{a||null==t.return||t.return()}finally{if(u)throw o}}}}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}/**
|
|
340
|
-
* Determines whether its argument represents a JavaScript number.
|
|
341
|
-
* @param value - Value to analyze.
|
|
342
|
-
* @returns A boolean value indicating whether given object is numeric
|
|
343
|
-
* like.
|
|
344
|
-
*/var isNumeric=function isNumeric(value){var type=determineType(value);/*
|
|
345
|
-
NOTE: "parseFloat" "NaNs" numeric-cast false positives ("") but
|
|
346
|
-
misinterprets leading-number strings, particularly hex literals
|
|
347
|
-
("0x...") subtraction forces infinities to NaN.
|
|
348
|
-
*/return["number","string"].includes(type)&&!isNaN(value-parseFloat(value))};/**
|
|
349
|
-
* Determine whether the argument is a window.
|
|
350
|
-
* @param value - Value to check for.
|
|
351
|
-
* @returns Boolean value indicating the result.
|
|
352
|
-
*/var isWindow=function isWindow(value){return![null,undefined].includes(value)&&_typeof(value)==="object"&&value===(value===null||value===void 0?void 0:value.window)};/**
|
|
353
|
-
* Checks if given object is similar to an array and can be handled like an
|
|
354
|
-
* array.
|
|
355
|
-
* @param object - Object to check behavior for.
|
|
356
|
-
* @returns A boolean value indicating whether given object is array like.
|
|
357
|
-
*/var isArrayLike=function isArrayLike(object){var length;try{length=Boolean(object)&&object.length}catch(_unused){return false}var type=(0,_object__WEBPACK_IMPORTED_MODULE_2__.determineType)(object);if(type==="function"||isWindow(object))return false;if(type==="array"||length===0)return true;if(typeof length==="number"&&length>0)try{var _dump=object[length-1];return true}catch(_unused2){// Continue regardless of an error.
|
|
358
|
-
}return false};/**
|
|
359
|
-
* Checks whether one of the given pattern matches given string.
|
|
360
|
-
* @param target - Target to check in pattern for.
|
|
361
|
-
* @param pattern - List of pattern to check for.
|
|
362
|
-
* @returns Value "true" if given object is matches by at leas one of the
|
|
363
|
-
* given pattern and "false" otherwise.
|
|
364
|
-
*/var isAnyMatching=function isAnyMatching(target,pattern){var _iterator=_createForOfIteratorHelper(pattern),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var currentPattern=_step.value;if(typeof currentPattern==="string"){if(currentPattern===target)return true}else if(currentPattern.test(target))return true}}catch(err){_iterator.e(err)}finally{_iterator.f()}return false};/**
|
|
365
|
-
* Checks whether given object is a native object but not null.
|
|
366
|
-
* @param value - Value to check.
|
|
367
|
-
* @returns Value "true" if given object is a plain javaScript object and
|
|
368
|
-
* "false" otherwise.
|
|
369
|
-
*/var isObject=function isObject(value){return value!==null&&_typeof(value)==="object"};/**
|
|
370
|
-
* Checks whether given object is a plain native object.
|
|
371
|
-
* @param value - Value to check.
|
|
372
|
-
* @returns Value "true" if given object is a plain javaScript object and
|
|
373
|
-
* "false" otherwise.
|
|
374
|
-
*/var isPlainObject=function isPlainObject(value){return isObject(value)&&_constants__WEBPACK_IMPORTED_MODULE_1__.PLAIN_OBJECT_PROTOTYPES.includes(Object.getPrototypeOf(value))};/**
|
|
375
|
-
* Checks whether given object is a set.
|
|
376
|
-
* @param value - Value to check.
|
|
377
|
-
* @returns Value "true" if given object is a set and "false" otherwise.
|
|
378
|
-
*/var isSet=function isSet(value){return determineType(value)==="set"};/**
|
|
379
|
-
* Checks whether given object is a map.
|
|
380
|
-
* @param value - Value to check.
|
|
381
|
-
* @returns Value "true" if given object is a map and "false" otherwise.
|
|
382
|
-
*/var isMap=function isMap(value){return determineType(value)==="map"};/**
|
|
383
|
-
* Checks whether given object is a proxy.
|
|
384
|
-
* @param value - Value to check.
|
|
385
|
-
* @returns Value "true" if given object is a proxy and "false" otherwise.
|
|
386
|
-
*/var isProxy=function isProxy(value){return Boolean(value.__target__)};/**
|
|
387
|
-
* Checks whether given object is a function.
|
|
388
|
-
* @param value - Value to check.
|
|
389
|
-
* @returns Value "true" if given object is a function and "false"
|
|
390
|
-
* otherwise.
|
|
391
|
-
*/var isFunction=function isFunction(value){return Boolean(value)&&["[object AsyncFunction]","[object Function]"].includes({}.toString.call(value))};
|
|
392
|
-
|
|
393
|
-
/***/ }),
|
|
394
|
-
/* 5 */,
|
|
395
|
-
/* 6 */,
|
|
396
|
-
/* 7 */,
|
|
397
|
-
/* 8 */
|
|
398
|
-
/***/ (function(module) {
|
|
399
|
-
|
|
400
|
-
module.exports = __WEBPACK_EXTERNAL_MODULE__8__;
|
|
401
|
-
|
|
402
|
-
/***/ })
|
|
403
|
-
/******/ ]);
|
|
404
|
-
/************************************************************************/
|
|
405
|
-
/******/ // The module cache
|
|
406
|
-
/******/ var __webpack_module_cache__ = {};
|
|
407
|
-
/******/
|
|
408
|
-
/******/ // The require function
|
|
409
|
-
/******/ function __webpack_require__(moduleId) {
|
|
410
|
-
/******/ // Check if module is in cache
|
|
411
|
-
/******/ var cachedModule = __webpack_module_cache__[moduleId];
|
|
412
|
-
/******/ if (cachedModule !== undefined) {
|
|
413
|
-
/******/ return cachedModule.exports;
|
|
414
|
-
/******/ }
|
|
415
|
-
/******/ // Create a new module (and put it into the cache)
|
|
416
|
-
/******/ var module = __webpack_module_cache__[moduleId] = {
|
|
417
|
-
/******/ // no module.id needed
|
|
418
|
-
/******/ // no module.loaded needed
|
|
419
|
-
/******/ exports: {}
|
|
420
|
-
/******/ };
|
|
421
|
-
/******/
|
|
422
|
-
/******/ // Execute the module function
|
|
423
|
-
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
424
|
-
/******/
|
|
425
|
-
/******/ // Return the exports of the module
|
|
426
|
-
/******/ return module.exports;
|
|
427
|
-
/******/ }
|
|
428
|
-
/******/
|
|
429
|
-
/************************************************************************/
|
|
430
|
-
/******/ /* webpack/runtime/compat get default export */
|
|
431
|
-
/******/ !function() {
|
|
432
|
-
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
|
433
|
-
/******/ __webpack_require__.n = function(module) {
|
|
434
|
-
/******/ var getter = module && module.__esModule ?
|
|
435
|
-
/******/ function() { return module['default']; } :
|
|
436
|
-
/******/ function() { return module; };
|
|
437
|
-
/******/ __webpack_require__.d(getter, { a: getter });
|
|
438
|
-
/******/ return getter;
|
|
439
|
-
/******/ };
|
|
440
|
-
/******/ }();
|
|
441
|
-
/******/
|
|
442
|
-
/******/ /* webpack/runtime/define property getters */
|
|
443
|
-
/******/ !function() {
|
|
444
|
-
/******/ // define getter/value functions for harmony exports
|
|
445
|
-
/******/ __webpack_require__.d = function(exports, definition) {
|
|
446
|
-
/******/ if(Array.isArray(definition)) {
|
|
447
|
-
/******/ var i = 0;
|
|
448
|
-
/******/ while(i < definition.length) {
|
|
449
|
-
/******/ var key = definition[i++];
|
|
450
|
-
/******/ var binding = definition[i++];
|
|
451
|
-
/******/ if(!__webpack_require__.o(exports, key)) {
|
|
452
|
-
/******/ if(binding === 0) {
|
|
453
|
-
/******/ Object.defineProperty(exports, key, { enumerable: true, value: definition[i++] });
|
|
454
|
-
/******/ } else {
|
|
455
|
-
/******/ Object.defineProperty(exports, key, { enumerable: true, get: binding });
|
|
456
|
-
/******/ }
|
|
457
|
-
/******/ } else if(binding === 0) { i++; }
|
|
458
|
-
/******/ }
|
|
459
|
-
/******/ } else {
|
|
460
|
-
/******/ for(var key in definition) {
|
|
461
|
-
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
|
462
|
-
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
|
463
|
-
/******/ }
|
|
464
|
-
/******/ }
|
|
465
|
-
/******/ }
|
|
466
|
-
/******/ };
|
|
467
|
-
/******/ }();
|
|
468
|
-
/******/
|
|
469
|
-
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
|
470
|
-
/******/ !function() {
|
|
471
|
-
/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
|
|
472
|
-
/******/ }();
|
|
473
|
-
/******/
|
|
474
|
-
/******/ /* webpack/runtime/make namespace object */
|
|
475
|
-
/******/ !function() {
|
|
476
|
-
/******/ // define __esModule on exports
|
|
477
|
-
/******/ __webpack_require__.r = function(exports) {
|
|
478
|
-
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
|
479
|
-
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
480
|
-
/******/ }
|
|
481
|
-
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
|
482
|
-
/******/ };
|
|
483
|
-
/******/ }();
|
|
484
|
-
/******/
|
|
485
|
-
/************************************************************************/
|
|
486
|
-
var __webpack_exports__ = {};
|
|
487
|
-
__webpack_require__.r(__webpack_exports__);
|
|
488
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
489
|
-
/* harmony export */ aggregatePropertyIfEqual: function() { return /* binding */ aggregatePropertyIfEqual; },
|
|
490
|
-
/* harmony export */ deleteEmptyItems: function() { return /* binding */ deleteEmptyItems; },
|
|
491
|
-
/* harmony export */ extract: function() { return /* binding */ extract; },
|
|
492
|
-
/* harmony export */ extractIfMatches: function() { return /* binding */ extractIfMatches; },
|
|
493
|
-
/* harmony export */ extractIfPropertyExists: function() { return /* binding */ extractIfPropertyExists; },
|
|
494
|
-
/* harmony export */ extractIfPropertyMatches: function() { return /* binding */ extractIfPropertyMatches; },
|
|
495
|
-
/* harmony export */ intersect: function() { return /* binding */ intersect; },
|
|
496
|
-
/* harmony export */ makeArray: function() { return /* binding */ makeArray; },
|
|
497
|
-
/* harmony export */ makeRange: function() { return /* binding */ makeRange; },
|
|
498
|
-
/* harmony export */ merge: function() { return /* binding */ merge; },
|
|
499
|
-
/* harmony export */ paginate: function() { return /* binding */ paginate; },
|
|
500
|
-
/* harmony export */ permute: function() { return /* binding */ _permute2; },
|
|
501
|
-
/* harmony export */ permuteLength: function() { return /* binding */ permuteLength; },
|
|
502
|
-
/* harmony export */ removeArrayItem: function() { return /* binding */ removeArrayItem; },
|
|
503
|
-
/* harmony export */ sortTopological: function() { return /* binding */ sortTopological; },
|
|
504
|
-
/* harmony export */ sumUpProperty: function() { return /* binding */ sumUpProperty; },
|
|
505
|
-
/* harmony export */ unique: function() { return /* binding */ unique; }
|
|
506
|
-
/* harmony export */ });
|
|
507
|
-
/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);
|
|
508
|
-
/* harmony import */ var core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_array_includes_js__WEBPACK_IMPORTED_MODULE_0__);
|
|
509
|
-
/* harmony import */ var _indicators__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4);
|
|
510
|
-
// #!/usr/bin/env babel-node
|
|
511
|
-
// -*- coding: utf-8 -*-
|
|
512
|
-
/** @module array *//* !
|
|
513
|
-
region header
|
|
514
|
-
[Project page](https://torben.website/clientnode)
|
|
515
|
-
|
|
516
|
-
Copyright Torben Sickert (info["~at~"]torben.website) 16.12.2012
|
|
517
|
-
|
|
518
|
-
License
|
|
519
|
-
-------
|
|
520
|
-
|
|
521
|
-
This library written by Torben Sickert stands under a creative commons
|
|
522
|
-
naming 3.0 unported license.
|
|
523
|
-
See https://creativecommons.org/licenses/by/3.0/deed.de
|
|
524
|
-
endregion
|
|
525
|
-
*/function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}function _toConsumableArray(r){return _arrayWithoutHoles(r)||_iterableToArray(r)||_unsupportedIterableToArray(r)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArray(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function _arrayWithoutHoles(r){if(Array.isArray(r))return _arrayLikeToArray(r)}function _createForOfIteratorHelper(r,e){var t="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(!t){if(Array.isArray(r)||(t=_unsupportedIterableToArray(r))||e&&r&&"number"==typeof r.length){t&&(r=t);var _n=0,F=function F(){};return{s:F,n:function n(){return _n>=r.length?{done:!0}:{done:!1,value:r[_n++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function s(){t=t.call(r)},n:function n(){var r=t.next();return a=r.done,r},e:function e(r){u=!0,o=r},f:function f(){try{a||null==t.return||t.return()}finally{if(u)throw o}}}}function _slicedToArray(r,e){return _arrayWithHoles(r)||_iterableToArrayLimit(r,e)||_unsupportedIterableToArray(r,e)||_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(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function _iterableToArrayLimit(r,l){var t=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=t){var e,n,i,u,a=[],f=!0,o=!1;try{if(i=(t=t.call(r)).next,0===l){if(Object(t)!==t)return;f=!1}else for(;!(f=(e=i.call(t)).done)&&(a.push(e.value),a.length!==l);f=!0);}catch(r){o=!0,n=r}finally{try{if(!f&&null!=t.return&&(u=t.return(),Object(u)!==u))return}finally{if(o)throw n}}return a}}function _arrayWithHoles(r){if(Array.isArray(r))return r}/**
|
|
24
|
+
/**
|
|
526
25
|
* Summarizes given property of given item list.
|
|
527
26
|
* @param data - Array of objects with given property name.
|
|
528
27
|
* @param propertyName - Property name to summarize.
|
|
529
28
|
* @param defaultValue - Value to return if property values doesn't match.
|
|
530
29
|
* @returns Aggregated value.
|
|
531
|
-
*/
|
|
30
|
+
*/
|
|
31
|
+
export const aggregatePropertyIfEqual = (data, propertyName, defaultValue = '') => {
|
|
32
|
+
let result = defaultValue;
|
|
33
|
+
if (Array.isArray(data) && data.length && Object.prototype.hasOwnProperty.call(data[0], propertyName)) {
|
|
34
|
+
result = data[0][propertyName];
|
|
35
|
+
for (const item of makeArray(data)) if (item[propertyName] !== result) return defaultValue;
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
532
40
|
* Deletes every item witch has only empty attributes for given property names.
|
|
533
41
|
* If given property names are empty each attribute will be considered. The
|
|
534
42
|
* empty string, "null" and "undefined" will be interpreted as empty.
|
|
535
43
|
* @param data - Data to filter.
|
|
536
44
|
* @param propertyNames - Properties to consider.
|
|
537
45
|
* @returns Given data without empty items.
|
|
538
|
-
*/
|
|
46
|
+
*/
|
|
47
|
+
export const deleteEmptyItems = (data, propertyNames = []) => {
|
|
48
|
+
const result = [];
|
|
49
|
+
for (const item of makeArray(data)) {
|
|
50
|
+
let empty = true;
|
|
51
|
+
for (const [propertyName, value] of Object.entries(item)) if (!['', null, undefined].includes(value) && (!propertyNames.length || makeArray(propertyNames).includes(propertyName))) {
|
|
52
|
+
empty = false;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
if (!empty) result.push(item);
|
|
56
|
+
}
|
|
57
|
+
return result;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
539
60
|
* Extracts all properties from all items which occur in given property names.
|
|
540
61
|
* @param data - Data where each item should be sliced.
|
|
541
62
|
* @param propertyNames - Property names to extract.
|
|
542
63
|
* @returns Data with sliced items.
|
|
543
|
-
*/
|
|
64
|
+
*/
|
|
65
|
+
export const extract = (data, propertyNames) => {
|
|
66
|
+
const result = [];
|
|
67
|
+
for (const item of makeArray(data)) {
|
|
68
|
+
const newItem = {};
|
|
69
|
+
for (const propertyName of makeArray(propertyNames)) if (Object.prototype.hasOwnProperty.call(item, propertyName)) newItem[propertyName] = item[propertyName];
|
|
70
|
+
result.push(newItem);
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
544
75
|
* Extracts all values which matches given regular expression.
|
|
545
76
|
* @param data - Data to filter.
|
|
546
77
|
* @param regularExpression - Pattern to match for.
|
|
547
78
|
* @returns Filtered data.
|
|
548
|
-
*/
|
|
79
|
+
*/
|
|
80
|
+
export const extractIfMatches = (data, regularExpression) => {
|
|
81
|
+
if (!regularExpression) return makeArray(data);
|
|
82
|
+
const result = [];
|
|
83
|
+
for (const value of makeArray(data)) if ((typeof regularExpression === 'string' ? new RegExp(regularExpression) : regularExpression).test(value)) result.push(value);
|
|
84
|
+
return result;
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
549
87
|
* Filters given data if given property is set or not.
|
|
550
88
|
* @param data - Data to filter.
|
|
551
89
|
* @param propertyName - Property name to check for existence.
|
|
552
90
|
* @returns Given data without the items which doesn't have specified property.
|
|
553
|
-
*/
|
|
91
|
+
*/
|
|
92
|
+
export const extractIfPropertyExists = (data, propertyName) => {
|
|
93
|
+
if (data && propertyName) {
|
|
94
|
+
const result = [];
|
|
95
|
+
for (const item of makeArray(data)) {
|
|
96
|
+
let exists = false;
|
|
97
|
+
for (const [key, value] of Object.entries(item)) if (key === propertyName && ![null, undefined].includes(value)) {
|
|
98
|
+
exists = true;
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
if (exists) result.push(item);
|
|
102
|
+
}
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
return data;
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
554
108
|
* Extract given data where specified property value matches given patterns.
|
|
555
109
|
* @param data - Data to filter.
|
|
556
110
|
* @param propertyPattern - Mapping of property names to pattern.
|
|
557
111
|
* @returns Filtered data.
|
|
558
|
-
*/
|
|
112
|
+
*/
|
|
113
|
+
export const extractIfPropertyMatches = (data, propertyPattern) => {
|
|
114
|
+
if (data) {
|
|
115
|
+
const result = [];
|
|
116
|
+
for (const item of makeArray(data)) {
|
|
117
|
+
let matches = true;
|
|
118
|
+
for (const propertyName in propertyPattern) if (!(propertyPattern[propertyName] && (typeof propertyPattern[propertyName] === 'string' ? new RegExp(propertyPattern[propertyName]) : propertyPattern[propertyName]).test(item[propertyName]))) {
|
|
119
|
+
matches = false;
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
if (matches) result.push(item);
|
|
123
|
+
}
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
return data;
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
559
129
|
* Determines all objects which exists in "first" and in "second".
|
|
560
130
|
* Object key which will be compared are given by "keys". If an empty array is
|
|
561
131
|
* given each key will be compared. If an object is given corresponding initial
|
|
@@ -567,11 +137,55 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
567
137
|
* "undefined" should be interpreted as equal (takes only effect if given keys
|
|
568
138
|
* aren't empty).
|
|
569
139
|
* @returns Data which does exit in given initial data.
|
|
570
|
-
*/
|
|
140
|
+
*/
|
|
141
|
+
export const intersect = (first, second, keys = [], strict = true) => {
|
|
142
|
+
const containingData = [];
|
|
143
|
+
second = makeArray(second);
|
|
144
|
+
const intersectItem = (firstItem, secondItem, firstKey, secondKey, keysAreAnArray, iterateGivenKeys) => {
|
|
145
|
+
if (iterateGivenKeys) {
|
|
146
|
+
if (keysAreAnArray) firstKey = secondKey;
|
|
147
|
+
} else secondKey = firstKey;
|
|
148
|
+
if (secondItem[secondKey] !== firstItem[firstKey] && (strict || !([null, undefined].includes(secondItem[secondKey]) && [null, undefined].includes(firstItem[firstKey])))) return false;
|
|
149
|
+
};
|
|
150
|
+
for (const firstItem of makeArray(first)) if (isPlainObject(firstItem)) for (const secondItem of second) {
|
|
151
|
+
let exists = true;
|
|
152
|
+
let iterateGivenKeys;
|
|
153
|
+
const keysAreAnArray = Array.isArray(keys);
|
|
154
|
+
if (isPlainObject(keys) || keysAreAnArray && keys.length) iterateGivenKeys = true;else {
|
|
155
|
+
iterateGivenKeys = false;
|
|
156
|
+
keys = firstItem;
|
|
157
|
+
}
|
|
158
|
+
if (Array.isArray(keys)) {
|
|
159
|
+
let index = 0;
|
|
160
|
+
for (const key of keys) {
|
|
161
|
+
if (intersectItem(firstItem, secondItem, index, key, keysAreAnArray, iterateGivenKeys) === false) {
|
|
162
|
+
exists = false;
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
index += 1;
|
|
166
|
+
}
|
|
167
|
+
} else for (const [key, value] of Object.entries(keys)) if (intersectItem(firstItem, secondItem, key, value, keysAreAnArray, iterateGivenKeys) === false) {
|
|
168
|
+
exists = false;
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
if (exists) {
|
|
172
|
+
containingData.push(firstItem);
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
} else if (second.includes(firstItem)) containingData.push(firstItem);
|
|
176
|
+
return containingData;
|
|
177
|
+
};
|
|
178
|
+
/**
|
|
571
179
|
* Converts given object into an array.
|
|
572
180
|
* @param object - Target to convert.
|
|
573
181
|
* @returns Generated array.
|
|
574
|
-
*/
|
|
182
|
+
*/
|
|
183
|
+
export const makeArray = object => {
|
|
184
|
+
const result = [];
|
|
185
|
+
if (![null, undefined].includes(object)) if (isArrayLike(Object(object))) merge(result, typeof object === 'string' ? [object] : object);else result.push(object);
|
|
186
|
+
return result;
|
|
187
|
+
};
|
|
188
|
+
/**
|
|
575
189
|
* Creates a list of items within given range.
|
|
576
190
|
* @param range - Array of lower and upper bounds. If only one value is given
|
|
577
191
|
* lower bound will be assumed to be zero. Both integers have to be positive
|
|
@@ -580,12 +194,38 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
580
194
|
* @param step - Space between two consecutive values.
|
|
581
195
|
* @param ignoreLastStep - Removes last step.
|
|
582
196
|
* @returns Produced array of integers.
|
|
583
|
-
*/
|
|
197
|
+
*/
|
|
198
|
+
export const makeRange = (range, step = 1, ignoreLastStep = false) => {
|
|
199
|
+
range = [].concat(range);
|
|
200
|
+
let index;
|
|
201
|
+
let higherBound;
|
|
202
|
+
if (range.length === 1) {
|
|
203
|
+
index = 0;
|
|
204
|
+
higherBound = parseInt(String(range[0]), 10);
|
|
205
|
+
} else if (range.length === 2) {
|
|
206
|
+
index = parseInt(String(range[0]), 10);
|
|
207
|
+
higherBound = parseInt(String(range[1]), 10);
|
|
208
|
+
} else return range;
|
|
209
|
+
if (higherBound < index) return [];
|
|
210
|
+
const result = [index];
|
|
211
|
+
while (index <= higherBound - step) {
|
|
212
|
+
index += step;
|
|
213
|
+
if (!ignoreLastStep || index <= higherBound - step) result.push(index);
|
|
214
|
+
}
|
|
215
|
+
return result;
|
|
216
|
+
};
|
|
217
|
+
/**
|
|
584
218
|
* Merge the contents of two arrays together into the first array.
|
|
585
219
|
* @param target - Target array.
|
|
586
220
|
* @param source - Source array.
|
|
587
221
|
* @returns Target array with merged given source one.
|
|
588
|
-
*/
|
|
222
|
+
*/
|
|
223
|
+
export const merge = (target, source) => {
|
|
224
|
+
if (!Array.isArray(source)) source = Array.prototype.slice.call(source);
|
|
225
|
+
for (const value of source) target.push(value);
|
|
226
|
+
return target;
|
|
227
|
+
};
|
|
228
|
+
/**
|
|
589
229
|
* Generates a list if pagination symbols to render a pagination from.
|
|
590
230
|
* @param options - Configure bounds and current page of pagination to
|
|
591
231
|
* determine.
|
|
@@ -606,78 +246,207 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
606
246
|
* page symbol.
|
|
607
247
|
* @param options.total - Number of all items to paginate.
|
|
608
248
|
* @returns A list of pagination symbols.
|
|
609
|
-
*/
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
boundaryCount
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
249
|
+
*/
|
|
250
|
+
export const paginate = (options = {}) => {
|
|
251
|
+
const {
|
|
252
|
+
boundaryCount = 1,
|
|
253
|
+
disabled = false,
|
|
254
|
+
hideNextButton = false,
|
|
255
|
+
hidePrevButton = false,
|
|
256
|
+
page = 1,
|
|
257
|
+
pageSize = 5,
|
|
258
|
+
showFirstButton = false,
|
|
259
|
+
showLastButton = false,
|
|
260
|
+
siblingCount = 4,
|
|
261
|
+
total = 100
|
|
262
|
+
} = options;
|
|
263
|
+
const numberOfPages = typeof pageSize === 'number' && !isNaN(pageSize) ? Math.ceil(total / pageSize) : total;
|
|
264
|
+
const startPages = makeRange([1, Math.min(boundaryCount, numberOfPages)]);
|
|
265
|
+
const endPages = makeRange([Math.max(numberOfPages - boundaryCount + 1, boundaryCount + 1), numberOfPages]);
|
|
266
|
+
const siblingsStart = Math.max(Math.min(
|
|
267
|
+
// Left boundary for lower pages.
|
|
268
|
+
page - siblingCount,
|
|
269
|
+
// Lower boundary for higher pages.
|
|
270
|
+
numberOfPages - boundaryCount - siblingCount * 2 - 1),
|
|
271
|
+
// If number is greater than number of "startPages".
|
|
272
|
+
boundaryCount + 2);
|
|
273
|
+
const siblingsEnd = Math.min(Math.max(
|
|
274
|
+
// Right bound for higher pages.
|
|
275
|
+
page + siblingCount,
|
|
276
|
+
// Upper boundary for lower pages.
|
|
277
|
+
boundaryCount + siblingCount * 2 + 2),
|
|
278
|
+
// If number is less than number of "endPages".
|
|
279
|
+
endPages.length > 0 ? endPages[0] - 2 : numberOfPages - 1);
|
|
619
280
|
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
281
|
+
/*
|
|
282
|
+
Symbol list of items to render represent as pagination.
|
|
283
|
+
Example result:
|
|
284
|
+
[
|
|
285
|
+
'first', 'previous',
|
|
286
|
+
1,
|
|
287
|
+
'start-ellipsis',
|
|
288
|
+
4, 5, 6,
|
|
289
|
+
'end-ellipsis',
|
|
290
|
+
10,
|
|
291
|
+
'next', 'last'
|
|
292
|
+
]
|
|
293
|
+
*/
|
|
294
|
+
return [...(showFirstButton ? ['first'] : []), ...(hidePrevButton ? [] : ['previous']), ...startPages,
|
|
295
|
+
// Start ellipsis
|
|
296
|
+
...(siblingsStart > boundaryCount + 2 ? ['start-ellipsis'] : boundaryCount + 1 < numberOfPages - boundaryCount ? [boundaryCount + 1] : []),
|
|
297
|
+
// Sibling pages
|
|
298
|
+
...makeRange([siblingsStart, siblingsEnd]),
|
|
299
|
+
// End ellipsis
|
|
300
|
+
...(siblingsEnd < numberOfPages - boundaryCount - 1 ? ['end-ellipsis'] : numberOfPages - boundaryCount > boundaryCount ? [numberOfPages - boundaryCount] : []), ...endPages, ...(hideNextButton ? [] : ['next']), ...(showLastButton ? ['last'] : [])].map(item => typeof item === 'number' ? {
|
|
301
|
+
disabled,
|
|
302
|
+
page: item,
|
|
303
|
+
selected: item === page,
|
|
304
|
+
type: 'page'
|
|
305
|
+
} : {
|
|
306
|
+
disabled: disabled || item.indexOf('ellipsis') === -1 && (item === 'next' || item === 'last' ? page >= numberOfPages : page <= 1),
|
|
307
|
+
selected: false,
|
|
308
|
+
type: item,
|
|
309
|
+
...(item.endsWith('-ellipsis') ? {} : {
|
|
310
|
+
page: {
|
|
311
|
+
first: 1,
|
|
312
|
+
last: numberOfPages
|
|
313
|
+
}[item] ?? item === 'next' ? Math.min(page + 1, numberOfPages) :
|
|
314
|
+
// NOTE: Is "previous" type.
|
|
315
|
+
Math.max(page - 1, 1)
|
|
316
|
+
})
|
|
317
|
+
});
|
|
318
|
+
};
|
|
319
|
+
/**
|
|
631
320
|
* Generates all permutations of given iterable.
|
|
632
321
|
* @param data - Array like object.
|
|
633
322
|
* @returns Array of permuted arrays.
|
|
634
|
-
*/
|
|
323
|
+
*/
|
|
324
|
+
export const permute = data => {
|
|
325
|
+
const result = [];
|
|
326
|
+
const permute = (currentData, dataToMixin = []) => {
|
|
327
|
+
if (currentData.length === 0) result.push(dataToMixin);else for (let index = 0; index < currentData.length; index++) {
|
|
328
|
+
const copy = currentData.slice();
|
|
329
|
+
permute(copy, dataToMixin.concat(copy.splice(index, 1)));
|
|
330
|
+
}
|
|
331
|
+
};
|
|
332
|
+
permute(data);
|
|
333
|
+
return result;
|
|
334
|
+
};
|
|
335
|
+
/**
|
|
635
336
|
* Generates all lengths permutations of given iterable.
|
|
636
337
|
* @param data - Array like object.
|
|
637
338
|
* @param minimalSubsetLength - Defines how long the minimal subset length
|
|
638
339
|
* should be.
|
|
639
340
|
* @returns Array of permuted arrays.
|
|
640
|
-
*/
|
|
341
|
+
*/
|
|
342
|
+
export const permuteLength = (data, minimalSubsetLength = 1) => {
|
|
343
|
+
const result = [];
|
|
344
|
+
if (data.length === 0) return result;
|
|
345
|
+
const generate = (index, source, rest) => {
|
|
346
|
+
if (index === 0) {
|
|
347
|
+
if (rest.length > 0) result[result.length] = rest;
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
for (let sourceIndex = 0; sourceIndex < source.length; sourceIndex++) generate(index - 1, source.slice(sourceIndex + 1), rest.concat([source[sourceIndex]]));
|
|
351
|
+
};
|
|
352
|
+
for (let index = minimalSubsetLength; index < data.length; index++) generate(index, data, []);
|
|
353
|
+
result.push(data);
|
|
354
|
+
return result;
|
|
355
|
+
};
|
|
356
|
+
/**
|
|
641
357
|
* Sums up given property of given item list.
|
|
642
358
|
* @param data - The objects with specified property to sum up.
|
|
643
359
|
* @param propertyName - Property name to sum up its value.
|
|
644
360
|
* @returns The aggregated value.
|
|
645
|
-
*/
|
|
361
|
+
*/
|
|
362
|
+
export const sumUpProperty = (data, propertyName) => {
|
|
363
|
+
let result = 0;
|
|
364
|
+
if (Array.isArray(data) && data.length) for (const item of data) if (Object.prototype.hasOwnProperty.call(item, propertyName)) result += parseFloat(item[propertyName] || 0);
|
|
365
|
+
return result;
|
|
366
|
+
};
|
|
367
|
+
/**
|
|
646
368
|
* Removes given target on given list.
|
|
647
369
|
* @param list - Array to splice.
|
|
648
370
|
* @param target - Target to remove from given list.
|
|
649
371
|
* @param strict - Indicates whether to fire an exception if given target
|
|
650
372
|
* doesn't exist given list.
|
|
651
373
|
* @returns Item with the appended target.
|
|
652
|
-
*/
|
|
374
|
+
*/
|
|
375
|
+
export const removeArrayItem = (list, target, strict = false) => {
|
|
376
|
+
const index = list.indexOf(target);
|
|
377
|
+
if (index === -1) {
|
|
378
|
+
if (strict) throw new Error(`Given target doesn't exists in given list.`);
|
|
379
|
+
} else list.splice(index, 1);
|
|
380
|
+
return list;
|
|
381
|
+
};
|
|
382
|
+
/**
|
|
653
383
|
* Sorts given object of dependencies in a topological order.
|
|
654
384
|
* @param items - Items to sort.
|
|
655
385
|
* @returns Sorted array of given items respecting their dependencies.
|
|
656
|
-
*/
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
386
|
+
*/
|
|
387
|
+
export const sortTopological = items => {
|
|
388
|
+
const edges = [];
|
|
389
|
+
for (const [name, value] of Object.entries(items)) {
|
|
390
|
+
items[name] = [].concat(value);
|
|
391
|
+
if (value.length > 0) for (const dependencyName of makeArray(value)) edges.push([name, dependencyName]);else edges.push([name]);
|
|
392
|
+
}
|
|
393
|
+
const nodes = [];
|
|
394
|
+
// Accumulate unique nodes into a large list.
|
|
395
|
+
for (const edge of edges) for (const node of edge) if (!nodes.includes(node)) nodes.push(node);
|
|
396
|
+
const sorted = [];
|
|
397
|
+
// Define a visitor function that recursively traverses dependencies.
|
|
398
|
+
const visit = (node, predecessors) => {
|
|
399
|
+
// Check if a node is dependent of itself.
|
|
400
|
+
if (predecessors.length !== 0 && predecessors.includes(node)) throw new Error(`Cyclic dependency found. "${node}" is dependent of ` + 'itself.\n' + `Dependency chain: "${predecessors.join('" -> "')}" => "` + `${node}".`);
|
|
401
|
+
const index = nodes.indexOf(node);
|
|
402
|
+
// If the node still exists, traverse its dependencies.
|
|
403
|
+
if (index !== -1) {
|
|
404
|
+
let copy;
|
|
405
|
+
// Mark the node to exclude it from future iterations.
|
|
406
|
+
nodes[index] = null;
|
|
407
|
+
/*
|
|
408
|
+
Loop through all edges and follow dependencies of the current
|
|
409
|
+
node
|
|
410
|
+
*/
|
|
411
|
+
for (const edge of edges) if (edge[0] === node) {
|
|
412
|
+
/*
|
|
413
|
+
Lazily create a copy of predecessors with the current
|
|
414
|
+
node concatenated onto it.
|
|
415
|
+
*/
|
|
416
|
+
copy = copy || predecessors.concat([node]);
|
|
417
|
+
// Recursively traverse to node dependencies.
|
|
418
|
+
visit(edge[1], copy);
|
|
419
|
+
}
|
|
420
|
+
sorted.push(node);
|
|
421
|
+
}
|
|
422
|
+
};
|
|
423
|
+
for (let index = 0; index < nodes.length; index++) {
|
|
424
|
+
const node = nodes[index];
|
|
425
|
+
// Ignore nodes that have been excluded.
|
|
426
|
+
if (node) {
|
|
427
|
+
// Mark the node to exclude it from future iterations.
|
|
428
|
+
nodes[index] = null;
|
|
429
|
+
/*
|
|
430
|
+
Loop through all edges and follow dependencies of the current
|
|
431
|
+
node.
|
|
432
|
+
*/
|
|
433
|
+
for (const edge of edges) if (edge[0] === node)
|
|
434
|
+
// Recursively traverse to node dependencies.
|
|
435
|
+
visit(edge[1], [node]);
|
|
436
|
+
sorted.push(node);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
return sorted;
|
|
440
|
+
};
|
|
441
|
+
/**
|
|
675
442
|
* Makes all values in given iterable unique by removing duplicates (The first
|
|
676
443
|
* occurrences will be left).
|
|
677
444
|
* @param data - Array like object.
|
|
678
445
|
* @returns Sliced version of given object.
|
|
679
|
-
*/
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
;
|
|
683
|
-
|
|
446
|
+
*/
|
|
447
|
+
export const unique = data => {
|
|
448
|
+
const result = [];
|
|
449
|
+
for (const value of makeArray(data)) if (!result.includes(value)) result.push(value);
|
|
450
|
+
return result;
|
|
451
|
+
};
|
|
452
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL2FycmF5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vICMhL3Vzci9iaW4vZW52IGJhYmVsLW5vZGVcbi8vIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLVxuLyoqIEBtb2R1bGUgYXJyYXkgKi9cbid1c2Ugc3RyaWN0J1xuLyogIVxuICAgIHJlZ2lvbiBoZWFkZXJcbiAgICBbUHJvamVjdCBwYWdlXShodHRwczovL3RvcmJlbi53ZWJzaXRlL2NsaWVudG5vZGUpXG5cbiAgICBDb3B5cmlnaHQgVG9yYmVuIFNpY2tlcnQgKGluZm9bXCJ+YXR+XCJddG9yYmVuLndlYnNpdGUpIDE2LjEyLjIwMTJcblxuICAgIExpY2Vuc2VcbiAgICAtLS0tLS0tXG5cbiAgICBUaGlzIGxpYnJhcnkgd3JpdHRlbiBieSBUb3JiZW4gU2lja2VydCBzdGFuZHMgdW5kZXIgYSBjcmVhdGl2ZSBjb21tb25zXG4gICAgbmFtaW5nIDMuMCB1bnBvcnRlZCBsaWNlbnNlLlxuICAgIFNlZSBodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wL2RlZWQuZGVcbiAgICBlbmRyZWdpb25cbiovXG5pbXBvcnQgdHlwZSB7TWFwcGluZywgUGFnZSwgUGFnZVR5cGUsIFBhZ2luYXRlT3B0aW9ucywgVmFsdWVPZn0gZnJvbSAnLi90eXBlJ1xuXG5pbXBvcnQge2lzQXJyYXlMaWtlLCBpc1BsYWluT2JqZWN0fSBmcm9tICcuL2luZGljYXRvcnMnXG5cbi8qKlxuICogU3VtbWFyaXplcyBnaXZlbiBwcm9wZXJ0eSBvZiBnaXZlbiBpdGVtIGxpc3QuXG4gKiBAcGFyYW0gZGF0YSAtIEFycmF5IG9mIG9iamVjdHMgd2l0aCBnaXZlbiBwcm9wZXJ0eSBuYW1lLlxuICogQHBhcmFtIHByb3BlcnR5TmFtZSAtIFByb3BlcnR5IG5hbWUgdG8gc3VtbWFyaXplLlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAtIFZhbHVlIHRvIHJldHVybiBpZiBwcm9wZXJ0eSB2YWx1ZXMgZG9lc24ndCBtYXRjaC5cbiAqIEByZXR1cm5zIEFnZ3JlZ2F0ZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCBjb25zdCBhZ2dyZWdhdGVQcm9wZXJ0eUlmRXF1YWwgPSA8VCA9IHVua25vd24+KFxuICAgIGRhdGE6IEFycmF5PE1hcHBpbmc8dW5rbm93bj4+LFxuICAgIHByb3BlcnR5TmFtZTogc3RyaW5nLFxuICAgIGRlZmF1bHRWYWx1ZTogVCA9ICcnIGFzIHVua25vd24gYXMgVFxuKTogVCA9PiB7XG4gICAgbGV0IHJlc3VsdDogVCA9IGRlZmF1bHRWYWx1ZVxuXG4gICAgaWYgKFxuICAgICAgICBBcnJheS5pc0FycmF5KGRhdGEpICYmXG4gICAgICAgIGRhdGEubGVuZ3RoICYmXG4gICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChkYXRhWzBdLCBwcm9wZXJ0eU5hbWUpXG4gICAgKSB7XG4gICAgICAgIHJlc3VsdCA9IGRhdGFbMF1bcHJvcGVydHlOYW1lXSBhcyBUXG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG1ha2VBcnJheTxNYXBwaW5nPHVua25vd24+PihkYXRhKSlcbiAgICAgICAgICAgIGlmIChpdGVtW3Byb3BlcnR5TmFtZV0gIT09IHJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxufVxuLyoqXG4gKiBEZWxldGVzIGV2ZXJ5IGl0ZW0gd2l0Y2ggaGFzIG9ubHkgZW1wdHkgYXR0cmlidXRlcyBmb3IgZ2l2ZW4gcHJvcGVydHkgbmFtZXMuXG4gKiBJZiBnaXZlbiBwcm9wZXJ0eSBuYW1lcyBhcmUgZW1wdHkgZWFjaCBhdHRyaWJ1dGUgd2lsbCBiZSBjb25zaWRlcmVkLiBUaGVcbiAqIGVtcHR5IHN0cmluZywgXCJudWxsXCIgYW5kIFwidW5kZWZpbmVkXCIgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyBlbXB0eS5cbiAqIEBwYXJhbSBkYXRhIC0gRGF0YSB0byBmaWx0ZXIuXG4gKiBAcGFyYW0gcHJvcGVydHlOYW1lcyAtIFByb3BlcnRpZXMgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJucyBHaXZlbiBkYXRhIHdpdGhvdXQgZW1wdHkgaXRlbXMuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWxldGVFbXB0eUl0ZW1zID0gPFxuICAgIFQgZXh0ZW5kcyBNYXBwaW5nPHVua25vd24+ID0gTWFwcGluZzx1bmtub3duPlxuPihkYXRhOiBBcnJheTxUPiwgcHJvcGVydHlOYW1lczogQXJyYXk8c3RyaW5nIHwgc3ltYm9sPiA9IFtdKTogQXJyYXk8VD4gPT4ge1xuICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8VD4gPSBbXVxuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIG1ha2VBcnJheTxUPihkYXRhKSkge1xuICAgICAgICBsZXQgZW1wdHkgPSB0cnVlXG5cbiAgICAgICAgZm9yIChjb25zdCBbcHJvcGVydHlOYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaXRlbSkpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIVsnJywgbnVsbCwgdW5kZWZpbmVkXS5pbmNsdWRlcyh2YWx1ZSBhcyBudWxsKSAmJlxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgIXByb3BlcnR5TmFtZXMubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgICAgIG1ha2VBcnJheShwcm9wZXJ0eU5hbWVzKS5pbmNsdWRlcyhwcm9wZXJ0eU5hbWUpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZW1wdHkgPSBmYWxzZVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFlbXB0eSlcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxufVxuLyoqXG4gKiBFeHRyYWN0cyBhbGwgcHJvcGVydGllcyBmcm9tIGFsbCBpdGVtcyB3aGljaCBvY2N1ciBpbiBnaXZlbiBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBwYXJhbSBkYXRhIC0gRGF0YSB3aGVyZSBlYWNoIGl0ZW0gc2hvdWxkIGJlIHNsaWNlZC5cbiAqIEBwYXJhbSBwcm9wZXJ0eU5hbWVzIC0gUHJvcGVydHkgbmFtZXMgdG8gZXh0cmFjdC5cbiAqIEByZXR1cm5zIERhdGEgd2l0aCBzbGljZWQgaXRlbXMuXG4gKi9cbmV4cG9ydCBjb25zdCBleHRyYWN0ID0gPFQgPSBNYXBwaW5nPHVua25vd24+PihcbiAgICBkYXRhOiB1bmtub3duLCBwcm9wZXJ0eU5hbWVzOiBBcnJheTxzdHJpbmc+XG4pOiBBcnJheTxUPiA9PiB7XG4gICAgY29uc3QgcmVzdWx0OiBBcnJheTxUPiA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbWFrZUFycmF5PE1hcHBpbmc8dW5rbm93bj4+KGRhdGEpKSB7XG4gICAgICAgIGNvbnN0IG5ld0l0ZW06IFQgPSB7fSBhcyBUXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIG1ha2VBcnJheTxzdHJpbmc+KFxuICAgICAgICAgICAgcHJvcGVydHlOYW1lc1xuICAgICAgICApKVxuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpdGVtLCBwcm9wZXJ0eU5hbWUpKVxuICAgICAgICAgICAgICAgIG5ld0l0ZW1bcHJvcGVydHlOYW1lIGFzIGtleW9mIFRdID1cbiAgICAgICAgICAgICAgICAgICAgaXRlbVtwcm9wZXJ0eU5hbWVdIGFzIFZhbHVlT2Y8VD5cblxuICAgICAgICByZXN1bHQucHVzaChuZXdJdGVtKVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbn1cbi8qKlxuICogRXh0cmFjdHMgYWxsIHZhbHVlcyB3aGljaCBtYXRjaGVzIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAqIEBwYXJhbSBkYXRhIC0gRGF0YSB0byBmaWx0ZXIuXG4gKiBAcGFyYW0gcmVndWxhckV4cHJlc3Npb24gLSBQYXR0ZXJuIHRvIG1hdGNoIGZvci5cbiAqIEByZXR1cm5zIEZpbHRlcmVkIGRhdGEuXG4gKi9cbmV4cG9ydCBjb25zdCBleHRyYWN0SWZNYXRjaGVzID0gKFxuICAgIGRhdGE6IHVua25vd24sIHJlZ3VsYXJFeHByZXNzaW9uOiBzdHJpbmcgfCBSZWdFeHBcbik6IEFycmF5PHN0cmluZz4gPT4ge1xuICAgIGlmICghcmVndWxhckV4cHJlc3Npb24pXG4gICAgICAgIHJldHVybiBtYWtlQXJyYXk8c3RyaW5nPihkYXRhKVxuXG4gICAgY29uc3QgcmVzdWx0OiBBcnJheTxzdHJpbmc+ID0gW11cbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG1ha2VBcnJheTxzdHJpbmc+KGRhdGEpKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAoKHR5cGVvZiByZWd1bGFyRXhwcmVzc2lvbiA9PT0gJ3N0cmluZycpID9cbiAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKHJlZ3VsYXJFeHByZXNzaW9uKSA6XG4gICAgICAgICAgICAgICAgcmVndWxhckV4cHJlc3Npb25cbiAgICAgICAgICAgICkudGVzdCh2YWx1ZSlcbiAgICAgICAgKVxuICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpXG5cbiAgICByZXR1cm4gcmVzdWx0XG59XG4vKipcbiAqIEZpbHRlcnMgZ2l2ZW4gZGF0YSBpZiBnaXZlbiBwcm9wZXJ0eSBpcyBzZXQgb3Igbm90LlxuICogQHBhcmFtIGRhdGEgLSBEYXRhIHRvIGZpbHRlci5cbiAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLSBQcm9wZXJ0eSBuYW1lIHRvIGNoZWNrIGZvciBleGlzdGVuY2UuXG4gKiBAcmV0dXJucyBHaXZlbiBkYXRhIHdpdGhvdXQgdGhlIGl0ZW1zIHdoaWNoIGRvZXNuJ3QgaGF2ZSBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBjb25zdCBleHRyYWN0SWZQcm9wZXJ0eUV4aXN0cyA9IDxcbiAgICBUIGV4dGVuZHMgTWFwcGluZzx1bmtub3duPiA9IE1hcHBpbmc8dW5rbm93bj5cbj4oZGF0YTogdW5rbm93biwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBBcnJheTxUPiA9PiB7XG4gICAgaWYgKGRhdGEgJiYgcHJvcGVydHlOYW1lKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8VD4gPSBbXVxuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBtYWtlQXJyYXk8VD4oZGF0YSkpIHtcbiAgICAgICAgICAgIGxldCBleGlzdHMgPSBmYWxzZVxuICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoaXRlbSkpXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IHByb3BlcnR5TmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAhW251bGwsIHVuZGVmaW5lZF0uaW5jbHVkZXModmFsdWUgYXMgbnVsbClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RzID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4aXN0cylcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChpdGVtKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cblxuICAgIHJldHVybiBkYXRhIGFzIEFycmF5PFQ+XG59XG4vKipcbiAqIEV4dHJhY3QgZ2l2ZW4gZGF0YSB3aGVyZSBzcGVjaWZpZWQgcHJvcGVydHkgdmFsdWUgbWF0Y2hlcyBnaXZlbiBwYXR0ZXJucy5cbiAqIEBwYXJhbSBkYXRhIC0gRGF0YSB0byBmaWx0ZXIuXG4gKiBAcGFyYW0gcHJvcGVydHlQYXR0ZXJuIC0gTWFwcGluZyBvZiBwcm9wZXJ0eSBuYW1lcyB0byBwYXR0ZXJuLlxuICogQHJldHVybnMgRmlsdGVyZWQgZGF0YS5cbiAqL1xuZXhwb3J0IGNvbnN0IGV4dHJhY3RJZlByb3BlcnR5TWF0Y2hlcyA9IDxUID0gdW5rbm93bj4oXG4gICAgZGF0YTogdW5rbm93biwgcHJvcGVydHlQYXR0ZXJuOiBNYXBwaW5nPFJlZ0V4cCB8IHN0cmluZz5cbik6IEFycmF5PFQ+ID0+IHtcbiAgICBpZiAoZGF0YSkge1xuICAgICAgICBjb25zdCByZXN1bHQ6IEFycmF5PFQ+ID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbWFrZUFycmF5PFQ+KGRhdGEpKSB7XG4gICAgICAgICAgICBsZXQgbWF0Y2hlcyA9IHRydWVcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIGluIHByb3BlcnR5UGF0dGVybilcbiAgICAgICAgICAgICAgICBpZiAoIShcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlQYXR0ZXJuW3Byb3BlcnR5TmFtZV0gJiZcbiAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBwcm9wZXJ0eVBhdHRlcm5bcHJvcGVydHlOYW1lXSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZ0V4cChwcm9wZXJ0eVBhdHRlcm5bcHJvcGVydHlOYW1lXSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5UGF0dGVybltwcm9wZXJ0eU5hbWVdXG4gICAgICAgICAgICAgICAgICAgICkudGVzdCgoaXRlbSBhcyB1bmtub3duIGFzIE1hcHBpbmcpW3Byb3BlcnR5TmFtZV0pXG4gICAgICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtYXRjaGVzKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGEgYXMgQXJyYXk8VD5cbn1cbi8qKlxuICogRGV0ZXJtaW5lcyBhbGwgb2JqZWN0cyB3aGljaCBleGlzdHMgaW4gXCJmaXJzdFwiIGFuZCBpbiBcInNlY29uZFwiLlxuICogT2JqZWN0IGtleSB3aGljaCB3aWxsIGJlIGNvbXBhcmVkIGFyZSBnaXZlbiBieSBcImtleXNcIi4gSWYgYW4gZW1wdHkgYXJyYXkgaXNcbiAqIGdpdmVuIGVhY2gga2V5IHdpbGwgYmUgY29tcGFyZWQuIElmIGFuIG9iamVjdCBpcyBnaXZlbiBjb3JyZXNwb25kaW5nIGluaXRpYWxcbiAqIGRhdGEga2V5IHdpbGwgYmUgbWFwcGVkIHRvIHJlZmVyZW5jZWQgbmV3IGRhdGEga2V5LlxuICogQHBhcmFtIGZpcnN0IC0gUmVmZXJlbmNlZCBkYXRhIHRvIGNoZWNrIGZvci5cbiAqIEBwYXJhbSBzZWNvbmQgLSBEYXRhIHRvIGNoZWNrIGZvciBleGlzdGVuY2UuXG4gKiBAcGFyYW0ga2V5cyAtIEtleXMgdG8gZGVmaW5lIGVxdWFsaXR5LlxuICogQHBhcmFtIHN0cmljdCAtIFRoZSBzdHJpY3QgcGFyYW1ldGVyIGluZGljYXRlcyB3aGV0aGVyIFwibnVsbFwiIGFuZFxuICogXCJ1bmRlZmluZWRcIiBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgZXF1YWwgKHRha2VzIG9ubHkgZWZmZWN0IGlmIGdpdmVuIGtleXNcbiAqIGFyZW4ndCBlbXB0eSkuXG4gKiBAcmV0dXJucyBEYXRhIHdoaWNoIGRvZXMgZXhpdCBpbiBnaXZlbiBpbml0aWFsIGRhdGEuXG4gKi9cbmV4cG9ydCBjb25zdCBpbnRlcnNlY3QgPSA8VCA9IHVua25vd24+KFxuICAgIGZpcnN0OiB1bmtub3duLFxuICAgIHNlY29uZDogdW5rbm93bixcbiAgICBrZXlzOiBBcnJheTxzdHJpbmc+IHwgTWFwcGluZzxudW1iZXIgfCBzdHJpbmc+ID0gW10sXG4gICAgc3RyaWN0ID0gdHJ1ZVxuKTogQXJyYXk8VD4gPT4ge1xuICAgIGNvbnN0IGNvbnRhaW5pbmdEYXRhOiBBcnJheTxUPiA9IFtdXG5cbiAgICBzZWNvbmQgPSBtYWtlQXJyYXkoc2Vjb25kKVxuXG4gICAgY29uc3QgaW50ZXJzZWN0SXRlbSA9IChcbiAgICAgICAgZmlyc3RJdGVtOiBNYXBwaW5nPHVua25vd24+LFxuICAgICAgICBzZWNvbmRJdGVtOiBNYXBwaW5nPHVua25vd24+LFxuICAgICAgICBmaXJzdEtleTogc3RyaW5nIHwgbnVtYmVyLFxuICAgICAgICBzZWNvbmRLZXk6IHN0cmluZyB8IG51bWJlcixcbiAgICAgICAga2V5c0FyZUFuQXJyYXk6IGJvb2xlYW4sXG4gICAgICAgIGl0ZXJhdGVHaXZlbktleXM6IGJvb2xlYW5cbiAgICApOiBmYWxzZSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICAgIGlmIChpdGVyYXRlR2l2ZW5LZXlzKSB7XG4gICAgICAgICAgICBpZiAoa2V5c0FyZUFuQXJyYXkpXG4gICAgICAgICAgICAgICAgZmlyc3RLZXkgPSBzZWNvbmRLZXlcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICBzZWNvbmRLZXkgPSBmaXJzdEtleVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHNlY29uZEl0ZW1bc2Vjb25kS2V5XSAhPT0gZmlyc3RJdGVtW2ZpcnN0S2V5XSAmJlxuICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgIHN0cmljdCB8fFxuICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgIFtudWxsLCB1bmRlZmluZWRdLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kSXRlbVtzZWNvbmRLZXldIGFzIG51bGxcbiAgICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICBbbnVsbCwgdW5kZWZpbmVkXS5pbmNsdWRlcyhmaXJzdEl0ZW1bZmlyc3RLZXldIGFzIG51bGwpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpcnN0SXRlbSBvZiBtYWtlQXJyYXk8VD4oZmlyc3QpKVxuICAgICAgICBpZiAoaXNQbGFpbk9iamVjdChmaXJzdEl0ZW0pKVxuICAgICAgICAgICAgZm9yIChjb25zdCBzZWNvbmRJdGVtIG9mIChzZWNvbmQgYXMgQXJyYXk8VD4pKSB7XG4gICAgICAgICAgICAgICAgbGV0IGV4aXN0cyA9IHRydWVcbiAgICAgICAgICAgICAgICBsZXQgaXRlcmF0ZUdpdmVuS2V5czogYm9vbGVhblxuICAgICAgICAgICAgICAgIGNvbnN0IGtleXNBcmVBbkFycmF5OiBib29sZWFuID0gQXJyYXkuaXNBcnJheShrZXlzKVxuXG4gICAgICAgICAgICAgICAgaWYgKGlzUGxhaW5PYmplY3Qoa2V5cykgfHwga2V5c0FyZUFuQXJyYXkgJiYga2V5cy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIGl0ZXJhdGVHaXZlbktleXMgPSB0cnVlXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZXJhdGVHaXZlbktleXMgPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICBrZXlzID0gZmlyc3RJdGVtIGFzIE1hcHBpbmc8bnVtYmVyIHwgc3RyaW5nPlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IDBcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyc2VjdEl0ZW0oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZEl0ZW0gYXMgdW5rbm93biBhcyBNYXBwaW5nPHVua25vd24+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzQXJlQW5BcnJheSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRlR2l2ZW5LZXlzXG4gICAgICAgICAgICAgICAgICAgICAgICApID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGtleXMpKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyc2VjdEl0ZW0oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RJdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZEl0ZW0gYXMgdW5rbm93biBhcyBNYXBwaW5nPHVua25vd24+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzQXJlQW5BcnJheSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRlR2l2ZW5LZXlzXG4gICAgICAgICAgICAgICAgICAgICAgICApID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ0RhdGEucHVzaChmaXJzdEl0ZW0pXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoc2Vjb25kIGFzIEFycmF5PFQ+KS5pbmNsdWRlcyhmaXJzdEl0ZW0pKVxuICAgICAgICAgICAgY29udGFpbmluZ0RhdGEucHVzaChmaXJzdEl0ZW0pXG5cbiAgICByZXR1cm4gY29udGFpbmluZ0RhdGFcbn1cbi8qKlxuICogQ29udmVydHMgZ2l2ZW4gb2JqZWN0IGludG8gYW4gYXJyYXkuXG4gKiBAcGFyYW0gb2JqZWN0IC0gVGFyZ2V0IHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBHZW5lcmF0ZWQgYXJyYXkuXG4gKi9cbmV4cG9ydCBjb25zdCBtYWtlQXJyYXkgPSA8VCA9IHVua25vd24+KG9iamVjdDogdW5rbm93bik6IEFycmF5PFQ+ID0+IHtcbiAgICBjb25zdCByZXN1bHQ6IEFycmF5PHVua25vd24+ID0gW11cbiAgICBpZiAoIVtudWxsLCB1bmRlZmluZWRdLmluY2x1ZGVzKG9iamVjdCBhcyBudWxsKSlcbiAgICAgICAgaWYgKGlzQXJyYXlMaWtlKE9iamVjdChvYmplY3QpKSlcbiAgICAgICAgICAgIG1lcmdlKFxuICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICB0eXBlb2Ygb2JqZWN0ID09PSAnc3RyaW5nJyA/IFtvYmplY3RdIDogb2JqZWN0IGFzIEFycmF5PFQ+XG4gICAgICAgICAgICApXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG9iamVjdClcblxuICAgIHJldHVybiByZXN1bHQgYXMgQXJyYXk8VD5cbn1cbi8qKlxuICogQ3JlYXRlcyBhIGxpc3Qgb2YgaXRlbXMgd2l0aGluIGdpdmVuIHJhbmdlLlxuICogQHBhcmFtIHJhbmdlIC0gQXJyYXkgb2YgbG93ZXIgYW5kIHVwcGVyIGJvdW5kcy4gSWYgb25seSBvbmUgdmFsdWUgaXMgZ2l2ZW5cbiAqIGxvd2VyIGJvdW5kIHdpbGwgYmUgYXNzdW1lZCB0byBiZSB6ZXJvLiBCb3RoIGludGVnZXJzIGhhdmUgdG8gYmUgcG9zaXRpdmVcbiAqIGFuZCB3aWxsIGJlIGNvbnRhaW5lZCBpbiB0aGUgcmVzdWx0aW5nIGFycmF5LiBJZiBtb3JlIHRoYW4gdHdvIG51bWJlcnMgYXJlXG4gKiBwcm92aWRlZCBnaXZlbiByYW5nZSB3aWxsIGJlIHJldHVybmVkLlxuICogQHBhcmFtIHN0ZXAgLSBTcGFjZSBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSB2YWx1ZXMuXG4gKiBAcGFyYW0gaWdub3JlTGFzdFN0ZXAgLSBSZW1vdmVzIGxhc3Qgc3RlcC5cbiAqIEByZXR1cm5zIFByb2R1Y2VkIGFycmF5IG9mIGludGVnZXJzLlxuICovXG5leHBvcnQgY29uc3QgbWFrZVJhbmdlID0gKFxuICAgIHJhbmdlOiBudW1iZXIgfCBBcnJheTxudW1iZXI+IHwgW251bWJlcl0gfCBbbnVtYmVyLCBudW1iZXJdLFxuICAgIHN0ZXAgPSAxLFxuICAgIGlnbm9yZUxhc3RTdGVwID0gZmFsc2Vcbik6IEFycmF5PG51bWJlcj4gPT4ge1xuICAgIHJhbmdlID0gKFtdIGFzIEFycmF5PG51bWJlcj4pLmNvbmNhdChyYW5nZSlcblxuICAgIGxldCBpbmRleDogbnVtYmVyXG4gICAgbGV0IGhpZ2hlckJvdW5kOiBudW1iZXJcbiAgICBpZiAocmFuZ2UubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGluZGV4ID0gMFxuICAgICAgICBoaWdoZXJCb3VuZCA9IHBhcnNlSW50KFN0cmluZyhyYW5nZVswXSksIDEwKVxuICAgIH0gZWxzZSBpZiAocmFuZ2UubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGluZGV4ID0gcGFyc2VJbnQoU3RyaW5nKHJhbmdlWzBdKSwgMTApXG4gICAgICAgIGhpZ2hlckJvdW5kID0gcGFyc2VJbnQoU3RyaW5nKHJhbmdlWzFdKSwgMTApXG4gICAgfSBlbHNlXG4gICAgICAgIHJldHVybiByYW5nZVxuXG4gICAgaWYgKGhpZ2hlckJvdW5kIDwgaW5kZXgpXG4gICAgICAgIHJldHVybiBbXVxuXG4gICAgY29uc3QgcmVzdWx0ID0gW2luZGV4XVxuICAgIHdoaWxlIChpbmRleCA8PSBoaWdoZXJCb3VuZCAtIHN0ZXApIHtcbiAgICAgICAgaW5kZXggKz0gc3RlcFxuICAgICAgICBpZiAoIWlnbm9yZUxhc3RTdGVwIHx8IGluZGV4IDw9IGhpZ2hlckJvdW5kIC0gc3RlcClcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGluZGV4KVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbn1cbi8qKlxuICogTWVyZ2UgdGhlIGNvbnRlbnRzIG9mIHR3byBhcnJheXMgdG9nZXRoZXIgaW50byB0aGUgZmlyc3QgYXJyYXkuXG4gKiBAcGFyYW0gdGFyZ2V0IC0gVGFyZ2V0IGFycmF5LlxuICogQHBhcmFtIHNvdXJjZSAtIFNvdXJjZSBhcnJheS5cbiAqIEByZXR1cm5zIFRhcmdldCBhcnJheSB3aXRoIG1lcmdlZCBnaXZlbiBzb3VyY2Ugb25lLlxuICovXG5leHBvcnQgY29uc3QgbWVyZ2UgPSA8VCA9IHVua25vd24+KFxuICAgIHRhcmdldDogQXJyYXk8VD4sIHNvdXJjZTogQXJyYXk8VD5cbik6IEFycmF5PFQ+ID0+IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc291cmNlKSlcbiAgICAgICAgc291cmNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoc291cmNlKSBhcyBBcnJheTxUPlxuXG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBzb3VyY2UpXG4gICAgICAgIHRhcmdldC5wdXNoKHZhbHVlKVxuXG4gICAgcmV0dXJuIHRhcmdldFxufVxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBsaXN0IGlmIHBhZ2luYXRpb24gc3ltYm9scyB0byByZW5kZXIgYSBwYWdpbmF0aW9uIGZyb20uXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyZSBib3VuZHMgYW5kIGN1cnJlbnQgcGFnZSBvZiBwYWdpbmF0aW9uIHRvXG4gKiBkZXRlcm1pbmUuXG4gKiBAcGFyYW0gb3B0aW9ucy5ib3VuZGFyeUNvdW50IC0gSW5kaWNhdGVzIHdoZXJlIHRvIHN0YXJ0IHBhZ2luYXRpb24gd2l0aGluXG4gKiBnaXZlbiB0b3RhbCByYW5nZS5cbiAqIEBwYXJhbSBvcHRpb25zLmRpc2FibGVkIC0gSW5kaWNhdGVzIHdoZXRoZXIgdG8gZGlzYWJsZSBhbGwgaXRlbXMuXG4gKiBAcGFyYW0gb3B0aW9ucy5oaWRlTmV4dEJ1dHRvbiAtIEluZGljYXRlcyB3aGV0aGVyIHRvIHNob3cgYSBqdW1wIHRvIG5leHRcbiAqIGl0ZW0uXG4gKiBAcGFyYW0gb3B0aW9ucy5oaWRlUHJldkJ1dHRvbiAtIEluZGljYXRlcyB3aGV0aGVyIHRvIHNob3cgYSBqdW1wIHRvIHByZXZpb3VzXG4gKiBpdGVtLlxuICogQHBhcmFtIG9wdGlvbnMucGFnZSAtIEluZGljYXRlcyBjdXJyZW50IHZpc2libGUgcGFnZS5cbiAqIEBwYXJhbSBvcHRpb25zLnBhZ2VTaXplIC0gTnVtYmVyIG9mIGl0ZW1zIHBlciBwYWdlLlxuICogQHBhcmFtIG9wdGlvbnMuc2hvd0ZpcnN0QnV0dG9uIC0gSW5kaWNhdGVzIHdoZXRoZXIgdG8gc2hvdyBhIGp1bXAgdG8gZmlyc3RcbiAqIGl0ZW0uXG4gKiBAcGFyYW0gb3B0aW9ucy5zaG93TGFzdEJ1dHRvbiAtIEluZGljYXRlcyB3aGV0aGVyIHRvIHNob3cgYSBqdW1wIHRvIGxhc3RcbiAqIGl0ZW0uXG4gKiBAcGFyYW0gb3B0aW9ucy5zaWJsaW5nQ291bnQgLSBOdW1iZXIgb2Ygc2libGluZyBwYWdlIHN5bWJvbHMgbmV4dCB0byBjdXJyZW50XG4gKiBwYWdlIHN5bWJvbC5cbiAqIEBwYXJhbSBvcHRpb25zLnRvdGFsIC0gTnVtYmVyIG9mIGFsbCBpdGVtcyB0byBwYWdpbmF0ZS5cbiAqIEByZXR1cm5zIEEgbGlzdCBvZiBwYWdpbmF0aW9uIHN5bWJvbHMuXG4gKi9cbmV4cG9ydCBjb25zdCBwYWdpbmF0ZSA9IChcbiAgICBvcHRpb25zOiBQYXJ0aWFsPFBhZ2luYXRlT3B0aW9ucz4gPSB7fVxuKTogQXJyYXk8UGFnZT4gPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgICAgYm91bmRhcnlDb3VudCA9IDEsXG4gICAgICAgIGRpc2FibGVkID0gZmFsc2UsXG4gICAgICAgIGhpZGVOZXh0QnV0dG9uID0gZmFsc2UsXG4gICAgICAgIGhpZGVQcmV2QnV0dG9uID0gZmFsc2UsXG4gICAgICAgIHBhZ2UgPSAxLFxuICAgICAgICBwYWdlU2l6ZSA9IDUsXG4gICAgICAgIHNob3dGaXJzdEJ1dHRvbiA9IGZhbHNlLFxuICAgICAgICBzaG93TGFzdEJ1dHRvbiA9IGZhbHNlLFxuICAgICAgICBzaWJsaW5nQ291bnQgPSA0LFxuICAgICAgICB0b3RhbCA9IDEwMFxuICAgIH0gPSBvcHRpb25zXG5cbiAgICBjb25zdCBudW1iZXJPZlBhZ2VzOiBudW1iZXIgPVxuICAgIHR5cGVvZiBwYWdlU2l6ZSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHBhZ2VTaXplKSA/XG4gICAgICAgIE1hdGguY2VpbCh0b3RhbCAvIHBhZ2VTaXplKSA6XG4gICAgICAgIHRvdGFsXG5cbiAgICBjb25zdCBzdGFydFBhZ2VzOiBBcnJheTxudW1iZXI+ID1cbiAgICAgICAgbWFrZVJhbmdlKFsxLCBNYXRoLm1pbihib3VuZGFyeUNvdW50LCBudW1iZXJPZlBhZ2VzKV0pXG4gICAgY29uc3QgZW5kUGFnZXM6IEFycmF5PG51bWJlcj4gPSBtYWtlUmFuZ2UoW1xuICAgICAgICBNYXRoLm1heChudW1iZXJPZlBhZ2VzIC0gYm91bmRhcnlDb3VudCArIDEsIGJvdW5kYXJ5Q291bnQgKyAxKSxcbiAgICAgICAgbnVtYmVyT2ZQYWdlc1xuICAgIF0pXG5cbiAgICBjb25zdCBzaWJsaW5nc1N0YXJ0OiBudW1iZXIgPSBNYXRoLm1heChcbiAgICAgICAgTWF0aC5taW4oXG4gICAgICAgICAgICAvLyBMZWZ0IGJvdW5kYXJ5IGZvciBsb3dlciBwYWdlcy5cbiAgICAgICAgICAgIHBhZ2UgLSBzaWJsaW5nQ291bnQsXG4gICAgICAgICAgICAvLyBMb3dlciBib3VuZGFyeSBmb3IgaGlnaGVyIHBhZ2VzLlxuICAgICAgICAgICAgbnVtYmVyT2ZQYWdlcyAtIGJvdW5kYXJ5Q291bnQgLSBzaWJsaW5nQ291bnQgKiAyIC0gMVxuICAgICAgICApLFxuICAgICAgICAvLyBJZiBudW1iZXIgaXMgZ3JlYXRlciB0aGFuIG51bWJlciBvZiBcInN0YXJ0UGFnZXNcIi5cbiAgICAgICAgYm91bmRhcnlDb3VudCArIDJcbiAgICApXG5cbiAgICBjb25zdCBzaWJsaW5nc0VuZDogbnVtYmVyID0gTWF0aC5taW4oXG4gICAgICAgIE1hdGgubWF4KFxuICAgICAgICAgICAgLy8gUmlnaHQgYm91bmQgZm9yIGhpZ2hlciBwYWdlcy5cbiAgICAgICAgICAgIHBhZ2UgKyBzaWJsaW5nQ291bnQsXG4gICAgICAgICAgICAvLyBVcHBlciBib3VuZGFyeSBmb3IgbG93ZXIgcGFnZXMuXG4gICAgICAgICAgICBib3VuZGFyeUNvdW50ICsgc2libGluZ0NvdW50ICogMiArIDJcbiAgICAgICAgKSxcbiAgICAgICAgLy8gSWYgbnVtYmVyIGlzIGxlc3MgdGhhbiBudW1iZXIgb2YgXCJlbmRQYWdlc1wiLlxuICAgICAgICBlbmRQYWdlcy5sZW5ndGggPiAwID8gZW5kUGFnZXNbMF0gLSAyIDogbnVtYmVyT2ZQYWdlcyAtIDFcbiAgICApXG5cbiAgICAvKlxuICAgICAgICBTeW1ib2wgbGlzdCBvZiBpdGVtcyB0byByZW5kZXIgcmVwcmVzZW50IGFzIHBhZ2luYXRpb24uXG5cbiAgICAgICAgRXhhbXBsZSByZXN1bHQ6XG5cbiAgICAgICAgW1xuICAgICAgICAgICAgJ2ZpcnN0JywgJ3ByZXZpb3VzJyxcbiAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAnc3RhcnQtZWxsaXBzaXMnLFxuICAgICAgICAgICAgNCwgNSwgNixcbiAgICAgICAgICAgICdlbmQtZWxsaXBzaXMnLFxuICAgICAgICAgICAgMTAsXG4gICAgICAgICAgICAnbmV4dCcsICdsYXN0J1xuICAgICAgICBdXG4gICAgKi9cbiAgICByZXR1cm4gKFtcbiAgICAgICAgLi4uKHNob3dGaXJzdEJ1dHRvbiA/IFsnZmlyc3QnXSA6IFtdKSxcbiAgICAgICAgLi4uKGhpZGVQcmV2QnV0dG9uID8gW10gOiBbJ3ByZXZpb3VzJ10pLFxuICAgICAgICAuLi5zdGFydFBhZ2VzLFxuXG4gICAgICAgIC8vIFN0YXJ0IGVsbGlwc2lzXG4gICAgICAgIC4uLihcbiAgICAgICAgICAgIHNpYmxpbmdzU3RhcnQgPiBib3VuZGFyeUNvdW50ICsgMiA/XG4gICAgICAgICAgICAgICAgWydzdGFydC1lbGxpcHNpcyddIDpcbiAgICAgICAgICAgICAgICBib3VuZGFyeUNvdW50ICsgMSA8IG51bWJlck9mUGFnZXMgLSBib3VuZGFyeUNvdW50ID9cbiAgICAgICAgICAgICAgICAgICAgW2JvdW5kYXJ5Q291bnQgKyAxXSA6XG4gICAgICAgICAgICAgICAgICAgIFtdXG4gICAgICAgICksXG5cbiAgICAgICAgLy8gU2libGluZyBwYWdlc1xuICAgICAgICAuLi5tYWtlUmFuZ2UoW3NpYmxpbmdzU3RhcnQsIHNpYmxpbmdzRW5kXSksXG5cbiAgICAgICAgLy8gRW5kIGVsbGlwc2lzXG4gICAgICAgIC4uLihcbiAgICAgICAgICAgIHNpYmxpbmdzRW5kIDwgbnVtYmVyT2ZQYWdlcyAtIGJvdW5kYXJ5Q291bnQgLSAxID9cbiAgICAgICAgICAgICAgICBbJ2VuZC1lbGxpcHNpcyddIDpcbiAgICAgICAgICAgICAgICBudW1iZXJPZlBhZ2VzIC0gYm91bmRhcnlDb3VudCA+IGJvdW5kYXJ5Q291bnQgP1xuICAgICAgICAgICAgICAgICAgICBbbnVtYmVyT2ZQYWdlcyAtIGJvdW5kYXJ5Q291bnRdIDpcbiAgICAgICAgICAgICAgICAgICAgW11cbiAgICAgICAgKSxcblxuICAgICAgICAuLi5lbmRQYWdlcyxcbiAgICAgICAgLi4uKGhpZGVOZXh0QnV0dG9uID8gW10gOiBbJ25leHQnXSksXG4gICAgICAgIC4uLihzaG93TGFzdEJ1dHRvbiA/IFsnbGFzdCddIDogW10pXG4gICAgXSBhcyBBcnJheTxudW1iZXIgfCBQYWdlVHlwZT4pLm1hcCgoaXRlbTogbnVtYmVyIHwgUGFnZVR5cGUpOiBQYWdlID0+XG4gICAgICAgIHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJyA/XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgcGFnZTogaXRlbSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZDogaXRlbSA9PT0gcGFnZSxcbiAgICAgICAgICAgICAgICB0eXBlOiAncGFnZSdcbiAgICAgICAgICAgIH0gOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRpc2FibGVkOlxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCB8fFxuICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmluZGV4T2YoJ2VsbGlwc2lzJykgPT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9PT0gJ25leHQnIHx8IGl0ZW0gPT09ICdsYXN0JyA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgPj0gbnVtYmVyT2ZQYWdlcyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UgPD0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB0eXBlOiBpdGVtLFxuICAgICAgICAgICAgICAgIC4uLihpdGVtLmVuZHNXaXRoKCctZWxsaXBzaXMnKSA/XG4gICAgICAgICAgICAgICAgICAgIHt9IDpcbiAgICAgICAgICAgICAgICAgICAge3BhZ2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdDogbnVtYmVyT2ZQYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1baXRlbSBhcyBzdHJpbmddID8/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9PT0gJ25leHQnID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4ocGFnZSArIDEsIG51bWJlck9mUGFnZXMpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogSXMgXCJwcmV2aW91c1wiIHR5cGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KHBhZ2UgLSAxLCAxKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgIClcbn1cbi8qKlxuICogR2VuZXJhdGVzIGFsbCBwZXJtdXRhdGlvbnMgb2YgZ2l2ZW4gaXRlcmFibGUuXG4gKiBAcGFyYW0gZGF0YSAtIEFycmF5IGxpa2Ugb2JqZWN0LlxuICogQHJldHVybnMgQXJyYXkgb2YgcGVybXV0ZWQgYXJyYXlzLlxuICovXG5leHBvcnQgY29uc3QgcGVybXV0ZSA9IDxUID0gdW5rbm93bj4oZGF0YTogQXJyYXk8VD4pOiBBcnJheTxBcnJheTxUPj4gPT4ge1xuICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8QXJyYXk8VD4+ID0gW11cblxuICAgIGNvbnN0IHBlcm11dGUgPSAoY3VycmVudERhdGE6IEFycmF5PFQ+LCBkYXRhVG9NaXhpbjogQXJyYXk8VD4gPSBbXSkgPT4ge1xuICAgICAgICBpZiAoY3VycmVudERhdGEubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmVzdWx0LnB1c2goZGF0YVRvTWl4aW4pXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjdXJyZW50RGF0YS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb3B5ID0gY3VycmVudERhdGEuc2xpY2UoKVxuICAgICAgICAgICAgICAgIHBlcm11dGUoY29weSwgZGF0YVRvTWl4aW4uY29uY2F0KGNvcHkuc3BsaWNlKGluZGV4LCAxKSkpXG4gICAgICAgICAgICB9XG4gICAgfVxuXG4gICAgcGVybXV0ZShkYXRhKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxufVxuLyoqXG4gKiBHZW5lcmF0ZXMgYWxsIGxlbmd0aHMgcGVybXV0YXRpb25zIG9mIGdpdmVuIGl0ZXJhYmxlLlxuICogQHBhcmFtIGRhdGEgLSBBcnJheSBsaWtlIG9iamVjdC5cbiAqIEBwYXJhbSBtaW5pbWFsU3Vic2V0TGVuZ3RoIC0gRGVmaW5lcyBob3cgbG9uZyB0aGUgbWluaW1hbCBzdWJzZXQgbGVuZ3RoXG4gKiBzaG91bGQgYmUuXG4gKiBAcmV0dXJucyBBcnJheSBvZiBwZXJtdXRlZCBhcnJheXMuXG4gKi9cbmV4cG9ydCBjb25zdCBwZXJtdXRlTGVuZ3RoID0gPFQgPSB1bmtub3duPihcbiAgICBkYXRhOiBBcnJheTxUPiwgbWluaW1hbFN1YnNldExlbmd0aCA9IDFcbik6IEFycmF5PEFycmF5PFQ+PiA9PiB7XG4gICAgY29uc3QgcmVzdWx0OiBBcnJheTxBcnJheTxUPj4gPSBbXVxuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuXG4gICAgY29uc3QgZ2VuZXJhdGUgPSAoXG4gICAgICAgIGluZGV4OiBudW1iZXIsIHNvdXJjZTogQXJyYXk8VD4sIHJlc3Q6IEFycmF5PFQ+XG4gICAgKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKHJlc3QubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICByZXN1bHRbcmVzdWx0Lmxlbmd0aF0gPSByZXN0XG5cbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChcbiAgICAgICAgICAgIGxldCBzb3VyY2VJbmRleCA9IDA7IHNvdXJjZUluZGV4IDwgc291cmNlLmxlbmd0aDsgc291cmNlSW5kZXgrK1xuICAgICAgICApXG4gICAgICAgICAgICBnZW5lcmF0ZShcbiAgICAgICAgICAgICAgICBpbmRleCAtIDEsXG4gICAgICAgICAgICAgICAgc291cmNlLnNsaWNlKHNvdXJjZUluZGV4ICsgMSksXG4gICAgICAgICAgICAgICAgcmVzdC5jb25jYXQoW3NvdXJjZVtzb3VyY2VJbmRleF1dKVxuICAgICAgICAgICAgKVxuICAgIH1cblxuICAgIGZvciAoXG4gICAgICAgIGxldCBpbmRleDogbnVtYmVyID0gbWluaW1hbFN1YnNldExlbmd0aDtcbiAgICAgICAgaW5kZXggPCBkYXRhLmxlbmd0aDtcbiAgICAgICAgaW5kZXgrK1xuICAgIClcbiAgICAgICAgZ2VuZXJhdGUoaW5kZXgsIGRhdGEsIFtdKVxuXG4gICAgcmVzdWx0LnB1c2goZGF0YSlcblxuICAgIHJldHVybiByZXN1bHRcbn1cbi8qKlxuICogU3VtcyB1cCBnaXZlbiBwcm9wZXJ0eSBvZiBnaXZlbiBpdGVtIGxpc3QuXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSBvYmplY3RzIHdpdGggc3BlY2lmaWVkIHByb3BlcnR5IHRvIHN1bSB1cC5cbiAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLSBQcm9wZXJ0eSBuYW1lIHRvIHN1bSB1cCBpdHMgdmFsdWUuXG4gKiBAcmV0dXJucyBUaGUgYWdncmVnYXRlZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHN1bVVwUHJvcGVydHkgPSAoZGF0YTogdW5rbm93biwgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICAgIGxldCByZXN1bHQgPSAwXG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSAmJiBkYXRhLmxlbmd0aClcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGRhdGEpXG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGl0ZW0sIHByb3BlcnR5TmFtZSkpXG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgICgoaXRlbSBhcyBNYXBwaW5nKVtwcm9wZXJ0eU5hbWVdIHx8IDApIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdcbiAgICAgICAgICAgICAgICApXG5cbiAgICByZXR1cm4gcmVzdWx0XG59XG4vKipcbiAqIFJlbW92ZXMgZ2l2ZW4gdGFyZ2V0IG9uIGdpdmVuIGxpc3QuXG4gKiBAcGFyYW0gbGlzdCAtIEFycmF5IHRvIHNwbGljZS5cbiAqIEBwYXJhbSB0YXJnZXQgLSBUYXJnZXQgdG8gcmVtb3ZlIGZyb20gZ2l2ZW4gbGlzdC5cbiAqIEBwYXJhbSBzdHJpY3QgLSBJbmRpY2F0ZXMgd2hldGhlciB0byBmaXJlIGFuIGV4Y2VwdGlvbiBpZiBnaXZlbiB0YXJnZXRcbiAqIGRvZXNuJ3QgZXhpc3QgZ2l2ZW4gbGlzdC5cbiAqIEByZXR1cm5zIEl0ZW0gd2l0aCB0aGUgYXBwZW5kZWQgdGFyZ2V0LlxuICovXG5leHBvcnQgY29uc3QgcmVtb3ZlQXJyYXlJdGVtID0gPFQgPSB1bmtub3duPihcbiAgICBsaXN0OiBBcnJheTxUPiwgdGFyZ2V0OiBULCBzdHJpY3QgPSBmYWxzZVxuKTogQXJyYXk8VD4gPT4ge1xuICAgIGNvbnN0IGluZGV4OiBudW1iZXIgPSBsaXN0LmluZGV4T2YodGFyZ2V0KVxuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgaWYgKHN0cmljdClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgR2l2ZW4gdGFyZ2V0IGRvZXNuJ3QgZXhpc3RzIGluIGdpdmVuIGxpc3QuYClcbiAgICB9IGVsc2VcbiAgICAgICAgbGlzdC5zcGxpY2UoaW5kZXgsIDEpXG5cbiAgICByZXR1cm4gbGlzdFxufVxuLyoqXG4gKiBTb3J0cyBnaXZlbiBvYmplY3Qgb2YgZGVwZW5kZW5jaWVzIGluIGEgdG9wb2xvZ2ljYWwgb3JkZXIuXG4gKiBAcGFyYW0gaXRlbXMgLSBJdGVtcyB0byBzb3J0LlxuICogQHJldHVybnMgU29ydGVkIGFycmF5IG9mIGdpdmVuIGl0ZW1zIHJlc3BlY3RpbmcgdGhlaXIgZGVwZW5kZW5jaWVzLlxuICovXG5leHBvcnQgY29uc3Qgc29ydFRvcG9sb2dpY2FsID0gKFxuICAgIGl0ZW1zOiBNYXBwaW5nPEFycmF5PHN0cmluZz4gfCBzdHJpbmc+XG4pOiBBcnJheTxzdHJpbmc+ID0+IHtcbiAgICBjb25zdCBlZGdlczogQXJyYXk8QXJyYXk8c3RyaW5nPj4gPSBbXVxuXG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGl0ZW1zKSkge1xuICAgICAgICBpdGVtc1tuYW1lXSA9IChbXSBhcyBBcnJheTxzdHJpbmc+KS5jb25jYXQodmFsdWUpXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5TmFtZSBvZiBtYWtlQXJyYXk8c3RyaW5nPih2YWx1ZSkpXG4gICAgICAgICAgICAgICAgZWRnZXMucHVzaChbbmFtZSwgZGVwZW5kZW5jeU5hbWVdKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBlZGdlcy5wdXNoKFtuYW1lXSlcbiAgICB9XG5cbiAgICBjb25zdCBub2RlczogQXJyYXk8bnVsbCB8IHN0cmluZz4gPSBbXVxuICAgIC8vIEFjY3VtdWxhdGUgdW5pcXVlIG5vZGVzIGludG8gYSBsYXJnZSBsaXN0LlxuICAgIGZvciAoY29uc3QgZWRnZSBvZiBlZGdlcylcbiAgICAgICAgZm9yIChjb25zdCBub2RlIG9mIGVkZ2UpXG4gICAgICAgICAgICBpZiAoIW5vZGVzLmluY2x1ZGVzKG5vZGUpKVxuICAgICAgICAgICAgICAgIG5vZGVzLnB1c2gobm9kZSlcblxuICAgIGNvbnN0IHNvcnRlZDogQXJyYXk8c3RyaW5nPiA9IFtdXG4gICAgLy8gRGVmaW5lIGEgdmlzaXRvciBmdW5jdGlvbiB0aGF0IHJlY3Vyc2l2ZWx5IHRyYXZlcnNlcyBkZXBlbmRlbmNpZXMuXG4gICAgY29uc3QgdmlzaXQgPSAobm9kZTogc3RyaW5nLCBwcmVkZWNlc3NvcnM6IEFycmF5PHN0cmluZz4pOiB2b2lkID0+IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgYSBub2RlIGlzIGRlcGVuZGVudCBvZiBpdHNlbGYuXG4gICAgICAgIGlmIChwcmVkZWNlc3NvcnMubGVuZ3RoICE9PSAwICYmIHByZWRlY2Vzc29ycy5pbmNsdWRlcyhub2RlKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgQ3ljbGljIGRlcGVuZGVuY3kgZm91bmQuIFwiJHtub2RlfVwiIGlzIGRlcGVuZGVudCBvZiBgICtcbiAgICAgICAgICAgICAgICAnaXRzZWxmLlxcbicgK1xuICAgICAgICAgICAgICAgIGBEZXBlbmRlbmN5IGNoYWluOiBcIiR7cHJlZGVjZXNzb3JzLmpvaW4oJ1wiIC0+IFwiJyl9XCIgPT4gXCJgICtcbiAgICAgICAgICAgICAgICBgJHtub2RlfVwiLmBcbiAgICAgICAgICAgIClcblxuICAgICAgICBjb25zdCBpbmRleCA9IG5vZGVzLmluZGV4T2Yobm9kZSlcbiAgICAgICAgLy8gSWYgdGhlIG5vZGUgc3RpbGwgZXhpc3RzLCB0cmF2ZXJzZSBpdHMgZGVwZW5kZW5jaWVzLlxuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBsZXQgY29weTogQXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZFxuICAgICAgICAgICAgLy8gTWFyayB0aGUgbm9kZSB0byBleGNsdWRlIGl0IGZyb20gZnV0dXJlIGl0ZXJhdGlvbnMuXG4gICAgICAgICAgICBub2Rlc1tpbmRleF0gPSBudWxsXG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgICAgIExvb3AgdGhyb3VnaCBhbGwgZWRnZXMgYW5kIGZvbGxvdyBkZXBlbmRlbmNpZXMgb2YgdGhlIGN1cnJlbnRcbiAgICAgICAgICAgICAgICBub2RlXG4gICAgICAgICAgICAqL1xuICAgICAgICAgICAgZm9yIChjb25zdCBlZGdlIG9mIGVkZ2VzKVxuICAgICAgICAgICAgICAgIGlmIChlZGdlWzBdID09PSBub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAgICBMYXppbHkgY3JlYXRlIGEgY29weSBvZiBwcmVkZWNlc3NvcnMgd2l0aCB0aGUgY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSBjb25jYXRlbmF0ZWQgb250byBpdC5cbiAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgY29weSA9IGNvcHkgfHwgcHJlZGVjZXNzb3JzLmNvbmNhdChbbm9kZV0pXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlIHRvIG5vZGUgZGVwZW5kZW5jaWVzLlxuICAgICAgICAgICAgICAgICAgICB2aXNpdChlZGdlWzFdLCBjb3B5KVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc29ydGVkLnB1c2gobm9kZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBub2Rlcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3Qgbm9kZTogbnVsbCB8IHN0cmluZyA9IG5vZGVzW2luZGV4XVxuICAgICAgICAvLyBJZ25vcmUgbm9kZXMgdGhhdCBoYXZlIGJlZW4gZXhjbHVkZWQuXG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICAvLyBNYXJrIHRoZSBub2RlIHRvIGV4Y2x1ZGUgaXQgZnJvbSBmdXR1cmUgaXRlcmF0aW9ucy5cbiAgICAgICAgICAgIG5vZGVzW2luZGV4XSA9IG51bGxcbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgTG9vcCB0aHJvdWdoIGFsbCBlZGdlcyBhbmQgZm9sbG93IGRlcGVuZGVuY2llcyBvZiB0aGUgY3VycmVudFxuICAgICAgICAgICAgICAgIG5vZGUuXG4gICAgICAgICAgICAqL1xuICAgICAgICAgICAgZm9yIChjb25zdCBlZGdlIG9mIGVkZ2VzKVxuICAgICAgICAgICAgICAgIGlmIChlZGdlWzBdID09PSBub2RlKVxuICAgICAgICAgICAgICAgICAgICAvLyBSZWN1cnNpdmVseSB0cmF2ZXJzZSB0byBub2RlIGRlcGVuZGVuY2llcy5cbiAgICAgICAgICAgICAgICAgICAgdmlzaXQoZWRnZVsxXSwgW25vZGVdKVxuXG4gICAgICAgICAgICBzb3J0ZWQucHVzaChub2RlKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvcnRlZFxufVxuLyoqXG4gKiBNYWtlcyBhbGwgdmFsdWVzIGluIGdpdmVuIGl0ZXJhYmxlIHVuaXF1ZSBieSByZW1vdmluZyBkdXBsaWNhdGVzIChUaGUgZmlyc3RcbiAqIG9jY3VycmVuY2VzIHdpbGwgYmUgbGVmdCkuXG4gKiBAcGFyYW0gZGF0YSAtIEFycmF5IGxpa2Ugb2JqZWN0LlxuICogQHJldHVybnMgU2xpY2VkIHZlcnNpb24gb2YgZ2l2ZW4gb2JqZWN0LlxuICovXG5leHBvcnQgY29uc3QgdW5pcXVlID0gPFQgPSB1bmtub3duPihkYXRhOiBBcnJheTxUPik6IEFycmF5PFQ+ID0+IHtcbiAgICBjb25zdCByZXN1bHQ6IEFycmF5PFQ+ID0gW11cblxuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgbWFrZUFycmF5KGRhdGEpKVxuICAgICAgICBpZiAoIXJlc3VsdC5pbmNsdWRlcyh2YWx1ZSBhcyBUKSlcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlIGFzIFQpXG5cbiAgICByZXR1cm4gcmVzdWx0XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7O0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWJBO0FBQUE7QUFnQkEsU0FBUSxXQUFXLEVBQUUsYUFBYTs7QUFFbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLE1BQU0sd0JBQXdCLEdBQUcsQ0FDcEMsSUFBNkIsRUFDN0IsWUFBb0IsRUFDcEIsWUFBZSxHQUFHLEVBQWtCLEtBQ2hDO0VBQ0osSUFBSSxNQUFTLEdBQUcsWUFBWTtFQUU1QixJQUNJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQ25CLElBQUksQ0FBQyxNQUFNLElBQ1gsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsRUFDN0Q7SUFDRSxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBTTtJQUVuQyxLQUFLLE1BQU0sSUFBSSxJQUFJLFNBQVMsQ0FBbUIsSUFBSSxDQUFDLEVBQ2hELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLE1BQU0sRUFDN0IsT0FBTyxZQUFZO0VBQy9CO0VBRUEsT0FBTyxNQUFNO0FBQ2pCLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxNQUFNLGdCQUFnQixHQUFHLENBRTlCLElBQWMsRUFBRSxhQUFxQyxHQUFHLEVBQUUsS0FBZTtFQUN2RSxNQUFNLE1BQWdCLEdBQUcsRUFBRTtFQUUzQixLQUFLLE1BQU0sSUFBSSxJQUFJLFNBQVMsQ0FBSSxJQUFJLENBQUMsRUFBRTtJQUNuQyxJQUFJLEtBQUss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QUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO01BQ2QsSUFBSSxJQUErQjtNQUNuQztNQUNBLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJO01BQ25CO0FBQ1o7QUFDQTtBQUNBO01BQ1ksS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQ3BCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNsQjtBQUNwQjtBQUNBO0FBQ0E7UUFDb0IsSUFBSSxHQUFHLElBQUksSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUM7UUFDQSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQztNQUN4QjtNQUVKLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3JCO0VBQ0osQ0FBQztFQUVELEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO0lBQy9DLE1BQU0sSUFBbUIsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3hDO0lBQ0EsSUFBSSxJQUFJLEVBQUU7TUFDTjtNQUNBLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJO01BQ25CO0FBQ1o7QUFDQTtBQUNBO01BQ1ksS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQ3BCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUk7UUFDaEI7UUFDQSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7TUFFOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDckI7RUFDSjtFQUVBLE9BQU8sTUFBTTtBQUNqQixDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyxNQUFNLE1BQU0sR0FBaUIsSUFBYyxJQUFlO0VBQzdELE1BQU0sTUFBZ0IsR0FBRyxFQUFFO0VBRTNCLEtBQUssTUFBTSxLQUFLLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxFQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFVLENBQUMsRUFDNUIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFVLENBQUM7RUFFL0IsT0FBTyxNQUFNO0FBQ2pCLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=
|