UNPKG

jse-eval

Version:

JavaScript expression parsing and evaluation.

1 lines 36.3 kB
{"version":3,"file":"jse-eval.cjs","sources":["../index.ts"],"sourcesContent":["import { ArrowExpression } from '@jsep-plugin/arrow';\nimport { AssignmentExpression, UpdateExpression } from '@jsep-plugin/assignment';\nimport { AwaitExpression } from '@jsep-plugin/async-await';\nimport { NewExpression } from '@jsep-plugin/new';\nimport { ObjectExpression, Property } from '@jsep-plugin/object';\nimport { SpreadElement } from '@jsep-plugin/spread';\nimport { TaggedTemplateExpression, TemplateLiteral } from '@jsep-plugin/template';\nimport jsep from 'jsep';\n\n/**\n * Evaluation code from JSEP project, under MIT License.\n * Copyright (c) 2013 Stephen Oney, http://jsep.from.so/\n */\n\nexport declare type Context = Record<string, unknown>;\nexport declare type operand = any;\nexport declare type unaryCallback = (a: operand) => operand;\nexport declare type binaryCallback = (a: operand, b: operand) => operand;\nexport declare type assignCallback = (obj: Record<string, operand>, key: string, val: operand) => operand;\nexport declare type evaluatorCallback<T extends AnyExpression> = (this: ExpressionEval, node: T, context?: Context) => unknown;\n\nexport type AnyExpression = jsep.Expression;\n\nexport type JseEvalPlugin = Partial<jsep.IPlugin> & {\n initEval?: (this: typeof ExpressionEval, jseEval: typeof ExpressionEval) => void;\n}\n\nexport default class ExpressionEval {\n static jsep = jsep;\n static parse = jsep;\n static evaluate = ExpressionEval.eval;\n\n static evaluators: Record<string, evaluatorCallback<AnyExpression>> = {\n 'ArrayExpression': ExpressionEval.prototype.evalArrayExpression,\n 'LogicalExpression': ExpressionEval.prototype.evalBinaryExpression,\n 'BinaryExpression': ExpressionEval.prototype.evalBinaryExpression,\n 'CallExpression': ExpressionEval.prototype.evalCallExpression,\n 'Compound': ExpressionEval.prototype.evalCompoundExpression,\n 'ConditionalExpression': ExpressionEval.prototype.evalConditionalExpression,\n 'Identifier': ExpressionEval.prototype.evalIdentifier,\n 'Literal': ExpressionEval.evalLiteral,\n 'OptionalMemberExpression': ExpressionEval.prototype.evalMemberExpression, // acorn uses this\n 'MemberExpression': ExpressionEval.prototype.evalMemberExpression,\n 'ThisExpression': ExpressionEval.prototype.evalThisExpression,\n 'UnaryExpression': ExpressionEval.prototype.evalUnaryExpression,\n 'ArrowFunctionExpression': ExpressionEval.prototype.evalArrowFunctionExpression,\n 'AssignmentExpression': ExpressionEval.prototype.evalAssignmentExpression,\n 'UpdateExpression': ExpressionEval.prototype.evalUpdateExpression,\n 'AwaitExpression': ExpressionEval.prototype.evalAwaitExpression,\n 'NewExpression': ExpressionEval.prototype.evalNewExpression,\n 'ObjectExpression': ExpressionEval.prototype.evalObjectExpression,\n 'SpreadElement': ExpressionEval.prototype.evalSpreadElement,\n 'TaggedTemplateExpression': ExpressionEval.prototype.evalTaggedTemplateExpression,\n 'TemplateLiteral': ExpressionEval.prototype.evalTemplateLiteral,\n };\n\n // Default operator precedence from https://github.com/EricSmekens/jsep/blob/master/src/jsep.js#L55\n static DEFAULT_PRECEDENCE: Record<string, number> = {\n '||': 1,\n '&&': 2,\n '|': 3,\n '^': 4,\n '&': 5,\n '==': 6,\n '!=': 6,\n '===': 6,\n '!==': 6,\n '<': 7,\n '>': 7,\n '<=': 7,\n '>=': 7,\n '<<': 8,\n '>>': 8,\n '>>>': 8,\n '+': 9,\n '-': 9,\n '*': 10,\n '/': 10,\n '%': 10\n };\n\n static binops: Record<string, binaryCallback> = {\n '||': function (a, b) { return a || b; },\n '&&': function (a, b) { return a && b; },\n '|': function (a, b) { return a | b; },\n '^': function (a, b) { return a ^ b; },\n '&': function (a, b) { return a & b; },\n '==': function (a, b) { return a == b; }, // jshint ignore:line\n '!=': function (a, b) { return a != b; }, // jshint ignore:line\n '===': function (a, b) { return a === b; },\n '!==': function (a, b) { return a !== b; },\n '<': function (a, b) { return a < b; },\n '>': function (a, b) { return a > b; },\n '<=': function (a, b) { return a <= b; },\n '>=': function (a, b) { return a >= b; },\n '<<': function (a, b) { return a << b; },\n '>>': function (a, b) { return a >> b; },\n '>>>': function (a, b) { return a >>> b; },\n '+': function (a, b) { return a + b; },\n '-': function (a, b) { return a - b; },\n '*': function (a, b) { return a * b; },\n '/': function (a, b) { return a / b; },\n '%': function (a, b) { return a % b; }\n };\n\n static unops: Record<string, unaryCallback> = {\n '-': function (a) { return -a; },\n '+': function (a) { return +a; },\n '~': function (a) { return ~a; },\n '!': function (a) { return !a; },\n };\n\n static assignOps: Record<string, assignCallback> = {\n '=': function(obj, key, val) { return obj[key] = val; },\n '*=': function(obj, key, val) { return obj[key] *= val; },\n '**=': function(obj, key, val) { return obj[key] **= val; },\n '/=': function(obj, key, val) { return obj[key] /= val; },\n '%=': function(obj, key, val) { return obj[key] %= val; },\n '+=': function(obj, key, val) { return obj[key] += val; },\n '-=': function(obj, key, val) { return obj[key] -= val; },\n '<<=': function(obj, key, val) { return obj[key] <<= val; },\n '>>=': function(obj, key, val) { return obj[key] >>= val; },\n '>>>=': function(obj, key, val) { return obj[key] >>>= val; },\n '&=': function(obj, key, val) { return obj[key] &= val; },\n '^=': function(obj, key, val) { return obj[key] ^= val; },\n '|=': function(obj, key, val) { return obj[key] |= val; },\n };\n\n // inject Custom Unary Operators (and override existing ones)\n static addUnaryOp(operator: string, _function: unaryCallback): void {\n jsep.addUnaryOp(operator);\n ExpressionEval.unops[operator] = _function;\n }\n\n // inject Custom Binary Operators (and override existing ones)\n static addBinaryOp(\n operator: string,\n precedence_or_fn: number | binaryCallback,\n _ra_or_callback?: boolean | binaryCallback,\n _function?: binaryCallback)\n : void {\n let precedence, ra, cb;\n if (typeof precedence_or_fn === 'function') {\n cb = precedence_or_fn;\n } else {\n precedence = precedence_or_fn;\n if (typeof _ra_or_callback === 'function') {\n cb = _ra_or_callback;\n } else {\n ra = _ra_or_callback;\n cb = _function;\n }\n }\n\n jsep.addBinaryOp(operator, precedence || 1, ra);\n ExpressionEval.binops[operator] = cb;\n }\n\n // inject custom node evaluators (and override existing ones)\n static addEvaluator<T extends AnyExpression>(nodeType: string, evaluator: evaluatorCallback<T>): void {\n ExpressionEval.evaluators[nodeType] = evaluator;\n }\n\n static registerPlugin(...plugins: Array<JseEvalPlugin>) {\n plugins.forEach((p) => {\n if (p.init) {\n ExpressionEval.parse.plugins.register(p as jsep.IPlugin);\n }\n if (p.initEval) {\n p.initEval.call(ExpressionEval, ExpressionEval);\n }\n });\n }\n\n // main evaluator method\n static eval(ast: jsep.Expression, context?: Context): unknown {\n return (new ExpressionEval(context)).eval(ast);\n }\n static async evalAsync(ast: jsep.Expression, context?: Context): Promise<unknown> {\n return (new ExpressionEval(context, true)).eval(ast);\n }\n\n // compile an expression and return an evaluator\n static compile(expression: string): (context?: Context) => unknown {\n return ExpressionEval.eval.bind(null, ExpressionEval.jsep(expression));\n }\n static compileAsync(expression: string): (context?: Context) => Promise<unknown> {\n return ExpressionEval.evalAsync.bind(null, ExpressionEval.jsep(expression));\n }\n\n // compile and evaluate\n static evalExpr(expression: string, context?: Context): unknown {\n return ExpressionEval.compile(expression)(context);\n }\n static evalExprAsync(expression: string, context?: Context): unknown {\n return ExpressionEval.compileAsync(expression)(context);\n }\n\n\n context?: Context;\n isAsync?: boolean;\n\n constructor(context?: Context, isAsync?: boolean) {\n this.context = context;\n this.isAsync = isAsync;\n }\n\n public eval(node: unknown, cb = v => v): unknown {\n const evaluator = ExpressionEval.evaluators[(node as jsep.Expression).type]\n || ExpressionEval.evaluators.default;\n if (!evaluator) {\n throw new Error(`unknown node type: ${JSON.stringify(node, null, 2)}`);\n }\n return this.evalSyncAsync(evaluator.bind(this)(node, this.context), (v) => {\n (node as any)._value = v;\n return cb(v);\n });\n }\n\n /*\n * `evalSyncAsync` is a helper to wrap sync/async calls into one so that\n * we don't have to duplicate all of our node type parsers.\n * It's basically like old node callback (hell?), but it works because:\n * for sync:\n * an expression like `[1].map(v => v + 1)` returns the result\n * after running the callback\n * for async:\n * an expression like `const a = (await x) + 1` is equivalent to\n * `Promise.resolve(x).then(res => res + 1)`\n *\n * Note: For optimization, there are a few places where it makes sense\n * to directly check `this.isAsync` to use Promise.all(),\n * `promisesOrResults = expressions.map(v => this.eval(v))`\n * could result in an array of results (sync) or promises (async)\n */\n evalSyncAsync(val: unknown, cb: (unknown) => unknown): Promise<unknown> | unknown {\n if (this.isAsync) {\n return Promise.resolve(val).then(cb);\n }\n return cb(val);\n }\n\n private evalArrayExpression(node: jsep.ArrayExpression) {\n return this.evalArray(node.elements);\n }\n\n protected evalArray(list: jsep.Expression[]): unknown[] {\n const mapped = list.map(v => this.eval(v));\n const toFullArray = (res) => res\n .reduce((arr, v, i) => {\n if ((list[i] as AnyExpression).type === 'SpreadElement') {\n return [...arr, ...v];\n }\n arr.push(v);\n return arr;\n }, []);\n return this.isAsync\n ? Promise.all(mapped).then(toFullArray)\n : toFullArray(mapped);\n }\n\n private evalBinaryExpression(node: jsep.BinaryExpression) {\n if (node.operator === '||') {\n return this.eval(node.left, left => left || this.eval(node.right));\n } else if (node.operator === '&&') {\n return this.eval(node.left, left => left && this.eval(node.right));\n }\n const leftRight = [\n this.eval(node.left),\n this.eval(node.right)\n ];\n const op = ([left, right]) => ExpressionEval\n .binops[node.operator](left, right);\n return this.isAsync\n ? Promise.all(leftRight).then(op)\n : op(leftRight as [operand, operand]);\n }\n\n private evalCompoundExpression(node: jsep.Compound) {\n return this.isAsync\n ? node.body.reduce((p: Promise<any>, node) => p.then(() => this.eval(node)), Promise.resolve())\n : node.body.map(v => this.eval(v))[node.body.length - 1]\n }\n\n private evalCallExpression(node: jsep.CallExpression) {\n return this.evalSyncAsync(this.evalCall(node.callee), ([fn, caller]) => this\n .evalSyncAsync(this.evalArray(node.arguments), args => fn\n .apply(caller === node.callee ? this.context : caller, args)));\n }\n\n protected evalCall(callee: jsep.Expression): unknown {\n if (callee.type === 'MemberExpression') {\n return this.evalSyncAsync(\n this.evaluateMember(callee as jsep.MemberExpression),\n ([caller, fn]) => ExpressionEval.validateFnAndCall(fn, caller, callee as AnyExpression)\n );\n }\n return this.eval(callee, fn => ExpressionEval.validateFnAndCall(fn, callee as AnyExpression));\n }\n\n private evalConditionalExpression(node: jsep.ConditionalExpression) {\n return this.eval(node.test, v => v\n ? this.eval(node.consequent)\n : this.eval(node.alternate));\n }\n\n private evalIdentifier(node: jsep.Identifier) {\n return this.context[node.name];\n }\n\n private static evalLiteral(node: jsep.Literal) {\n return node.value;\n }\n\n private evalMemberExpression(node: jsep.MemberExpression) {\n return this.evalSyncAsync(this.evaluateMember(node), ([, val]) => val);\n }\n\n private evaluateMember(node: jsep.MemberExpression) {\n return this.eval(node.object, (object) => this\n .evalSyncAsync(\n node.computed\n ? this.eval(node.property)\n : (node.property as jsep.Identifier).name,\n (key: string) => {\n if (/^__proto__|prototype|constructor$/.test(key)) {\n throw Error(`Access to member \"${key}\" disallowed.`);\n }\n return [object, (node.optional ? (object || {}) : object)[key], key];\n })\n );\n }\n\n private evalThisExpression() {\n return this.context;\n }\n\n private evalUnaryExpression(node: jsep.UnaryExpression) {\n return this.eval(node.argument, arg => ExpressionEval\n .unops[node.operator](arg));\n }\n\n private evalArrowFunctionExpression(node: ArrowExpression) {\n if (this.isAsync !== node.async) {\n return ExpressionEval[node.async ? 'evalAsync' : 'eval'](node as any, this.context);\n }\n return (...arrowArgs) => {\n const arrowContext = this.evalArrowContext(node, arrowArgs);\n return ExpressionEval[node.async ? 'evalAsync' : 'eval'](node.body, arrowContext);\n };\n }\n\n private evalArrowContext(node: ArrowExpression, arrowArgs): Context {\n const arrowContext = { ...this.context };\n\n ((node.params as AnyExpression[]) || []).forEach((param, i) => {\n // default value:\n if (param.type === 'AssignmentExpression') {\n if (arrowArgs[i] === undefined) {\n arrowArgs[i] = this.eval(param.right);\n }\n param = param.left as AnyExpression;\n }\n\n if (param.type === 'Identifier') {\n arrowContext[(param as jsep.Identifier).name] = arrowArgs[i];\n } else if (param.type === 'ArrayExpression') {\n // array destructuring\n (param.elements as AnyExpression[]).forEach((el, j) => {\n let val = arrowArgs[i][j];\n if (el.type === 'AssignmentExpression') {\n if (val === undefined) {\n // default value\n val = this.eval(el.right);\n }\n el = el.left as AnyExpression;\n }\n\n if (el.type === 'Identifier') {\n arrowContext[(el as jsep.Identifier).name] = val;\n } else {\n throw new Error('Unexpected arrow function argument');\n }\n });\n } else if (param.type === 'ObjectExpression') {\n // object destructuring\n const keys = [];\n (param.properties as AnyExpression[]).forEach((prop) => {\n let p = prop;\n if (p.type === 'AssignmentExpression') {\n p = p.left as AnyExpression;\n }\n\n let key;\n if (p.type === 'Property') {\n key = (<jsep.Expression>p.key).type === 'Identifier'\n ? (p.key as jsep.Identifier).name\n : this.eval(p.key).toString();\n } else if (p.type === 'Identifier') {\n key = p.name;\n } else if (p.type === 'SpreadElement' && (<jsep.Expression>p.argument).type === 'Identifier') {\n key = (p.argument as jsep.Identifier).name;\n } else {\n throw new Error('Unexpected arrow function argument');\n }\n\n let val = arrowArgs[i][key];\n if (p.type === 'SpreadElement') {\n // all remaining object properties. Copy arg obj, then delete from our copy\n val = { ...arrowArgs[i] };\n keys.forEach((k) => {\n delete val[k];\n });\n } else if (val === undefined && prop.type === 'AssignmentExpression') {\n // default value\n val = this.eval(prop.right);\n }\n\n arrowContext[key] = val;\n keys.push(key);\n });\n } else if (param.type === 'SpreadElement' && (<jsep.Expression>param.argument).type === 'Identifier') {\n const key = (param.argument as jsep.Identifier).name;\n arrowContext[key] = arrowArgs.slice(i);\n } else {\n throw new Error('Unexpected arrow function argument');\n }\n });\n return arrowContext;\n }\n\n private evalAssignmentExpression(node: AssignmentExpression) {\n return this.evalSyncAsync(\n this.getContextAndKey(node.left as AnyExpression),\n ([destObj, destKey]) => this.eval(node.right, right => ExpressionEval\n .assignOps[node.operator](destObj, destKey, right))\n );\n }\n\n private evalUpdateExpression(node: UpdateExpression) {\n return this.evalSyncAsync(\n this.getContextAndKey(node.argument as AnyExpression),\n ([destObj, destKey]) => ExpressionEval\n .evalUpdateOperation(node, destObj, destKey)\n );\n }\n\n private evalAwaitExpression(node: AwaitExpression) {\n return ExpressionEval.evalAsync(node.argument, this.context);\n }\n\n private static evalUpdateOperation(node: UpdateExpression, destObj, destKey) {\n if (node.prefix) {\n return node.operator === '++'\n ? ++destObj[destKey]\n : --destObj[destKey];\n }\n return node.operator === '++'\n ? destObj[destKey]++\n : destObj[destKey]--;\n }\n\n private getContextAndKey(node: AnyExpression) {\n if (node.type === 'MemberExpression') {\n return this.evalSyncAsync(\n this.evaluateMember(<jsep.MemberExpression>node),\n ([obj, , key]) => [obj, key]\n );\n } else if (node.type === 'Identifier') {\n return [this.context, node.name];\n } else if (node.type === 'ConditionalExpression') {\n return this.eval(node.test, test => this\n .getContextAndKey((test\n ? node.consequent\n : node.alternate) as AnyExpression));\n } else {\n throw new Error('Invalid Member Key');\n }\n }\n\n private evalNewExpression(node: NewExpression) {\n return this.evalSyncAsync(\n this.evalCall(node.callee),\n ([ctor]) => this.evalSyncAsync(\n this.evalArray(node.arguments),\n args => ExpressionEval.construct(ctor, args, node)));\n }\n\n private evalObjectExpression(node: ObjectExpression) {\n const obj = {};\n const arr = node.properties.map((prop: Property | SpreadElement) => {\n if (prop.type === 'SpreadElement') {\n // always synchronous in this case\n Object.assign(obj, ExpressionEval.eval(prop.argument, this.context));\n } else if (prop.type === 'Property') {\n return this.evalSyncAsync(\n prop.key.type === 'Identifier'\n ? (<jsep.Identifier>prop.key).name\n : this.eval(prop.key),\n key => this.eval(\n prop.shorthand ? prop.key : prop.value,\n val => { obj[key] = val; }\n )\n );\n }\n });\n return this.isAsync\n ? Promise.all(arr).then(() => obj)\n : obj;\n }\n\n private evalSpreadElement(node: SpreadElement) {\n return this.eval(node.argument);\n }\n\n private evalTaggedTemplateExpression(node: TaggedTemplateExpression) {\n const fnAndArgs = [\n this.evalCall(node.tag),\n this.evalSyncAsync(\n this.evalArray(node.quasi.expressions),\n exprs => [\n node.quasi.quasis.map(q => q.value.cooked),\n ...exprs,\n ]\n ),\n ];\n const apply = ([[fn, caller], args]) => fn.apply(caller, args);\n return this.isAsync\n ? Promise.all(fnAndArgs).then(apply)\n : apply(fnAndArgs as [[() => unknown, AnyExpression], unknown]);\n }\n\n private evalTemplateLiteral(node: TemplateLiteral) {\n return this.evalSyncAsync(\n this.evalArray(node.expressions),\n expressions => node.quasis.reduce((str, q, i) => {\n str += q.value.cooked;\n if (!q.tail) {\n str += expressions[i];\n }\n return str;\n }, '')\n );\n }\n\n protected static construct(\n ctor: () => unknown,\n args: unknown[],\n node: jsep.CallExpression | jsep.Expression\n ): unknown {\n try {\n return new (Function.prototype.bind.apply(ctor, [null].concat(args)))();\n } catch (e) {\n throw new Error(`${ExpressionEval.nodeFunctionName(node.callee as AnyExpression)} is not a constructor`);\n }\n }\n\n protected static validateFnAndCall(\n fn: () => unknown,\n callee?: AnyExpression,\n caller?: AnyExpression,\n ): [() => unknown, AnyExpression] {\n if (typeof fn !== 'function') {\n if (!fn && caller && caller.optional) {\n return [() => undefined, callee];\n }\n const name = ExpressionEval.nodeFunctionName(caller || callee);\n throw new Error(`'${name}' is not a function`);\n }\n return [fn, callee];\n }\n\n protected static nodeFunctionName(callee: AnyExpression): string {\n return callee\n && ((callee as jsep.Identifier).name\n || ((callee as jsep.MemberExpression).property\n && ((callee as jsep.MemberExpression).property as jsep.Identifier).name));\n }\n}\n\n/** NOTE: exporting named + default.\n * For CJS, these match the static members of the default export, so they still work.\n */\nexport { default as jsep, default as parse } from 'jsep';\nexport const DEFAULT_PRECEDENCE = ExpressionEval.DEFAULT_PRECEDENCE;\nexport const evaluators = ExpressionEval.evaluators;\nexport const binops = ExpressionEval.binops;\nexport const unops = ExpressionEval.unops;\nexport const assignOps = ExpressionEval.assignOps;\nexport const addUnaryOp = ExpressionEval.addUnaryOp;\nexport const addBinaryOp = ExpressionEval.addBinaryOp;\nexport const addEvaluator = ExpressionEval.addEvaluator;\nexport const registerPlugin = ExpressionEval.registerPlugin;\nexport const evaluate = ExpressionEval.eval;\nexport const evalAsync = ExpressionEval.evalAsync;\nexport const compile = ExpressionEval.compile;\nexport const compileAsync = ExpressionEval.compileAsync;\nexport const evalExpr = ExpressionEval.evalExpr;\nexport const evalExprAsync = ExpressionEval.evalExprAsync;\n"],"names":["ExpressionEval","context","isAsync","this","addUnaryOp","operator","_function","jsep","unops","addBinaryOp","precedence_or_fn","_ra_or_callback","ra","cb","precedence","binops","addEvaluator","nodeType","evaluator","evaluators","registerPlugin","slice","call","arguments","forEach","p","init","parse","plugins","register","initEval","eval","ast","evalAsync","Promise","resolve","compile","expression","bind","compileAsync","evalExpr","evalExprAsync","node","v","type","JSON","stringify","evalSyncAsync","_value","val","then","evalArrayExpression","evalArray","elements","list","mapped","map","_this2","toFullArray","res","reduce","arr","i","push","all","evalBinaryExpression","_this3","left","right","op","_ref","leftRight","evalCompoundExpression","_this4","body","length","evalCallExpression","_this5","evalCall","callee","fn","caller","_ref2","args","apply","evaluateMember","validateFnAndCall","_ref3","evalConditionalExpression","_this6","test","consequent","alternate","evalIdentifier","name","evalLiteral","value","evalMemberExpression","_this7","object","computed","property","key","Error","optional","evalThisExpression","evalUnaryExpression","argument","arg","evalArrowFunctionExpression","_this","async","arrowContext","evalArrowContext","arrowArgs","_this8","_extends","params","param","undefined","el","j","properties","prop","toString","keys","k","evalAssignmentExpression","_this9","getContextAndKey","_ref5","destKey","assignOps","destObj","evalUpdateExpression","evalUpdateOperation","_ref6","evalAwaitExpression","prefix","_this10","_ref7","evalNewExpression","_this11","ctor","_ref8","construct","evalObjectExpression","_this12","obj","Object","assign","shorthand","evalSpreadElement","evalTaggedTemplateExpression","tag","quasi","expressions","exprs","quasis","q","cooked","fnAndArgs","evalTemplateLiteral","str","tail","Function","prototype","concat","e","nodeFunctionName","evaluate","ArrayExpression","LogicalExpression","BinaryExpression","CallExpression","Compound","ConditionalExpression","Identifier","Literal","OptionalMemberExpression","MemberExpression","ThisExpression","UnaryExpression","ArrowFunctionExpression","AssignmentExpression","UpdateExpression","AwaitExpression","NewExpression","ObjectExpression","SpreadElement","TaggedTemplateExpression","TemplateLiteral","DEFAULT_PRECEDENCE","a","b","_key"],"mappings":"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"}