{"version":3,"file":"ej2-data.min.js","sources":["../../src/query.js","../../src/util.js","../../src/adaptors.js","../../src/manager.js"],"sourcesContent":["/* eslint-disable valid-jsdoc */\n/* eslint-disable security/detect-object-injection */\nimport { DataUtil } from './util';\nimport { isNullOrUndefined } from '@syncfusion/ej2-base';\n/**\n * Query class is used to build query which is used by the DataManager to communicate with datasource.\n */\nvar Query = /** @class */ (function () {\n /**\n * Constructor for Query class.\n *\n * @param {string|string[]} from?\n * @param from\n * @hidden\n */\n function Query(from) {\n /** @hidden */\n this.subQuery = null;\n /** @hidden */\n this.isChild = false;\n /** @hidden */\n this.distincts = [];\n this.queries = [];\n this.key = '';\n this.fKey = '';\n if (typeof from === 'string') {\n this.fromTable = from;\n }\n else if (from && from instanceof Array) {\n this.lookups = from;\n }\n this.expands = [];\n this.sortedColumns = [];\n this.groupedColumns = [];\n this.subQuery = null;\n this.isChild = false;\n this.params = [];\n this.lazyLoad = [];\n return this;\n }\n /**\n * Sets the primary key.\n *\n * @param {string} field - Defines the column field.\n */\n Query.prototype.setKey = function (field) {\n this.key = field;\n return this;\n };\n /**\n * Sets default DataManager to execute query.\n *\n * @param {DataManager} dataManager - Defines the DataManager.\n */\n Query.prototype.using = function (dataManager) {\n this.dataManager = dataManager;\n return this;\n };\n /**\n * Executes query with the given DataManager.\n *\n * @param {DataManager} dataManager - Defines the DataManager.\n * @param {Function} done - Defines the success callback.\n * @param {Function} fail - Defines the failure callback.\n * @param {Function} always - Defines the callback which will be invoked on either success or failure.\n *\n *
\n     * let dataManager: DataManager = new DataManager([{ ID: '10' }, { ID: '2' }, { ID: '1' }, { ID: '20' }]);\n     * let query: Query = new Query();\n     * query.sortBy('ID', (x: string, y: string): number => { return parseInt(x, 10) - parseInt(y, 10) });\n     * let promise: Promise< Object > = query.execute(dataManager);\n     * promise.then((e: { result: Object }) => { });\n     * 
\n */\n Query.prototype.execute = function (dataManager, done, fail, always) {\n dataManager = dataManager || this.dataManager;\n if (dataManager) {\n return dataManager.executeQuery(this, done, fail, always);\n }\n return DataUtil.throwError('Query - execute() : dataManager needs to be is set using \"using\" function or should be passed as argument');\n };\n /**\n * Executes query with the local datasource.\n *\n * @param {DataManager} dataManager - Defines the DataManager.\n */\n Query.prototype.executeLocal = function (dataManager) {\n dataManager = dataManager || this.dataManager;\n if (dataManager) {\n return dataManager.executeLocal(this);\n }\n return DataUtil.throwError('Query - executeLocal() : dataManager needs to be is set using \"using\" function or should be passed as argument');\n };\n /**\n * Creates deep copy of the Query object.\n */\n Query.prototype.clone = function () {\n var cloned = new Query();\n cloned.queries = this.queries.slice(0);\n cloned.key = this.key;\n cloned.isChild = this.isChild;\n cloned.dataManager = this.dataManager;\n cloned.fromTable = this.fromTable;\n cloned.params = this.params.slice(0);\n cloned.expands = this.expands.slice(0);\n cloned.sortedColumns = this.sortedColumns.slice(0);\n cloned.groupedColumns = this.groupedColumns.slice(0);\n cloned.subQuerySelector = this.subQuerySelector;\n cloned.subQuery = this.subQuery;\n cloned.fKey = this.fKey;\n cloned.isCountRequired = this.isCountRequired;\n cloned.distincts = this.distincts.slice(0);\n cloned.lazyLoad = this.lazyLoad.slice(0);\n return cloned;\n };\n /**\n * Specifies the name of table to retrieve data in query execution.\n *\n * @param {string} tableName - Defines the table name.\n */\n Query.prototype.from = function (tableName) {\n this.fromTable = tableName;\n return this;\n };\n /**\n * Adds additional parameter which will be sent along with the request which will be generated while DataManager execute.\n *\n * @param {string} key - Defines the key of additional parameter.\n * @param {Function|string} value - Defines the value for the key.\n */\n Query.prototype.addParams = function (key, value) {\n if (typeof value === 'function') {\n this.params.push({ key: key, fn: value });\n }\n else {\n this.params.push({ key: key, value: value });\n }\n return this;\n };\n /**\n * @param fields\n * @hidden\n */\n Query.prototype.distinct = function (fields) {\n if (typeof fields === 'string') {\n this.distincts = [].slice.call([fields], 0);\n }\n else {\n this.distincts = fields.slice(0);\n }\n return this;\n };\n /**\n * Expands the related table.\n *\n * @param {string|Object[]} tables\n */\n Query.prototype.expand = function (tables) {\n if (typeof tables === 'string') {\n this.expands = [].slice.call([tables], 0);\n }\n else {\n this.expands = tables.slice(0);\n }\n return this;\n };\n /**\n * Filter data with given filter criteria.\n *\n * @param {string|Predicate} fieldName - Defines the column field or Predicate.\n * @param {string} operator - Defines the operator how to filter data.\n * @param {string|number|boolean} value - Defines the values to match with data.\n * @param {boolean} ignoreCase - If ignore case set to false, then filter data with exact match or else\n * filter data with case insensitive.\n * @param ignoreAccent\n * @param matchCase\n */\n Query.prototype.where = function (fieldName, operator, value, ignoreCase, ignoreAccent, matchCase) {\n operator = operator ? (operator).toLowerCase() : null;\n var predicate = null;\n if (typeof fieldName === 'string') {\n predicate = new Predicate(fieldName, operator, value, ignoreCase, ignoreAccent, matchCase);\n }\n else if (fieldName instanceof Predicate) {\n predicate = fieldName;\n }\n this.queries.push({\n fn: 'onWhere',\n e: predicate\n });\n return this;\n };\n /**\n * Search data with given search criteria.\n *\n * @param {string|number|boolean} searchKey - Defines the search key.\n * @param {string|string[]} fieldNames - Defines the collection of column fields.\n * @param {string} operator - Defines the operator how to search data.\n * @param {boolean} ignoreCase - If ignore case set to false, then filter data with exact match or else\n * filter data with case insensitive.\n * @param ignoreAccent\n */\n Query.prototype.search = function (searchKey, fieldNames, operator, ignoreCase, ignoreAccent) {\n if (typeof fieldNames === 'string') {\n fieldNames = [fieldNames];\n }\n if (!operator || operator === 'none') {\n operator = 'contains';\n }\n var comparer = DataUtil.fnOperators[operator];\n this.queries.push({\n fn: 'onSearch',\n e: {\n fieldNames: fieldNames,\n operator: operator,\n searchKey: searchKey,\n ignoreCase: ignoreCase,\n ignoreAccent: ignoreAccent,\n comparer: comparer\n }\n });\n return this;\n };\n /**\n * Sort the data with given sort criteria.\n * By default, sort direction is ascending.\n *\n * @param {string|string[]} fieldName - Defines the single or collection of column fields.\n * @param {string|Function} comparer - Defines the sort direction or custom sort comparer function.\n * @param isFromGroup\n */\n Query.prototype.sortBy = function (fieldName, comparer, isFromGroup) {\n return this.sortByForeignKey(fieldName, comparer, isFromGroup);\n };\n /**\n * Sort the data with given sort criteria.\n * By default, sort direction is ascending.\n *\n * @param {string|string[]} fieldName - Defines the single or collection of column fields.\n * @param {string|Function} comparer - Defines the sort direction or custom sort comparer function.\n * @param isFromGroup\n * @param {string} direction - Defines the sort direction .\n */\n Query.prototype.sortByForeignKey = function (fieldName, comparer, isFromGroup, direction) {\n var order = !isNullOrUndefined(direction) ? direction : 'ascending';\n var sorts;\n var temp;\n if (typeof fieldName === 'string' && DataUtil.endsWith(fieldName.toLowerCase(), ' desc')) {\n fieldName = fieldName.replace(/ desc$/i, '');\n comparer = 'descending';\n }\n if (!comparer || typeof comparer === 'string') {\n order = comparer ? comparer.toLowerCase() : 'ascending';\n comparer = DataUtil.fnSort(comparer);\n }\n if (isFromGroup) {\n sorts = Query.filterQueries(this.queries, 'onSortBy');\n for (var i = 0; i < sorts.length; i++) {\n temp = sorts[i].e.fieldName;\n if (typeof temp === 'string') {\n if (temp === fieldName) {\n return this;\n }\n }\n else if (temp instanceof Array) {\n for (var j = 0; j < temp.length; j++) {\n if (temp[j] === fieldName || fieldName.toLowerCase() === temp[j] + ' desc') {\n return this;\n }\n }\n }\n }\n }\n this.queries.push({\n fn: 'onSortBy',\n e: {\n fieldName: fieldName,\n comparer: comparer,\n direction: order\n }\n });\n return this;\n };\n /**\n * Sorts data in descending order.\n *\n * @param {string} fieldName - Defines the column field.\n */\n Query.prototype.sortByDesc = function (fieldName) {\n return this.sortBy(fieldName, 'descending');\n };\n /**\n * Groups data with the given field name.\n *\n * @param {string} fieldName - Defines the column field.\n * @param fn\n * @param format\n */\n Query.prototype.group = function (fieldName, fn, format) {\n this.sortBy(fieldName, null, true);\n this.queries.push({\n fn: 'onGroup',\n e: {\n fieldName: fieldName,\n comparer: fn ? fn : null,\n format: format ? format : null\n }\n });\n return this;\n };\n /**\n * Gets data based on the given page index and size.\n *\n * @param {number} pageIndex - Defines the current page index.\n * @param {number} pageSize - Defines the no of records per page.\n */\n Query.prototype.page = function (pageIndex, pageSize) {\n this.queries.push({\n fn: 'onPage',\n e: {\n pageIndex: pageIndex,\n pageSize: pageSize\n }\n });\n return this;\n };\n /**\n * Gets data based on the given start and end index.\n *\n * @param {number} start - Defines the start index of the datasource.\n * @param {number} end - Defines the end index of the datasource.\n */\n Query.prototype.range = function (start, end) {\n this.queries.push({\n fn: 'onRange',\n e: {\n start: start,\n end: end\n }\n });\n return this;\n };\n /**\n * Gets data from the top of the data source based on given number of records count.\n *\n * @param {number} nos - Defines the no of records to retrieve from datasource.\n */\n Query.prototype.take = function (nos) {\n this.queries.push({\n fn: 'onTake',\n e: {\n nos: nos\n }\n });\n return this;\n };\n /**\n * Skips data with given number of records count from the top of the data source.\n *\n * @param {number} nos - Defines the no of records skip in the datasource.\n */\n Query.prototype.skip = function (nos) {\n this.queries.push({\n fn: 'onSkip',\n e: { nos: nos }\n });\n return this;\n };\n /**\n * Selects specified columns from the data source.\n *\n * @param {string|string[]} fieldNames - Defines the collection of column fields.\n */\n Query.prototype.select = function (fieldNames) {\n if (typeof fieldNames === 'string') {\n fieldNames = [].slice.call([fieldNames], 0);\n }\n this.queries.push({\n fn: 'onSelect',\n e: { fieldNames: fieldNames }\n });\n return this;\n };\n /**\n * Gets the records in hierarchical relationship from two tables. It requires the foreign key to relate two tables.\n *\n * @param {Query} query - Defines the query to relate two tables.\n * @param {Function} selectorFn - Defines the custom function to select records.\n */\n Query.prototype.hierarchy = function (query, selectorFn) {\n this.subQuerySelector = selectorFn;\n this.subQuery = query;\n return this;\n };\n /**\n * Sets the foreign key which is used to get data from the related table.\n *\n * @param {string} key - Defines the foreign key.\n */\n Query.prototype.foreignKey = function (key) {\n this.fKey = key;\n return this;\n };\n /**\n * It is used to get total number of records in the DataManager execution result.\n */\n Query.prototype.requiresCount = function () {\n this.isCountRequired = true;\n return this;\n };\n //type - sum, avg, min, max\n /**\n * Aggregate the data with given type and field name.\n *\n * @param {string} type - Defines the aggregate type.\n * @param {string} field - Defines the column field to aggregate.\n */\n Query.prototype.aggregate = function (type, field) {\n this.queries.push({\n fn: 'onAggregates',\n e: { field: field, type: type }\n });\n return this;\n };\n /**\n * Pass array of filterColumn query for performing filter operation.\n *\n * @param {QueryOptions[]} queries\n * @param {string} name\n * @hidden\n */\n Query.filterQueries = function (queries, name) {\n return queries.filter(function (q) {\n return q.fn === name;\n });\n };\n /**\n * To get the list of queries which is already filtered in current data source.\n *\n * @param {Object[]} queries\n * @param {string[]} singles\n * @hidden\n */\n Query.filterQueryLists = function (queries, singles) {\n var filtered = queries.filter(function (q) {\n return singles.indexOf(q.fn) !== -1;\n });\n var res = {};\n for (var i = 0; i < filtered.length; i++) {\n if (!res[filtered[i].fn]) {\n res[filtered[i].fn] = filtered[i].e;\n }\n }\n return res;\n };\n return Query;\n}());\nexport { Query };\n/**\n * Predicate class is used to generate complex filter criteria.\n * This will be used by DataManager to perform multiple filtering operation.\n */\nvar Predicate = /** @class */ (function () {\n /**\n * Constructor for Predicate class.\n *\n * @param {string|Predicate} field\n * @param {string} operator\n * @param {string|number|boolean|Predicate|Predicate[]} value\n * @param {boolean=false} ignoreCase\n * @param ignoreAccent\n * @param {boolean} matchCase\n * @hidden\n */\n function Predicate(field, operator, value, ignoreCase, ignoreAccent, matchCase) {\n if (ignoreCase === void 0) { ignoreCase = false; }\n /** @hidden */\n this.ignoreAccent = false;\n /** @hidden */\n this.isComplex = false;\n if (typeof field === 'string') {\n this.field = field;\n this.operator = operator.toLowerCase();\n this.value = value;\n this.matchCase = matchCase;\n this.ignoreCase = ignoreCase;\n this.ignoreAccent = ignoreAccent;\n this.isComplex = false;\n this.comparer = DataUtil.fnOperators.processOperator(this.operator);\n }\n else if (field instanceof Predicate && value instanceof Predicate || value instanceof Array) {\n this.isComplex = true;\n this.condition = operator.toLowerCase();\n this.predicates = [field];\n this.matchCase = field.matchCase;\n this.ignoreCase = field.ignoreCase;\n this.ignoreAccent = field.ignoreAccent;\n if (value instanceof Array) {\n [].push.apply(this.predicates, value);\n }\n else {\n this.predicates.push(value);\n }\n }\n return this;\n }\n /**\n * Adds n-number of new predicates on existing predicate with “and” condition.\n *\n * @param {Object[]} args - Defines the collection of predicates.\n */\n Predicate.and = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return Predicate.combinePredicates([].slice.call(args, 0), 'and');\n };\n /**\n * Adds new predicate on existing predicate with “and” condition.\n *\n * @param {string} field - Defines the column field.\n * @param {string} operator - Defines the operator how to filter data.\n * @param {string} value - Defines the values to match with data.\n * @param {boolean} ignoreCase? - If ignore case set to false, then filter data with exact match or else\n * filter data with case insensitive.\n * @param ignoreCase\n * @param ignoreAccent\n */\n Predicate.prototype.and = function (field, operator, value, ignoreCase, ignoreAccent) {\n return Predicate.combine(this, field, operator, value, 'and', ignoreCase, ignoreAccent);\n };\n /**\n * Adds n-number of new predicates on existing predicate with “or” condition.\n *\n * @param {Object[]} args - Defines the collection of predicates.\n */\n Predicate.or = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return Predicate.combinePredicates([].slice.call(args, 0), 'or');\n };\n /**\n * Adds new predicate on existing predicate with “or” condition.\n *\n * @param {string} field - Defines the column field.\n * @param {string} operator - Defines the operator how to filter data.\n * @param {string} value - Defines the values to match with data.\n * @param {boolean} ignoreCase? - If ignore case set to false, then filter data with exact match or else\n * filter data with case insensitive.\n * @param ignoreCase\n * @param ignoreAccent\n */\n Predicate.prototype.or = function (field, operator, value, ignoreCase, ignoreAccent) {\n return Predicate.combine(this, field, operator, value, 'or', ignoreCase, ignoreAccent);\n };\n /**\n * Adds n-number of new predicates on existing predicate with “and not” condition.\n *\n * @param {Object[]} args - Defines the collection of predicates.\n */\n Predicate.ornot = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return Predicate.combinePredicates([].slice.call(args, 0), 'or not');\n };\n /**\n * Adds new predicate on existing predicate with “and not” condition.\n *\n * @param {string} field - Defines the column field.\n * @param {string} operator - Defines the operator how to filter data.\n * @param {string} value - Defines the values to match with data.\n * @param {boolean} ignoreCase? - If ignore case set to false, then filter data with exact match or else\n * filter data with case insensitive.\n * @param ignoreCase\n * @param ignoreAccent\n */\n Predicate.prototype.ornot = function (field, operator, value, ignoreCase, ignoreAccent) {\n return Predicate.combine(this, field, operator, value, 'ornot', ignoreCase, ignoreAccent);\n };\n /**\n * Adds n-number of new predicates on existing predicate with “and not” condition.\n *\n * @param {Object[]} args - Defines the collection of predicates.\n */\n Predicate.andnot = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n return Predicate.combinePredicates([].slice.call(args, 0), 'and not');\n };\n /**\n * Adds new predicate on existing predicate with “and not” condition.\n *\n * @param {string} field - Defines the column field.\n * @param {string} operator - Defines the operator how to filter data.\n * @param {string} value - Defines the values to match with data.\n * @param {boolean} ignoreCase? - If ignore case set to false, then filter data with exact match or else\n * filter data with case insensitive.\n * @param ignoreCase\n * @param ignoreAccent\n */\n Predicate.prototype.andnot = function (field, operator, value, ignoreCase, ignoreAccent) {\n return Predicate.combine(this, field, operator, value, 'andnot', ignoreCase, ignoreAccent);\n };\n /**\n * Converts plain JavaScript object to Predicate object.\n *\n * @param {Predicate[]|Predicate} json - Defines single or collection of Predicate.\n */\n Predicate.fromJson = function (json) {\n if (json instanceof Array) {\n var res = [];\n for (var i = 0, len = json.length; i < len; i++) {\n res.push(this.fromJSONData(json[i]));\n }\n return res;\n }\n var pred = json;\n return this.fromJSONData(pred);\n };\n /**\n * Validate the record based on the predicates.\n *\n * @param {Object} record - Defines the datasource record.\n */\n Predicate.prototype.validate = function (record) {\n var predicate = this.predicates ? this.predicates : [];\n var ret;\n var isAnd;\n if (!this.isComplex && this.comparer) {\n if (this.condition && this.condition.indexOf('not') !== -1) {\n this.condition = this.condition.split('not')[0] === '' ? undefined : this.condition.split('not')[0];\n return !this.comparer.call(this, DataUtil.getObject(this.field, record), this.value, this.ignoreCase, this.ignoreAccent);\n }\n else {\n return this.comparer.call(this, DataUtil.getObject(this.field, record), this.value, this.ignoreCase, this.ignoreAccent);\n }\n }\n if (this.condition && this.condition.indexOf('not') !== -1) {\n isAnd = this.condition.indexOf('and') !== -1;\n }\n else {\n isAnd = this.condition === 'and';\n }\n for (var i = 0; i < predicate.length; i++) {\n if (i > 0 && this.condition && this.condition.indexOf('not') !== -1) {\n predicate[i].condition = predicate[i].condition ? predicate[i].condition + 'not' : 'not';\n }\n ret = predicate[i].validate(record);\n if (isAnd) {\n if (!ret) {\n return false;\n }\n }\n else {\n if (ret) {\n return true;\n }\n }\n }\n return isAnd;\n };\n /**\n * Converts predicates to plain JavaScript.\n * This method is uses Json stringify when serializing Predicate object.\n */\n Predicate.prototype.toJson = function () {\n var predicates;\n var p;\n if (this.isComplex) {\n predicates = [];\n p = this.predicates;\n for (var i = 0; i < p.length; i++) {\n predicates.push(p[i].toJson());\n }\n }\n return {\n isComplex: this.isComplex,\n field: this.field,\n operator: this.operator,\n value: this.value,\n ignoreCase: this.ignoreCase,\n ignoreAccent: this.ignoreAccent,\n condition: this.condition,\n predicates: predicates,\n matchCase: this.matchCase\n };\n };\n Predicate.combinePredicates = function (predicates, operator) {\n if (predicates.length === 1) {\n if (!(predicates[0] instanceof Array)) {\n return predicates[0];\n }\n predicates = predicates[0];\n }\n return new Predicate(predicates[0], operator, predicates.slice(1));\n };\n Predicate.combine = function (pred, field, operator, value, condition, ignoreCase, ignoreAccent) {\n if (field instanceof Predicate) {\n return Predicate[condition](pred, field);\n }\n if (typeof field === 'string') {\n return Predicate[condition](pred, new Predicate(field, operator, value, ignoreCase, ignoreAccent));\n }\n return DataUtil.throwError('Predicate - ' + condition + ' : invalid arguments');\n };\n Predicate.fromJSONData = function (json) {\n var preds = json.predicates || [];\n var len = preds.length;\n var predicates = [];\n var result;\n for (var i = 0; i < len; i++) {\n predicates.push(this.fromJSONData(preds[i]));\n }\n if (!json.isComplex) {\n result = new Predicate(json.field, json.operator, json.value, json.ignoreCase, json.ignoreAccent);\n }\n else {\n result = new Predicate(predicates[0], json.condition, predicates.slice(1));\n }\n return result;\n };\n return Predicate;\n}());\nexport { Predicate };\n","/* eslint-disable valid-jsdoc */\n/* eslint-disable security/detect-object-injection */\nimport { isNullOrUndefined } from '@syncfusion/ej2-base';\nimport { DataManager } from './manager';\nimport { Query, Predicate } from './query';\nvar consts = { GroupGuid: '{271bbba0-1ee7}' };\n/**\n * Data manager common utility methods.\n *\n * @hidden\n */\nvar DataUtil = /** @class */ (function () {\n function DataUtil() {\n }\n /**\n * Returns the value by invoking the provided parameter function.\n * If the paramater is not of type function then it will be returned as it is.\n *\n * @param {Function|string|string[]|number} value\n * @param {Object} inst?\n * @param inst\n * @hidden\n */\n DataUtil.getValue = function (value, inst) {\n if (typeof value === 'function') {\n return value.call(inst || {});\n }\n return value;\n };\n /**\n * Returns true if the input string ends with given string.\n *\n * @param {string} input\n * @param {string} substr\n */\n DataUtil.endsWith = function (input, substr) {\n return input.slice && input.slice(-substr.length) === substr;\n };\n /**\n * Returns true if the input string not ends with given string.\n *\n * @param {string} input\n * @param {string} substr\n */\n DataUtil.notEndsWith = function (input, substr) {\n return input.slice && input.slice(-substr.length) !== substr;\n };\n /**\n * Returns true if the input string starts with given string.\n *\n * @param {string} str\n * @param {string} startstr\n * @param input\n * @param start\n */\n DataUtil.startsWith = function (input, start) {\n return input.slice(0, start.length) === start;\n };\n /**\n * Returns true if the input string not starts with given string.\n *\n * @param {string} str\n * @param {string} startstr\n * @param input\n * @param start\n */\n DataUtil.notStartsWith = function (input, start) {\n return input.slice(0, start.length) !== start;\n };\n /**\n * Returns true if the input string pattern(wildcard) matches with given string.\n *\n * @param {string} str\n * @param {string} startstr\n * @param input\n * @param pattern\n */\n DataUtil.wildCard = function (input, pattern) {\n var asteriskSplit;\n var optionalSplit;\n if (pattern.indexOf('*') !== -1) {\n if (pattern.charAt(0) !== '*') {\n pattern = '^' + pattern;\n }\n if (pattern.charAt(pattern.length - 1) !== '*') {\n pattern = pattern + '$';\n }\n asteriskSplit = pattern.split('*');\n for (var i = 0; i < asteriskSplit.length; i++) {\n if (asteriskSplit[i].indexOf('.') === -1) {\n asteriskSplit[i] = asteriskSplit[i] + '.*';\n }\n else {\n asteriskSplit[i] = asteriskSplit[i] + '*';\n }\n }\n pattern = asteriskSplit.join('');\n }\n if (pattern.indexOf('%3f') !== -1 || pattern.indexOf('?') !== -1) {\n optionalSplit = pattern.indexOf('%3f') !== -1 ? pattern.split('%3f') : pattern.split('?');\n pattern = optionalSplit.join('.');\n }\n // eslint-disable-next-line security/detect-non-literal-regexp\n var regexPattern = new RegExp(pattern, 'g');\n return regexPattern.test(input);\n };\n /**\n * Returns true if the input string pattern(like) matches with given string.\n *\n * @param {string} str\n * @param {string} startstr\n * @param input\n * @param pattern\n */\n DataUtil.like = function (input, pattern) {\n if (pattern.indexOf('%') !== -1) {\n if (pattern.charAt(0) === '%' && pattern.lastIndexOf('%') < 2) {\n pattern = pattern.substring(1, pattern.length);\n return DataUtil.startsWith(DataUtil.toLowerCase(input), DataUtil.toLowerCase(pattern));\n }\n else if (pattern.charAt(pattern.length - 1) === '%' && pattern.indexOf('%') > pattern.length - 3) {\n pattern = pattern.substring(0, pattern.length - 1);\n return DataUtil.endsWith(DataUtil.toLowerCase(input), DataUtil.toLowerCase(pattern));\n }\n else if (pattern.lastIndexOf('%') !== pattern.indexOf('%') && pattern.lastIndexOf('%') > pattern.indexOf('%') + 1) {\n pattern = pattern.substring(pattern.indexOf('%') + 1, pattern.lastIndexOf('%'));\n return input.indexOf(pattern) !== -1;\n }\n else {\n return input.indexOf(pattern) !== -1;\n }\n }\n else {\n return false;\n }\n };\n /**\n * To return the sorting function based on the string.\n *\n * @param {string} order\n * @hidden\n */\n DataUtil.fnSort = function (order) {\n order = order ? DataUtil.toLowerCase(order) : 'ascending';\n if (order === 'ascending') {\n return this.fnAscending;\n }\n return this.fnDescending;\n };\n /**\n * Comparer function which is used to sort the data in ascending order.\n *\n * @param {string|number} x\n * @param {string|number} y\n * @returns number\n */\n DataUtil.fnAscending = function (x, y) {\n if (isNullOrUndefined(x) && isNullOrUndefined(y)) {\n return -1;\n }\n if (y === null || y === undefined) {\n return -1;\n }\n if (typeof x === 'string') {\n return x.localeCompare(y);\n }\n if (x === null || x === undefined) {\n return 1;\n }\n return x - y;\n };\n /**\n * Comparer function which is used to sort the data in descending order.\n *\n * @param {string|number} x\n * @param {string|number} y\n * @returns number\n */\n DataUtil.fnDescending = function (x, y) {\n if (isNullOrUndefined(x) && isNullOrUndefined(y)) {\n return -1;\n }\n if (y === null || y === undefined) {\n return 1;\n }\n if (typeof x === 'string') {\n return x.localeCompare(y) * -1;\n }\n if (x === null || x === undefined) {\n return -1;\n }\n return y - x;\n };\n DataUtil.extractFields = function (obj, fields) {\n var newObj = {};\n for (var i = 0; i < fields.length; i++) {\n newObj = this.setValue(fields[i], this.getObject(fields[i], obj), newObj);\n }\n return newObj;\n };\n /**\n * Select objects by given fields from jsonArray.\n *\n * @param {Object[]} jsonArray\n * @param {string[]} fields\n */\n DataUtil.select = function (jsonArray, fields) {\n var newData = [];\n for (var i = 0; i < jsonArray.length; i++) {\n newData.push(this.extractFields(jsonArray[i], fields));\n }\n return newData;\n };\n /**\n * Group the input data based on the field name.\n * It also performs aggregation of the grouped records based on the aggregates paramater.\n *\n * @param {Object[]} jsonArray\n * @param {string} field?\n * @param {Object[]} agg?\n * @param {number} level?\n * @param {Object[]} groupDs?\n * @param field\n * @param aggregates\n * @param level\n * @param groupDs\n * @param format\n * @param isLazyLoad\n */\n DataUtil.group = function (jsonArray, field, aggregates, level, groupDs, format, isLazyLoad) {\n level = level || 1;\n var jsonData = jsonArray;\n var guid = 'GroupGuid';\n if (jsonData.GroupGuid === consts[guid]) {\n var _loop_1 = function (j) {\n if (!isNullOrUndefined(groupDs)) {\n var indx = -1;\n var temp = groupDs.filter(function (e) { return e.key === jsonData[j].key; });\n indx = groupDs.indexOf(temp[0]);\n jsonData[j].items = this_1.group(jsonData[j].items, field, aggregates, jsonData.level + 1, groupDs[indx].items, format, isLazyLoad);\n jsonData[j].count = groupDs[indx].count;\n }\n else {\n jsonData[j].items = this_1.group(jsonData[j].items, field, aggregates, jsonData.level + 1, null, format, isLazyLoad);\n jsonData[j].count = jsonData[j].items.length;\n }\n };\n var this_1 = this;\n for (var j = 0; j < jsonData.length; j++) {\n _loop_1(j);\n }\n jsonData.childLevels += 1;\n return jsonData;\n }\n var grouped = {};\n var groupedArray = [];\n groupedArray.GroupGuid = consts[guid];\n groupedArray.level = level;\n groupedArray.childLevels = 0;\n groupedArray.records = jsonData;\n var _loop_2 = function (i) {\n var val = this_2.getVal(jsonData, i, field);\n if (!isNullOrUndefined(format)) {\n val = format(val, field);\n }\n if (!grouped[val]) {\n grouped[val] = {\n key: val,\n count: 0,\n items: [],\n aggregates: {},\n field: field\n };\n groupedArray.push(grouped[val]);\n if (!isNullOrUndefined(groupDs)) {\n var tempObj = groupDs.filter(function (e) { return e.key === grouped[val].key; });\n grouped[val].count = tempObj[0].count;\n }\n }\n grouped[val].count = !isNullOrUndefined(groupDs) ? grouped[val].count : grouped[val].count += 1;\n if (!isLazyLoad || (isLazyLoad && aggregates.length)) {\n grouped[val].items.push(jsonData[i]);\n }\n };\n var this_2 = this;\n for (var i = 0; i < jsonData.length; i++) {\n _loop_2(i);\n }\n if (aggregates && aggregates.length) {\n var _loop_3 = function (i) {\n var res = {};\n var fn = void 0;\n var aggs = aggregates;\n for (var j = 0; j < aggregates.length; j++) {\n fn = DataUtil.aggregates[aggregates[j].type];\n if (!isNullOrUndefined(groupDs)) {\n var temp = groupDs.filter(function (e) { return e.key === groupedArray[i].key; });\n if (fn) {\n res[aggs[j].field + ' - ' + aggs[j].type] = fn(temp[0].items, aggs[j].field);\n }\n }\n else {\n if (fn) {\n res[aggs[j].field + ' - ' + aggs[j].type] = fn(groupedArray[i].items, aggs[j].field);\n }\n }\n }\n groupedArray[i].aggregates = res;\n };\n for (var i = 0; i < groupedArray.length; i++) {\n _loop_3(i);\n }\n }\n if (isLazyLoad && groupedArray.length && aggregates.length) {\n for (var i = 0; i < groupedArray.length; i++) {\n groupedArray[i].items = [];\n }\n }\n return jsonData.length && groupedArray || jsonData;\n };\n /**\n * It is used to categorize the multiple items based on a specific field in jsonArray.\n * The hierarchical queries are commonly required when you use foreign key binding.\n *\n * @param {string} fKey\n * @param {string} from\n * @param {Object[]} source\n * @param {Group} lookup?\n * @param {string} pKey?\n * @param lookup\n * @param pKey\n * @hidden\n */\n DataUtil.buildHierarchy = function (fKey, from, source, lookup, pKey) {\n var i;\n var grp = {};\n var temp;\n if (lookup.result) {\n lookup = lookup.result;\n }\n if (lookup.GroupGuid) {\n this.throwError('DataManager: Do not have support Grouping in hierarchy');\n }\n for (i = 0; i < lookup.length; i++) {\n var fKeyData = this.getObject(fKey, lookup[i]);\n temp = grp[fKeyData] || (grp[fKeyData] = []);\n temp.push(lookup[i]);\n }\n for (i = 0; i < source.length; i++) {\n var fKeyData = this.getObject(pKey || fKey, source[i]);\n source[i][from] = grp[fKeyData];\n }\n };\n /**\n * The method used to get the field names which started with specified characters.\n *\n * @param {Object} obj\n * @param {string[]} fields?\n * @param {string} prefix?\n * @param fields\n * @param prefix\n * @hidden\n */\n DataUtil.getFieldList = function (obj, fields, prefix) {\n if (prefix === undefined) {\n prefix = '';\n }\n if (fields === undefined || fields === null) {\n return this.getFieldList(obj, [], prefix);\n }\n var copyObj = obj;\n var keys = Object.keys(obj);\n for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {\n var prop = keys_1[_i];\n if (typeof copyObj[prop] === 'object' && !(copyObj[prop] instanceof Array)) {\n this.getFieldList(copyObj[prop], fields, prefix + prop + '.');\n }\n else {\n fields.push(prefix + prop);\n }\n }\n return fields;\n };\n /**\n * Gets the value of the property in the given object.\n * The complex object can be accessed by providing the field names concatenated with dot(.).\n *\n * @param {string} nameSpace - The name of the property to be accessed.\n * @param {Object} from - Defines the source object.\n */\n DataUtil.getObject = function (nameSpace, from) {\n if (!nameSpace) {\n return from;\n }\n if (!from) {\n return undefined;\n }\n if (nameSpace.indexOf('.') === -1) {\n return from[nameSpace];\n }\n var value = from;\n var splits = nameSpace.split('.');\n for (var i = 0; i < splits.length; i++) {\n if (value == null) {\n break;\n }\n value = value[splits[i]];\n }\n return value;\n };\n /**\n * To set value for the nameSpace in desired object.\n *\n * @param {string} nameSpace - String value to the get the inner object.\n * @param {Object} value - Value that you need to set.\n * @param {Object} obj - Object to get the inner object value.\n * @return { [key: string]: Object; } | Object\n * @hidden\n */\n DataUtil.setValue = function (nameSpace, value, obj) {\n var keys = nameSpace.toString().split('.');\n var start = obj || {};\n var fromObj = start;\n var i;\n var length = keys.length;\n var key;\n for (i = 0; i < length; i++) {\n key = keys[i];\n if (i + 1 === length) {\n fromObj[key] = value === undefined ? undefined : value;\n }\n else if (isNullOrUndefined(fromObj[key])) {\n fromObj[key] = {};\n }\n fromObj = fromObj[key];\n }\n return start;\n };\n /**\n * Sort the given data based on the field and comparer.\n *\n * @param {Object[]} ds - Defines the input data.\n * @param {string} field - Defines the field to be sorted.\n * @param {Function} comparer - Defines the comparer function used to sort the records.\n */\n DataUtil.sort = function (ds, field, comparer) {\n if (ds.length <= 1) {\n return ds;\n }\n var middle = parseInt((ds.length / 2).toString(), 10);\n var left = ds.slice(0, middle);\n var right = ds.slice(middle);\n left = this.sort(left, field, comparer);\n right = this.sort(right, field, comparer);\n return this.merge(left, right, field, comparer);\n };\n DataUtil.ignoreDiacritics = function (value) {\n if (typeof value !== 'string') {\n return value;\n }\n var result = value.split('');\n var newValue = result.map(function (temp) { return temp in DataUtil.diacritics ? DataUtil.diacritics[temp] : temp; });\n return newValue.join('');\n };\n DataUtil.merge = function (left, right, fieldName, comparer) {\n var result = [];\n var current;\n while (left.length > 0 || right.length > 0) {\n if (left.length > 0 && right.length > 0) {\n if (comparer) {\n current = comparer(this.getVal(left, 0, fieldName), this.getVal(right, 0, fieldName), left[0], right[0]) <= 0 ? left : right;\n }\n else {\n current = left[0][fieldName] < left[0][fieldName] ? left : right;\n }\n }\n else {\n current = left.length > 0 ? left : right;\n }\n result.push(current.shift());\n }\n return result;\n };\n DataUtil.getVal = function (array, index, field) {\n return field ? this.getObject(field, array[index]) : array[index];\n };\n DataUtil.toLowerCase = function (val) {\n return val ? typeof val === 'string' ? val.toLowerCase() : val.toString() : (val === 0 || val === false) ? val.toString() : '';\n };\n /**\n * To perform the filter operation with specified adaptor and returns the result.\n *\n * @param {Object} adaptor\n * @param {string} fnName\n * @param {Object} param1?\n * @param {Object} param2?\n * @param param1\n * @param param2\n * @hidden\n */\n DataUtil.callAdaptorFunction = function (adaptor, fnName, param1, param2) {\n if (fnName in adaptor) {\n var res = adaptor[fnName](param1, param2);\n if (!isNullOrUndefined(res)) {\n param1 = res;\n }\n }\n return param1;\n };\n DataUtil.getAddParams = function (adp, dm, query) {\n var req = {};\n DataUtil.callAdaptorFunction(adp, 'addParams', {\n dm: dm,\n query: query,\n params: query.params,\n reqParams: req\n });\n return req;\n };\n /**\n * Checks wheather the given input is a plain object or not.\n *\n * @param {Object|Object[]} obj\n */\n DataUtil.isPlainObject = function (obj) {\n return (!!obj) && (obj.constructor === Object);\n };\n /**\n * Returns true when the browser cross origin request.\n */\n DataUtil.isCors = function () {\n var xhr = null;\n var request = 'XMLHttpRequest';\n try {\n xhr = new window[request]();\n }\n catch (e) {\n // No exception handling\n }\n return !!xhr && ('withCredentials' in xhr);\n };\n /**\n * Generate random GUID value which will be prefixed with the given value.\n *\n * @param {string} prefix\n */\n DataUtil.getGuid = function (prefix) {\n var hexs = '0123456789abcdef';\n var rand;\n return (prefix || '') + '00000000-0000-4000-0000-000000000000'.replace(/0/g, function (val, i) {\n if ('crypto' in window && 'getRandomValues' in crypto) {\n var arr = new Uint8Array(1);\n window.crypto.getRandomValues(arr);\n rand = arr[0] % 16 | 0;\n }\n else {\n rand = Math.random() * 16 | 0;\n }\n return hexs[i === 19 ? rand & 0x3 | 0x8 : rand];\n });\n };\n /**\n * Checks wheather the given value is null or not.\n *\n * @param {string|Object} val\n * @returns boolean\n */\n DataUtil.isNull = function (val) {\n return val === undefined || val === null;\n };\n /**\n * To get the required items from collection of objects.\n *\n * @param {Object[]} array\n * @param {string} field\n * @param {Function} comparer\n * @returns Object\n * @hidden\n */\n DataUtil.getItemFromComparer = function (array, field, comparer) {\n var keyVal;\n var current;\n var key;\n var i = 0;\n var castRequired = typeof DataUtil.getVal(array, 0, field) === 'string';\n if (array.length) {\n while (isNullOrUndefined(keyVal) && i < array.length) {\n keyVal = DataUtil.getVal(array, i, field);\n key = array[i++];\n }\n }\n for (; i < array.length; i++) {\n current = DataUtil.getVal(array, i, field);\n if (isNullOrUndefined(current)) {\n continue;\n }\n if (castRequired) {\n keyVal = +keyVal;\n current = +current;\n }\n if (comparer(keyVal, current) > 0) {\n keyVal = current;\n key = array[i];\n }\n }\n return key;\n };\n /**\n * To get distinct values of Array or Array of Objects.\n *\n * @param {Object[]} json\n * @param {string} field\n * @param fieldName\n * @param {boolean} requiresCompleteRecord\n * @returns Object[]\n * * distinct array of objects is return when requiresCompleteRecord set as true.\n * @hidden\n */\n DataUtil.distinct = function (json, fieldName, requiresCompleteRecord) {\n requiresCompleteRecord = isNullOrUndefined(requiresCompleteRecord) ? false : requiresCompleteRecord;\n var result = [];\n var val;\n var tmp = {};\n json.forEach(function (data, index) {\n val = typeof (json[index]) === 'object' ? DataUtil.getVal(json, index, fieldName) : json[index];\n if (!(val in tmp)) {\n result.push(!requiresCompleteRecord ? val : json[index]);\n tmp[val] = 1;\n }\n });\n return result;\n };\n /**\n * Process the given records based on the datamanager string.\n *\n * @param {string} datamanager\n * @param dm\n * @param {Object[]} records\n */\n DataUtil.processData = function (dm, records) {\n var query = this.prepareQuery(dm);\n var sampledata = new DataManager(records);\n if (dm.requiresCounts) {\n query.requiresCount();\n }\n /* eslint-disable @typescript-eslint/no-explicit-any */\n // tslint:disable-next-line:no-any\n var result = sampledata.executeLocal(query);\n /* eslint-enable @typescript-eslint/no-explicit-any */\n var returnValue = {\n result: dm.requiresCounts ? result.result : result,\n count: result.count,\n aggregates: JSON.stringify(result.aggregates)\n };\n return dm.requiresCounts ? returnValue : result;\n };\n DataUtil.prepareQuery = function (dm) {\n var _this = this;\n var query = new Query();\n if (dm.select) {\n query.select(dm.select);\n }\n if (dm.where) {\n var where = DataUtil.parse.parseJson(dm.where);\n where.filter(function (pred) {\n if (isNullOrUndefined(pred.condition)) {\n query.where(pred.field, pred.operator, pred.value, pred.ignoreCase, pred.ignoreAccent);\n }\n else {\n var predicateList = [];\n if (pred.field) {\n predicateList.push(new Predicate(pred.field, pred.operator, pred.value, pred.ignoreCase, pred.ignoreAccent));\n }\n else {\n predicateList = predicateList.concat(_this.getPredicate(pred.predicates));\n }\n if (pred.condition === 'or') {\n query.where(Predicate.or(predicateList));\n }\n else if (pred.condition === 'and') {\n query.where(Predicate.and(predicateList));\n }\n }\n });\n }\n if (dm.search) {\n var search = DataUtil.parse.parseJson(dm.search);\n // tslint:disable-next-line:no-string-literal\n search.filter(function (e) { return query.search(e.key, e.fields, e['operator'], \n // tslint:disable-next-line:no-string-literal\n e['ignoreCase'], e['ignoreAccent']); });\n }\n if (dm.aggregates) {\n dm.aggregates.filter(function (e) { return query.aggregate(e.type, e.field); });\n }\n if (dm.sorted) {\n dm.sorted.filter(function (e) { return query.sortBy(e.name, e.direction); });\n }\n if (dm.skip) {\n query.skip(dm.skip);\n }\n if (dm.take) {\n query.take(dm.take);\n }\n if (dm.group) {\n dm.group.filter(function (grp) { return query.group(grp); });\n }\n return query;\n };\n DataUtil.getPredicate = function (pred) {\n var mainPred = [];\n for (var i = 0; i < pred.length; i++) {\n var e = pred[i];\n if (e.field) {\n mainPred.push(new Predicate(e.field, e.operator, e.value, e.ignoreCase, e.ignoreAccent));\n }\n else {\n var childPred = [];\n // tslint:disable-next-line:typedef\n var cpre = this.getPredicate(e.predicates);\n for (var _i = 0, _a = Object.keys(cpre); _i < _a.length; _i++) {\n var prop = _a[_i];\n childPred.push(cpre[prop]);\n }\n mainPred.push(e.condition === 'or' ? Predicate.or(childPred) : Predicate.and(childPred));\n }\n }\n return mainPred;\n };\n /**\n * Specifies the value which will be used to adjust the date value to server timezone.\n *\n * @default null\n */\n DataUtil.serverTimezoneOffset = null;\n /**\n * Species whether are not to be parsed with serverTimezoneOffset value.\n *\n * @hidden\n */\n DataUtil.timeZoneHandling = true;\n /**\n * Throw error with the given string as message.\n *\n * @param {string} er\n * @param error\n */\n DataUtil.throwError = function (error) {\n try {\n throw new Error(error);\n }\n catch (e) {\n // eslint-disable-next-line no-throw-literal\n throw e.message + '\\n' + e.stack;\n }\n };\n DataUtil.aggregates = {\n /**\n * Calculate sum of the given field in the data.\n *\n * @param {Object[]} ds\n * @param {string} field\n */\n sum: function (ds, field) {\n var result = 0;\n var val;\n var castRequired = typeof DataUtil.getVal(ds, 0, field) !== 'number';\n for (var i = 0; i < ds.length; i++) {\n val = DataUtil.getVal(ds, i, field);\n if (!isNaN(val) && val !== null) {\n if (castRequired) {\n val = +val;\n }\n result += val;\n }\n }\n return result;\n },\n /**\n * Calculate average value of the given field in the data.\n *\n * @param {Object[]} ds\n * @param {string} field\n */\n average: function (ds, field) {\n return DataUtil.aggregates.sum(ds, field) / ds.length;\n },\n /**\n * Returns the min value of the data based on the field.\n *\n * @param {Object[]} ds\n * @param {string|Function} field\n */\n min: function (ds, field) {\n var comparer;\n if (typeof field === 'function') {\n comparer = field;\n field = null;\n }\n return DataUtil.getObject(field, DataUtil.getItemFromComparer(ds, field, comparer || DataUtil.fnAscending));\n },\n /**\n * Returns the max value of the data based on the field.\n *\n * @param {Object[]} ds\n * @param {string} field\n * @returns number\n */\n max: function (ds, field) {\n var comparer;\n if (typeof field === 'function') {\n comparer = field;\n field = null;\n }\n return DataUtil.getObject(field, DataUtil.getItemFromComparer(ds, field, comparer || DataUtil.fnDescending));\n },\n /**\n * Returns the total number of true value present in the data based on the given boolean field name.\n *\n * @param {Object[]} ds\n * @param {string} field\n */\n truecount: function (ds, field) {\n return new DataManager(ds).executeLocal(new Query().where(field, 'equal', true, true)).length;\n },\n /**\n * Returns the total number of false value present in the data based on the given boolean field name.\n *\n * @param {Object[]} ds\n * @param {string} field\n */\n falsecount: function (ds, field) {\n return new DataManager(ds).executeLocal(new Query().where(field, 'equal', false, true)).length;\n },\n /**\n * Returns the length of the given data.\n *\n * @param {Object[]} ds\n * @param {string} field?\n * @param field\n * @returns number\n */\n count: function (ds, field) {\n return ds.length;\n }\n };\n /**\n * Specifies the Object with filter operators.\n */\n DataUtil.operatorSymbols = {\n '<': 'lessthan',\n '>': 'greaterthan',\n '<=': 'lessthanorequal',\n '>=': 'greaterthanorequal',\n '==': 'equal',\n '!=': 'notequal',\n '*=': 'contains',\n '$=': 'endswith',\n '^=': 'startswith'\n };\n /**\n * Specifies the Object with filter operators which will be used for OData filter query generation.\n * * It will be used for date/number type filter query.\n */\n DataUtil.odBiOperator = {\n '<': ' lt ',\n '>': ' gt ',\n '<=': ' le ',\n '>=': ' ge ',\n '==': ' eq ',\n '!=': ' ne ',\n 'lessthan': ' lt ',\n 'lessthanorequal': ' le ',\n 'greaterthan': ' gt ',\n 'greaterthanorequal': ' ge ',\n 'equal': ' eq ',\n 'notequal': ' ne '\n };\n /**\n * Specifies the Object with filter operators which will be used for OData filter query generation.\n * It will be used for string type filter query.\n */\n DataUtil.odUniOperator = {\n '$=': 'endswith',\n '^=': 'startswith',\n '*=': 'substringof',\n 'endswith': 'endswith',\n 'startswith': 'startswith',\n 'contains': 'substringof',\n 'doesnotendwith': 'not endswith',\n 'doesnotstartwith': 'not startswith',\n 'doesnotcontain': 'not substringof',\n 'wildcard': 'wildcard',\n 'like': 'like'\n };\n /**\n * Specifies the Object with filter operators which will be used for ODataV4 filter query generation.\n * It will be used for string type filter query.\n */\n DataUtil.odv4UniOperator = {\n '$=': 'endswith',\n '^=': 'startswith',\n '*=': 'contains',\n 'endswith': 'endswith',\n 'startswith': 'startswith',\n 'contains': 'contains',\n 'doesnotendwith': 'not endswith',\n 'doesnotstartwith': 'not startswith',\n 'doesnotcontain': 'not contains',\n 'wildcard': 'wildcard',\n 'like': 'like'\n };\n DataUtil.diacritics = {\n '\\u24B6': 'A',\n '\\uFF21': 'A',\n '\\u00C0': 'A',\n '\\u00C1': 'A',\n '\\u00C2': 'A',\n '\\u1EA6': 'A',\n '\\u1EA4': 'A',\n '\\u1EAA': 'A',\n '\\u1EA8': 'A',\n '\\u00C3': 'A',\n '\\u0100': 'A',\n '\\u0102': 'A',\n '\\u1EB0': 'A',\n '\\u1EAE': 'A',\n '\\u1EB4': 'A',\n '\\u1EB2': 'A',\n '\\u0226': 'A',\n '\\u01E0': 'A',\n '\\u00C4': 'A',\n '\\u01DE': 'A',\n '\\u1EA2': 'A',\n '\\u00C5': 'A',\n '\\u01FA': 'A',\n '\\u01CD': 'A',\n '\\u0200': 'A',\n '\\u0202': 'A',\n '\\u1EA0': 'A',\n '\\u1EAC': 'A',\n '\\u1EB6': 'A',\n '\\u1E00': 'A',\n '\\u0104': 'A',\n '\\u023A': 'A',\n '\\u2C6F': 'A',\n '\\uA732': 'AA',\n '\\u00C6': 'AE',\n '\\u01FC': 'AE',\n '\\u01E2': 'AE',\n '\\uA734': 'AO',\n '\\uA736': 'AU',\n '\\uA738': 'AV',\n '\\uA73A': 'AV',\n '\\uA73C': 'AY',\n '\\u24B7': 'B',\n '\\uFF22': 'B',\n '\\u1E02': 'B',\n '\\u1E04': 'B',\n '\\u1E06': 'B',\n '\\u0243': 'B',\n '\\u0182': 'B',\n '\\u0181': 'B',\n '\\u24B8': 'C',\n '\\uFF23': 'C',\n '\\u0106': 'C',\n '\\u0108': 'C',\n '\\u010A': 'C',\n '\\u010C': 'C',\n '\\u00C7': 'C',\n '\\u1E08': 'C',\n '\\u0187': 'C',\n '\\u023B': 'C',\n '\\uA73E': 'C',\n '\\u24B9': 'D',\n '\\uFF24': 'D',\n '\\u1E0A': 'D',\n '\\u010E': 'D',\n '\\u1E0C': 'D',\n '\\u1E10': 'D',\n '\\u1E12': 'D',\n '\\u1E0E': 'D',\n '\\u0110': 'D',\n '\\u018B': 'D',\n '\\u018A': 'D',\n '\\u0189': 'D',\n '\\uA779': 'D',\n '\\u01F1': 'DZ',\n '\\u01C4': 'DZ',\n '\\u01F2': 'Dz',\n '\\u01C5': 'Dz',\n '\\u24BA': 'E',\n '\\uFF25': 'E',\n '\\u00C8': 'E',\n '\\u00C9': 'E',\n '\\u00CA': 'E',\n '\\u1EC0': 'E',\n '\\u1EBE': 'E',\n '\\u1EC4': 'E',\n '\\u1EC2': 'E',\n '\\u1EBC': 'E',\n '\\u0112': 'E',\n '\\u1E14': 'E',\n '\\u1E16': 'E',\n '\\u0114': 'E',\n '\\u0116': 'E',\n '\\u00CB': 'E',\n '\\u1EBA': 'E',\n '\\u011A': 'E',\n '\\u0204': 'E',\n '\\u0206': 'E',\n '\\u1EB8': 'E',\n '\\u1EC6': 'E',\n '\\u0228': 'E',\n '\\u1E1C': 'E',\n '\\u0118': 'E',\n '\\u1E18': 'E',\n '\\u1E1A': 'E',\n '\\u0190': 'E',\n '\\u018E': 'E',\n '\\u24BB': 'F',\n '\\uFF26': 'F',\n '\\u1E1E': 'F',\n '\\u0191': 'F',\n '\\uA77B': 'F',\n '\\u24BC': 'G',\n '\\uFF27': 'G',\n '\\u01F4': 'G',\n '\\u011C': 'G',\n '\\u1E20': 'G',\n '\\u011E': 'G',\n '\\u0120': 'G',\n '\\u01E6': 'G',\n '\\u0122': 'G',\n '\\u01E4': 'G',\n '\\u0193': 'G',\n '\\uA7A0': 'G',\n '\\uA77D': 'G',\n '\\uA77E': 'G',\n '\\u24BD': 'H',\n '\\uFF28': 'H',\n '\\u0124': 'H',\n '\\u1E22': 'H',\n '\\u1E26': 'H',\n '\\u021E': 'H',\n '\\u1E24': 'H',\n '\\u1E28': 'H',\n '\\u1E2A': 'H',\n '\\u0126': 'H',\n '\\u2C67': 'H',\n '\\u2C75': 'H',\n '\\uA78D': 'H',\n '\\u24BE': 'I',\n '\\uFF29': 'I',\n '\\u00CC': 'I',\n '\\u00CD': 'I',\n '\\u00CE': 'I',\n '\\u0128': 'I',\n '\\u012A': 'I',\n '\\u012C': 'I',\n '\\u0130': 'I',\n '\\u00CF': 'I',\n '\\u1E2E': 'I',\n '\\u1EC8': 'I',\n '\\u01CF': 'I',\n '\\u0208': 'I',\n '\\u020A': 'I',\n '\\u1ECA': 'I',\n '\\u012E': 'I',\n '\\u1E2C': 'I',\n '\\u0197': 'I',\n '\\u24BF': 'J',\n '\\uFF2A': 'J',\n '\\u0134': 'J',\n '\\u0248': 'J',\n '\\u24C0': 'K',\n '\\uFF2B': 'K',\n '\\u1E30': 'K',\n '\\u01E8': 'K',\n '\\u1E32': 'K',\n '\\u0136': 'K',\n '\\u1E34': 'K',\n '\\u0198': 'K',\n '\\u2C69': 'K',\n '\\uA740': 'K',\n '\\uA742': 'K',\n '\\uA744': 'K',\n '\\uA7A2': 'K',\n '\\u24C1': 'L',\n '\\uFF2C': 'L',\n '\\u013F': 'L',\n '\\u0139': 'L',\n '\\u013D': 'L',\n '\\u1E36': 'L',\n '\\u1E38': 'L',\n '\\u013B': 'L',\n '\\u1E3C': 'L',\n '\\u1E3A': 'L',\n '\\u0141': 'L',\n '\\u023D': 'L',\n '\\u2C62': 'L',\n '\\u2C60': 'L',\n '\\uA748': 'L',\n '\\uA746': 'L',\n '\\uA780': 'L',\n '\\u01C7': 'LJ',\n '\\u01C8': 'Lj',\n '\\u24C2': 'M',\n '\\uFF2D': 'M',\n '\\u1E3E': 'M',\n '\\u1E40': 'M',\n '\\u1E42': 'M',\n '\\u2C6E': 'M',\n '\\u019C': 'M',\n '\\u24C3': 'N',\n '\\uFF2E': 'N',\n '\\u01F8': 'N',\n '\\u0143': 'N',\n '\\u00D1': 'N',\n '\\u1E44': 'N',\n '\\u0147': 'N',\n '\\u1E46': 'N',\n '\\u0145': 'N',\n '\\u1E4A': 'N',\n '\\u1E48': 'N',\n '\\u0220': 'N',\n '\\u019D': 'N',\n '\\uA790': 'N',\n '\\uA7A4': 'N',\n '\\u01CA': 'NJ',\n '\\u01CB': 'Nj',\n '\\u24C4': 'O',\n '\\uFF2F': 'O',\n '\\u00D2': 'O',\n '\\u00D3': 'O',\n '\\u00D4': 'O',\n '\\u1ED2': 'O',\n '\\u1ED0': 'O',\n '\\u1ED6': 'O',\n '\\u1ED4': 'O',\n '\\u00D5': 'O',\n '\\u1E4C': 'O',\n '\\u022C': 'O',\n '\\u1E4E': 'O',\n '\\u014C': 'O',\n '\\u1E50': 'O',\n '\\u1E52': 'O',\n '\\u014E': 'O',\n '\\u022E': 'O',\n '\\u0230': 'O',\n '\\u00D6': 'O',\n '\\u022A': 'O',\n '\\u1ECE': 'O',\n '\\u0150': 'O',\n '\\u01D1': 'O',\n '\\u020C': 'O',\n '\\u020E': 'O',\n '\\u01A0': 'O',\n '\\u1EDC': 'O',\n '\\u1EDA': 'O',\n '\\u1EE0': 'O',\n '\\u1EDE': 'O',\n '\\u1EE2': 'O',\n '\\u1ECC': 'O',\n '\\u1ED8': 'O',\n '\\u01EA': 'O',\n '\\u01EC': 'O',\n '\\u00D8': 'O',\n '\\u01FE': 'O',\n '\\u0186': 'O',\n '\\u019F': 'O',\n '\\uA74A': 'O',\n '\\uA74C': 'O',\n '\\u01A2': 'OI',\n '\\uA74E': 'OO',\n '\\u0222': 'OU',\n '\\u24C5': 'P',\n '\\uFF30': 'P',\n '\\u1E54': 'P',\n '\\u1E56': 'P',\n '\\u01A4': 'P',\n '\\u2C63': 'P',\n '\\uA750': 'P',\n '\\uA752': 'P',\n '\\uA754': 'P',\n '\\u24C6': 'Q',\n '\\uFF31': 'Q',\n '\\uA756': 'Q',\n '\\uA758': 'Q',\n '\\u024A': 'Q',\n '\\u24C7': 'R',\n '\\uFF32': 'R',\n '\\u0154': 'R',\n '\\u1E58': 'R',\n '\\u0158': 'R',\n '\\u0210': 'R',\n '\\u0212': 'R',\n '\\u1E5A': 'R',\n '\\u1E5C': 'R',\n '\\u0156': 'R',\n '\\u1E5E': 'R',\n '\\u024C': 'R',\n '\\u2C64': 'R',\n '\\uA75A': 'R',\n '\\uA7A6': 'R',\n '\\uA782': 'R',\n '\\u24C8': 'S',\n '\\uFF33': 'S',\n '\\u1E9E': 'S',\n '\\u015A': 'S',\n '\\u1E64': 'S',\n '\\u015C': 'S',\n '\\u1E60': 'S',\n '\\u0160': 'S',\n '\\u1E66': 'S',\n '\\u1E62': 'S',\n '\\u1E68': 'S',\n '\\u0218': 'S',\n '\\u015E': 'S',\n '\\u2C7E': 'S',\n '\\uA7A8': 'S',\n '\\uA784': 'S',\n '\\u24C9': 'T',\n '\\uFF34': 'T',\n '\\u1E6A': 'T',\n '\\u0164': 'T',\n '\\u1E6C': 'T',\n '\\u021A': 'T',\n '\\u0162': 'T',\n '\\u1E70': 'T',\n '\\u1E6E': 'T',\n '\\u0166': 'T',\n '\\u01AC': 'T',\n '\\u01AE': 'T',\n '\\u023E': 'T',\n '\\uA786': 'T',\n '\\uA728': 'TZ',\n '\\u24CA': 'U',\n '\\uFF35': 'U',\n '\\u00D9': 'U',\n '\\u00DA': 'U',\n '\\u00DB': 'U',\n '\\u0168': 'U',\n '\\u1E78': 'U',\n '\\u016A': 'U',\n '\\u1E7A': 'U',\n '\\u016C': 'U',\n '\\u00DC': 'U',\n '\\u01DB': 'U',\n '\\u01D7': 'U',\n '\\u01D5': 'U',\n '\\u01D9': 'U',\n '\\u1EE6': 'U',\n '\\u016E': 'U',\n '\\u0170': 'U',\n '\\u01D3': 'U',\n '\\u0214': 'U',\n '\\u0216': 'U',\n '\\u01AF': 'U',\n '\\u1EEA': 'U',\n '\\u1EE8': 'U',\n '\\u1EEE': 'U',\n '\\u1EEC': 'U',\n '\\u1EF0': 'U',\n '\\u1EE4': 'U',\n '\\u1E72': 'U',\n '\\u0172': 'U',\n '\\u1E76': 'U',\n '\\u1E74': 'U',\n '\\u0244': 'U',\n '\\u24CB': 'V',\n '\\uFF36': 'V',\n '\\u1E7C': 'V',\n '\\u1E7E': 'V',\n '\\u01B2': 'V',\n '\\uA75E': 'V',\n '\\u0245': 'V',\n '\\uA760': 'VY',\n '\\u24CC': 'W',\n '\\uFF37': 'W',\n '\\u1E80': 'W',\n '\\u1E82': 'W',\n '\\u0174': 'W',\n '\\u1E86': 'W',\n '\\u1E84': 'W',\n '\\u1E88': 'W',\n '\\u2C72': 'W',\n '\\u24CD': 'X',\n '\\uFF38': 'X',\n '\\u1E8A': 'X',\n '\\u1E8C': 'X',\n '\\u24CE': 'Y',\n '\\uFF39': 'Y',\n '\\u1EF2': 'Y',\n '\\u00DD': 'Y',\n '\\u0176': 'Y',\n '\\u1EF8': 'Y',\n '\\u0232': 'Y',\n '\\u1E8E': 'Y',\n '\\u0178': 'Y',\n '\\u1EF6': 'Y',\n '\\u1EF4': 'Y',\n '\\u01B3': 'Y',\n '\\u024E': 'Y',\n '\\u1EFE': 'Y',\n '\\u24CF': 'Z',\n '\\uFF3A': 'Z',\n '\\u0179': 'Z',\n '\\u1E90': 'Z',\n '\\u017B': 'Z',\n '\\u017D': 'Z',\n '\\u1E92': 'Z',\n '\\u1E94': 'Z',\n '\\u01B5': 'Z',\n '\\u0224': 'Z',\n '\\u2C7F': 'Z',\n '\\u2C6B': 'Z',\n '\\uA762': 'Z',\n '\\u24D0': 'a',\n '\\uFF41': 'a',\n '\\u1E9A': 'a',\n '\\u00E0': 'a',\n '\\u00E1': 'a',\n '\\u00E2': 'a',\n '\\u1EA7': 'a',\n '\\u1EA5': 'a',\n '\\u1EAB': 'a',\n '\\u1EA9': 'a',\n '\\u00E3': 'a',\n '\\u0101': 'a',\n '\\u0103': 'a',\n '\\u1EB1': 'a',\n '\\u1EAF': 'a',\n '\\u1EB5': 'a',\n '\\u1EB3': 'a',\n '\\u0227': 'a',\n '\\u01E1': 'a',\n '\\u00E4': 'a',\n '\\u01DF': 'a',\n '\\u1EA3': 'a',\n '\\u00E5': 'a',\n '\\u01FB': 'a',\n '\\u01CE': 'a',\n '\\u0201': 'a',\n '\\u0203': 'a',\n '\\u1EA1': 'a',\n '\\u1EAD': 'a',\n '\\u1EB7': 'a',\n '\\u1E01': 'a',\n '\\u0105': 'a',\n '\\u2C65': 'a',\n '\\u0250': 'a',\n '\\uA733': 'aa',\n '\\u00E6': 'ae',\n '\\u01FD': 'ae',\n '\\u01E3': 'ae',\n '\\uA735': 'ao',\n '\\uA737': 'au',\n '\\uA739': 'av',\n '\\uA73B': 'av',\n '\\uA73D': 'ay',\n '\\u24D1': 'b',\n '\\uFF42': 'b',\n '\\u1E03': 'b',\n '\\u1E05': 'b',\n '\\u1E07': 'b',\n '\\u0180': 'b',\n '\\u0183': 'b',\n '\\u0253': 'b',\n '\\u24D2': 'c',\n '\\uFF43': 'c',\n '\\u0107': 'c',\n '\\u0109': 'c',\n '\\u010B': 'c',\n '\\u010D': 'c',\n '\\u00E7': 'c',\n '\\u1E09': 'c',\n '\\u0188': 'c',\n '\\u023C': 'c',\n '\\uA73F': 'c',\n '\\u2184': 'c',\n '\\u24D3': 'd',\n '\\uFF44': 'd',\n '\\u1E0B': 'd',\n '\\u010F': 'd',\n '\\u1E0D': 'd',\n '\\u1E11': 'd',\n '\\u1E13': 'd',\n '\\u1E0F': 'd',\n '\\u0111': 'd',\n '\\u018C': 'd',\n '\\u0256': 'd',\n '\\u0257': 'd',\n '\\uA77A': 'd',\n '\\u01F3': 'dz',\n '\\u01C6': 'dz',\n '\\u24D4': 'e',\n '\\uFF45': 'e',\n '\\u00E8': 'e',\n '\\u00E9': 'e',\n '\\u00EA': 'e',\n '\\u1EC1': 'e',\n '\\u1EBF': 'e',\n '\\u1EC5': 'e',\n '\\u1EC3': 'e',\n '\\u1EBD': 'e',\n '\\u0113': 'e',\n '\\u1E15': 'e',\n '\\u1E17': 'e',\n '\\u0115': 'e',\n '\\u0117': 'e',\n '\\u00EB': 'e',\n '\\u1EBB': 'e',\n '\\u011B': 'e',\n '\\u0205': 'e',\n '\\u0207': 'e',\n '\\u1EB9': 'e',\n '\\u1EC7': 'e',\n '\\u0229': 'e',\n '\\u1E1D': 'e',\n '\\u0119': 'e',\n '\\u1E19': 'e',\n '\\u1E1B': 'e',\n '\\u0247': 'e',\n '\\u025B': 'e',\n '\\u01DD': 'e',\n '\\u24D5': 'f',\n '\\uFF46': 'f',\n '\\u1E1F': 'f',\n '\\u0192': 'f',\n '\\uA77C': 'f',\n '\\u24D6': 'g',\n '\\uFF47': 'g',\n '\\u01F5': 'g',\n '\\u011D': 'g',\n '\\u1E21': 'g',\n '\\u011F': 'g',\n '\\u0121': 'g',\n '\\u01E7': 'g',\n '\\u0123': 'g',\n '\\u01E5': 'g',\n '\\u0260': 'g',\n '\\uA7A1': 'g',\n '\\u1D79': 'g',\n '\\uA77F': 'g',\n '\\u24D7': 'h',\n '\\uFF48': 'h',\n '\\u0125': 'h',\n '\\u1E23': 'h',\n '\\u1E27': 'h',\n '\\u021F': 'h',\n '\\u1E25': 'h',\n '\\u1E29': 'h',\n '\\u1E2B': 'h',\n '\\u1E96': 'h',\n '\\u0127': 'h',\n '\\u2C68': 'h',\n '\\u2C76': 'h',\n '\\u0265': 'h',\n '\\u0195': 'hv',\n '\\u24D8': 'i',\n '\\uFF49': 'i',\n '\\u00EC': 'i',\n '\\u00ED': 'i',\n '\\u00EE': 'i',\n '\\u0129': 'i',\n '\\u012B': 'i',\n '\\u012D': 'i',\n '\\u00EF': 'i',\n '\\u1E2F': 'i',\n '\\u1EC9': 'i',\n '\\u01D0': 'i',\n '\\u0209': 'i',\n '\\u020B': 'i',\n '\\u1ECB': 'i',\n '\\u012F': 'i',\n '\\u1E2D': 'i',\n '\\u0268': 'i',\n '\\u0131': 'i',\n '\\u24D9': 'j',\n '\\uFF4A': 'j',\n '\\u0135': 'j',\n '\\u01F0': 'j',\n '\\u0249': 'j',\n '\\u24DA': 'k',\n '\\uFF4B': 'k',\n '\\u1E31': 'k',\n '\\u01E9': 'k',\n '\\u1E33': 'k',\n '\\u0137': 'k',\n '\\u1E35': 'k',\n '\\u0199': 'k',\n '\\u2C6A': 'k',\n '\\uA741': 'k',\n '\\uA743': 'k',\n '\\uA745': 'k',\n '\\uA7A3': 'k',\n '\\u24DB': 'l',\n '\\uFF4C': 'l',\n '\\u0140': 'l',\n '\\u013A': 'l',\n '\\u013E': 'l',\n '\\u1E37': 'l',\n '\\u1E39': 'l',\n '\\u013C': 'l',\n '\\u1E3D': 'l',\n '\\u1E3B': 'l',\n '\\u017F': 'l',\n '\\u0142': 'l',\n '\\u019A': 'l',\n '\\u026B': 'l',\n '\\u2C61': 'l',\n '\\uA749': 'l',\n '\\uA781': 'l',\n '\\uA747': 'l',\n '\\u01C9': 'lj',\n '\\u24DC': 'm',\n '\\uFF4D': 'm',\n '\\u1E3F': 'm',\n '\\u1E41': 'm',\n '\\u1E43': 'm',\n '\\u0271': 'm',\n '\\u026F': 'm',\n '\\u24DD': 'n',\n '\\uFF4E': 'n',\n '\\u01F9': 'n',\n '\\u0144': 'n',\n '\\u00F1': 'n',\n '\\u1E45': 'n',\n '\\u0148': 'n',\n '\\u1E47': 'n',\n '\\u0146': 'n',\n '\\u1E4B': 'n',\n '\\u1E49': 'n',\n '\\u019E': 'n',\n '\\u0272': 'n',\n '\\u0149': 'n',\n '\\uA791': 'n',\n '\\uA7A5': 'n',\n '\\u01CC': 'nj',\n '\\u24DE': 'o',\n '\\uFF4F': 'o',\n '\\u00F2': 'o',\n '\\u00F3': 'o',\n '\\u00F4': 'o',\n '\\u1ED3': 'o',\n '\\u1ED1': 'o',\n '\\u1ED7': 'o',\n '\\u1ED5': 'o',\n '\\u00F5': 'o',\n '\\u1E4D': 'o',\n '\\u022D': 'o',\n '\\u1E4F': 'o',\n '\\u014D': 'o',\n '\\u1E51': 'o',\n '\\u1E53': 'o',\n '\\u014F': 'o',\n '\\u022F': 'o',\n '\\u0231': 'o',\n '\\u00F6': 'o',\n '\\u022B': 'o',\n '\\u1ECF': 'o',\n '\\u0151': 'o',\n '\\u01D2': 'o',\n '\\u020D': 'o',\n '\\u020F': 'o',\n '\\u01A1': 'o',\n '\\u1EDD': 'o',\n '\\u1EDB': 'o',\n '\\u1EE1': 'o',\n '\\u1EDF': 'o',\n '\\u1EE3': 'o',\n '\\u1ECD': 'o',\n '\\u1ED9': 'o',\n '\\u01EB': 'o',\n '\\u01ED': 'o',\n '\\u00F8': 'o',\n '\\u01FF': 'o',\n '\\u0254': 'o',\n '\\uA74B': 'o',\n '\\uA74D': 'o',\n '\\u0275': 'o',\n '\\u01A3': 'oi',\n '\\u0223': 'ou',\n '\\uA74F': 'oo',\n '\\u24DF': 'p',\n '\\uFF50': 'p',\n '\\u1E55': 'p',\n '\\u1E57': 'p',\n '\\u01A5': 'p',\n '\\u1D7D': 'p',\n '\\uA751': 'p',\n '\\uA753': 'p',\n '\\uA755': 'p',\n '\\u24E0': 'q',\n '\\uFF51': 'q',\n '\\u024B': 'q',\n '\\uA757': 'q',\n '\\uA759': 'q',\n '\\u24E1': 'r',\n '\\uFF52': 'r',\n '\\u0155': 'r',\n '\\u1E59': 'r',\n '\\u0159': 'r',\n '\\u0211': 'r',\n '\\u0213': 'r',\n '\\u1E5B': 'r',\n '\\u1E5D': 'r',\n '\\u0157': 'r',\n '\\u1E5F': 'r',\n '\\u024D': 'r',\n '\\u027D': 'r',\n '\\uA75B': 'r',\n '\\uA7A7': 'r',\n '\\uA783': 'r',\n '\\u24E2': 's',\n '\\uFF53': 's',\n '\\u00DF': 's',\n '\\u015B': 's',\n '\\u1E65': 's',\n '\\u015D': 's',\n '\\u1E61': 's',\n '\\u0161': 's',\n '\\u1E67': 's',\n '\\u1E63': 's',\n '\\u1E69': 's',\n '\\u0219': 's',\n '\\u015F': 's',\n '\\u023F': 's',\n '\\uA7A9': 's',\n '\\uA785': 's',\n '\\u1E9B': 's',\n '\\u24E3': 't',\n '\\uFF54': 't',\n '\\u1E6B': 't',\n '\\u1E97': 't',\n '\\u0165': 't',\n '\\u1E6D': 't',\n '\\u021B': 't',\n '\\u0163': 't',\n '\\u1E71': 't',\n '\\u1E6F': 't',\n '\\u0167': 't',\n '\\u01AD': 't',\n '\\u0288': 't',\n '\\u2C66': 't',\n '\\uA787': 't',\n '\\uA729': 'tz',\n '\\u24E4': 'u',\n '\\uFF55': 'u',\n '\\u00F9': 'u',\n '\\u00FA': 'u',\n '\\u00FB': 'u',\n '\\u0169': 'u',\n '\\u1E79': 'u',\n '\\u016B': 'u',\n '\\u1E7B': 'u',\n '\\u016D': 'u',\n '\\u00FC': 'u',\n '\\u01DC': 'u',\n '\\u01D8': 'u',\n '\\u01D6': 'u',\n '\\u01DA': 'u',\n '\\u1EE7': 'u',\n '\\u016F': 'u',\n '\\u0171': 'u',\n '\\u01D4': 'u',\n '\\u0215': 'u',\n '\\u0217': 'u',\n '\\u01B0': 'u',\n '\\u1EEB': 'u',\n '\\u1EE9': 'u',\n '\\u1EEF': 'u',\n '\\u1EED': 'u',\n '\\u1EF1': 'u',\n '\\u1EE5': 'u',\n '\\u1E73': 'u',\n '\\u0173': 'u',\n '\\u1E77': 'u',\n '\\u1E75': 'u',\n '\\u0289': 'u',\n '\\u24E5': 'v',\n '\\uFF56': 'v',\n '\\u1E7D': 'v',\n '\\u1E7F': 'v',\n '\\u028B': 'v',\n '\\uA75F': 'v',\n '\\u028C': 'v',\n '\\uA761': 'vy',\n '\\u24E6': 'w',\n '\\uFF57': 'w',\n '\\u1E81': 'w',\n '\\u1E83': 'w',\n '\\u0175': 'w',\n '\\u1E87': 'w',\n '\\u1E85': 'w',\n '\\u1E98': 'w',\n '\\u1E89': 'w',\n '\\u2C73': 'w',\n '\\u24E7': 'x',\n '\\uFF58': 'x',\n '\\u1E8B': 'x',\n '\\u1E8D': 'x',\n '\\u24E8': 'y',\n '\\uFF59': 'y',\n '\\u1EF3': 'y',\n '\\u00FD': 'y',\n '\\u0177': 'y',\n '\\u1EF9': 'y',\n '\\u0233': 'y',\n '\\u1E8F': 'y',\n '\\u00FF': 'y',\n '\\u1EF7': 'y',\n '\\u1E99': 'y',\n '\\u1EF5': 'y',\n '\\u01B4': 'y',\n '\\u024F': 'y',\n '\\u1EFF': 'y',\n '\\u24E9': 'z',\n '\\uFF5A': 'z',\n '\\u017A': 'z',\n '\\u1E91': 'z',\n '\\u017C': 'z',\n '\\u017E': 'z',\n '\\u1E93': 'z',\n '\\u1E95': 'z',\n '\\u01B6': 'z',\n '\\u0225': 'z',\n '\\u0240': 'z',\n '\\u2C6C': 'z',\n '\\uA763': 'z',\n '\\u0386': '\\u0391',\n '\\u0388': '\\u0395',\n '\\u0389': '\\u0397',\n '\\u038A': '\\u0399',\n '\\u03AA': '\\u0399',\n '\\u038C': '\\u039F',\n '\\u038E': '\\u03A5',\n '\\u03AB': '\\u03A5',\n '\\u038F': '\\u03A9',\n '\\u03AC': '\\u03B1',\n '\\u03AD': '\\u03B5',\n '\\u03AE': '\\u03B7',\n '\\u03AF': '\\u03B9',\n '\\u03CA': '\\u03B9',\n '\\u0390': '\\u03B9',\n '\\u03CC': '\\u03BF',\n '\\u03CD': '\\u03C5',\n '\\u03CB': '\\u03C5',\n '\\u03B0': '\\u03C5',\n '\\u03C9': '\\u03C9',\n '\\u03C2': '\\u03C3'\n };\n DataUtil.fnOperators = {\n /**\n * Returns true when the actual input is equal to the given input.\n *\n * @param {string|number|boolean} actual\n * @param {string|number|boolean} expected\n * @param {boolean} ignoreCase?\n * @param {boolean} ignoreAccent?\n * @param ignoreCase\n * @param ignoreAccent\n */\n equal: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return DataUtil.toLowerCase(actual) === DataUtil.toLowerCase(expected);\n }\n return actual === expected;\n },\n /**\n * Returns true when the actual input is not equal to the given input.\n *\n * @param {string|number|boolean} actual\n * @param {string|number|boolean} expected\n * @param {boolean} ignoreCase?\n * @param ignoreCase\n * @param ignoreAccent\n */\n notequal: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n return !DataUtil.fnOperators.equal(actual, expected, ignoreCase);\n },\n /**\n * Returns true when the actual input is less than to the given input.\n *\n * @param {string|number|boolean} actual\n * @param {string|number|boolean} expected\n * @param {boolean} ignoreCase?\n * @param ignoreCase\n */\n lessthan: function (actual, expected, ignoreCase) {\n if (ignoreCase) {\n return DataUtil.toLowerCase(actual) < DataUtil.toLowerCase(expected);\n }\n if (isNullOrUndefined(actual)) {\n actual = undefined;\n }\n return actual < expected;\n },\n /**\n * Returns true when the actual input is greater than to the given input.\n *\n * @param {string|number|boolean} actual\n * @param {string|number|boolean} expected\n * @param {boolean} ignoreCase?\n * @param ignoreCase\n */\n greaterthan: function (actual, expected, ignoreCase) {\n if (ignoreCase) {\n return DataUtil.toLowerCase(actual) > DataUtil.toLowerCase(expected);\n }\n return actual > expected;\n },\n /**\n * Returns true when the actual input is less than or equal to the given input.\n *\n * @param {string|number|boolean} actual\n * @param {string|number|boolean} expected\n * @param {boolean} ignoreCase?\n * @param ignoreCase\n */\n lessthanorequal: function (actual, expected, ignoreCase) {\n if (ignoreCase) {\n return DataUtil.toLowerCase(actual) <= DataUtil.toLowerCase(expected);\n }\n if (isNullOrUndefined(actual)) {\n actual = undefined;\n }\n return actual <= expected;\n },\n /**\n * Returns true when the actual input is greater than or equal to the given input.\n *\n * @param {string|number|boolean} actual\n * @param {string|number|boolean} expected\n * @param {boolean} ignoreCase?\n * @param ignoreCase\n */\n greaterthanorequal: function (actual, expected, ignoreCase) {\n if (ignoreCase) {\n return DataUtil.toLowerCase(actual) >= DataUtil.toLowerCase(expected);\n }\n return actual >= expected;\n },\n /**\n * Returns true when the actual input contains the given string.\n *\n * @param {string|number} actual\n * @param {string|number} expected\n * @param {boolean} ignoreCase?\n * @param ignoreCase\n * @param ignoreAccent\n */\n contains: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return !isNullOrUndefined(actual) && !isNullOrUndefined(expected) &&\n DataUtil.toLowerCase(actual).indexOf(DataUtil.toLowerCase(expected)) !== -1;\n }\n return !isNullOrUndefined(actual) && !isNullOrUndefined(expected) &&\n actual.toString().indexOf(expected) !== -1;\n },\n /**\n * Returns true when the actual input not contains the given string.\n *\n * @param {string|number} actual\n * @param {string|number} expected\n * @param {boolean} ignoreCase?\n */\n doesnotcontain: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return !isNullOrUndefined(actual) && !isNullOrUndefined(expected) &&\n DataUtil.toLowerCase(actual).indexOf(DataUtil.toLowerCase(expected)) === -1;\n }\n return !isNullOrUndefined(actual) && !isNullOrUndefined(expected) &&\n actual.toString().indexOf(expected) === -1;\n },\n /**\n * Returns true when the given input value is not null.\n *\n * @param {string|number} actual\n * @returns boolean\n */\n isnotnull: function (actual) {\n return actual !== null && actual !== undefined;\n },\n /**\n * Returns true when the given input value is null.\n *\n * @param {string|number} actual\n * @returns boolean\n */\n isnull: function (actual) {\n return actual === null || actual === undefined;\n },\n /**\n * Returns true when the actual input starts with the given string\n *\n * @param {string} actual\n * @param {string} expected\n * @param {boolean} ignoreCase?\n * @param ignoreCase\n * @param ignoreAccent\n */\n startswith: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return actual && expected && DataUtil.startsWith(DataUtil.toLowerCase(actual), DataUtil.toLowerCase(expected));\n }\n return actual && expected && DataUtil.startsWith(actual, expected);\n },\n /**\n * Returns true when the actual input not starts with the given string\n *\n * @param {string} actual\n * @param {string} expected\n * @param {boolean} ignoreCase?\n */\n doesnotstartwith: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return actual && expected && DataUtil.notStartsWith(DataUtil.toLowerCase(actual), DataUtil.toLowerCase(expected));\n }\n return actual && expected && DataUtil.notStartsWith(actual, expected);\n },\n /**\n * Returns true when the actual input like with the given string.\n *\n * @param {string} actual\n * @param {string} expected\n * @param {boolean} ignoreCase?\n */\n like: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return actual && expected && DataUtil.like(DataUtil.toLowerCase(actual), DataUtil.toLowerCase(expected));\n }\n return actual && expected && DataUtil.like(actual, expected);\n },\n /**\n * Returns true when the given input value is empty.\n *\n * @param {string|number} actual\n * @returns boolean\n */\n isempty: function (actual) {\n return actual === undefined || actual === '';\n },\n /**\n * Returns true when the given input value is not empty.\n *\n * @param {string|number} actual\n * @returns boolean\n */\n isnotempty: function (actual) {\n return actual !== undefined && actual !== '';\n },\n /**\n * Returns true when the actual input pattern(wildcard) matches with the given string.\n *\n * @param {string} actual\n * @param {string} expected\n * @param {boolean} ignoreCase?\n */\n wildcard: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return actual && expected && DataUtil.wildCard(DataUtil.toLowerCase(actual), DataUtil.toLowerCase(expected));\n }\n return actual && expected && DataUtil.wildCard(actual, expected);\n },\n /**\n * Returns true when the actual input ends with the given string.\n *\n * @param {string} actual\n * @param {string} expected\n * @param {boolean} ignoreCase?\n * @param ignoreCase\n * @param ignoreAccent\n */\n endswith: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return actual && expected && DataUtil.endsWith(DataUtil.toLowerCase(actual), DataUtil.toLowerCase(expected));\n }\n return actual && expected && DataUtil.endsWith(actual, expected);\n },\n /**\n * Returns true when the actual input not ends with the given string.\n *\n * @param {string} actual\n * @param {string} expected\n * @param {boolean} ignoreCase?\n */\n doesnotendwith: function (actual, expected, ignoreCase, ignoreAccent) {\n if (ignoreAccent) {\n actual = DataUtil.ignoreDiacritics(actual);\n expected = DataUtil.ignoreDiacritics(expected);\n }\n if (ignoreCase) {\n return actual && expected && DataUtil.notEndsWith(DataUtil.toLowerCase(actual), DataUtil.toLowerCase(expected));\n }\n return actual && expected && DataUtil.notEndsWith(actual, expected);\n },\n /**\n * It will return the filter operator based on the filter symbol.\n *\n * @param {string} operator\n * @hidden\n */\n processSymbols: function (operator) {\n var fnName = DataUtil.operatorSymbols[operator];\n if (fnName) {\n var fn = DataUtil.fnOperators[fnName];\n return fn;\n }\n return DataUtil.throwError('Query - Process Operator : Invalid operator');\n },\n /**\n * It will return the valid filter operator based on the specified operators.\n *\n * @param {string} operator\n * @hidden\n */\n processOperator: function (operator) {\n var fn = DataUtil.fnOperators[operator];\n if (fn) {\n return fn;\n }\n return DataUtil.fnOperators.processSymbols(operator);\n }\n };\n /**\n * To perform the parse operation on JSON data, like convert to string from JSON or convert to JSON from string.\n */\n DataUtil.parse = {\n /**\n * Parse the given string to the plain JavaScript object.\n *\n * @param {string|Object|Object[]} jsonText\n */\n parseJson: function (jsonText) {\n if (typeof jsonText === 'string') {\n jsonText = JSON.parse(jsonText, DataUtil.parse.jsonReviver);\n }\n else if (jsonText instanceof Array) {\n DataUtil.parse.iterateAndReviveArray(jsonText);\n }\n else if (typeof jsonText === 'object' && jsonText !== null) {\n DataUtil.parse.iterateAndReviveJson(jsonText);\n }\n return jsonText;\n },\n /**\n * It will perform on array of values.\n *\n * @param {string[]|Object[]} array\n * @hidden\n */\n iterateAndReviveArray: function (array) {\n for (var i = 0; i < array.length; i++) {\n if (typeof array[i] === 'object' && array[i] !== null) {\n DataUtil.parse.iterateAndReviveJson(array[i]);\n // eslint-disable-next-line no-useless-escape\n }\n else if (typeof array[i] === 'string' && !/^[\\s]*\\[|^[\\s]*\\{(.)+:|\\\"/g.test(array[i])) {\n array[i] = DataUtil.parse.jsonReviver('', array[i]);\n }\n else {\n array[i] = DataUtil.parse.parseJson(array[i]);\n }\n }\n },\n /**\n * It will perform on JSON values\n *\n * @param {JSON} json\n * @hidden\n */\n iterateAndReviveJson: function (json) {\n var value;\n var keys = Object.keys(json);\n for (var _i = 0, keys_2 = keys; _i < keys_2.length; _i++) {\n var prop = keys_2[_i];\n if (DataUtil.startsWith(prop, '__')) {\n continue;\n }\n value = json[prop];\n if (typeof value === 'object') {\n if (value instanceof Array) {\n DataUtil.parse.iterateAndReviveArray(value);\n }\n else if (value) {\n DataUtil.parse.iterateAndReviveJson(value);\n }\n }\n else {\n json[prop] = DataUtil.parse.jsonReviver(json[prop], value);\n }\n }\n },\n /**\n * It will perform on JSON values\n *\n * @param {string} field\n * @param {string|Date} value\n * @hidden\n */\n jsonReviver: function (field, value) {\n if (typeof value === 'string') {\n // eslint-disable-next-line security/detect-unsafe-regex\n var ms = /^\\/Date\\(([+-]?[0-9]+)([+-][0-9]{4})?\\)\\/$/.exec(value);\n var offSet = DataUtil.timeZoneHandling ? DataUtil.serverTimezoneOffset : null;\n if (ms) {\n return DataUtil.dateParse.toTimeZone(new Date(parseInt(ms[1], 10)), offSet, true);\n // eslint-disable-next-line no-useless-escape, security/detect-unsafe-regex\n }\n else if (/^(\\d{4}\\-\\d\\d\\-\\d\\d([tT][\\d:\\.]*){1})([zZ]|([+\\-])(\\d\\d):?(\\d\\d))?$/.test(value)) {\n var isUTC = value.indexOf('Z') > -1 || value.indexOf('z') > -1;\n var arr = value.split(/[^0-9.]/);\n if (isUTC) {\n if (arr[5].indexOf('.') > -1) {\n var secondsMs = arr[5].split('.');\n arr[5] = secondsMs[0];\n arr[6] = new Date(value).getUTCMilliseconds().toString();\n }\n else {\n arr[6] = '00';\n }\n value = DataUtil.dateParse\n .toTimeZone(new Date(parseInt(arr[0], 10), parseInt(arr[1], 10) - 1, parseInt(arr[2], 10), parseInt(arr[3], 10), parseInt(arr[4], 10), parseInt(arr[5], 10), parseInt(arr[6], 10)), DataUtil.serverTimezoneOffset, false);\n }\n else {\n var utcFormat = new Date(parseInt(arr[0], 10), parseInt(arr[1], 10) - 1, parseInt(arr[2], 10), parseInt(arr[3], 10), parseInt(arr[4], 10), parseInt(arr[5], 10));\n var hrs = parseInt(arr[6], 10);\n var mins = parseInt(arr[7], 10);\n if (isNaN(hrs) && isNaN(mins)) {\n return utcFormat;\n }\n if (value.indexOf('+') > -1) {\n utcFormat.setHours(utcFormat.getHours() - hrs, utcFormat.getMinutes() - mins);\n }\n else {\n utcFormat.setHours(utcFormat.getHours() + hrs, utcFormat.getMinutes() + mins);\n }\n value = DataUtil.dateParse\n .toTimeZone(utcFormat, DataUtil.serverTimezoneOffset, false);\n }\n if (DataUtil.serverTimezoneOffset == null) {\n value = DataUtil.dateParse.addSelfOffset(value);\n }\n }\n }\n return value;\n },\n /**\n * Check wheather the given value is JSON or not.\n *\n * @param {Object[]} jsonData\n */\n isJson: function (jsonData) {\n if (typeof jsonData[0] === 'string') {\n return jsonData;\n }\n return DataUtil.parse.parseJson(jsonData);\n },\n /**\n * Checks wheather the given value is GUID or not.\n *\n * @param {string} value\n */\n isGuid: function (value) {\n // eslint-disable-next-line security/detect-unsafe-regex\n var regex = /[A-Fa-f0-9]{8}(?:-[A-Fa-f0-9]{4}){3}-[A-Fa-f0-9]{12}/i;\n var match = regex.exec(value);\n return match != null;\n },\n /**\n * The method used to replace the value based on the type.\n *\n * @param {Object} value\n * @param {boolean} stringify\n * @hidden\n */\n replacer: function (value, stringify) {\n if (DataUtil.isPlainObject(value)) {\n return DataUtil.parse.jsonReplacer(value, stringify);\n }\n if (value instanceof Array) {\n return DataUtil.parse.arrayReplacer(value);\n }\n if (value instanceof Date) {\n return DataUtil.parse.jsonReplacer({ val: value }, stringify).val;\n }\n return value;\n },\n /**\n * It will replace the JSON value.\n *\n * @param {string} key\n * @param {Object} val\n * @param stringify\n * @hidden\n */\n jsonReplacer: function (val, stringify) {\n var value;\n var keys = Object.keys(val);\n for (var _i = 0, keys_3 = keys; _i < keys_3.length; _i++) {\n var prop = keys_3[_i];\n value = val[prop];\n if (!(value instanceof Date)) {\n continue;\n }\n var d = value;\n if (DataUtil.serverTimezoneOffset == null) {\n val[prop] = DataUtil.dateParse.toTimeZone(d, null).toJSON();\n }\n else {\n d = new Date(+d + DataUtil.serverTimezoneOffset * 3600000);\n val[prop] = DataUtil.dateParse.toTimeZone(DataUtil.dateParse.addSelfOffset(d), null).toJSON();\n }\n }\n return val;\n },\n /**\n * It will replace the Array of value.\n *\n * @param {string} key\n * @param {Object[]} val\n * @hidden\n */\n arrayReplacer: function (val) {\n for (var i = 0; i < val.length; i++) {\n if (DataUtil.isPlainObject(val[i])) {\n val[i] = DataUtil.parse.jsonReplacer(val[i]);\n }\n else if (val[i] instanceof Date) {\n val[i] = DataUtil.parse.jsonReplacer({ date: val[i] }).date;\n }\n }\n return val;\n },\n /**\n * It will replace the Date object with respective to UTC format value.\n *\n * @param {string} key\n * @param {any} value\n * @hidden\n */\n /* eslint-disable @typescript-eslint/no-explicit-any */\n /* tslint:disable-next-line:no-any */\n jsonDateReplacer: function (key, value) {\n /* eslint-enable @typescript-eslint/no-explicit-any */\n if (key === 'value' && value) {\n if (typeof value === 'string') {\n // eslint-disable-next-line security/detect-unsafe-regex\n var ms = /^\\/Date\\(([+-]?[0-9]+)([+-][0-9]{4})?\\)\\/$/.exec(value);\n if (ms) {\n value = DataUtil.dateParse.toTimeZone(new Date(parseInt(ms[1], 10)), null, true);\n // eslint-disable-next-line no-useless-escape, security/detect-unsafe-regex\n }\n else if (/^(\\d{4}\\-\\d\\d\\-\\d\\d([tT][\\d:\\.]*){1})([zZ]|([+\\-])(\\d\\d):?(\\d\\d))?$/.test(value)) {\n var arr = value.split(/[^0-9]/);\n value = DataUtil.dateParse\n .toTimeZone(new Date(parseInt(arr[0], 10), parseInt(arr[1], 10) - 1, parseInt(arr[2], 10), parseInt(arr[3], 10), parseInt(arr[4], 10), parseInt(arr[5], 10)), null, true);\n }\n }\n if (value instanceof Date) {\n value = DataUtil.dateParse.addSelfOffset(value);\n if (DataUtil.serverTimezoneOffset === null) {\n return DataUtil.dateParse.toTimeZone(DataUtil.dateParse.addSelfOffset(value), null).toJSON();\n }\n else {\n value = DataUtil.dateParse.toTimeZone(value, (((value.getTimezoneOffset() / 60) * 2)\n - DataUtil.serverTimezoneOffset), false);\n return value.toJSON();\n }\n }\n }\n return value;\n }\n };\n /**\n * @hidden\n */\n DataUtil.dateParse = {\n addSelfOffset: function (input) {\n return new Date(+input - (input.getTimezoneOffset() * 60000));\n },\n toUTC: function (input) {\n return new Date(+input + (input.getTimezoneOffset() * 60000));\n },\n toTimeZone: function (input, offset, utc) {\n if (offset === null) {\n return input;\n }\n var unix = utc ? DataUtil.dateParse.toUTC(input) : input;\n return new Date(+unix - (offset * 3600000));\n },\n toLocalTime: function (input) {\n var datefn = input;\n var timeZone = -datefn.getTimezoneOffset();\n var differenceString = timeZone >= 0 ? '+' : '-';\n var localtimefn = function (num) {\n var norm = Math.floor(Math.abs(num));\n return (norm < 10 ? '0' : '') + norm;\n };\n var val = datefn.getFullYear() + '-' + localtimefn(datefn.getMonth() + 1) + '-' + localtimefn(datefn.getDate()) +\n 'T' + localtimefn(datefn.getHours()) +\n ':' + localtimefn(datefn.getMinutes()) +\n ':' + localtimefn(datefn.getSeconds()) +\n differenceString + localtimefn(timeZone / 60) +\n ':' + localtimefn(timeZone % 60);\n return val;\n }\n };\n return DataUtil;\n}());\nexport { DataUtil };\n","var __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nimport { merge, extend, isNullOrUndefined, setValue, getValue } from '@syncfusion/ej2-base';\nimport { DataUtil } from './util';\nimport { Query, Predicate } from './query';\nvar consts = { GroupGuid: '{271bbba0-1ee7}' };\n/**\n * Adaptors are specific data source type aware interfaces that are used by DataManager to communicate with DataSource.\n * This is the base adaptor class that other adaptors can extend.\n *\n * @hidden\n */\nvar Adaptor = /** @class */ (function () {\n /**\n * Constructor for Adaptor class\n *\n * @param {DataOptions} ds?\n * @param ds\n * @hidden\n * @returns aggregates\n */\n function Adaptor(ds) {\n // common options for all the adaptors\n this.options = {\n from: 'table',\n requestType: 'json',\n sortBy: 'sorted',\n select: 'select',\n skip: 'skip',\n group: 'group',\n take: 'take',\n search: 'search',\n count: 'requiresCounts',\n where: 'where',\n aggregates: 'aggregates',\n expand: 'expand'\n };\n /**\n * Specifies the type of adaptor.\n *\n * @default Adaptor\n */\n this.type = Adaptor;\n this.dataSource = ds;\n this.pvt = {};\n }\n /**\n * Returns the data from the query processing.\n *\n * @param {Object} data\n * @param {DataOptions} ds?\n * @param {Query} query?\n * @param {XMLHttpRequest} xhr?\n * @param ds\n * @param query\n * @param xhr\n * @returns Object\n */\n Adaptor.prototype.processResponse = function (data, ds, query, xhr) {\n return data;\n };\n return Adaptor;\n}());\nexport { Adaptor };\n/**\n * JsonAdaptor is used to process JSON data. It contains methods to process the given JSON data based on the queries.\n *\n * @hidden\n */\nvar JsonAdaptor = /** @class */ (function (_super) {\n __extends(JsonAdaptor, _super);\n function JsonAdaptor() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n /**\n * Process the JSON data based on the provided queries.\n *\n * @param {DataManager} dataManager\n * @param {Query} query\n * @returns Object\n */\n JsonAdaptor.prototype.processQuery = function (dataManager, query) {\n var result = dataManager.dataSource.json.slice(0);\n var count = result.length;\n var countFlg = true;\n var ret;\n var key;\n var lazyLoad = {};\n var keyCount = 0;\n var group = [];\n var page;\n for (var i = 0; i < query.lazyLoad.length; i++) {\n keyCount++;\n lazyLoad[query.lazyLoad[i].key] = query.lazyLoad[i].value;\n }\n var agg = {};\n for (var i = 0; i < query.queries.length; i++) {\n key = query.queries[i];\n if ((key.fn === 'onPage' || key.fn === 'onGroup') && query.lazyLoad.length) {\n if (key.fn === 'onGroup') {\n group.push(key.e);\n }\n if (key.fn === 'onPage') {\n page = key.e;\n }\n continue;\n }\n ret = this[key.fn].call(this, result, key.e, query);\n if (key.fn === 'onAggregates') {\n agg[key.e.field + ' - ' + key.e.type] = ret;\n }\n else {\n result = ret !== undefined ? ret : result;\n }\n if (key.fn === 'onPage' || key.fn === 'onSkip' || key.fn === 'onTake' || key.fn === 'onRange') {\n countFlg = false;\n }\n if (countFlg) {\n count = result.length;\n }\n }\n if (keyCount) {\n var args = {\n query: query, lazyLoad: lazyLoad, result: result, group: group, page: page\n };\n var lazyLoadData = this.lazyLoadGroup(args);\n result = lazyLoadData.result;\n count = lazyLoadData.count;\n }\n if (query.isCountRequired) {\n result = {\n result: result,\n count: count,\n aggregates: agg\n };\n }\n return result;\n };\n /**\n * Perform lazy load grouping in JSON array based on the given query and lazy load details.\n *\n * @param {LazyLoadGroupArgs} args\n */\n JsonAdaptor.prototype.lazyLoadGroup = function (args) {\n var count = 0;\n var agg = this.getAggregate(args.query);\n var result = args.result;\n if (!isNullOrUndefined(args.lazyLoad.onDemandGroupInfo)) {\n var req = args.lazyLoad.onDemandGroupInfo;\n for (var i = req.where.length - 1; i >= 0; i--) {\n result = this.onWhere(result, req.where[i]);\n }\n if (args.group.length !== req.level) {\n var field = args.group[req.level].fieldName;\n result = DataUtil.group(result, field, agg, null, null, args.group[0].comparer, true);\n }\n count = result.length;\n var data = result;\n result = result.slice(req.skip);\n result = result.slice(0, req.take);\n if (args.group.length !== req.level) {\n this.formGroupResult(result, data);\n }\n }\n else {\n var field = args.group[0].fieldName;\n result = DataUtil.group(result, field, agg, null, null, args.group[0].comparer, true);\n count = result.length;\n var data = result;\n if (args.page) {\n result = this.onPage(result, args.page, args.query);\n }\n this.formGroupResult(result, data);\n }\n return { result: result, count: count };\n };\n JsonAdaptor.prototype.formGroupResult = function (result, data) {\n if (result.length && data.length) {\n var uid = 'GroupGuid';\n var childLevel = 'childLevels';\n var level = 'level';\n var records = 'records';\n result[uid] = data[uid];\n result[childLevel] = data[childLevel];\n result[level] = data[level];\n result[records] = data[records];\n }\n return result;\n };\n /**\n * Separate the aggregate query from the given queries\n *\n * @param {Query} query\n */\n JsonAdaptor.prototype.getAggregate = function (query) {\n var aggQuery = Query.filterQueries(query.queries, 'onAggregates');\n var agg = [];\n if (aggQuery.length) {\n var tmp = void 0;\n for (var i = 0; i < aggQuery.length; i++) {\n tmp = aggQuery[i].e;\n agg.push({ type: tmp.type, field: DataUtil.getValue(tmp.field, query) });\n }\n }\n return agg;\n };\n /**\n * Performs batch update in the JSON array which add, remove and update records.\n *\n * @param {DataManager} dm\n * @param {CrudOptions} changes\n * @param {RemoteArgs} e\n */\n JsonAdaptor.prototype.batchRequest = function (dm, changes, e) {\n var i;\n var deletedRecordsLen = changes.deletedRecords.length;\n for (i = 0; i < changes.addedRecords.length; i++) {\n this.insert(dm, changes.addedRecords[i]);\n }\n for (i = 0; i < changes.changedRecords.length; i++) {\n this.update(dm, e.key, changes.changedRecords[i]);\n }\n for (i = 0; i < deletedRecordsLen; i++) {\n this.remove(dm, e.key, changes.deletedRecords[i]);\n }\n return changes;\n };\n /**\n * Performs filter operation with the given data and where query.\n *\n * @param {Object[]} ds\n * @param {{validate:Function}} e\n * @param e.validate\n */\n JsonAdaptor.prototype.onWhere = function (ds, e) {\n if (!ds || !ds.length) {\n return ds;\n }\n return ds.filter(function (obj) {\n if (e) {\n return e.validate(obj);\n }\n });\n };\n /**\n * Returns aggregate function based on the aggregate type.\n *\n * @param {Object[]} ds\n * @param e\n * @param {string} } type\n * @param e.field\n * @param e.type\n */\n JsonAdaptor.prototype.onAggregates = function (ds, e) {\n var fn = DataUtil.aggregates[e.type];\n if (!ds || !fn || ds.length === 0) {\n return null;\n }\n return fn(ds, e.field);\n };\n /**\n * Performs search operation based on the given query.\n *\n * @param {Object[]} ds\n * @param {QueryOptions} e\n */\n JsonAdaptor.prototype.onSearch = function (ds, e) {\n if (!ds || !ds.length) {\n return ds;\n }\n if (e.fieldNames.length === 0) {\n DataUtil.getFieldList(ds[0], e.fieldNames);\n }\n return ds.filter(function (obj) {\n for (var j = 0; j < e.fieldNames.length; j++) {\n if (e.comparer.call(obj, DataUtil.getObject(e.fieldNames[j], obj), e.searchKey, e.ignoreCase, e.ignoreAccent)) {\n return true;\n }\n }\n return false;\n });\n };\n /**\n * Sort the data with given direction and field.\n *\n * @param {Object[]} ds\n * @param e\n * @param {Object} b\n * @param e.comparer\n * @param e.fieldName\n * @param query\n */\n JsonAdaptor.prototype.onSortBy = function (ds, e, query) {\n if (!ds || !ds.length) {\n return ds;\n }\n var fnCompare;\n var field = DataUtil.getValue(e.fieldName, query);\n if (!field) {\n return ds.sort(e.comparer);\n }\n if (field instanceof Array) {\n field = field.slice(0);\n for (var i = field.length - 1; i >= 0; i--) {\n if (!field[i]) {\n continue;\n }\n fnCompare = e.comparer;\n if (DataUtil.endsWith(field[i], ' desc')) {\n fnCompare = DataUtil.fnSort('descending');\n field[i] = field[i].replace(' desc', '');\n }\n ds = DataUtil.sort(ds, field[i], fnCompare);\n }\n return ds;\n }\n return DataUtil.sort(ds, field, e.comparer);\n };\n /**\n * Group the data based on the given query.\n *\n * @param {Object[]} ds\n * @param {QueryOptions} e\n * @param {Query} query\n */\n JsonAdaptor.prototype.onGroup = function (ds, e, query) {\n if (!ds || !ds.length) {\n return ds;\n }\n var agg = this.getAggregate(query);\n return DataUtil.group(ds, DataUtil.getValue(e.fieldName, query), agg, null, null, e.comparer);\n };\n /**\n * Retrieves records based on the given page index and size.\n *\n * @param {Object[]} ds\n * @param e\n * @param {number} } pageIndex\n * @param e.pageSize\n * @param {Query} query\n * @param e.pageIndex\n */\n JsonAdaptor.prototype.onPage = function (ds, e, query) {\n var size = DataUtil.getValue(e.pageSize, query);\n var start = (DataUtil.getValue(e.pageIndex, query) - 1) * size;\n var end = start + size;\n if (!ds || !ds.length) {\n return ds;\n }\n return ds.slice(start, end);\n };\n /**\n * Retrieves records based on the given start and end index from query.\n *\n * @param {Object[]} ds\n * @param e\n * @param {number} } end\n * @param e.start\n * @param e.end\n */\n JsonAdaptor.prototype.onRange = function (ds, e) {\n if (!ds || !ds.length) {\n return ds;\n }\n return ds.slice(DataUtil.getValue(e.start), DataUtil.getValue(e.end));\n };\n /**\n * Picks the given count of records from the top of the datasource.\n *\n * @param {Object[]} ds\n * @param {{nos:number}} e\n * @param e.nos\n */\n JsonAdaptor.prototype.onTake = function (ds, e) {\n if (!ds || !ds.length) {\n return ds;\n }\n return ds.slice(0, DataUtil.getValue(e.nos));\n };\n /**\n * Skips the given count of records from the data source.\n *\n * @param {Object[]} ds\n * @param {{nos:number}} e\n * @param e.nos\n */\n JsonAdaptor.prototype.onSkip = function (ds, e) {\n if (!ds || !ds.length) {\n return ds;\n }\n return ds.slice(DataUtil.getValue(e.nos));\n };\n /**\n * Selects specified columns from the data source.\n *\n * @param {Object[]} ds\n * @param {{fieldNames:string}} e\n * @param e.fieldNames\n */\n JsonAdaptor.prototype.onSelect = function (ds, e) {\n if (!ds || !ds.length) {\n return ds;\n }\n return DataUtil.select(ds, DataUtil.getValue(e.fieldNames));\n };\n /**\n * Inserts new record in the table.\n *\n * @param {DataManager} dm\n * @param {Object} data\n * @param tableName\n * @param query\n * @param {number} position\n */\n JsonAdaptor.prototype.insert = function (dm, data, tableName, query, position) {\n if (isNullOrUndefined(position)) {\n return dm.dataSource.json.push(data);\n }\n else {\n return dm.dataSource.json.splice(position, 0, data);\n }\n };\n /**\n * Remove the data from the dataSource based on the key field value.\n *\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {Object} value\n * @param {string} tableName?\n * @param tableName\n * @returns null\n */\n JsonAdaptor.prototype.remove = function (dm, keyField, value, tableName) {\n var ds = dm.dataSource.json;\n var i;\n if (typeof value === 'object' && !(value instanceof Date)) {\n value = DataUtil.getObject(keyField, value);\n }\n for (i = 0; i < ds.length; i++) {\n if (DataUtil.getObject(keyField, ds[i]) === value) {\n break;\n }\n }\n return i !== ds.length ? ds.splice(i, 1) : null;\n };\n /**\n * Updates existing record and saves the changes to the table.\n *\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {Object} value\n * @param {string} tableName?\n * @param tableName\n * @returns null\n */\n JsonAdaptor.prototype.update = function (dm, keyField, value, tableName) {\n var ds = dm.dataSource.json;\n var i;\n var key;\n if (!isNullOrUndefined(keyField)) {\n key = getValue(keyField, value);\n }\n for (i = 0; i < ds.length; i++) {\n if (!isNullOrUndefined(keyField) && (getValue(keyField, ds[i])) === key) {\n break;\n }\n }\n return i < ds.length ? merge(ds[i], value) : null;\n };\n return JsonAdaptor;\n}(Adaptor));\nexport { JsonAdaptor };\n/**\n * URL Adaptor of DataManager can be used when you are required to use remote service to retrieve data.\n * It interacts with server-side for all DataManager Queries and CRUD operations.\n *\n * @hidden\n */\nvar UrlAdaptor = /** @class */ (function (_super) {\n __extends(UrlAdaptor, _super);\n function UrlAdaptor() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n /**\n * Process the query to generate request body.\n *\n * @param {DataManager} dm\n * @param {Query} query\n * @param {Object[]} hierarchyFilters?\n * @param hierarchyFilters\n * @returns p\n */\n // tslint:disable-next-line:max-func-body-length\n UrlAdaptor.prototype.processQuery = function (dm, query, hierarchyFilters) {\n var queries = this.getQueryRequest(query);\n var singles = Query.filterQueryLists(query.queries, ['onSelect', 'onPage', 'onSkip', 'onTake', 'onRange']);\n var params = query.params;\n var url = dm.dataSource.url;\n var temp;\n var skip;\n var take = null;\n var options = this.options;\n var request = { sorts: [], groups: [], filters: [], searches: [], aggregates: [] };\n // calc Paging & Range\n if ('onPage' in singles) {\n temp = singles.onPage;\n skip = DataUtil.getValue(temp.pageIndex, query);\n take = DataUtil.getValue(temp.pageSize, query);\n skip = (skip - 1) * take;\n }\n else if ('onRange' in singles) {\n temp = singles.onRange;\n skip = temp.start;\n take = temp.end - temp.start;\n }\n // Sorting\n for (var i = 0; i < queries.sorts.length; i++) {\n temp = DataUtil.getValue(queries.sorts[i].e.fieldName, query);\n request.sorts.push(DataUtil.callAdaptorFunction(this, 'onEachSort', { name: temp, direction: queries.sorts[i].e.direction }, query));\n }\n // hierarchy\n if (hierarchyFilters) {\n temp = this.getFiltersFrom(hierarchyFilters, query);\n if (temp) {\n request.filters.push(DataUtil.callAdaptorFunction(this, 'onEachWhere', temp.toJson(), query));\n }\n }\n // Filters\n for (var i = 0; i < queries.filters.length; i++) {\n var res = DataUtil.callAdaptorFunction(this, 'onEachWhere', queries.filters[i].e.toJson(), query);\n if ((this.getModuleName &&\n this.getModuleName() === 'ODataV4Adaptor') &&\n !isNullOrUndefined(queries.filters[i].e.key) && queries.filters.length > 1) {\n res = '(' + res + ')';\n }\n request.filters.push(res);\n var keys_3 = typeof request.filters[i] === 'object' ? Object.keys(request.filters[i]) : [];\n for (var _i = 0, keys_1 = keys_3; _i < keys_1.length; _i++) {\n var prop = keys_1[_i];\n if (DataUtil.isNull((request)[prop])) {\n delete request[prop];\n }\n }\n }\n // Searches\n for (var i = 0; i < queries.searches.length; i++) {\n temp = queries.searches[i].e;\n request.searches.push(DataUtil.callAdaptorFunction(this, 'onEachSearch', {\n fields: temp.fieldNames,\n operator: temp.operator,\n key: temp.searchKey,\n ignoreCase: temp.ignoreCase\n }, query));\n }\n // Grouping\n for (var i = 0; i < queries.groups.length; i++) {\n request.groups.push(DataUtil.getValue(queries.groups[i].e.fieldName, query));\n }\n // aggregates\n for (var i = 0; i < queries.aggregates.length; i++) {\n temp = queries.aggregates[i].e;\n request.aggregates.push({ type: temp.type, field: DataUtil.getValue(temp.field, query) });\n }\n var req = {};\n this.getRequestQuery(options, query, singles, request, req);\n // Params\n DataUtil.callAdaptorFunction(this, 'addParams', { dm: dm, query: query, params: params, reqParams: req });\n if (query.lazyLoad.length) {\n for (var i = 0; i < query.lazyLoad.length; i++) {\n req[query.lazyLoad[i].key] = query.lazyLoad[i].value;\n }\n }\n // cleanup\n var keys = Object.keys(req);\n for (var _a = 0, keys_2 = keys; _a < keys_2.length; _a++) {\n var prop = keys_2[_a];\n if (DataUtil.isNull(req[prop]) || req[prop] === '' || req[prop].length === 0) {\n delete req[prop];\n }\n }\n if (!(options.skip in req && options.take in req) && take !== null) {\n req[options.skip] = DataUtil.callAdaptorFunction(this, 'onSkip', skip, query);\n req[options.take] = DataUtil.callAdaptorFunction(this, 'onTake', take, query);\n }\n var p = this.pvt;\n this.pvt = {};\n if (this.options.requestType === 'json') {\n return {\n data: JSON.stringify(req, DataUtil.parse.jsonDateReplacer),\n url: url,\n pvtData: p,\n type: 'POST',\n contentType: 'application/json; charset=utf-8'\n };\n }\n temp = this.convertToQueryString(req, query, dm);\n temp = (dm.dataSource.url.indexOf('?') !== -1 ? '&' : '/') + temp;\n return {\n type: 'GET', url: temp.length ? url.replace(/\\/*$/, temp) : url, pvtData: p\n };\n };\n UrlAdaptor.prototype.getRequestQuery = function (options, query, singles, request, request1) {\n var param = 'param';\n var req = request1;\n req[options.from] = query.fromTable;\n if (options.apply && query.distincts.length) {\n req[options.apply] = 'onDistinct' in this ? DataUtil.callAdaptorFunction(this, 'onDistinct', query.distincts) : '';\n }\n if (!query.distincts.length && options.expand) {\n req[options.expand] = 'onExpand' in this && 'onSelect' in singles ?\n DataUtil.callAdaptorFunction(this, 'onExpand', { selects: DataUtil.getValue(singles.onSelect.fieldNames, query), expands: query.expands }, query) : query.expands;\n }\n req[options.select] = 'onSelect' in singles && !query.distincts.length ?\n DataUtil.callAdaptorFunction(this, 'onSelect', DataUtil.getValue(singles.onSelect.fieldNames, query), query) : '';\n req[options.count] = query.isCountRequired ? DataUtil.callAdaptorFunction(this, 'onCount', query.isCountRequired, query) : '';\n req[options.search] = request.searches.length ? DataUtil.callAdaptorFunction(this, 'onSearch', request.searches, query) : '';\n req[options.skip] = 'onSkip' in singles ?\n DataUtil.callAdaptorFunction(this, 'onSkip', DataUtil.getValue(singles.onSkip.nos, query), query) : '';\n req[options.take] = 'onTake' in singles ?\n DataUtil.callAdaptorFunction(this, 'onTake', DataUtil.getValue(singles.onTake.nos, query), query) : '';\n req[options.where] = request.filters.length || request.searches.length ?\n DataUtil.callAdaptorFunction(this, 'onWhere', request.filters, query) : '';\n req[options.sortBy] = request.sorts.length ? DataUtil.callAdaptorFunction(this, 'onSortBy', request.sorts, query) : '';\n req[options.group] = request.groups.length ? DataUtil.callAdaptorFunction(this, 'onGroup', request.groups, query) : '';\n req[options.aggregates] = request.aggregates.length ?\n DataUtil.callAdaptorFunction(this, 'onAggregates', request.aggregates, query) : '';\n req[param] = [];\n };\n /**\n * Convert the object from processQuery to string which can be added query string.\n *\n * @param {Object} req\n * @param request\n * @param {Query} query\n * @param {DataManager} dm\n */\n UrlAdaptor.prototype.convertToQueryString = function (request, query, dm) {\n return '';\n // this needs to be overridden\n };\n /**\n * Return the data from the data manager processing.\n *\n * @param {DataResult} data\n * @param {DataOptions} ds?\n * @param {Query} query?\n * @param {XMLHttpRequest} xhr?\n * @param {Object} request?\n * @param {CrudOptions} changes?\n * @param ds\n * @param query\n * @param xhr\n * @param request\n * @param changes\n */\n UrlAdaptor.prototype.processResponse = function (data, ds, query, xhr, request, changes) {\n if (xhr && xhr.getResponseHeader('Content-Type') &&\n xhr.getResponseHeader('Content-Type').indexOf('application/json') !== -1) {\n var handleTimeZone = DataUtil.timeZoneHandling;\n if (ds && !ds.timeZoneHandling) {\n DataUtil.timeZoneHandling = false;\n }\n data = DataUtil.parse.parseJson(data);\n DataUtil.timeZoneHandling = handleTimeZone;\n }\n var requests = request;\n var pvt = requests.pvtData || {};\n var groupDs = data ? data.groupDs : [];\n if (xhr && xhr.getResponseHeader('Content-Type') &&\n xhr.getResponseHeader('Content-Type').indexOf('xml') !== -1) {\n return (query.isCountRequired ? { result: [], count: 0 } : []);\n }\n var d = JSON.parse(requests.data);\n if (d && d.action === 'batch' && data && data.addedRecords) {\n changes.addedRecords = data.addedRecords;\n return changes;\n }\n if (data && data.d) {\n data = data.d;\n }\n var args = {};\n if (data && 'count' in data) {\n args.count = data.count;\n }\n args.result = data && data.result ? data.result : data;\n var isExpand = false;\n if (Array.isArray(data.result) && data.result.length) {\n var key = 'key';\n var val = 'value';\n var level = 'level';\n if (!isNullOrUndefined(data.result[0][key])) {\n args.result = this.formRemoteGroupedData(args.result, 1, pvt.groups.length - 1);\n }\n if (query && query.lazyLoad.length && pvt.groups.length) {\n for (var i = 0; i < query.lazyLoad.length; i++) {\n if (query.lazyLoad[i][key] === 'onDemandGroupInfo') {\n var value = query.lazyLoad[i][val][level];\n if (pvt.groups.length === value) {\n isExpand = true;\n }\n }\n }\n }\n }\n if (!isExpand) {\n this.getAggregateResult(pvt, data, args, groupDs, query);\n }\n return DataUtil.isNull(args.count) ? args.result : { result: args.result, count: args.count, aggregates: args.aggregates };\n };\n UrlAdaptor.prototype.formRemoteGroupedData = function (data, level, childLevel) {\n for (var i = 0; i < data.length; i++) {\n if (data[i].items.length && Object.keys(data[i].items[0]).indexOf('key') > -1) {\n this.formRemoteGroupedData(data[i].items, level + 1, childLevel - 1);\n }\n }\n var uid = 'GroupGuid';\n var childLvl = 'childLevels';\n var lvl = 'level';\n var records = 'records';\n data[uid] = consts[uid];\n data[lvl] = level;\n data[childLvl] = childLevel;\n data[records] = data[0].items.length ? this.getGroupedRecords(data, !isNullOrUndefined(data[0].items[records])) : [];\n return data;\n };\n UrlAdaptor.prototype.getGroupedRecords = function (data, hasRecords) {\n var childGroupedRecords = [];\n var records = 'records';\n for (var i = 0; i < data.length; i++) {\n if (!hasRecords) {\n for (var j = 0; j < data[i].items.length; j++) {\n childGroupedRecords.push(data[i].items[j]);\n }\n }\n else {\n childGroupedRecords = childGroupedRecords.concat(data[i].items[records]);\n }\n }\n return childGroupedRecords;\n };\n /**\n * Add the group query to the adaptor`s option.\n *\n * @param {Object[]} e\n * @returns void\n */\n UrlAdaptor.prototype.onGroup = function (e) {\n this.pvt.groups = e;\n return e;\n };\n /**\n * Add the aggregate query to the adaptor`s option.\n *\n * @param {Aggregates[]} e\n * @returns void\n */\n UrlAdaptor.prototype.onAggregates = function (e) {\n this.pvt.aggregates = e;\n };\n /**\n * Prepare the request body based on the newly added, removed and updated records.\n * The result is used by the batch request.\n *\n * @param {DataManager} dm\n * @param {CrudOptions} changes\n * @param {Object} e\n * @param query\n * @param original\n */\n UrlAdaptor.prototype.batchRequest = function (dm, changes, e, query, original) {\n var url;\n var key;\n return {\n type: 'POST',\n url: dm.dataSource.batchUrl || dm.dataSource.crudUrl || dm.dataSource.removeUrl || dm.dataSource.url,\n contentType: 'application/json; charset=utf-8',\n dataType: 'json',\n data: JSON.stringify(extend({}, {\n changed: changes.changedRecords,\n added: changes.addedRecords,\n deleted: changes.deletedRecords,\n action: 'batch',\n table: e[url],\n key: e[key]\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n /**\n * Method will trigger before send the request to server side.\n * Used to set the custom header or modify the request options.\n *\n * @param {DataManager} dm\n * @param {XMLHttpRequest} request\n * @returns void\n */\n UrlAdaptor.prototype.beforeSend = function (dm, request) {\n // need to extend this method\n };\n /**\n * Prepare and returns request body which is used to insert a new record in the table.\n *\n * @param {DataManager} dm\n * @param {Object} data\n * @param {string} tableName\n * @param query\n */\n UrlAdaptor.prototype.insert = function (dm, data, tableName, query) {\n return {\n url: dm.dataSource.insertUrl || dm.dataSource.crudUrl || dm.dataSource.url,\n data: JSON.stringify(extend({}, {\n value: data,\n table: tableName,\n action: 'insert'\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n /**\n * Prepare and return request body which is used to remove record from the table.\n *\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {number|string} value\n * @param {string} tableName\n * @param query\n */\n UrlAdaptor.prototype.remove = function (dm, keyField, value, tableName, query) {\n return {\n type: 'POST',\n url: dm.dataSource.removeUrl || dm.dataSource.crudUrl || dm.dataSource.url,\n data: JSON.stringify(extend({}, {\n key: value,\n keyColumn: keyField,\n table: tableName,\n action: 'remove'\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n /**\n * Prepare and return request body which is used to update record.\n *\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {Object} value\n * @param {string} tableName\n * @param query\n */\n UrlAdaptor.prototype.update = function (dm, keyField, value, tableName, query) {\n return {\n type: 'POST',\n url: dm.dataSource.updateUrl || dm.dataSource.crudUrl || dm.dataSource.url,\n data: JSON.stringify(extend({}, {\n value: value,\n action: 'update',\n keyColumn: keyField,\n key: DataUtil.getObject(keyField, value),\n table: tableName\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n /**\n * To generate the predicate based on the filtered query.\n *\n * @param {Object[]|string[]|number[]} data\n * @param {Query} query\n * @hidden\n */\n UrlAdaptor.prototype.getFiltersFrom = function (data, query) {\n var key = query.fKey;\n var value;\n var prop = key;\n var pKey = query.key;\n var predicats = [];\n if (typeof data[0] !== 'object') {\n prop = null;\n }\n for (var i = 0; i < data.length; i++) {\n if (typeof data[0] === 'object') {\n value = DataUtil.getObject(pKey || prop, data[i]);\n }\n else {\n value = data[i];\n }\n predicats.push(new Predicate(key, 'equal', value));\n }\n return Predicate.or(predicats);\n };\n UrlAdaptor.prototype.getAggregateResult = function (pvt, data, args, groupDs, query) {\n var pData = data;\n if (data && data.result) {\n pData = data.result;\n }\n if (pvt && pvt.aggregates && pvt.aggregates.length) {\n var agg = pvt.aggregates;\n var fn = void 0;\n var aggregateData = pData;\n var res = {};\n if (data.aggregate) {\n aggregateData = data.aggregate;\n }\n for (var i = 0; i < agg.length; i++) {\n fn = DataUtil.aggregates[agg[i].type];\n if (fn) {\n res[agg[i].field + ' - ' + agg[i].type] = fn(aggregateData, agg[i].field);\n }\n }\n args.aggregates = res;\n }\n var key = 'key';\n var isServerGrouping = Array.isArray(data.result) && data.result.length && !isNullOrUndefined(data.result[0][key]);\n if (pvt && pvt.groups && pvt.groups.length && !isServerGrouping) {\n var groups = pvt.groups;\n for (var i = 0; i < groups.length; i++) {\n var level = null;\n if (!isNullOrUndefined(groupDs)) {\n groupDs = DataUtil.group(groupDs, groups[i]);\n }\n var groupQuery = Query.filterQueries(query.queries, 'onGroup')[i].e;\n pData = DataUtil.group(pData, groups[i], pvt.aggregates, level, groupDs, groupQuery.comparer);\n }\n args.result = pData;\n }\n return args;\n };\n UrlAdaptor.prototype.getQueryRequest = function (query) {\n var req = { sorts: [], groups: [], filters: [], searches: [], aggregates: [] };\n req.sorts = Query.filterQueries(query.queries, 'onSortBy');\n req.groups = Query.filterQueries(query.queries, 'onGroup');\n req.filters = Query.filterQueries(query.queries, 'onWhere');\n req.searches = Query.filterQueries(query.queries, 'onSearch');\n req.aggregates = Query.filterQueries(query.queries, 'onAggregates');\n return req;\n };\n UrlAdaptor.prototype.addParams = function (options) {\n var req = options.reqParams;\n if (options.params.length) {\n req.params = {};\n }\n for (var _i = 0, _a = options.params; _i < _a.length; _i++) {\n var tmp = _a[_i];\n if (req[tmp.key]) {\n throw new Error('Query() - addParams: Custom Param is conflicting other request arguments');\n }\n req[tmp.key] = tmp.value;\n if (tmp.fn) {\n req[tmp.key] = tmp.fn.call(options.query, tmp.key, options.query, options.dm);\n }\n req.params[tmp.key] = req[tmp.key];\n }\n };\n return UrlAdaptor;\n}(Adaptor));\nexport { UrlAdaptor };\n/**\n * OData Adaptor that is extended from URL Adaptor, is used for consuming data through OData Service.\n *\n * @hidden\n */\nvar ODataAdaptor = /** @class */ (function (_super) {\n __extends(ODataAdaptor, _super);\n function ODataAdaptor(props) {\n var _this = _super.call(this) || this;\n // options replaced the default adaptor options\n _this.options = extend({}, _this.options, {\n requestType: 'get',\n accept: 'application/json;odata=light;q=1,application/json;odata=verbose;q=0.5',\n multipartAccept: 'multipart/mixed',\n sortBy: '$orderby',\n select: '$select',\n skip: '$skip',\n take: '$top',\n count: '$inlinecount',\n where: '$filter',\n expand: '$expand',\n batch: '$batch',\n changeSet: '--changeset_',\n batchPre: 'batch_',\n contentId: 'Content-Id: ',\n batchContent: 'Content-Type: multipart/mixed; boundary=',\n changeSetContent: 'Content-Type: application/http\\nContent-Transfer-Encoding: binary ',\n batchChangeSetContentType: 'Content-Type: application/json; charset=utf-8 ',\n updateType: 'PUT'\n });\n extend(_this.options, props || {});\n return _this;\n }\n ODataAdaptor.prototype.getModuleName = function () {\n return 'ODataAdaptor';\n };\n /**\n * Generate request string based on the filter criteria from query.\n *\n * @param {Predicate} pred\n * @param {boolean} requiresCast?\n * @param predicate\n * @param query\n * @param requiresCast\n */\n ODataAdaptor.prototype.onPredicate = function (predicate, query, requiresCast) {\n var returnValue = '';\n var operator;\n var guid;\n var val = predicate.value;\n var type = typeof val;\n var field = predicate.field ? ODataAdaptor.getField(predicate.field) : null;\n if (val instanceof Date) {\n val = 'datetime\\'' + DataUtil.parse.replacer(val) + '\\'';\n }\n if (type === 'string') {\n val = val.replace(/'/g, '\\'\\'');\n if (predicate.ignoreCase) {\n val = val.toLowerCase();\n }\n if (predicate.operator !== 'like') {\n val = encodeURIComponent(val);\n }\n if (predicate.operator !== 'wildcard' && predicate.operator !== 'like') {\n val = '\\'' + val + '\\'';\n }\n if (requiresCast) {\n field = 'cast(' + field + ', \\'Edm.String\\')';\n }\n if (DataUtil.parse.isGuid(val)) {\n guid = 'guid';\n }\n if (predicate.ignoreCase) {\n if (!guid) {\n field = 'tolower(' + field + ')';\n }\n val = val.toLowerCase();\n }\n }\n if (predicate.operator === 'isempty' || predicate.operator === 'isnull' || predicate.operator === 'isnotempty' ||\n predicate.operator === 'isnotnull') {\n operator = predicate.operator.indexOf('isnot') !== -1 ? DataUtil.odBiOperator['notequal'] : DataUtil.odBiOperator['equal'];\n val = predicate.operator === 'isnull' || predicate.operator === 'isnotnull' ? null : '\\'\\'';\n }\n else {\n operator = DataUtil.odBiOperator[predicate.operator];\n }\n if (operator) {\n returnValue += field;\n returnValue += operator;\n if (guid) {\n returnValue += guid;\n }\n return returnValue + val;\n }\n if (!isNullOrUndefined(this.getModuleName) && this.getModuleName() === 'ODataV4Adaptor') {\n operator = DataUtil.odv4UniOperator[predicate.operator];\n }\n else {\n operator = DataUtil.odUniOperator[predicate.operator];\n }\n if (operator === 'like') {\n val = val;\n if (val.indexOf('%') !== -1) {\n if (val.charAt(0) === '%' && val.lastIndexOf('%') < 2) {\n val = val.substring(1, val.length);\n operator = !isNullOrUndefined(this.getModuleName) && this.getModuleName() === 'ODataV4Adaptor' ?\n DataUtil.odv4UniOperator['startswith'] : DataUtil.odUniOperator['startswith'];\n }\n else if (val.charAt(val.length - 1) === '%' && val.indexOf('%') > val.length - 3) {\n val = val.substring(0, val.length - 1);\n operator = !isNullOrUndefined(this.getModuleName) && this.getModuleName() === 'ODataV4Adaptor' ?\n DataUtil.odv4UniOperator['endswith'] : DataUtil.odUniOperator['endswith'];\n }\n else if (val.lastIndexOf('%') !== val.indexOf('%') && val.lastIndexOf('%') > val.indexOf('%') + 1) {\n val = val.substring(val.indexOf('%') + 1, val.lastIndexOf('%'));\n operator = !isNullOrUndefined(this.getModuleName) && this.getModuleName() === 'ODataV4Adaptor' ?\n DataUtil.odv4UniOperator['contains'] : DataUtil.odUniOperator['contains'];\n }\n else {\n operator = !isNullOrUndefined(this.getModuleName) && this.getModuleName() === 'ODataV4Adaptor' ?\n DataUtil.odv4UniOperator['contains'] : DataUtil.odUniOperator['contains'];\n }\n }\n val = encodeURIComponent(val);\n val = '\\'' + val + '\\'';\n }\n else if (operator === 'wildcard') {\n val = val;\n if (val.indexOf('*') !== -1) {\n var splittedStringValue = val.split('*');\n var splittedValue = void 0;\n var count = 0;\n if (val.indexOf('*') !== 0 && splittedStringValue[0].indexOf('%3f') === -1 &&\n splittedStringValue[0].indexOf('?') === -1) {\n splittedValue = splittedStringValue[0];\n splittedValue = '\\'' + splittedValue + '\\'';\n operator = !isNullOrUndefined(this.getModuleName) && this.getModuleName() === 'ODataV4Adaptor' ?\n DataUtil.odv4UniOperator['startswith'] : DataUtil.odUniOperator['startswith'];\n returnValue += operator + '(';\n returnValue += field + ',';\n if (guid) {\n returnValue += guid;\n }\n returnValue += splittedValue + ')';\n count++;\n }\n if (val.lastIndexOf('*') !== val.length - 1 && splittedStringValue[splittedStringValue.length - 1].indexOf('%3f') === -1 &&\n splittedStringValue[splittedStringValue.length - 1].indexOf('?') === -1) {\n splittedValue = splittedStringValue[splittedStringValue.length - 1];\n splittedValue = '\\'' + splittedValue + '\\'';\n operator = !isNullOrUndefined(this.getModuleName) && this.getModuleName() === 'ODataV4Adaptor' ?\n DataUtil.odv4UniOperator['endswith'] : DataUtil.odUniOperator['endswith'];\n if (count > 0) {\n returnValue += ' and ';\n }\n returnValue += operator + '(';\n returnValue += field + ',';\n if (guid) {\n returnValue += guid;\n }\n returnValue += splittedValue + ')';\n count++;\n }\n if (splittedStringValue.length > 2) {\n for (var i = 1; i < splittedStringValue.length - 1; i++) {\n if (splittedStringValue[i].indexOf('%3f') === -1 && splittedStringValue[i].indexOf('?') === -1) {\n splittedValue = splittedStringValue[i];\n splittedValue = '\\'' + splittedValue + '\\'';\n operator = !isNullOrUndefined(this.getModuleName) && this.getModuleName() === 'ODataV4Adaptor' ?\n DataUtil.odv4UniOperator['contains'] : DataUtil.odUniOperator['contains'];\n if (count > 0) {\n returnValue += ' and ';\n }\n if (operator === 'substringof' || operator === 'not substringof') {\n var temp = splittedValue;\n splittedValue = field;\n field = temp;\n }\n returnValue += operator + '(';\n returnValue += field + ',';\n if (guid) {\n returnValue += guid;\n }\n returnValue += splittedValue + ')';\n count++;\n }\n }\n }\n if (count === 0) {\n operator = !isNullOrUndefined(this.getModuleName) && this.getModuleName() === 'ODataV4Adaptor' ?\n DataUtil.odv4UniOperator['contains'] : DataUtil.odUniOperator['contains'];\n if (val.indexOf('?') !== -1 || val.indexOf('%3f') !== -1) {\n val = val.indexOf('?') !== -1 ? val.split('?').join('') : val.split('%3f').join('');\n }\n val = '\\'' + val + '\\'';\n }\n else {\n operator = 'wildcard';\n }\n }\n else {\n operator = !isNullOrUndefined(this.getModuleName) && this.getModuleName() === 'ODataV4Adaptor' ?\n DataUtil.odv4UniOperator['contains'] : DataUtil.odUniOperator['contains'];\n if (val.indexOf('?') !== -1 || val.indexOf('%3f') !== -1) {\n val = val.indexOf('?') !== -1 ? val.split('?').join('') : val.split('%3f').join('');\n }\n val = '\\'' + val + '\\'';\n }\n }\n if (operator === 'substringof' || operator === 'not substringof') {\n var temp = val;\n val = field;\n field = temp;\n }\n if (operator !== 'wildcard') {\n returnValue += operator + '(';\n returnValue += field + ',';\n if (guid) {\n returnValue += guid;\n }\n returnValue += val + ')';\n }\n return returnValue;\n };\n ODataAdaptor.prototype.addParams = function (options) {\n _super.prototype.addParams.call(this, options);\n delete options.reqParams.params;\n };\n /**\n * Generate request string based on the multiple filter criteria from query.\n *\n * @param {Predicate} pred\n * @param {boolean} requiresCast?\n * @param predicate\n * @param query\n * @param requiresCast\n */\n ODataAdaptor.prototype.onComplexPredicate = function (predicate, query, requiresCast) {\n var res = [];\n for (var i = 0; i < predicate.predicates.length; i++) {\n res.push('(' + this.onEachWhere(predicate.predicates[i], query, requiresCast) + ')');\n }\n return res.join(' ' + predicate.condition + ' ');\n };\n /**\n * Generate query string based on the multiple filter criteria from query.\n *\n * @param {Predicate} filter\n * @param {boolean} requiresCast?\n * @param query\n * @param requiresCast\n */\n ODataAdaptor.prototype.onEachWhere = function (filter, query, requiresCast) {\n return filter.isComplex ? this.onComplexPredicate(filter, query, requiresCast) : this.onPredicate(filter, query, requiresCast);\n };\n /**\n * Generate query string based on the multiple filter criteria from query.\n *\n * @param {string[]} filters\n */\n ODataAdaptor.prototype.onWhere = function (filters) {\n if (this.pvt.search) {\n filters.push(this.onEachWhere(this.pvt.search, null, true));\n }\n return filters.join(' and ');\n };\n /**\n * Generate query string based on the multiple search criteria from query.\n *\n * @param e\n * @param {string} operator\n * @param {string} key\n * @param {boolean} } ignoreCase\n * @param e.fields\n * @param e.operator\n * @param e.key\n * @param e.ignoreCase\n */\n ODataAdaptor.prototype.onEachSearch = function (e) {\n if (e.fields && e.fields.length === 0) {\n DataUtil.throwError('Query() - Search : oData search requires list of field names to search');\n }\n var filter = this.pvt.search || [];\n for (var i = 0; i < e.fields.length; i++) {\n filter.push(new Predicate(e.fields[i], e.operator, e.key, e.ignoreCase));\n }\n this.pvt.search = filter;\n };\n /**\n * Generate query string based on the search criteria from query.\n *\n * @param {Object} e\n */\n ODataAdaptor.prototype.onSearch = function (e) {\n this.pvt.search = Predicate.or(this.pvt.search);\n return '';\n };\n /**\n * Generate query string based on multiple sort criteria from query.\n *\n * @param {QueryOptions} e\n */\n ODataAdaptor.prototype.onEachSort = function (e) {\n var res = [];\n if (e.name instanceof Array) {\n for (var i = 0; i < e.name.length; i++) {\n res.push(ODataAdaptor.getField(e.name[i]) + (e.direction === 'descending' ? ' desc' : ''));\n }\n }\n else {\n res.push(ODataAdaptor.getField(e.name) + (e.direction === 'descending' ? ' desc' : ''));\n }\n return res.join(',');\n };\n /**\n * Returns sort query string.\n *\n * @param {string[]} e\n */\n ODataAdaptor.prototype.onSortBy = function (e) {\n return e.reverse().join(',');\n };\n /**\n * Adds the group query to the adaptor option.\n *\n * @param {Object[]} e\n * @returns string\n */\n ODataAdaptor.prototype.onGroup = function (e) {\n this.pvt.groups = e;\n return [];\n };\n /**\n * Returns the select query string.\n *\n * @param {string[]} e\n */\n ODataAdaptor.prototype.onSelect = function (e) {\n for (var i = 0; i < e.length; i++) {\n e[i] = ODataAdaptor.getField(e[i]);\n }\n return e.join(',');\n };\n /**\n * Add the aggregate query to the adaptor option.\n *\n * @param {Object[]} e\n * @returns string\n */\n ODataAdaptor.prototype.onAggregates = function (e) {\n this.pvt.aggregates = e;\n return '';\n };\n /**\n * Returns the query string which requests total count from the data source.\n *\n * @param {boolean} e\n * @returns string\n */\n ODataAdaptor.prototype.onCount = function (e) {\n return e === true ? 'allpages' : '';\n };\n /**\n * Method will trigger before send the request to server side.\n * Used to set the custom header or modify the request options.\n *\n * @param {DataManager} dm\n * @param {XMLHttpRequest} request\n * @param {Ajax} settings?\n * @param settings\n */\n ODataAdaptor.prototype.beforeSend = function (dm, request, settings) {\n if (DataUtil.endsWith(settings.url, this.options.batch) && settings.type.toLowerCase() === 'post') {\n request.setRequestHeader('Accept', this.options.multipartAccept);\n request.setRequestHeader('DataServiceVersion', '2.0');\n request.overrideMimeType('text/plain; charset=x-user-defined');\n }\n else {\n request.setRequestHeader('Accept', this.options.accept);\n }\n request.setRequestHeader('DataServiceVersion', '2.0');\n request.setRequestHeader('MaxDataServiceVersion', '2.0');\n };\n /**\n * Returns the data from the query processing.\n *\n * @param {DataResult} data\n * @param {DataOptions} ds?\n * @param {Query} query?\n * @param {XMLHttpRequest} xhr?\n * @param {Ajax} request?\n * @param {CrudOptions} changes?\n * @param ds\n * @param query\n * @param xhr\n * @param request\n * @param changes\n * @returns aggregateResult\n */\n ODataAdaptor.prototype.processResponse = function (data, ds, query, xhr, request, changes) {\n var metaCheck = 'odata.metadata';\n if ((request && request.type === 'GET') && !this.rootUrl && data[metaCheck]) {\n var dataUrls = data[metaCheck].split('/$metadata#');\n this.rootUrl = dataUrls[0];\n this.resourceTableName = dataUrls[1];\n }\n var pvtData = 'pvtData';\n if (!isNullOrUndefined(data.d)) {\n var dataCopy = ((query && query.isCountRequired) ? data.d.results : data.d);\n var metaData = '__metadata';\n if (!isNullOrUndefined(dataCopy)) {\n for (var i = 0; i < dataCopy.length; i++) {\n if (!isNullOrUndefined(dataCopy[i][metaData])) {\n delete dataCopy[i][metaData];\n }\n }\n }\n }\n var pvt = request && request[pvtData];\n var emptyAndBatch = this.processBatchResponse(data, query, xhr, request, changes);\n if (emptyAndBatch) {\n return emptyAndBatch;\n }\n var versionCheck = xhr && request.getResponseHeader('DataServiceVersion');\n var count = null;\n var version = (versionCheck && parseInt(versionCheck, 10)) || 2;\n if (query && query.isCountRequired) {\n var oDataCount = '__count';\n if (data[oDataCount] || data['odata.count']) {\n count = data[oDataCount] || data['odata.count'];\n }\n if (data.d) {\n data = data.d;\n }\n if (data[oDataCount] || data['odata.count']) {\n count = data[oDataCount] || data['odata.count'];\n }\n }\n if (version === 3 && data.value) {\n data = data.value;\n }\n if (data.d) {\n data = data.d;\n }\n if (version < 3 && data.results) {\n data = data.results;\n }\n var args = {};\n args.count = count;\n args.result = data;\n this.getAggregateResult(pvt, data, args, null, query);\n return DataUtil.isNull(count) ? args.result : { result: args.result, count: args.count, aggregates: args.aggregates };\n };\n /**\n * Converts the request object to query string.\n *\n * @param {Object} req\n * @param request\n * @param {Query} query\n * @param {DataManager} dm\n * @returns tableName\n */\n ODataAdaptor.prototype.convertToQueryString = function (request, query, dm) {\n var res = [];\n var table = 'table';\n var tableName = request[table] || '';\n var format = '$format';\n delete request[table];\n if (dm.dataSource.requiresFormat) {\n request[format] = 'json';\n }\n var keys = Object.keys(request);\n for (var _i = 0, keys_4 = keys; _i < keys_4.length; _i++) {\n var prop = keys_4[_i];\n res.push(prop + '=' + request[prop]);\n }\n res = res.join('&');\n if (dm.dataSource.url && dm.dataSource.url.indexOf('?') !== -1 && !tableName) {\n return res;\n }\n return res.length ? tableName + '?' + res : tableName || '';\n };\n ODataAdaptor.prototype.localTimeReplacer = function (key, convertObj) {\n for (var _i = 0, _a = !isNullOrUndefined(convertObj) ? Object.keys(convertObj) : []; _i < _a.length; _i++) {\n var prop = _a[_i];\n if ((convertObj[prop] instanceof Date)) {\n convertObj[prop] = DataUtil.dateParse.toLocalTime(convertObj[prop]);\n }\n }\n return convertObj;\n };\n /**\n * Prepare and returns request body which is used to insert a new record in the table.\n *\n * @param {DataManager} dm\n * @param {Object} data\n * @param {string} tableName?\n * @param tableName\n */\n ODataAdaptor.prototype.insert = function (dm, data, tableName) {\n return {\n url: (dm.dataSource.insertUrl || dm.dataSource.url).replace(/\\/*$/, tableName ? '/' + tableName : ''),\n data: JSON.stringify(data, this.options.localTime ? this.localTimeReplacer : null)\n };\n };\n /**\n * Prepare and return request body which is used to remove record from the table.\n *\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {number} value\n * @param {string} tableName?\n * @param tableName\n */\n ODataAdaptor.prototype.remove = function (dm, keyField, value, tableName) {\n var url;\n if (typeof value === 'string' && !DataUtil.parse.isGuid(value)) {\n url = \"('\" + value + \"')\";\n }\n else {\n url = \"(\" + value + \")\";\n }\n return {\n type: 'DELETE',\n url: (dm.dataSource.removeUrl || dm.dataSource.url).replace(/\\/*$/, tableName ? '/' + tableName : '') + url\n };\n };\n /**\n * Updates existing record and saves the changes to the table.\n *\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {Object} value\n * @param {string} tableName?\n * @param tableName\n * @param query\n * @param original\n * @returns this\n */\n ODataAdaptor.prototype.update = function (dm, keyField, value, tableName, query, original) {\n if (this.options.updateType === 'PATCH' && !isNullOrUndefined(original)) {\n value = this.compareAndRemove(value, original, keyField);\n }\n var url;\n if (typeof value[keyField] === 'string' && !DataUtil.parse.isGuid(value[keyField])) {\n url = \"('\" + value[keyField] + \"')\";\n }\n else {\n url = \"(\" + value[keyField] + \")\";\n }\n return {\n type: this.options.updateType,\n url: (dm.dataSource.updateUrl || dm.dataSource.url).replace(/\\/*$/, tableName ? '/' + tableName : '') + url,\n data: JSON.stringify(value, this.options.localTime ? this.localTimeReplacer : null),\n accept: this.options.accept\n };\n };\n /**\n * Prepare the request body based on the newly added, removed and updated records.\n * The result is used by the batch request.\n *\n * @param {DataManager} dm\n * @param {CrudOptions} changes\n * @param {RemoteArgs} e\n * @param query\n * @param original\n * @returns {Object}\n */\n ODataAdaptor.prototype.batchRequest = function (dm, changes, e, query, original) {\n var initialGuid = e.guid = DataUtil.getGuid(this.options.batchPre);\n var url = this.rootUrl ? this.rootUrl + '/' + this.options.batch :\n dm.dataSource.url.replace(/\\/*$/, '/' + this.options.batch);\n e.url = this.resourceTableName ? this.resourceTableName : e.url;\n var args = {\n url: e.url,\n key: e.key,\n cid: 1,\n cSet: DataUtil.getGuid(this.options.changeSet)\n };\n var req = '--' + initialGuid + '\\n';\n req += 'Content-Type: multipart/mixed; boundary=' + args.cSet.replace('--', '') + '\\n';\n this.pvt.changeSet = 0;\n req += this.generateInsertRequest(changes.addedRecords, args, dm);\n req += this.generateUpdateRequest(changes.changedRecords, args, dm, original ? original.changedRecords : []);\n req += this.generateDeleteRequest(changes.deletedRecords, args, dm);\n req += args.cSet + '--\\n';\n req += '--' + initialGuid + '--';\n return {\n type: 'POST',\n url: url,\n dataType: 'json',\n contentType: 'multipart/mixed; charset=UTF-8;boundary=' + initialGuid,\n data: req\n };\n };\n /**\n * Generate the string content from the removed records.\n * The result will be send during batch update.\n *\n * @param {Object[]} arr\n * @param {RemoteArgs} e\n * @param dm\n * @returns this\n */\n ODataAdaptor.prototype.generateDeleteRequest = function (arr, e, dm) {\n if (!arr) {\n return '';\n }\n var req = '';\n var stat = {\n 'method': 'DELETE ',\n 'url': function (data, i, key) {\n var url = DataUtil.getObject(key, data[i]);\n if (typeof url === 'number' || DataUtil.parse.isGuid(url)) {\n return '(' + url + ')';\n }\n else if (url instanceof Date) {\n var dateTime = data[i][key];\n return '(' + dateTime.toJSON() + ')';\n }\n else {\n return \"('\" + url + \"')\";\n }\n },\n 'data': function (data, i) { return ''; }\n };\n req = this.generateBodyContent(arr, e, stat, dm);\n return req + '\\n';\n };\n /**\n * Generate the string content from the inserted records.\n * The result will be send during batch update.\n *\n * @param {Object[]} arr\n * @param {RemoteArgs} e\n * @param dm\n */\n ODataAdaptor.prototype.generateInsertRequest = function (arr, e, dm) {\n if (!arr) {\n return '';\n }\n var req = '';\n var stat = {\n 'method': 'POST ',\n 'url': function (data, i, key) { return ''; },\n 'data': function (data, i) { return JSON.stringify(data[i]) + '\\n\\n'; }\n };\n req = this.generateBodyContent(arr, e, stat, dm);\n return req;\n };\n /**\n * Generate the string content from the updated records.\n * The result will be send during batch update.\n *\n * @param {Object[]} arr\n * @param {RemoteArgs} e\n * @param dm\n * @param org\n */\n ODataAdaptor.prototype.generateUpdateRequest = function (arr, e, dm, org) {\n var _this = this;\n if (!arr) {\n return '';\n }\n var req = '';\n arr.forEach(function (change) { return change = _this.compareAndRemove(change, org.filter(function (o) { return DataUtil.getObject(e.key, o) === DataUtil.getObject(e.key, change); })[0], e.key); });\n var stat = {\n 'method': this.options.updateType + ' ',\n 'url': function (data, i, key) {\n if (typeof data[i][key] === 'number' || DataUtil.parse.isGuid(data[i][key])) {\n return '(' + data[i][key] + ')';\n }\n else if (data[i][key] instanceof Date) {\n var date = data[i][key];\n return '(' + date.toJSON() + ')';\n }\n else {\n return \"('\" + data[i][key] + \"')\";\n }\n },\n 'data': function (data, i) { return JSON.stringify(data[i]) + '\\n\\n'; }\n };\n req = this.generateBodyContent(arr, e, stat, dm);\n return req;\n };\n ODataAdaptor.getField = function (prop) {\n return prop.replace(/\\./g, '/');\n };\n ODataAdaptor.prototype.generateBodyContent = function (arr, e, stat, dm) {\n var req = '';\n for (var i = 0; i < arr.length; i++) {\n req += '\\n' + e.cSet + '\\n';\n req += this.options.changeSetContent + '\\n\\n';\n req += stat.method;\n if (stat.method === 'POST ') {\n req += (dm.dataSource.insertUrl || dm.dataSource.crudUrl || e.url) + stat.url(arr, i, e.key) + ' HTTP/1.1\\n';\n }\n else if (stat.method === 'PUT ' || stat.method === 'PATCH ') {\n req += (dm.dataSource.updateUrl || dm.dataSource.crudUrl || e.url) + stat.url(arr, i, e.key) + ' HTTP/1.1\\n';\n }\n else if (stat.method === 'DELETE ') {\n req += (dm.dataSource.removeUrl || dm.dataSource.crudUrl || e.url) + stat.url(arr, i, e.key) + ' HTTP/1.1\\n';\n }\n req += 'Accept: ' + this.options.accept + '\\n';\n req += 'Content-Id: ' + this.pvt.changeSet++ + '\\n';\n req += this.options.batchChangeSetContentType + '\\n';\n if (!isNullOrUndefined(arr[i]['@odata.etag'])) {\n req += 'If-Match: ' + arr[i]['@odata.etag'] + '\\n\\n';\n delete arr[i]['@odata.etag'];\n }\n else {\n req += '\\n';\n }\n req += stat.data(arr, i);\n }\n return req;\n };\n ODataAdaptor.prototype.processBatchResponse = function (data, query, xhr, request, changes) {\n if (xhr && xhr.getResponseHeader('Content-Type') && xhr.getResponseHeader('Content-Type').indexOf('xml') !== -1) {\n return (query.isCountRequired ? { result: [], count: 0 } : []);\n }\n if (request && this.options.batch && DataUtil.endsWith(request.url, this.options.batch) && request.type.toLowerCase() === 'post') {\n var guid = xhr.getResponseHeader('Content-Type');\n var cIdx = void 0;\n var jsonObj = void 0;\n var d = data + '';\n guid = guid.substring(guid.indexOf('=batchresponse') + 1);\n d = d.split(guid);\n if (d.length < 2) {\n return {};\n }\n d = d[1];\n var exVal = /(?:\\bContent-Type.+boundary=)(changesetresponse.+)/i.exec(d);\n if (exVal) {\n d.replace(exVal[0], '');\n }\n var changeGuid = exVal ? exVal[1] : '';\n d = d.split(changeGuid);\n for (var i = d.length; i > -1; i--) {\n if (!/\\bContent-ID:/i.test(d[i]) || !/\\bHTTP.+201/.test(d[i])) {\n continue;\n }\n cIdx = parseInt(/\\bContent-ID: (\\d+)/i.exec(d[i])[1], 10);\n if (changes.addedRecords[cIdx]) {\n jsonObj = DataUtil.parse.parseJson(/^\\{.+\\}/m.exec(d[i])[0]);\n extend({}, changes.addedRecords[cIdx], this.processResponse(jsonObj));\n }\n }\n return changes;\n }\n return null;\n };\n ODataAdaptor.prototype.compareAndRemove = function (data, original, key) {\n var _this = this;\n if (isNullOrUndefined(original)) {\n return data;\n }\n Object.keys(data).forEach(function (prop) {\n if (prop !== key && prop !== '@odata.etag') {\n if (DataUtil.isPlainObject(data[prop])) {\n _this.compareAndRemove(data[prop], original[prop]);\n var final = Object.keys(data[prop]).filter(function (data) { return data !== '@odata.etag'; });\n if (final.length === 0) {\n delete data[prop];\n }\n }\n else if (data[prop] === original[prop]) {\n delete data[prop];\n }\n else if (data[prop] && original[prop] && data[prop].valueOf() === original[prop].valueOf()) {\n delete data[prop];\n }\n }\n });\n return data;\n };\n return ODataAdaptor;\n}(UrlAdaptor));\nexport { ODataAdaptor };\n/**\n * The OData v4 is an improved version of OData protocols.\n * The DataManager uses the ODataV4Adaptor to consume OData v4 services.\n *\n * @hidden\n */\nvar ODataV4Adaptor = /** @class */ (function (_super) {\n __extends(ODataV4Adaptor, _super);\n function ODataV4Adaptor(props) {\n var _this = _super.call(this, props) || this;\n // options replaced the default adaptor options\n _this.options = extend({}, _this.options, {\n requestType: 'get',\n accept: 'application/json, text/javascript, */*; q=0.01',\n multipartAccept: 'multipart/mixed',\n sortBy: '$orderby',\n select: '$select',\n skip: '$skip',\n take: '$top',\n count: '$count',\n search: '$search',\n where: '$filter',\n expand: '$expand',\n batch: '$batch',\n changeSet: '--changeset_',\n batchPre: 'batch_',\n contentId: 'Content-Id: ',\n batchContent: 'Content-Type: multipart/mixed; boundary=',\n changeSetContent: 'Content-Type: application/http\\nContent-Transfer-Encoding: binary ',\n batchChangeSetContentType: 'Content-Type: application/json; charset=utf-8 ',\n updateType: 'PATCH',\n localTime: false,\n apply: '$apply'\n });\n extend(_this.options, props || {});\n return _this;\n }\n /**\n * @hidden\n */\n ODataV4Adaptor.prototype.getModuleName = function () {\n return 'ODataV4Adaptor';\n };\n /**\n * Returns the query string which requests total count from the data source.\n *\n * @param {boolean} e\n * @returns string\n */\n ODataV4Adaptor.prototype.onCount = function (e) {\n return e === true ? 'true' : '';\n };\n /**\n * Generate request string based on the filter criteria from query.\n *\n * @param {Predicate} pred\n * @param {boolean} requiresCast?\n * @param predicate\n * @param query\n * @param requiresCast\n */\n ODataV4Adaptor.prototype.onPredicate = function (predicate, query, requiresCast) {\n var returnValue = '';\n var val = predicate.value;\n var isDate = val instanceof Date;\n if (query instanceof Query) {\n var queries = this.getQueryRequest(query);\n for (var i = 0; i < queries.filters.length; i++) {\n if (queries.filters[i].e.key === predicate.value) {\n requiresCast = true;\n }\n }\n }\n returnValue = _super.prototype.onPredicate.call(this, predicate, query, requiresCast);\n if (isDate) {\n returnValue = returnValue.replace(/datetime'(.*)'$/, '$1');\n }\n if (DataUtil.parse.isGuid(val)) {\n returnValue = returnValue.replace('guid', '').replace(/'/g, '');\n }\n return returnValue;\n };\n /**\n * Generate query string based on the multiple search criteria from query.\n *\n * @param e\n * @param {string} operator\n * @param {string} key\n * @param {boolean} } ignoreCase\n * @param e.fields\n * @param e.operator\n * @param e.key\n * @param e.ignoreCase\n */\n ODataV4Adaptor.prototype.onEachSearch = function (e) {\n var search = this.pvt.searches || [];\n search.push(e.key);\n this.pvt.searches = search;\n };\n /**\n * Generate query string based on the search criteria from query.\n *\n * @param {Object} e\n */\n ODataV4Adaptor.prototype.onSearch = function (e) {\n return this.pvt.searches.join(' OR ');\n };\n /**\n * Returns the expand query string.\n *\n * @param {string} e\n * @param e.selects\n * @param e.expands\n */\n ODataV4Adaptor.prototype.onExpand = function (e) {\n var _this = this;\n var selected = {};\n var expanded = {};\n var expands = e.expands.slice();\n var exArr = [];\n var selects = e.selects.filter(function (item) { return item.indexOf('.') > -1; });\n selects.forEach(function (select) {\n var splits = select.split('.');\n if (!(splits[0] in selected)) {\n selected[splits[0]] = [];\n }\n if (splits.length === 2) {\n if (selected[splits[0]].length && Object.keys(selected).indexOf(splits[0]) !== -1) {\n if (selected[splits[0]][0].indexOf('$expand') !== -1 && selected[splits[0]][0].indexOf(';$select=') === -1) {\n selected[splits[0]][0] = selected[splits[0]][0] + ';' + '$select=' + splits[1];\n }\n else {\n selected[splits[0]][0] = selected[splits[0]][0] + ',' + splits[1];\n }\n }\n else {\n selected[splits[0]].push('$select=' + splits[1]);\n }\n }\n else {\n var sel = '$select=' + splits[splits.length - 1];\n var exp = '';\n var close_1 = '';\n for (var i = 1; i < splits.length - 1; i++) {\n exp = exp + '$expand=' + splits[i] + '(';\n close_1 = close_1 + ')';\n }\n var combineVal = exp + sel + close_1;\n if (selected[splits[0]].length && Object.keys(selected).indexOf(splits[0]) !== -1 &&\n _this.expandQueryIndex(selected[splits[0]], true)) {\n var idx = _this.expandQueryIndex(selected[splits[0]]);\n selected[splits[0]][idx] = selected[splits[0]][idx] + combineVal.replace('$expand=', ',');\n }\n else {\n selected[splits[0]].push(combineVal);\n }\n }\n });\n //Auto expand from select query\n Object.keys(selected).forEach(function (expand) {\n if ((expands.indexOf(expand) === -1)) {\n expands.push(expand);\n }\n });\n expands.forEach(function (expand) {\n expanded[expand] = expand in selected ? expand + \"(\" + selected[expand].join(';') + \")\" : expand;\n });\n Object.keys(expanded).forEach(function (ex) { return exArr.push(expanded[ex]); });\n return exArr.join(',');\n };\n ODataV4Adaptor.prototype.expandQueryIndex = function (query, isExpand) {\n for (var i = 0; i < query.length; i++) {\n if (query[i].indexOf('$expand') !== -1) {\n return isExpand ? true : i;\n }\n }\n return isExpand ? false : 0;\n };\n /**\n * Returns the groupby query string.\n *\n * @param {string} e\n * @param distinctFields\n */\n ODataV4Adaptor.prototype.onDistinct = function (distinctFields) {\n var fields = distinctFields.map(function (field) { return ODataAdaptor.getField(field); }).join(',');\n return \"groupby((\" + fields + \"))\";\n };\n /**\n * Returns the select query string.\n *\n * @param {string[]} e\n */\n ODataV4Adaptor.prototype.onSelect = function (e) {\n return _super.prototype.onSelect.call(this, e.filter(function (item) { return item.indexOf('.') === -1; }));\n };\n /**\n * Method will trigger before send the request to server side.\n * Used to set the custom header or modify the request options.\n *\n * @param {DataManager} dm\n * @param {XMLHttpRequest} request\n * @param {Ajax} settings\n * @returns void\n */\n ODataV4Adaptor.prototype.beforeSend = function (dm, request, settings) {\n if (settings.type === 'POST' || settings.type === 'PUT' || settings.type === 'PATCH') {\n request.setRequestHeader('Prefer', 'return=representation');\n }\n request.setRequestHeader('Accept', this.options.accept);\n };\n /**\n * Returns the data from the query processing.\n *\n * @param {DataResult} data\n * @param {DataOptions} ds?\n * @param {Query} query?\n * @param {XMLHttpRequest} xhr?\n * @param {Ajax} request?\n * @param {CrudOptions} changes?\n * @param ds\n * @param query\n * @param xhr\n * @param request\n * @param changes\n * @returns aggregateResult\n */\n ODataV4Adaptor.prototype.processResponse = function (data, ds, query, xhr, request, changes) {\n var metaName = '@odata.context';\n if ((request && request.type === 'GET') && !this.rootUrl && data[metaName]) {\n var dataUrl = data[metaName].split('/$metadata#');\n this.rootUrl = dataUrl[0];\n this.resourceTableName = dataUrl[1];\n }\n var pvtData = 'pvtData';\n var pvt = request && request[pvtData];\n var emptyAndBatch = _super.prototype.processBatchResponse.call(this, data, query, xhr, request, changes);\n if (emptyAndBatch) {\n return emptyAndBatch;\n }\n var count = null;\n var dataCount = '@odata.count';\n if (query && query.isCountRequired) {\n if (dataCount in data) {\n count = data[dataCount];\n }\n }\n data = !isNullOrUndefined(data.value) ? data.value : data;\n var args = {};\n args.count = count;\n args.result = data;\n this.getAggregateResult(pvt, data, args, null, query);\n return DataUtil.isNull(count) ? args.result : { result: args.result, count: count, aggregates: args.aggregates };\n };\n return ODataV4Adaptor;\n}(ODataAdaptor));\nexport { ODataV4Adaptor };\n/**\n * The Web API is a programmatic interface to define the request and response messages system that is mostly exposed in JSON or XML.\n * The DataManager uses the WebApiAdaptor to consume Web API.\n * Since this adaptor is targeted to interact with Web API created using OData endpoint, it is extended from ODataAdaptor\n *\n * @hidden\n */\nvar WebApiAdaptor = /** @class */ (function (_super) {\n __extends(WebApiAdaptor, _super);\n function WebApiAdaptor() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n WebApiAdaptor.prototype.getModuleName = function () {\n return 'WebApiAdaptor';\n };\n /**\n * Prepare and returns request body which is used to insert a new record in the table.\n *\n * @param {DataManager} dm\n * @param {Object} data\n * @param {string} tableName?\n * @param tableName\n */\n WebApiAdaptor.prototype.insert = function (dm, data, tableName) {\n return {\n type: 'POST',\n url: dm.dataSource.url,\n data: JSON.stringify(data)\n };\n };\n /**\n * Prepare and return request body which is used to remove record from the table.\n *\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {number} value\n * @param {string} tableName?\n * @param tableName\n */\n WebApiAdaptor.prototype.remove = function (dm, keyField, value, tableName) {\n return {\n type: 'DELETE',\n url: dm.dataSource.url + '/' + value,\n data: JSON.stringify(value)\n };\n };\n /**\n * Prepare and return request body which is used to update record.\n *\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {Object} value\n * @param {string} tableName?\n * @param tableName\n */\n WebApiAdaptor.prototype.update = function (dm, keyField, value, tableName) {\n return {\n type: 'PUT',\n url: dm.dataSource.url,\n data: JSON.stringify(value)\n };\n };\n WebApiAdaptor.prototype.batchRequest = function (dm, changes, e) {\n var _this = this;\n var initialGuid = e.guid = DataUtil.getGuid(this.options.batchPre);\n var url = dm.dataSource.url.replace(/\\/*$/, '/' + this.options.batch);\n e.url = this.resourceTableName ? this.resourceTableName : e.url;\n var req = [];\n var _loop_1 = function (i, x) {\n changes.addedRecords.forEach(function (j, d) {\n var stat = {\n 'method': 'POST ',\n 'url': function (data, i, key) { return ''; },\n 'data': function (data, i) { return JSON.stringify(data[i]) + '\\n\\n'; }\n };\n req.push('--' + initialGuid);\n req.push('Content-Type: application/http; msgtype=request', '');\n req.push('POST ' + '/api/' + (dm.dataSource.insertUrl || dm.dataSource.crudUrl || e.url)\n + stat.url(changes.addedRecords, i, e.key) + ' HTTP/1.1');\n req.push('Content-Type: ' + 'application/json; charset=utf-8');\n req.push('Host: ' + location.host);\n req.push('', j ? JSON.stringify(j) : '');\n });\n };\n //insertion\n for (var i = 0, x = changes.addedRecords.length; i < x; i++) {\n _loop_1(i, x);\n }\n var _loop_2 = function (i, x) {\n changes.changedRecords.forEach(function (j, d) {\n var stat = {\n 'method': _this.options.updateType + ' ',\n 'url': function (data, i, key) { return ''; },\n 'data': function (data, i) { return JSON.stringify(data[i]) + '\\n\\n'; }\n };\n req.push('--' + initialGuid);\n req.push('Content-Type: application/http; msgtype=request', '');\n req.push('PUT ' + '/api/' + (dm.dataSource.updateUrl || dm.dataSource.crudUrl || e.url)\n + stat.url(changes.changedRecords, i, e.key) + ' HTTP/1.1');\n req.push('Content-Type: ' + 'application/json; charset=utf-8');\n req.push('Host: ' + location.host);\n req.push('', j ? JSON.stringify(j) : '');\n });\n };\n //updation\n for (var i = 0, x = changes.changedRecords.length; i < x; i++) {\n _loop_2(i, x);\n }\n var _loop_3 = function (i, x) {\n changes.deletedRecords.forEach(function (j, d) {\n var state = {\n 'mtd': 'DELETE ',\n 'url': function (data, i, key) {\n var url = DataUtil.getObject(key, data[i]);\n if (typeof url === 'number' || DataUtil.parse.isGuid(url)) {\n return '/' + url;\n }\n else if (url instanceof Date) {\n var datTime = data[i][key];\n return '/' + datTime.toJSON();\n }\n else {\n return \"/'\" + url + \"'\";\n }\n },\n 'data': function (data, i) { return ''; }\n };\n req.push('--' + initialGuid);\n req.push('Content-Type: application/http; msgtype=request', '');\n req.push('DELETE ' + '/api/' + (dm.dataSource.removeUrl || dm.dataSource.crudUrl || e.url)\n + state.url(changes.deletedRecords, i, e.key) + ' HTTP/1.1');\n req.push('Content-Type: ' + 'application/json; charset=utf-8');\n req.push('Host: ' + location.host);\n req.push('', j ? JSON.stringify(j) : '');\n });\n };\n //deletion\n for (var i = 0, x = changes.deletedRecords.length; i < x; i++) {\n _loop_3(i, x);\n }\n req.push('--' + initialGuid + '--', '');\n return {\n type: 'POST',\n url: url,\n contentType: 'multipart/mixed; boundary=' + initialGuid,\n data: req.join('\\r\\n')\n };\n };\n /**\n * Method will trigger before send the request to server side.\n * Used to set the custom header or modify the request options.\n *\n * @param {DataManager} dm\n * @param {XMLHttpRequest} request\n * @param {Ajax} settings\n * @returns void\n */\n WebApiAdaptor.prototype.beforeSend = function (dm, request, settings) {\n request.setRequestHeader('Accept', 'application/json, text/javascript, */*; q=0.01');\n };\n /**\n * Returns the data from the query processing.\n *\n * @param {DataResult} data\n * @param {DataOptions} ds?\n * @param {Query} query?\n * @param {XMLHttpRequest} xhr?\n * @param {Ajax} request?\n * @param {CrudOptions} changes?\n * @param ds\n * @param query\n * @param xhr\n * @param request\n * @param changes\n * @returns aggregateResult\n */\n WebApiAdaptor.prototype.processResponse = function (data, ds, query, xhr, request, changes) {\n var pvtData = 'pvtData';\n var pvt = request && request[pvtData];\n var count = null;\n var args = {};\n if (request && request.type.toLowerCase() !== 'post') {\n var versionCheck = xhr && request.getResponseHeader('DataServiceVersion');\n var version = (versionCheck && parseInt(versionCheck, 10)) || 2;\n if (query && query.isCountRequired) {\n if (!DataUtil.isNull(data.Count)) {\n count = data.Count;\n }\n }\n if (version < 3 && data.Items) {\n data = data.Items;\n }\n args.count = count;\n args.result = data;\n this.getAggregateResult(pvt, data, args, null, query);\n }\n args.result = args.result || data;\n return DataUtil.isNull(count) ? args.result : { result: args.result, count: args.count, aggregates: args.aggregates };\n };\n return WebApiAdaptor;\n}(ODataAdaptor));\nexport { WebApiAdaptor };\n/**\n * WebMethodAdaptor can be used by DataManager to interact with web method.\n *\n * @hidden\n */\nvar WebMethodAdaptor = /** @class */ (function (_super) {\n __extends(WebMethodAdaptor, _super);\n function WebMethodAdaptor() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n /**\n * Prepare the request body based on the query.\n * The query information can be accessed at the WebMethod using variable named `value`.\n *\n * @param {DataManager} dm\n * @param {Query} query\n * @param {Object[]} hierarchyFilters?\n * @param hierarchyFilters\n * @returns application\n */\n WebMethodAdaptor.prototype.processQuery = function (dm, query, hierarchyFilters) {\n var obj = new UrlAdaptor().processQuery(dm, query, hierarchyFilters);\n var getData = 'data';\n var data = DataUtil.parse.parseJson(obj[getData]);\n var result = {};\n var value = 'value';\n if (data.param) {\n for (var i = 0; i < data.param.length; i++) {\n var param = data.param[i];\n var key = Object.keys(param)[0];\n result[key] = param[key];\n }\n }\n result[value] = data;\n var pvtData = 'pvtData';\n var url = 'url';\n return {\n data: JSON.stringify(result),\n url: obj[url],\n pvtData: obj[pvtData],\n type: 'POST',\n contentType: 'application/json; charset=utf-8'\n };\n };\n return WebMethodAdaptor;\n}(UrlAdaptor));\nexport { WebMethodAdaptor };\n/**\n * RemoteSaveAdaptor, extended from JsonAdaptor and it is used for binding local data and performs all DataManager queries in client-side.\n * It interacts with server-side only for CRUD operations.\n *\n * @hidden\n */\nvar RemoteSaveAdaptor = /** @class */ (function (_super) {\n __extends(RemoteSaveAdaptor, _super);\n /**\n * @hidden\n */\n function RemoteSaveAdaptor() {\n var _this = _super.call(this) || this;\n setValue('beforeSend', UrlAdaptor.prototype.beforeSend, _this);\n return _this;\n }\n RemoteSaveAdaptor.prototype.insert = function (dm, data, tableName, query, position) {\n this.pvt.position = position;\n this.updateType = 'add';\n return {\n url: dm.dataSource.insertUrl || dm.dataSource.crudUrl || dm.dataSource.url,\n data: JSON.stringify(extend({}, {\n value: data,\n table: tableName,\n action: 'insert'\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n RemoteSaveAdaptor.prototype.remove = function (dm, keyField, val, tableName, query) {\n _super.prototype.remove.call(this, dm, keyField, val);\n return {\n type: 'POST',\n url: dm.dataSource.removeUrl || dm.dataSource.crudUrl || dm.dataSource.url,\n data: JSON.stringify(extend({}, {\n key: val,\n keyColumn: keyField,\n table: tableName,\n action: 'remove'\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n RemoteSaveAdaptor.prototype.update = function (dm, keyField, val, tableName, query) {\n this.updateType = 'update';\n this.updateKey = keyField;\n return {\n type: 'POST',\n url: dm.dataSource.updateUrl || dm.dataSource.crudUrl || dm.dataSource.url,\n data: JSON.stringify(extend({}, {\n value: val,\n action: 'update',\n keyColumn: keyField,\n key: val[keyField],\n table: tableName\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n RemoteSaveAdaptor.prototype.processResponse = function (data, ds, query, xhr, request, changes, e) {\n var i;\n var newData = request ? JSON.parse(request.data) : data;\n data = newData.action === 'batch' ? DataUtil.parse.parseJson(data) : data;\n if (this.updateType === 'add') {\n _super.prototype.insert.call(this, ds, data, null, null, this.pvt.position);\n }\n if (this.updateType === 'update') {\n _super.prototype.update.call(this, ds, this.updateKey, data);\n }\n this.updateType = undefined;\n if (data.added) {\n for (i = 0; i < data.added.length; i++) {\n _super.prototype.insert.call(this, ds, data.added[i]);\n }\n }\n if (data.changed) {\n for (i = 0; i < data.changed.length; i++) {\n _super.prototype.update.call(this, ds, e.key, data.changed[i]);\n }\n }\n if (data.deleted) {\n for (i = 0; i < data.deleted.length; i++) {\n _super.prototype.remove.call(this, ds, e.key, data.deleted[i]);\n }\n }\n return data;\n };\n /**\n * Prepare the request body based on the newly added, removed and updated records.\n * Also perform the changes in the locally cached data to sync with the remote data.\n * The result is used by the batch request.\n *\n * @param {DataManager} dm\n * @param {CrudOptions} changes\n * @param {RemoteArgs} e\n * @param query\n * @param original\n */\n RemoteSaveAdaptor.prototype.batchRequest = function (dm, changes, e, query, original) {\n return {\n type: 'POST',\n url: dm.dataSource.batchUrl || dm.dataSource.crudUrl || dm.dataSource.url,\n contentType: 'application/json; charset=utf-8',\n dataType: 'json',\n data: JSON.stringify(extend({}, {\n changed: changes.changedRecords,\n added: changes.addedRecords,\n deleted: changes.deletedRecords,\n action: 'batch',\n table: e.url,\n key: e.key\n }, DataUtil.getAddParams(this, dm, query)))\n };\n };\n RemoteSaveAdaptor.prototype.addParams = function (options) {\n var urlParams = new UrlAdaptor();\n urlParams.addParams(options);\n };\n return RemoteSaveAdaptor;\n}(JsonAdaptor));\nexport { RemoteSaveAdaptor };\n/**\n * Ajax Adaptor that is extended from URL Adaptor, is used for handle data operations with user defined functions.\n *\n * @hidden\n */\nvar CustomDataAdaptor = /** @class */ (function (_super) {\n __extends(CustomDataAdaptor, _super);\n function CustomDataAdaptor(props) {\n var _this = _super.call(this) || this;\n // options replaced the default adaptor options\n _this.options = extend({}, _this.options, {\n getData: new Function(),\n addRecord: new Function(),\n updateRecord: new Function(),\n deleteRecord: new Function(),\n batchUpdate: new Function()\n });\n extend(_this.options, props || {});\n return _this;\n }\n CustomDataAdaptor.prototype.getModuleName = function () {\n return 'CustomDataAdaptor';\n };\n return CustomDataAdaptor;\n}(UrlAdaptor));\nexport { CustomDataAdaptor };\n/**\n * The GraphqlAdaptor that is extended from URL Adaptor, is used for retrieving data from the Graphql server.\n * It interacts with the Graphql server with all the DataManager Queries and performs CRUD operations.\n *\n * @hidden\n */\nvar GraphQLAdaptor = /** @class */ (function (_super) {\n __extends(GraphQLAdaptor, _super);\n function GraphQLAdaptor(options) {\n var _this = _super.call(this) || this;\n _this.opt = options;\n _this.schema = _this.opt.response;\n _this.query = _this.opt.query;\n /* eslint-disable @typescript-eslint/no-empty-function */\n // tslint:disable-next-line:no-empty\n _this.getVariables = _this.opt.getVariables ? _this.opt.getVariables : function () { };\n /* eslint-enable @typescript-eslint/no-empty-function */\n _this.getQuery = function () { return _this.query; };\n return _this;\n }\n GraphQLAdaptor.prototype.getModuleName = function () {\n return 'GraphQLAdaptor';\n };\n /**\n * Process the JSON data based on the provided queries.\n *\n * @param {DataManager} dm\n * @param {Query} query?\n * @param datamanager\n * @param query\n */\n GraphQLAdaptor.prototype.processQuery = function (datamanager, query) {\n var urlQuery = _super.prototype.processQuery.apply(this, arguments);\n var dm = JSON.parse(urlQuery.data);\n // constructing GraphQL parameters\n var keys = ['skip', 'take', 'sorted', 'table', 'select', 'where',\n 'search', 'requiresCounts', 'aggregates', 'params'];\n var temp = {};\n var str = 'searchwhereparams';\n keys.filter(function (e) {\n temp[e] = str.indexOf(e) > -1 ? JSON.stringify(dm[e]) : dm[e];\n });\n var vars = this.getVariables() || {};\n // tslint:disable-next-line:no-string-literal\n vars['datamanager'] = temp;\n var data = JSON.stringify({\n query: this.getQuery(),\n variables: vars\n });\n urlQuery.data = data;\n return urlQuery;\n };\n /**\n * Returns the data from the query processing.\n * It will also cache the data for later usage.\n *\n * @param {DataResult} data\n * @param {DataManager} ds?\n * @param {Query} query?\n * @param {XMLHttpRequest} xhr?\n * @param {Object} request?\n * @param resData\n * @param ds\n * @param query\n * @param xhr\n * @param request\n * @returns DataResult\n */\n GraphQLAdaptor.prototype.processResponse = function (resData, ds, query, xhr, request) {\n var res = resData;\n var count;\n var aggregates;\n var result = getValue(this.schema.result, res.data);\n if (this.schema.count) {\n count = getValue(this.schema.count, res.data);\n }\n if (this.schema.aggregates) {\n aggregates = getValue(this.schema.aggregates, res.data);\n aggregates = !isNullOrUndefined(aggregates) ? DataUtil.parse.parseJson(aggregates) : aggregates;\n }\n var pvt = request.pvtData || {};\n var args = { result: result, aggregates: aggregates };\n var data = args;\n if (pvt && pvt.groups && pvt.groups.length) {\n this.getAggregateResult(pvt, data, args, null, query);\n }\n return !isNullOrUndefined(count) ? { result: args.result, count: count, aggregates: aggregates } : args.result;\n };\n /**\n * Prepare and returns request body which is used to insert a new record in the table.\n */\n GraphQLAdaptor.prototype.insert = function () {\n var inserted = _super.prototype.insert.apply(this, arguments);\n return this.generateCrudData(inserted, 'insert');\n };\n /**\n * Prepare and returns request body which is used to update a new record in the table.\n */\n GraphQLAdaptor.prototype.update = function () {\n var inserted = _super.prototype.update.apply(this, arguments);\n return this.generateCrudData(inserted, 'update');\n };\n /**\n * Prepare and returns request body which is used to remove a new record in the table.\n */\n GraphQLAdaptor.prototype.remove = function () {\n var inserted = _super.prototype.remove.apply(this, arguments);\n return this.generateCrudData(inserted, 'remove');\n };\n /**\n * Prepare the request body based on the newly added, removed and updated records.\n * The result is used by the batch request.\n *\n * @param {DataManager} dm\n * @param {CrudOptions} changes\n * @param {Object} e\n * @param e.key\n * @param {Query} query\n * @param {Object} original\n */\n GraphQLAdaptor.prototype.batchRequest = function (dm, changes, e, query, original) {\n var batch = _super.prototype.batchRequest.apply(this, arguments);\n // tslint:disable-next-line:typedef\n var bData = JSON.parse(batch.data);\n bData.key = e.key;\n batch.data = JSON.stringify(bData);\n return this.generateCrudData(batch, 'batch');\n };\n GraphQLAdaptor.prototype.generateCrudData = function (crudData, action) {\n var parsed = JSON.parse(crudData.data);\n crudData.data = JSON.stringify({\n query: this.opt.getMutation(action),\n variables: parsed\n });\n return crudData;\n };\n return GraphQLAdaptor;\n}(UrlAdaptor));\nexport { GraphQLAdaptor };\n/**\n * Cache Adaptor is used to cache the data of the visited pages. It prevents new requests for the previously visited pages.\n * You can configure cache page size and duration of caching by using cachingPageSize and timeTillExpiration properties of the DataManager\n *\n * @hidden\n */\nvar CacheAdaptor = /** @class */ (function (_super) {\n __extends(CacheAdaptor, _super);\n /**\n * Constructor for CacheAdaptor class.\n *\n * @param {CacheAdaptor} adaptor?\n * @param {number} timeStamp?\n * @param {number} pageSize?\n * @param adaptor\n * @param timeStamp\n * @param pageSize\n * @hidden\n */\n function CacheAdaptor(adaptor, timeStamp, pageSize) {\n var _this = _super.call(this) || this;\n _this.isCrudAction = false;\n _this.isInsertAction = false;\n if (!isNullOrUndefined(adaptor)) {\n _this.cacheAdaptor = adaptor;\n }\n _this.pageSize = pageSize;\n _this.guidId = DataUtil.getGuid('cacheAdaptor');\n var obj = { keys: [], results: [] };\n window.localStorage.setItem(_this.guidId, JSON.stringify(obj));\n var guid = _this.guidId;\n if (!isNullOrUndefined(timeStamp)) {\n setInterval(function () {\n var data = DataUtil.parse.parseJson(window.localStorage.getItem(guid));\n var forDel = [];\n for (var i = 0; i < data.results.length; i++) {\n var currentTime = +new Date();\n var requestTime = +new Date(data.results[i].timeStamp);\n data.results[i].timeStamp = currentTime - requestTime;\n if (currentTime - requestTime > timeStamp) {\n forDel.push(i);\n }\n }\n for (var i = 0; i < forDel.length; i++) {\n data.results.splice(forDel[i], 1);\n data.keys.splice(forDel[i], 1);\n }\n window.localStorage.removeItem(guid);\n window.localStorage.setItem(guid, JSON.stringify(data));\n }, timeStamp);\n }\n return _this;\n }\n /**\n * It will generate the key based on the URL when we send a request to server.\n *\n * @param {string} url\n * @param {Query} query?\n * @param query\n * @hidden\n */\n CacheAdaptor.prototype.generateKey = function (url, query) {\n var queries = this.getQueryRequest(query);\n var singles = Query.filterQueryLists(query.queries, ['onSelect', 'onPage', 'onSkip', 'onTake', 'onRange']);\n var key = url;\n var page = 'onPage';\n if (page in singles) {\n key += singles[page].pageIndex;\n }\n queries.sorts.forEach(function (obj) {\n key += obj.e.direction + obj.e.fieldName;\n });\n queries.groups.forEach(function (obj) {\n key += obj.e.fieldName;\n });\n queries.searches.forEach(function (obj) {\n key += obj.e.searchKey;\n });\n for (var filter = 0; filter < queries.filters.length; filter++) {\n var currentFilter = queries.filters[filter];\n if (currentFilter.e.isComplex) {\n var newQuery = query.clone();\n newQuery.queries = [];\n for (var i = 0; i < currentFilter.e.predicates.length; i++) {\n newQuery.queries.push({ fn: 'onWhere', e: currentFilter.e.predicates[i], filter: query.queries.filter });\n }\n key += currentFilter.e.condition + this.generateKey(url, newQuery);\n }\n else {\n key += currentFilter.e.field + currentFilter.e.operator + currentFilter.e.value;\n }\n }\n return key;\n };\n /**\n * Process the query to generate request body.\n * If the data is already cached, it will return the cached data.\n *\n * @param {DataManager} dm\n * @param {Query} query?\n * @param {Object[]} hierarchyFilters?\n * @param query\n * @param hierarchyFilters\n */\n CacheAdaptor.prototype.processQuery = function (dm, query, hierarchyFilters) {\n var key = this.generateKey(dm.dataSource.url, query);\n var cachedItems = DataUtil.parse.parseJson(window.localStorage.getItem(this.guidId));\n var data = cachedItems ? cachedItems.results[cachedItems.keys.indexOf(key)] : null;\n if (data != null && !this.isCrudAction && !this.isInsertAction) {\n return data;\n }\n this.isCrudAction = null;\n this.isInsertAction = null;\n /* eslint-disable prefer-spread */\n return this.cacheAdaptor.processQuery.apply(this.cacheAdaptor, [].slice.call(arguments, 0));\n /* eslint-enable prefer-spread */\n };\n /**\n * Returns the data from the query processing.\n * It will also cache the data for later usage.\n *\n * @param {DataResult} data\n * @param {DataManager} ds?\n * @param {Query} query?\n * @param {XMLHttpRequest} xhr?\n * @param {Ajax} request?\n * @param {CrudOptions} changes?\n * @param ds\n * @param query\n * @param xhr\n * @param request\n * @param changes\n */\n CacheAdaptor.prototype.processResponse = function (data, ds, query, xhr, request, changes) {\n if (this.isInsertAction || (request && this.cacheAdaptor.options.batch &&\n DataUtil.endsWith(request.url, this.cacheAdaptor.options.batch) && request.type.toLowerCase() === 'post')) {\n return this.cacheAdaptor.processResponse(data, ds, query, xhr, request, changes);\n }\n /* eslint-disable prefer-spread */\n data = this.cacheAdaptor.processResponse.apply(this.cacheAdaptor, [].slice.call(arguments, 0));\n /* eslint-enable prefer-spread */\n var key = query ? this.generateKey(ds.dataSource.url, query) : ds.dataSource.url;\n var obj = {};\n obj = DataUtil.parse.parseJson(window.localStorage.getItem(this.guidId));\n var index = obj.keys.indexOf(key);\n if (index !== -1) {\n obj.results.splice(index, 1);\n obj.keys.splice(index, 1);\n }\n obj.results[obj.keys.push(key) - 1] = { keys: key, result: data.result, timeStamp: new Date(), count: data.count };\n while (obj.results.length > this.pageSize) {\n obj.results.splice(0, 1);\n obj.keys.splice(0, 1);\n }\n window.localStorage.setItem(this.guidId, JSON.stringify(obj));\n return data;\n };\n /**\n * Method will trigger before send the request to server side. Used to set the custom header or modify the request options.\n *\n * @param {DataManager} dm\n * @param {XMLHttpRequest} request\n * @param {Ajax} settings?\n * @param settings\n */\n CacheAdaptor.prototype.beforeSend = function (dm, request, settings) {\n if (!isNullOrUndefined(this.cacheAdaptor.options.batch) && DataUtil.endsWith(settings.url, this.cacheAdaptor.options.batch)\n && settings.type.toLowerCase() === 'post') {\n request.setRequestHeader('Accept', this.cacheAdaptor.options.multipartAccept);\n }\n if (!dm.dataSource.crossDomain) {\n request.setRequestHeader('Accept', this.cacheAdaptor.options.accept);\n }\n };\n /**\n * Updates existing record and saves the changes to the table.\n *\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {Object} value\n * @param {string} tableName\n */\n CacheAdaptor.prototype.update = function (dm, keyField, value, tableName) {\n this.isCrudAction = true;\n return this.cacheAdaptor.update(dm, keyField, value, tableName);\n };\n /**\n * Prepare and returns request body which is used to insert a new record in the table.\n *\n * @param {DataManager} dm\n * @param {Object} data\n * @param {string} tableName?\n * @param tableName\n */\n CacheAdaptor.prototype.insert = function (dm, data, tableName) {\n this.isInsertAction = true;\n return this.cacheAdaptor.insert(dm, data, tableName);\n };\n /**\n * Prepare and return request body which is used to remove record from the table.\n *\n * @param {DataManager} dm\n * @param {string} keyField\n * @param {Object} value\n * @param {string} tableName?\n * @param tableName\n */\n CacheAdaptor.prototype.remove = function (dm, keyField, value, tableName) {\n this.isCrudAction = true;\n return this.cacheAdaptor.remove(dm, keyField, value, tableName);\n };\n /**\n * Prepare the request body based on the newly added, removed and updated records.\n * The result is used by the batch request.\n *\n * @param {DataManager} dm\n * @param {CrudOptions} changes\n * @param {RemoteArgs} e\n */\n CacheAdaptor.prototype.batchRequest = function (dm, changes, e) {\n return this.cacheAdaptor.batchRequest(dm, changes, e);\n };\n return CacheAdaptor;\n}(UrlAdaptor));\nexport { CacheAdaptor };\n","/* eslint-disable valid-jsdoc */\n/* eslint-disable security/detect-object-injection */\nimport { Ajax } from '@syncfusion/ej2-base';\nimport { extend, isNullOrUndefined } from '@syncfusion/ej2-base';\nimport { DataUtil } from './util';\nimport { Query } from './query';\nimport { ODataAdaptor, JsonAdaptor, CacheAdaptor, RemoteSaveAdaptor, CustomDataAdaptor } from './adaptors';\n/**\n * DataManager is used to manage and manipulate relational data.\n */\nvar DataManager = /** @class */ (function () {\n /**\n * Constructor for DataManager class\n *\n * @param {DataOptions|JSON[]} dataSource?\n * @param {Query} query?\n * @param {AdaptorOptions|string} adaptor?\n * @param dataSource\n * @param query\n * @param adaptor\n * @hidden\n */\n function DataManager(dataSource, query, adaptor) {\n var _this = this;\n /** @hidden */\n this.dateParse = true;\n /** @hidden */\n this.timeZoneHandling = true;\n this.requests = [];\n if (!dataSource && !this.dataSource) {\n dataSource = [];\n }\n adaptor = adaptor || dataSource.adaptor;\n if (dataSource && dataSource.timeZoneHandling === false) {\n this.timeZoneHandling = dataSource.timeZoneHandling;\n }\n var data;\n if (dataSource instanceof Array) {\n data = {\n json: dataSource,\n offline: true\n };\n }\n else if (typeof dataSource === 'object') {\n if (!dataSource.json) {\n dataSource.json = [];\n }\n data = {\n url: dataSource.url,\n insertUrl: dataSource.insertUrl,\n removeUrl: dataSource.removeUrl,\n updateUrl: dataSource.updateUrl,\n crudUrl: dataSource.crudUrl,\n batchUrl: dataSource.batchUrl,\n json: dataSource.json,\n headers: dataSource.headers,\n accept: dataSource.accept,\n data: dataSource.data,\n timeTillExpiration: dataSource.timeTillExpiration,\n cachingPageSize: dataSource.cachingPageSize,\n enableCaching: dataSource.enableCaching,\n requestType: dataSource.requestType,\n key: dataSource.key,\n crossDomain: dataSource.crossDomain,\n jsonp: dataSource.jsonp,\n dataType: dataSource.dataType,\n offline: dataSource.offline !== undefined ? dataSource.offline\n : dataSource.adaptor instanceof RemoteSaveAdaptor || dataSource.adaptor instanceof CustomDataAdaptor ?\n false : dataSource.url ? false : true,\n requiresFormat: dataSource.requiresFormat\n };\n }\n else {\n DataUtil.throwError('DataManager: Invalid arguments');\n }\n if (data.requiresFormat === undefined && !DataUtil.isCors()) {\n data.requiresFormat = isNullOrUndefined(data.crossDomain) ? true : data.crossDomain;\n }\n if (data.dataType === undefined) {\n data.dataType = 'json';\n }\n this.dataSource = data;\n this.defaultQuery = query;\n if (data.url && data.offline && !data.json.length) {\n this.isDataAvailable = false;\n this.adaptor = adaptor || new ODataAdaptor();\n this.dataSource.offline = false;\n this.ready = this.executeQuery(query || new Query());\n this.ready.then(function (e) {\n _this.dataSource.offline = true;\n _this.isDataAvailable = true;\n data.json = e.result;\n _this.adaptor = new JsonAdaptor();\n });\n }\n else {\n this.adaptor = data.offline ? new JsonAdaptor() : new ODataAdaptor();\n }\n if (!data.jsonp && this.adaptor instanceof ODataAdaptor) {\n data.jsonp = 'callback';\n }\n this.adaptor = adaptor || this.adaptor;\n if (data.enableCaching) {\n this.adaptor = new CacheAdaptor(this.adaptor, data.timeTillExpiration, data.cachingPageSize);\n }\n return this;\n }\n /**\n * Overrides DataManager's default query with given query.\n *\n * @param {Query} query - Defines the new default query.\n */\n DataManager.prototype.setDefaultQuery = function (query) {\n this.defaultQuery = query;\n return this;\n };\n /**\n * Executes the given query with local data source.\n *\n * @param {Query} query - Defines the query to retrieve data.\n */\n DataManager.prototype.executeLocal = function (query) {\n if (!this.defaultQuery && !(query instanceof Query)) {\n DataUtil.throwError('DataManager - executeLocal() : A query is required to execute');\n }\n if (!this.dataSource.json) {\n DataUtil.throwError('DataManager - executeLocal() : Json data is required to execute');\n }\n query = query || this.defaultQuery;\n var result = this.adaptor.processQuery(this, query);\n if (query.subQuery) {\n var from = query.subQuery.fromTable;\n var lookup = query.subQuery.lookups;\n var res = query.isCountRequired ? result.result :\n result;\n if (lookup && lookup instanceof Array) {\n DataUtil.buildHierarchy(query.subQuery.fKey, from, res, lookup, query.subQuery.key);\n }\n for (var j = 0; j < res.length; j++) {\n if (res[j][from] instanceof Array) {\n res[j] = extend({}, {}, res[j]);\n res[j][from] = this.adaptor.processResponse(query.subQuery.using(new DataManager(res[j][from].slice(0))).executeLocal(), this, query);\n }\n }\n }\n return this.adaptor.processResponse(result, this, query);\n };\n /**\n * Executes the given query with either local or remote data source.\n * It will be executed as asynchronously and returns Promise object which will be resolved or rejected after action completed.\n *\n * @param {Query|Function} query - Defines the query to retrieve data.\n * @param {Function} done - Defines the callback function and triggers when the Promise is resolved.\n * @param {Function} fail - Defines the callback function and triggers when the Promise is rejected.\n * @param {Function} always - Defines the callback function and triggers when the Promise is resolved or rejected.\n */\n DataManager.prototype.executeQuery = function (query, done, fail, always) {\n var _this = this;\n var makeRequest = 'makeRequest';\n if (typeof query === 'function') {\n always = fail;\n fail = done;\n done = query;\n query = null;\n }\n if (!query) {\n query = this.defaultQuery;\n }\n if (!(query instanceof Query)) {\n DataUtil.throwError('DataManager - executeQuery() : A query is required to execute');\n }\n var deffered = new Deferred();\n var args = { query: query };\n if (!this.dataSource.offline && (this.dataSource.url !== undefined && this.dataSource.url !== '')\n || (!isNullOrUndefined(this.adaptor[makeRequest])) || this.isCustomDataAdaptor(this.adaptor)) {\n var result = this.adaptor.processQuery(this, query);\n if (!isNullOrUndefined(this.adaptor[makeRequest])) {\n this.adaptor[makeRequest](result, deffered, args, query);\n }\n else if (!isNullOrUndefined(result.url) || this.isCustomDataAdaptor(this.adaptor)) {\n this.requests = [];\n this.makeRequest(result, deffered, args, query);\n }\n else {\n args = DataManager.getDeferedArgs(query, result, args);\n deffered.resolve(args);\n }\n }\n else {\n DataManager.nextTick(function () {\n var res = _this.executeLocal(query);\n args = DataManager.getDeferedArgs(query, res, args);\n deffered.resolve(args);\n });\n }\n if (done || fail) {\n deffered.promise.then(done, fail);\n }\n if (always) {\n deffered.promise.then(always, always);\n }\n return deffered.promise;\n };\n DataManager.getDeferedArgs = function (query, result, args) {\n if (query.isCountRequired) {\n args.result = result.result;\n args.count = result.count;\n args.aggregates = result.aggregates;\n }\n else {\n args.result = result;\n }\n return args;\n };\n DataManager.nextTick = function (fn) {\n /* eslint-disable @typescript-eslint/no-explicit-any */\n // tslint:disable-next-line:no-any\n (window.setImmediate || window.setTimeout)(fn, 0);\n /* eslint-enable @typescript-eslint/no-explicit-any */\n };\n DataManager.prototype.extendRequest = function (url, fnSuccess, fnFail) {\n return extend({}, {\n type: 'GET',\n dataType: this.dataSource.dataType,\n crossDomain: this.dataSource.crossDomain,\n jsonp: this.dataSource.jsonp,\n cache: true,\n processData: false,\n onSuccess: fnSuccess,\n onFailure: fnFail\n }, url);\n };\n // tslint:disable-next-line:max-func-body-length\n DataManager.prototype.makeRequest = function (url, deffered, args, query) {\n var _this = this;\n var isSelector = !!query.subQuerySelector;\n var fnFail = function (e) {\n args.error = e;\n deffered.reject(args);\n };\n var process = function (data, count, xhr, request, actual, aggregates, virtualSelectRecords) {\n args.xhr = xhr;\n args.count = count ? parseInt(count.toString(), 10) : 0;\n args.result = data;\n args.request = request;\n args.aggregates = aggregates;\n args.actual = actual;\n args.virtualSelectRecords = virtualSelectRecords;\n deffered.resolve(args);\n };\n var fnQueryChild = function (data, selector) {\n var subDeffer = new Deferred();\n var childArgs = { parent: args };\n query.subQuery.isChild = true;\n var subUrl = _this.adaptor.processQuery(_this, query.subQuery, data ? _this.adaptor.processResponse(data) : selector);\n var childReq = _this.makeRequest(subUrl, subDeffer, childArgs, query.subQuery);\n if (!isSelector) {\n subDeffer.then(function (subData) {\n if (data) {\n DataUtil.buildHierarchy(query.subQuery.fKey, query.subQuery.fromTable, data, subData, query.subQuery.key);\n process(data, subData.count, subData.xhr);\n }\n }, fnFail);\n }\n return childReq;\n };\n var fnSuccess = function (data, request) {\n if (_this.isGraphQLAdaptor(_this.adaptor)) {\n // tslint:disable-next-line:no-string-literal\n if (!isNullOrUndefined(data['errors'])) {\n // tslint:disable-next-line:no-string-literal\n return fnFail(data['errors'], request);\n }\n }\n if (_this.isCustomDataAdaptor(_this.adaptor)) {\n request = extend({}, _this.ajaxReqOption, request);\n }\n if (request.httpRequest.getResponseHeader('Content-Type').indexOf('xml') === -1 && _this.dateParse) {\n data = DataUtil.parse.parseJson(data);\n }\n var result = _this.adaptor.processResponse(data, _this, query, request.httpRequest, request);\n var count = 0;\n var aggregates = null;\n var virtualSelectRecords = 'virtualSelectRecords';\n var virtualRecords = data[virtualSelectRecords];\n if (query.isCountRequired) {\n count = result.count;\n aggregates = result.aggregates;\n result = result.result;\n }\n if (!query.subQuery) {\n process(result, count, request.httpRequest, request.type, data, aggregates, virtualRecords);\n return;\n }\n if (!isSelector) {\n fnQueryChild(result, request);\n }\n };\n var req = this.extendRequest(url, fnSuccess, fnFail);\n if (!this.isCustomDataAdaptor(this.adaptor)) {\n var ajax_1 = new Ajax(req);\n ajax_1.beforeSend = function () {\n _this.beforeSend(ajax_1.httpRequest, ajax_1);\n };\n req = ajax_1.send();\n req.catch(function (e) { return true; }); // to handle failure remote requests.\n this.requests.push(ajax_1);\n }\n else {\n this.ajaxReqOption = req;\n var request = req;\n this.adaptor.options.getData({\n data: request.data,\n onSuccess: request.onSuccess, onFailure: request.onFailure\n });\n }\n if (isSelector) {\n var promise = void 0;\n var res = query.subQuerySelector.call(this, { query: query.subQuery, parent: query });\n if (res && res.length) {\n promise = Promise.all([req, fnQueryChild(null, res)]);\n promise.then(function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var result = args[0];\n var pResult = _this.adaptor.processResponse(result[0], _this, query, _this.requests[0].httpRequest, _this.requests[0]);\n var count = 0;\n if (query.isCountRequired) {\n count = pResult.count;\n pResult = pResult.result;\n }\n var cResult = _this.adaptor.processResponse(result[1], _this, query.subQuery, _this.requests[1].httpRequest, _this.requests[1]);\n count = 0;\n if (query.subQuery.isCountRequired) {\n count = cResult.count;\n cResult = cResult.result;\n }\n DataUtil.buildHierarchy(query.subQuery.fKey, query.subQuery.fromTable, pResult, cResult, query.subQuery.key);\n isSelector = false;\n process(pResult, count, _this.requests[0].httpRequest);\n });\n }\n else {\n isSelector = false;\n }\n }\n return req;\n };\n DataManager.prototype.beforeSend = function (request, settings) {\n this.adaptor.beforeSend(this, request, settings);\n var headers = this.dataSource.headers;\n var props;\n for (var i = 0; headers && i < headers.length; i++) {\n props = [];\n var keys = Object.keys(headers[i]);\n for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {\n var prop = keys_1[_i];\n props.push(prop);\n request.setRequestHeader(prop, headers[i][prop]);\n }\n }\n };\n /**\n * Save bulk changes to the given table name.\n * User can add a new record, edit an existing record, and delete a record at the same time.\n * If the datasource from remote, then updated in a single post.\n *\n * @param {Object} changes - Defines the CrudOptions.\n * @param {string} key - Defines the column field.\n * @param {string|Query} tableName - Defines the table name.\n * @param {Query} query - Sets default query for the DataManager.\n * @param original\n */\n DataManager.prototype.saveChanges = function (changes, key, tableName, query, original) {\n var _this = this;\n if (tableName instanceof Query) {\n query = tableName;\n tableName = null;\n }\n var args = {\n url: tableName,\n key: key || this.dataSource.key\n };\n var req = this.adaptor.batchRequest(this, changes, args, query || new Query(), original);\n var doAjaxRequest = 'doAjaxRequest';\n if (this.dataSource.offline) {\n return req;\n }\n if (!isNullOrUndefined(this.adaptor[doAjaxRequest])) {\n return this.adaptor[doAjaxRequest](req);\n }\n else if (!this.isCustomDataAdaptor(this.adaptor)) {\n var deff_1 = new Deferred();\n var ajax_2 = new Ajax(req);\n ajax_2.beforeSend = function () {\n _this.beforeSend(ajax_2.httpRequest, ajax_2);\n };\n ajax_2.onSuccess = function (data, request) {\n if (_this.isGraphQLAdaptor(_this.adaptor)) {\n // tslint:disable-next-line:no-string-literal\n if (!isNullOrUndefined(data['errors'])) {\n // tslint:disable-next-line:no-string-literal\n ajax_2.onFailure(JSON.stringify(data['errors']));\n }\n }\n deff_1.resolve(_this.adaptor.processResponse(data, _this, null, request.httpRequest, request, changes, args));\n };\n ajax_2.onFailure = function (e) {\n deff_1.reject([{ error: e }]);\n };\n ajax_2.send().catch(function (e) { return true; }); // to handle the failure requests.\n return deff_1.promise;\n }\n else {\n return this.doAjaxRequest(req, this.adaptor.options.batchUpdate);\n }\n };\n /**\n * Inserts new record in the given table.\n *\n * @param {Object} data - Defines the data to insert.\n * @param {string|Query} tableName - Defines the table name.\n * @param {Query} query - Sets default query for the DataManager.\n * @param position\n */\n DataManager.prototype.insert = function (data, tableName, query, position) {\n if (tableName instanceof Query) {\n query = tableName;\n tableName = null;\n }\n var req = this.adaptor.insert(this, data, tableName, query, position);\n var doAjaxRequest = 'doAjaxRequest';\n if (this.dataSource.offline) {\n return req;\n }\n if (!isNullOrUndefined(this.adaptor[doAjaxRequest])) {\n return this.adaptor[doAjaxRequest](req);\n }\n else {\n return this.doAjaxRequest(req, this.adaptor.options.addRecord);\n }\n };\n /**\n * Removes data from the table with the given key.\n *\n * @param {string} keyField - Defines the column field.\n * @param {Object} value - Defines the value to find the data in the specified column.\n * @param {string|Query} tableName - Defines the table name\n * @param {Query} query - Sets default query for the DataManager.\n */\n DataManager.prototype.remove = function (keyField, value, tableName, query) {\n if (typeof value === 'object') {\n value = DataUtil.getObject(keyField, value);\n }\n if (tableName instanceof Query) {\n query = tableName;\n tableName = null;\n }\n var res = this.adaptor.remove(this, keyField, value, tableName, query);\n var doAjaxRequest = 'doAjaxRequest';\n if (this.dataSource.offline) {\n return res;\n }\n if (!isNullOrUndefined(this.adaptor[doAjaxRequest])) {\n return this.adaptor[doAjaxRequest](res);\n }\n else {\n var remove = this.adaptor.options.deleteRecord;\n return this.doAjaxRequest(res, remove);\n }\n };\n /**\n * Updates existing record in the given table.\n *\n * @param {string} keyField - Defines the column field.\n * @param {Object} value - Defines the value to find the data in the specified column.\n * @param {string|Query} tableName - Defines the table name\n * @param {Query} query - Sets default query for the DataManager.\n * @param original\n */\n DataManager.prototype.update = function (keyField, value, tableName, query, original) {\n if (tableName instanceof Query) {\n query = tableName;\n tableName = null;\n }\n var res = this.adaptor.update(this, keyField, value, tableName, query, original);\n var doAjaxRequest = 'doAjaxRequest';\n if (this.dataSource.offline) {\n return res;\n }\n if (!isNullOrUndefined(this.adaptor[doAjaxRequest])) {\n return this.adaptor[doAjaxRequest](res);\n }\n else {\n var update = this.adaptor.options.updateRecord;\n return this.doAjaxRequest(res, update);\n }\n };\n DataManager.prototype.isCustomDataAdaptor = function (dataSource) {\n return this.adaptor.getModuleName &&\n this.adaptor.getModuleName() === 'CustomDataAdaptor';\n };\n DataManager.prototype.isGraphQLAdaptor = function (dataSource) {\n return this.adaptor.getModuleName &&\n this.adaptor.getModuleName() === 'GraphQLAdaptor';\n };\n DataManager.prototype.successFunc = function (record, request) {\n if (this.isGraphQLAdaptor(this.adaptor)) {\n var data = JSON.parse(record);\n // tslint:disable-next-line:no-string-literal\n if (!isNullOrUndefined(data['errors'])) {\n // tslint:disable-next-line:no-string-literal\n this.failureFunc(JSON.stringify(data['errors']));\n }\n }\n if (this.isCustomDataAdaptor(this.adaptor)) {\n request = extend({}, this.ajaxReqOption, request);\n }\n try {\n DataUtil.parse.parseJson(record);\n }\n catch (e) {\n record = [];\n }\n record = this.adaptor.processResponse(DataUtil.parse.parseJson(record), this, null, request.httpRequest, request);\n this.ajaxDeffered.resolve(record);\n };\n DataManager.prototype.failureFunc = function (e) {\n this.ajaxDeffered.reject([{ error: e }]);\n };\n DataManager.prototype.doAjaxRequest = function (res, ajaxFunc) {\n var _this = this;\n res = extend({}, {\n type: 'POST',\n contentType: 'application/json; charset=utf-8',\n processData: false\n }, res);\n this.ajaxDeffered = new Deferred();\n if (!this.isCustomDataAdaptor(this.adaptor)) {\n var ajax_3 = new Ajax(res);\n ajax_3.beforeSend = function () {\n _this.beforeSend(ajax_3.httpRequest, ajax_3);\n };\n ajax_3.onSuccess = this.successFunc.bind(this);\n ajax_3.onFailure = this.failureFunc.bind(this);\n ajax_3.send().catch(function (e) { return true; }); // to handle the failure requests.\n }\n else {\n this.ajaxReqOption = res;\n ajaxFunc.call(this, {\n data: res.data, onSuccess: this.successFunc.bind(this),\n onFailure: this.failureFunc.bind(this)\n });\n }\n return this.ajaxDeffered.promise;\n };\n return DataManager;\n}());\nexport { DataManager };\n/**\n * Deferred is used to handle asynchronous operation.\n */\nvar Deferred = /** @class */ (function () {\n function Deferred() {\n var _this = this;\n /**\n * Promise is an object that represents a value that may not be available yet, but will be resolved at some point in the future.\n */\n this.promise = new Promise(function (resolve, reject) {\n _this.resolve = resolve;\n _this.reject = reject;\n });\n /**\n * Defines the callback function triggers when the Deferred object is resolved.\n */\n this.then = this.promise.then.bind(this.promise);\n /**\n * Defines the callback function triggers when the Deferred object is rejected.\n */\n this.catch = this.promise.catch.bind(this.promise);\n }\n return Deferred;\n}());\nexport { Deferred };\n"],"names":["Query","from","this","subQuery","isChild","distincts","queries","key","fKey","fromTable","Array","lookups","expands","sortedColumns","groupedColumns","params","lazyLoad","prototype","setKey","field","using","dataManager","execute","done","fail","always","executeQuery","DataUtil","throwError","executeLocal","clone","cloned","slice","subQuerySelector","isCountRequired","tableName","addParams","value","push","fn","distinct","fields","call","expand","tables","where","fieldName","operator","ignoreCase","ignoreAccent","matchCase","toLowerCase","predicate","Predicate","e","search","searchKey","fieldNames","comparer","fnOperators","sortBy","isFromGroup","sortByForeignKey","direction","sorts","temp","order","isNullOrUndefined","endsWith","replace","fnSort","filterQueries","i","length","j","sortByDesc","group","format","page","pageIndex","pageSize","range","start","end","take","nos","skip","select","hierarchy","query","selectorFn","foreignKey","requiresCount","aggregate","type","name","filter","q","filterQueryLists","singles","filtered","indexOf","res","isComplex","processOperator","condition","predicates","apply","and","args","_i","arguments","combinePredicates","combine","or","ornot","andnot","fromJson","json","len","fromJSONData","pred","validate","record","ret","isAnd","split","undefined","getObject","toJson","p","preds","consts","GroupGuid","getValue","inst","input","substr","notEndsWith","startsWith","notStartsWith","wildCard","pattern","asteriskSplit","charAt","join","RegExp","test","like","lastIndexOf","substring","fnAscending","fnDescending","x","y","localeCompare","extractFields","obj","newObj","setValue","jsonArray","newData","aggregates","level","groupDs","isLazyLoad","jsonData","this_1","items","count","indx","childLevels","grouped","groupedArray","records","this_2","val","getVal","tempObj","aggs","buildHierarchy","source","lookup","pKey","grp","result","fKeyData","getFieldList","prefix","copyObj","keys_1","Object","keys","prop","nameSpace","splits","toString","fromObj","sort","ds","middle","parseInt","left","right","merge","ignoreDiacritics","map","diacritics","current","shift","array","index","callAdaptorFunction","adaptor","fnName","param1","param2","getAddParams","adp","dm","req","reqParams","isPlainObject","constructor","isCors","xhr","window","getGuid","rand","crypto","arr","Uint8Array","getRandomValues","Math","random","isNull","getItemFromComparer","keyVal","castRequired","requiresCompleteRecord","tmp","forEach","data","processData","prepareQuery","sampledata","DataManager","requiresCounts","returnValue","JSON","stringify","_this","parse","parseJson","predicateList","concat","getPredicate","sorted","mainPred","childPred","cpre","_a","serverTimezoneOffset","timeZoneHandling","error","Error","message","stack","sum","isNaN","average","min","max","truecount","falsecount","operatorSymbols","<",">","<=",">=","==","!=","*=","$=","^=","odBiOperator","lessthan","lessthanorequal","greaterthan","greaterthanorequal","equal","notequal","odUniOperator","endswith","startswith","contains","doesnotendwith","doesnotstartwith","doesnotcontain","wildcard","odv4UniOperator","Ⓐ","A","À","Á","Â","Ầ","Ấ","Ẫ","Ẩ","Ã","Ā","Ă","Ằ","Ắ","Ẵ","Ẳ","Ȧ","Ǡ","Ä","Ǟ","Ả","Å","Ǻ","Ǎ","Ȁ","Ȃ","Ạ","Ậ","Ặ","Ḁ","Ą","Ⱥ","Ɐ","Ꜳ","Æ","Ǽ","Ǣ","Ꜵ","Ꜷ","Ꜹ","Ꜻ","Ꜽ","Ⓑ","B","Ḃ","Ḅ","Ḇ","Ƀ","Ƃ","Ɓ","Ⓒ","C","Ć","Ĉ","Ċ","Č","Ç","Ḉ","Ƈ","Ȼ","Ꜿ","Ⓓ","D","Ḋ","Ď","Ḍ","Ḑ","Ḓ","Ḏ","Đ","Ƌ","Ɗ","Ɖ","Ꝺ","DZ","DŽ","Dz","Dž","Ⓔ","E","È","É","Ê","Ề","Ế","Ễ","Ể","Ẽ","Ē","Ḕ","Ḗ","Ĕ","Ė","Ë","Ẻ","Ě","Ȅ","Ȇ","Ẹ","Ệ","Ȩ","Ḝ","Ę","Ḙ","Ḛ","Ɛ","Ǝ","Ⓕ","F","Ḟ","Ƒ","Ꝼ","Ⓖ","G","Ǵ","Ĝ","Ḡ","Ğ","Ġ","Ǧ","Ģ","Ǥ","Ɠ","Ꞡ","Ᵹ","Ꝿ","Ⓗ","H","Ĥ","Ḣ","Ḧ","Ȟ","Ḥ","Ḩ","Ḫ","Ħ","Ⱨ","Ⱶ","Ɥ","Ⓘ","I","Ì","Í","Î","Ĩ","Ī","Ĭ","İ","Ï","Ḯ","Ỉ","Ǐ","Ȉ","Ȋ","Ị","Į","Ḭ","Ɨ","Ⓙ","J","Ĵ","Ɉ","Ⓚ","K","Ḱ","Ǩ","Ḳ","Ķ","Ḵ","Ƙ","Ⱪ","Ꝁ","Ꝃ","Ꝅ","Ꞣ","Ⓛ","L","Ŀ","Ĺ","Ľ","Ḷ","Ḹ","Ļ","Ḽ","Ḻ","Ł","Ƚ","Ɫ","Ⱡ","Ꝉ","Ꝇ","Ꞁ","LJ","Lj","Ⓜ","M","Ḿ","Ṁ","Ṃ","Ɱ","Ɯ","Ⓝ","N","Ǹ","Ń","Ñ","Ṅ","Ň","Ṇ","Ņ","Ṋ","Ṉ","Ƞ","Ɲ","Ꞑ","Ꞥ","NJ","Nj","Ⓞ","O","Ò","Ó","Ô","Ồ","Ố","Ỗ","Ổ","Õ","Ṍ","Ȭ","Ṏ","Ō","Ṑ","Ṓ","Ŏ","Ȯ","Ȱ","Ö","Ȫ","Ỏ","Ő","Ǒ","Ȍ","Ȏ","Ơ","Ờ","Ớ","Ỡ","Ở","Ợ","Ọ","Ộ","Ǫ","Ǭ","Ø","Ǿ","Ɔ","Ɵ","Ꝋ","Ꝍ","Ƣ","Ꝏ","Ȣ","Ⓟ","P","Ṕ","Ṗ","Ƥ","Ᵽ","Ꝑ","Ꝓ","Ꝕ","Ⓠ","Q","Ꝗ","Ꝙ","Ɋ","Ⓡ","R","Ŕ","Ṙ","Ř","Ȑ","Ȓ","Ṛ","Ṝ","Ŗ","Ṟ","Ɍ","Ɽ","Ꝛ","Ꞧ","Ꞃ","Ⓢ","S","ẞ","Ś","Ṥ","Ŝ","Ṡ","Š","Ṧ","Ṣ","Ṩ","Ș","Ş","Ȿ","Ꞩ","Ꞅ","Ⓣ","T","Ṫ","Ť","Ṭ","Ț","Ţ","Ṱ","Ṯ","Ŧ","Ƭ","Ʈ","Ⱦ","Ꞇ","Ꜩ","Ⓤ","U","Ù","Ú","Û","Ũ","Ṹ","Ū","Ṻ","Ŭ","Ü","Ǜ","Ǘ","Ǖ","Ǚ","Ủ","Ů","Ű","Ǔ","Ȕ","Ȗ","Ư","Ừ","Ứ","Ữ","Ử","Ự","Ụ","Ṳ","Ų","Ṷ","Ṵ","Ʉ","Ⓥ","V","Ṽ","Ṿ","Ʋ","Ꝟ","Ʌ","Ꝡ","Ⓦ","W","Ẁ","Ẃ","Ŵ","Ẇ","Ẅ","Ẉ","Ⱳ","Ⓧ","X","Ẋ","Ẍ","Ⓨ","Y","Ỳ","Ý","Ŷ","Ỹ","Ȳ","Ẏ","Ÿ","Ỷ","Ỵ","Ƴ","Ɏ","Ỿ","Ⓩ","Z","Ź","Ẑ","Ż","Ž","Ẓ","Ẕ","Ƶ","Ȥ","Ɀ","Ⱬ","Ꝣ","ⓐ","a","ẚ","à","á","â","ầ","ấ","ẫ","ẩ","ã","ā","ă","ằ","ắ","ẵ","ẳ","ȧ","ǡ","ä","ǟ","ả","å","ǻ","ǎ","ȁ","ȃ","ạ","ậ","ặ","ḁ","ą","ⱥ","ɐ","ꜳ","æ","ǽ","ǣ","ꜵ","ꜷ","ꜹ","ꜻ","ꜽ","ⓑ","b","ḃ","ḅ","ḇ","ƀ","ƃ","ɓ","ⓒ","c","ć","ĉ","ċ","č","ç","ḉ","ƈ","ȼ","ꜿ","ↄ","ⓓ","d","ḋ","ď","ḍ","ḑ","ḓ","ḏ","đ","ƌ","ɖ","ɗ","ꝺ","dz","dž","ⓔ","e","è","é","ê","ề","ế","ễ","ể","ẽ","ē","ḕ","ḗ","ĕ","ė","ë","ẻ","ě","ȅ","ȇ","ẹ","ệ","ȩ","ḝ","ę","ḙ","ḛ","ɇ","ɛ","ǝ","ⓕ","f","ḟ","ƒ","ꝼ","ⓖ","g","ǵ","ĝ","ḡ","ğ","ġ","ǧ","ģ","ǥ","ɠ","ꞡ","ᵹ","ꝿ","ⓗ","h","ĥ","ḣ","ḧ","ȟ","ḥ","ḩ","ḫ","ẖ","ħ","ⱨ","ⱶ","ɥ","ƕ","ⓘ","i","ì","í","î","ĩ","ī","ĭ","ï","ḯ","ỉ","ǐ","ȉ","ȋ","ị","į","ḭ","ɨ","ı","ⓙ","j","ĵ","ǰ","ɉ","ⓚ","k","ḱ","ǩ","ḳ","ķ","ḵ","ƙ","ⱪ","ꝁ","ꝃ","ꝅ","ꞣ","ⓛ","l","ŀ","ĺ","ľ","ḷ","ḹ","ļ","ḽ","ḻ","ſ","ł","ƚ","ɫ","ⱡ","ꝉ","ꞁ","ꝇ","lj","ⓜ","m","ḿ","ṁ","ṃ","ɱ","ɯ","ⓝ","n","ǹ","ń","ñ","ṅ","ň","ṇ","ņ","ṋ","ṉ","ƞ","ɲ","ʼn","ꞑ","ꞥ","nj","ⓞ","o","ò","ó","ô","ồ","ố","ỗ","ổ","õ","ṍ","ȭ","ṏ","ō","ṑ","ṓ","ŏ","ȯ","ȱ","ö","ȫ","ỏ","ő","ǒ","ȍ","ȏ","ơ","ờ","ớ","ỡ","ở","ợ","ọ","ộ","ǫ","ǭ","ø","ǿ","ɔ","ꝋ","ꝍ","ɵ","ƣ","ȣ","ꝏ","ⓟ","p","ṕ","ṗ","ƥ","ᵽ","ꝑ","ꝓ","ꝕ","ⓠ","q","ɋ","ꝗ","ꝙ","ⓡ","r","ŕ","ṙ","ř","ȑ","ȓ","ṛ","ṝ","ŗ","ṟ","ɍ","ɽ","ꝛ","ꞧ","ꞃ","ⓢ","s","ß","ś","ṥ","ŝ","ṡ","š","ṧ","ṣ","ṩ","ș","ş","ȿ","ꞩ","ꞅ","ẛ","ⓣ","t","ṫ","ẗ","ť","ṭ","ț","ţ","ṱ","ṯ","ŧ","ƭ","ʈ","ⱦ","ꞇ","ꜩ","ⓤ","u","ù","ú","û","ũ","ṹ","ū","ṻ","ŭ","ü","ǜ","ǘ","ǖ","ǚ","ủ","ů","ű","ǔ","ȕ","ȗ","ư","ừ","ứ","ữ","ử","ự","ụ","ṳ","ų","ṷ","ṵ","ʉ","ⓥ","v","ṽ","ṿ","ʋ","ꝟ","ʌ","ꝡ","ⓦ","w","ẁ","ẃ","ŵ","ẇ","ẅ","ẘ","ẉ","ⱳ","ⓧ","x","ẋ","ẍ","ⓨ","y","ỳ","ý","ŷ","ỹ","ȳ","ẏ","ÿ","ỷ","ẙ","ỵ","ƴ","ɏ","ỿ","ⓩ","z","ź","ẑ","ż","ž","ẓ","ẕ","ƶ","ȥ","ɀ","ⱬ","ꝣ","Ά","Έ","Ή","Ί","Ϊ","Ό","Ύ","Ϋ","Ώ","ά","έ","ή","ί","ϊ","ΐ","ό","ύ","ϋ","ΰ","ω","ς","actual","expected","isnotnull","isnull","isempty","isnotempty","processSymbols","jsonText","jsonReviver","iterateAndReviveArray","iterateAndReviveJson","keys_2","ms","exec","offSet","dateParse","toTimeZone","Date","isUTC","secondsMs","getUTCMilliseconds","utcFormat","hrs","mins","setHours","getHours","getMinutes","addSelfOffset","isJson","isGuid","replacer","jsonReplacer","arrayReplacer","keys_3","d","toJSON","date","jsonDateReplacer","getTimezoneOffset","toUTC","offset","utc","unix","toLocalTime","datefn","timeZone","differenceString","localtimefn","num","norm","floor","abs","getFullYear","getMonth","getDate","getSeconds","__extends","extendStatics","b","setPrototypeOf","__proto__","hasOwnProperty","__","create","Adaptor","options","requestType","dataSource","pvt","processResponse","JsonAdaptor","_super","processQuery","countFlg","keyCount","agg","lazyLoadData","lazyLoadGroup","getAggregate","onDemandGroupInfo","onPage","formGroupResult","onWhere","aggQuery","batchRequest","changes","deletedRecordsLen","deletedRecords","addedRecords","insert","changedRecords","update","remove","onAggregates","onSearch","onSortBy","fnCompare","onGroup","size","onRange","onTake","onSkip","onSelect","position","splice","keyField","UrlAdaptor","hierarchyFilters","getQueryRequest","url","request","groups","filters","searches","getFiltersFrom","getModuleName","getRequestQuery","pvtData","contentType","convertToQueryString","request1","selects","getResponseHeader","handleTimeZone","requests","action","isExpand","isArray","formRemoteGroupedData","getAggregateResult","childLevel","getGroupedRecords","hasRecords","childGroupedRecords","original","batchUrl","crudUrl","removeUrl","dataType","extend","changed","added","deleted","table","beforeSend","insertUrl","keyColumn","updateUrl","predicats","pData","aggregateData","isServerGrouping","groupQuery","ODataAdaptor","props","accept","multipartAccept","batch","changeSet","batchPre","contentId","batchContent","changeSetContent","batchChangeSetContentType","updateType","onPredicate","requiresCast","guid","getField","encodeURIComponent","splittedStringValue","splittedValue","onComplexPredicate","onEachWhere","onEachSearch","onEachSort","reverse","onCount","settings","setRequestHeader","overrideMimeType","rootUrl","dataUrls","resourceTableName","dataCopy","results","emptyAndBatch","processBatchResponse","versionCheck","version","requiresFormat","keys_4","localTimeReplacer","convertObj","localTime","compareAndRemove","initialGuid","cid","cSet","generateInsertRequest","generateUpdateRequest","generateDeleteRequest","stat","method","generateBodyContent","org","change","o","cIdx","jsonObj","exVal","changeGuid","valueOf","ODataV4Adaptor","isDate","onExpand","selected","expanded","exArr","item","sel","exp","close_1","combineVal","expandQueryIndex","idx","ex","onDistinct","distinctFields","dataUrl","WebApiAdaptor","location","host","state","mtd","Count","Items","WebMethodAdaptor","param","RemoteSaveAdaptor","updateKey","CustomDataAdaptor","getData","Function","addRecord","updateRecord","deleteRecord","batchUpdate","GraphQLAdaptor","opt","schema","response","getVariables","getQuery","datamanager","urlQuery","vars","variables","resData","inserted","generateCrudData","bData","crudData","parsed","getMutation","CacheAdaptor","timeStamp","isCrudAction","isInsertAction","cacheAdaptor","guidId","localStorage","setItem","setInterval","getItem","forDel","currentTime","requestTime","removeItem","generateKey","currentFilter","newQuery","cachedItems","crossDomain","offline","headers","timeTillExpiration","cachingPageSize","enableCaching","jsonp","defaultQuery","isDataAvailable","ready","then","setDefaultQuery","deffered","Deferred","isCustomDataAdaptor","makeRequest","getDeferedArgs","resolve","nextTick","promise","setImmediate","setTimeout","extendRequest","fnSuccess","fnFail","cache","onSuccess","onFailure","isSelector","reject","process","virtualSelectRecords","fnQueryChild","selector","subDeffer","childArgs","parent","subUrl","childReq","subData","isGraphQLAdaptor","ajaxReqOption","httpRequest","virtualRecords","ajax_1","Ajax","send","catch","Promise","all","pResult","cResult","saveChanges","doAjaxRequest","deff_1","ajax_2","successFunc","failureFunc","ajaxDeffered","ajaxFunc","bind","ajax_3"],"mappings":"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C,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,KACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,KACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,IACVC,IAAU,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"}