ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
735 lines (720 loc) • 92.1 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.INLINES = exports.Inlines = exports.BLOCKS = exports.Blocks = exports.PartialInvoker = exports.InvokeDynamicLayout = exports.ATTRS_BLOCK = undefined;
exports.expr = expr;
exports.compileList = compileList;
exports.populateBuiltins = populateBuiltins;
exports.compileStatement = compileStatement;
exports.compileStatements = compileStatements;
var _reference = require('@glimmer/reference');
var _util = require('@glimmer/util');
var _wireFormat = require('@glimmer/wire-format');
var WireFormat = _interopRequireWildcard(_wireFormat);
var _builder = require('../compiled/opcodes/builder');
var _builder2 = _interopRequireDefault(_builder);
var _opcodes = require('../opcodes');
var _clientSide = require('../syntax/client-side');
var ClientSide = _interopRequireWildcard(_clientSide);
var _rawBlock = require('./raw-block');
var _rawBlock2 = _interopRequireDefault(_rawBlock);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
var Ops = WireFormat.Ops;
const ATTRS_BLOCK = exports.ATTRS_BLOCK = '&attrs';
class Compilers {
constructor(offset = 0) {
this.offset = offset;
this.names = (0, _util.dict)();
this.funcs = [];
}
add(name, func) {
this.funcs.push(func);
this.names[name] = this.funcs.length - 1;
}
compile(sexp, builder) {
let name = sexp[this.offset];
let index = this.names[name];
let func = this.funcs[index];
(0, _util.assert)(!!func, `expected an implementation for ${this.offset === 0 ? Ops[sexp[0]] : ClientSide.Ops[sexp[1]]}`);
func(sexp, builder);
}
}
const STATEMENTS = new Compilers();
const CLIENT_SIDE = new Compilers(1);
STATEMENTS.add(Ops.Text, (sexp, builder) => {
builder.text(sexp[1]);
});
STATEMENTS.add(Ops.Comment, (sexp, builder) => {
builder.comment(sexp[1]);
});
STATEMENTS.add(Ops.CloseElement, (_sexp, builder) => {
builder.closeElement();
});
STATEMENTS.add(Ops.FlushElement, (_sexp, builder) => {
builder.flushElement();
});
STATEMENTS.add(Ops.Modifier, (sexp, builder) => {
let { env, meta } = builder;
let [, name, params, hash] = sexp;
if (env.hasModifier(name, meta.templateMeta)) {
builder.compileArgs(params, hash, true);
builder.modifier(env.lookupModifier(name, meta.templateMeta));
} else {
throw new Error(`Compile Error ${name} is not a modifier: Helpers may not be used in the element form.`);
}
});
STATEMENTS.add(Ops.StaticAttr, (sexp, builder) => {
let [, name, value, namespace] = sexp;
builder.staticAttr(name, namespace, value);
});
STATEMENTS.add(Ops.DynamicAttr, (sexp, builder) => {
dynamicAttr(sexp, false, builder);
});
STATEMENTS.add(Ops.TrustingAttr, (sexp, builder) => {
dynamicAttr(sexp, true, builder);
});
function dynamicAttr(sexp, trusting, builder) {
let [, name, value, namespace] = sexp;
expr(value, builder);
if (namespace) {
builder.dynamicAttrNS(name, namespace, trusting);
} else {
builder.dynamicAttr(name, trusting);
}
}
STATEMENTS.add(Ops.OpenElement, (sexp, builder) => {
builder.openPrimitiveElement(sexp[1]);
});
CLIENT_SIDE.add(ClientSide.Ops.OpenComponentElement, (sexp, builder) => {
builder.pushComponentOperations();
builder.openElementWithOperations(sexp[2]);
});
CLIENT_SIDE.add(ClientSide.Ops.DidCreateElement, (_sexp, builder) => {
builder.didCreateElement(_opcodes.Register.s0);
});
CLIENT_SIDE.add(ClientSide.Ops.DidRenderLayout, (_sexp, builder) => {
builder.didRenderLayout(_opcodes.Register.s0);
});
STATEMENTS.add(Ops.Append, (sexp, builder) => {
let [, value, trusting] = sexp;
let { inlines } = builder.env.macros();
let returned = inlines.compile(sexp, builder) || value;
if (returned === true) return;
let isGet = E.isGet(value);
let isMaybeLocal = E.isMaybeLocal(value);
if (trusting) {
builder.guardedAppend(value, true);
} else {
if (isGet || isMaybeLocal) {
builder.guardedAppend(value, false);
} else {
expr(value, builder);
builder.cautiousAppend();
}
}
});
STATEMENTS.add(Ops.Block, (sexp, builder) => {
let [, name, params, hash, _template, _inverse] = sexp;
let template = builder.template(_template);
let inverse = builder.template(_inverse);
let templateBlock = template && template.scan();
let inverseBlock = inverse && inverse.scan();
let { blocks } = builder.env.macros();
blocks.compile(name, params, hash, templateBlock, inverseBlock, builder);
});
class InvokeDynamicLayout {
constructor(attrs) {
this.attrs = attrs;
}
invoke(vm, layout) {
let { symbols, hasEval } = layout.symbolTable;
let stack = vm.stack;
let scope = vm.pushRootScope(symbols.length + 1, true);
scope.bindSelf(stack.pop());
scope.bindBlock(symbols.indexOf(ATTRS_BLOCK) + 1, this.attrs);
let lookup = null;
let $eval = -1;
if (hasEval) {
$eval = symbols.indexOf('$eval') + 1;
lookup = (0, _util.dict)();
}
let callerNames = stack.pop();
for (let i = callerNames.length - 1; i >= 0; i--) {
let symbol = symbols.indexOf(callerNames[i]);
let value = stack.pop();
if (symbol !== -1) scope.bindSymbol(symbol + 1, value);
if (hasEval) lookup[callerNames[i]] = value;
}
let numPositionalArgs = stack.pop();
(0, _util.assert)(typeof numPositionalArgs === 'number', '[BUG] Incorrect value of positional argument count found during invoke-dynamic-layout.');
// Currently we don't support accessing positional args in templates, so just throw them away
stack.pop(numPositionalArgs);
let inverseSymbol = symbols.indexOf('&inverse');
let inverse = stack.pop();
if (inverseSymbol !== -1) {
scope.bindBlock(inverseSymbol + 1, inverse);
}
if (lookup) lookup['&inverse'] = inverse;
let defaultSymbol = symbols.indexOf('&default');
let defaultBlock = stack.pop();
if (defaultSymbol !== -1) {
scope.bindBlock(defaultSymbol + 1, defaultBlock);
}
if (lookup) lookup['&default'] = defaultBlock;
if (lookup) scope.bindEvalScope(lookup);
vm.pushFrame();
vm.call(layout.handle);
}
toJSON() {
return { GlimmerDebug: '<invoke-dynamic-layout>' };
}
}
exports.InvokeDynamicLayout = InvokeDynamicLayout;
STATEMENTS.add(Ops.Component, (sexp, builder) => {
let [, tag, attrs, args, block] = sexp;
if (builder.env.hasComponentDefinition(tag, builder.meta.templateMeta)) {
let child = builder.template(block);
let attrsBlock = new _rawBlock2.default(builder.meta, attrs, _util.EMPTY_ARRAY);
let definition = builder.env.getComponentDefinition(tag, builder.meta.templateMeta);
builder.pushComponentManager(definition);
builder.invokeComponent(attrsBlock, null, args, child && child.scan());
} else if (block && block.parameters.length) {
throw new Error(`Compile Error: Cannot find component ${tag}`);
} else {
builder.openPrimitiveElement(tag);
for (let i = 0; i < attrs.length; i++) {
STATEMENTS.compile(attrs[i], builder);
}
builder.flushElement();
if (block) {
let stmts = block.statements;
for (let i = 0; i < stmts.length; i++) {
STATEMENTS.compile(stmts[i], builder);
}
}
builder.closeElement();
}
});
class PartialInvoker {
constructor(outerSymbols, evalInfo) {
this.outerSymbols = outerSymbols;
this.evalInfo = evalInfo;
}
invoke(vm, _partial) {
let partial = (0, _util.unwrap)(_partial);
let partialSymbols = partial.symbolTable.symbols;
let outerScope = vm.scope();
let partialScope = vm.pushRootScope(partialSymbols.length, false);
partialScope.bindCallerScope(outerScope.getCallerScope());
partialScope.bindEvalScope(outerScope.getEvalScope());
partialScope.bindSelf(outerScope.getSelf());
let { evalInfo, outerSymbols } = this;
let locals = (0, _util.dict)();
for (let i = 0; i < evalInfo.length; i++) {
let slot = evalInfo[i];
let name = outerSymbols[slot - 1];
let ref = outerScope.getSymbol(slot);
locals[name] = ref;
}
let evalScope = outerScope.getEvalScope();
for (let i = 0; i < partialSymbols.length; i++) {
let name = partialSymbols[i];
let symbol = i + 1;
let value = evalScope[name];
if (value !== undefined) partialScope.bind(symbol, value);
}
partialScope.bindPartialMap(locals);
vm.pushFrame();
vm.call(partial.handle);
}
}
exports.PartialInvoker = PartialInvoker;
STATEMENTS.add(Ops.Partial, (sexp, builder) => {
let [, name, evalInfo] = sexp;
let { templateMeta, symbols } = builder.meta;
function helper(vm, args) {
let { env } = vm;
let nameRef = args.positional.at(0);
return (0, _reference.map)(nameRef, n => {
if (typeof n === 'string' && n) {
if (!env.hasPartial(n, templateMeta)) {
throw new Error(`Could not find a partial named "${n}"`);
}
return env.lookupPartial(n, templateMeta);
} else if (n) {
throw new Error(`Could not find a partial named "${String(n)}"`);
} else {
return null;
}
});
}
builder.startLabels();
builder.pushFrame();
builder.returnTo('END');
expr(name, builder);
builder.pushImmediate(1);
builder.pushImmediate(_util.EMPTY_ARRAY);
builder.pushArgs(true);
builder.helper(helper);
builder.dup();
builder.test('simple');
builder.enter(2);
builder.jumpUnless('ELSE');
builder.getPartialTemplate();
builder.compileDynamicBlock();
builder.invokeDynamic(new PartialInvoker(symbols, evalInfo));
builder.popScope();
builder.popFrame();
builder.label('ELSE');
builder.exit();
builder.return();
builder.label('END');
builder.popFrame();
builder.stopLabels();
});
class InvokeDynamicYield {
constructor(callerCount) {
this.callerCount = callerCount;
}
invoke(vm, block) {
let { callerCount } = this;
let stack = vm.stack;
if (!block) {
// To balance the pop{Frame,Scope}
vm.pushFrame();
vm.pushCallerScope();
return;
}
let table = block.symbolTable;
let locals = table.parameters; // always present in inline blocks
let calleeCount = locals ? locals.length : 0;
let count = Math.min(callerCount, calleeCount);
vm.pushFrame();
vm.pushCallerScope(calleeCount > 0);
let scope = vm.scope();
for (let i = 0; i < count; i++) {
scope.bindSymbol(locals[i], stack.fromBase(callerCount - i));
}
vm.call(block.handle);
}
toJSON() {
return { GlimmerDebug: `<invoke-dynamic-yield caller-count=${this.callerCount}>` };
}
}
STATEMENTS.add(Ops.Yield, (sexp, builder) => {
let [, to, params] = sexp;
let count = compileList(params, builder);
builder.getBlock(to);
builder.compileDynamicBlock();
builder.invokeDynamic(new InvokeDynamicYield(count));
builder.popScope();
builder.popFrame();
if (count) {
builder.pop(count);
}
});
STATEMENTS.add(Ops.Debugger, (sexp, builder) => {
let [, evalInfo] = sexp;
builder.debugger(builder.meta.symbols, evalInfo);
});
STATEMENTS.add(Ops.ClientSideStatement, (sexp, builder) => {
CLIENT_SIDE.compile(sexp, builder);
});
const EXPRESSIONS = new Compilers();
const CLIENT_SIDE_EXPRS = new Compilers(1);
var E = WireFormat.Expressions;
function expr(expression, builder) {
if (Array.isArray(expression)) {
EXPRESSIONS.compile(expression, builder);
} else {
builder.primitive(expression);
}
}
EXPRESSIONS.add(Ops.Unknown, (sexp, builder) => {
let name = sexp[1];
if (builder.env.hasHelper(name, builder.meta.templateMeta)) {
EXPRESSIONS.compile([Ops.Helper, name, _util.EMPTY_ARRAY, null], builder);
} else if (builder.meta.asPartial) {
builder.resolveMaybeLocal(name);
} else {
builder.getVariable(0);
builder.getProperty(name);
}
});
EXPRESSIONS.add(Ops.Concat, (sexp, builder) => {
let parts = sexp[1];
for (let i = 0; i < parts.length; i++) {
expr(parts[i], builder);
}
builder.concat(parts.length);
});
CLIENT_SIDE_EXPRS.add(ClientSide.Ops.FunctionExpression, (sexp, builder) => {
builder.function(sexp[2]);
});
EXPRESSIONS.add(Ops.Helper, (sexp, builder) => {
let { env, meta } = builder;
let [, name, params, hash] = sexp;
if (env.hasHelper(name, meta.templateMeta)) {
builder.compileArgs(params, hash, true);
builder.helper(env.lookupHelper(name, meta.templateMeta));
} else {
throw new Error(`Compile Error: ${name} is not a helper`);
}
});
EXPRESSIONS.add(Ops.Get, (sexp, builder) => {
let [, head, path] = sexp;
builder.getVariable(head);
for (let i = 0; i < path.length; i++) {
builder.getProperty(path[i]);
}
});
EXPRESSIONS.add(Ops.MaybeLocal, (sexp, builder) => {
let [, path] = sexp;
if (builder.meta.asPartial) {
let head = path[0];
path = path.slice(1);
builder.resolveMaybeLocal(head);
} else {
builder.getVariable(0);
}
for (let i = 0; i < path.length; i++) {
builder.getProperty(path[i]);
}
});
EXPRESSIONS.add(Ops.Undefined, (_sexp, builder) => {
return builder.primitive(undefined);
});
EXPRESSIONS.add(Ops.HasBlock, (sexp, builder) => {
builder.hasBlock(sexp[1]);
});
EXPRESSIONS.add(Ops.HasBlockParams, (sexp, builder) => {
builder.hasBlockParams(sexp[1]);
});
EXPRESSIONS.add(Ops.ClientSideExpression, (sexp, builder) => {
CLIENT_SIDE_EXPRS.compile(sexp, builder);
});
function compileList(params, builder) {
if (!params) return 0;
for (let i = 0; i < params.length; i++) {
expr(params[i], builder);
}
return params.length;
}
class Blocks {
constructor() {
this.names = (0, _util.dict)();
this.funcs = [];
}
add(name, func) {
this.funcs.push(func);
this.names[name] = this.funcs.length - 1;
}
addMissing(func) {
this.missing = func;
}
compile(name, params, hash, template, inverse, builder) {
let index = this.names[name];
if (index === undefined) {
(0, _util.assert)(!!this.missing, `${name} not found, and no catch-all block handler was registered`);
let func = this.missing;
let handled = func(name, params, hash, template, inverse, builder);
(0, _util.assert)(!!handled, `${name} not found, and the catch-all block handler didn't handle it`);
} else {
let func = this.funcs[index];
func(params, hash, template, inverse, builder);
}
}
}
exports.Blocks = Blocks;
const BLOCKS = exports.BLOCKS = new Blocks();
class Inlines {
constructor() {
this.names = (0, _util.dict)();
this.funcs = [];
}
add(name, func) {
this.funcs.push(func);
this.names[name] = this.funcs.length - 1;
}
addMissing(func) {
this.missing = func;
}
compile(sexp, builder) {
let value = sexp[1];
// TODO: Fix this so that expression macros can return
// things like components, so that {{component foo}}
// is the same as {{(component foo)}}
if (!Array.isArray(value)) return ['expr', value];
let name;
let params;
let hash;
if (value[0] === Ops.Helper) {
name = value[1];
params = value[2];
hash = value[3];
} else if (value[0] === Ops.Unknown) {
name = value[1];
params = hash = null;
} else {
return ['expr', value];
}
let index = this.names[name];
if (index === undefined && this.missing) {
let func = this.missing;
let returned = func(name, params, hash, builder);
return returned === false ? ['expr', value] : returned;
} else if (index !== undefined) {
let func = this.funcs[index];
let returned = func(name, params, hash, builder);
return returned === false ? ['expr', value] : returned;
} else {
return ['expr', value];
}
}
}
exports.Inlines = Inlines;
const INLINES = exports.INLINES = new Inlines();
populateBuiltins(BLOCKS, INLINES);
function populateBuiltins(blocks = new Blocks(), inlines = new Inlines()) {
blocks.add('if', (params, _hash, template, inverse, builder) => {
// PutArgs
// Test(Environment)
// Enter(BEGIN, END)
// BEGIN: Noop
// JumpUnless(ELSE)
// Evaluate(default)
// Jump(END)
// ELSE: Noop
// Evalulate(inverse)
// END: Noop
// Exit
if (!params || params.length !== 1) {
throw new Error(`SYNTAX ERROR: #if requires a single argument`);
}
builder.startLabels();
builder.pushFrame();
builder.returnTo('END');
expr(params[0], builder);
builder.test('environment');
builder.enter(1);
builder.jumpUnless('ELSE');
builder.invokeStatic((0, _util.unwrap)(template));
if (inverse) {
builder.jump('EXIT');
builder.label('ELSE');
builder.invokeStatic(inverse);
builder.label('EXIT');
builder.exit();
builder.return();
} else {
builder.label('ELSE');
builder.exit();
builder.return();
}
builder.label('END');
builder.popFrame();
builder.stopLabels();
});
blocks.add('unless', (params, _hash, template, inverse, builder) => {
// PutArgs
// Test(Environment)
// Enter(BEGIN, END)
// BEGIN: Noop
// JumpUnless(ELSE)
// Evaluate(default)
// Jump(END)
// ELSE: Noop
// Evalulate(inverse)
// END: Noop
// Exit
if (!params || params.length !== 1) {
throw new Error(`SYNTAX ERROR: #unless requires a single argument`);
}
builder.startLabels();
builder.pushFrame();
builder.returnTo('END');
expr(params[0], builder);
builder.test('environment');
builder.enter(1);
builder.jumpIf('ELSE');
builder.invokeStatic((0, _util.unwrap)(template));
if (inverse) {
builder.jump('EXIT');
builder.label('ELSE');
builder.invokeStatic(inverse);
builder.label('EXIT');
builder.exit();
builder.return();
} else {
builder.label('ELSE');
builder.exit();
builder.return();
}
builder.label('END');
builder.popFrame();
builder.stopLabels();
});
blocks.add('with', (params, _hash, template, inverse, builder) => {
// PutArgs
// Test(Environment)
// Enter(BEGIN, END)
// BEGIN: Noop
// JumpUnless(ELSE)
// Evaluate(default)
// Jump(END)
// ELSE: Noop
// Evalulate(inverse)
// END: Noop
// Exit
if (!params || params.length !== 1) {
throw new Error(`SYNTAX ERROR: #with requires a single argument`);
}
builder.startLabels();
builder.pushFrame();
builder.returnTo('END');
expr(params[0], builder);
builder.dup();
builder.test('environment');
builder.enter(2);
builder.jumpUnless('ELSE');
builder.invokeStatic((0, _util.unwrap)(template), 1);
if (inverse) {
builder.jump('EXIT');
builder.label('ELSE');
builder.invokeStatic(inverse);
builder.label('EXIT');
builder.exit();
builder.return();
} else {
builder.label('ELSE');
builder.exit();
builder.return();
}
builder.label('END');
builder.popFrame();
builder.stopLabels();
});
blocks.add('each', (params, hash, template, inverse, builder) => {
// Enter(BEGIN, END)
// BEGIN: Noop
// PutArgs
// PutIterable
// JumpUnless(ELSE)
// EnterList(BEGIN2, END2)
// ITER: Noop
// NextIter(BREAK)
// BEGIN2: Noop
// PushChildScope
// Evaluate(default)
// PopScope
// END2: Noop
// Exit
// Jump(ITER)
// BREAK: Noop
// ExitList
// Jump(END)
// ELSE: Noop
// Evalulate(inverse)
// END: Noop
// Exit
builder.startLabels();
builder.pushFrame();
builder.returnTo('END');
if (hash && hash[0][0] === 'key') {
expr(hash[1][0], builder);
} else {
builder.primitive(null);
}
expr(params[0], builder);
builder.enter(2);
builder.putIterator();
builder.jumpUnless('ELSE');
builder.pushFrame();
builder.returnTo('ITER');
builder.dup(_opcodes.Register.fp, 1);
builder.enterList('BODY');
builder.label('ITER');
builder.iterate('BREAK');
builder.label('BODY');
builder.invokeStatic((0, _util.unwrap)(template), 2);
builder.pop(2);
builder.exit();
builder.return();
builder.label('BREAK');
builder.exitList();
builder.popFrame();
if (inverse) {
builder.jump('EXIT');
builder.label('ELSE');
builder.invokeStatic(inverse);
builder.label('EXIT');
builder.exit();
builder.return();
} else {
builder.label('ELSE');
builder.exit();
builder.return();
}
builder.label('END');
builder.popFrame();
builder.stopLabels();
});
blocks.add('-in-element', (params, hash, template, _inverse, builder) => {
if (!params || params.length !== 1) {
throw new Error(`SYNTAX ERROR: #-in-element requires a single argument`);
}
builder.startLabels();
builder.pushFrame();
builder.returnTo('END');
if (hash && hash[0].length) {
let [keys, values] = hash;
if (keys.length === 1 && keys[0] === 'nextSibling') {
expr(values[0], builder);
} else {
throw new Error(`SYNTAX ERROR: #-in-element does not take a \`${keys[0]}\` option`);
}
} else {
expr(null, builder);
}
expr(params[0], builder);
builder.dup();
builder.test('simple');
builder.enter(3);
builder.jumpUnless('ELSE');
builder.pushRemoteElement();
builder.invokeStatic((0, _util.unwrap)(template));
builder.popRemoteElement();
builder.label('ELSE');
builder.exit();
builder.return();
builder.label('END');
builder.popFrame();
builder.stopLabels();
});
blocks.add('-with-dynamic-vars', (_params, hash, template, _inverse, builder) => {
if (hash) {
let [names, expressions] = hash;
compileList(expressions, builder);
builder.pushDynamicScope();
builder.bindDynamicScope(names);
builder.invokeStatic((0, _util.unwrap)(template));
builder.popDynamicScope();
} else {
builder.invokeStatic((0, _util.unwrap)(template));
}
});
return { blocks, inlines };
}
function compileStatement(statement, builder) {
STATEMENTS.compile(statement, builder);
}
function compileStatements(statements, meta, env) {
let b = new _builder2.default(env, meta);
for (let i = 0; i < statements.length; i++) {
compileStatement(statements[i], b);
}
return b;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zeW50YXgvZnVuY3Rpb25zLmpzIl0sIm5hbWVzIjpbImV4cHIiLCJjb21waWxlTGlzdCIsInBvcHVsYXRlQnVpbHRpbnMiLCJjb21waWxlU3RhdGVtZW50IiwiY29tcGlsZVN0YXRlbWVudHMiLCJXaXJlRm9ybWF0IiwiQ2xpZW50U2lkZSIsIk9wcyIsIkFUVFJTX0JMT0NLIiwiQ29tcGlsZXJzIiwiY29uc3RydWN0b3IiLCJvZmZzZXQiLCJuYW1lcyIsImZ1bmNzIiwiYWRkIiwibmFtZSIsImZ1bmMiLCJwdXNoIiwibGVuZ3RoIiwiY29tcGlsZSIsInNleHAiLCJidWlsZGVyIiwiaW5kZXgiLCJTVEFURU1FTlRTIiwiQ0xJRU5UX1NJREUiLCJUZXh0IiwidGV4dCIsIkNvbW1lbnQiLCJjb21tZW50IiwiQ2xvc2VFbGVtZW50IiwiX3NleHAiLCJjbG9zZUVsZW1lbnQiLCJGbHVzaEVsZW1lbnQiLCJmbHVzaEVsZW1lbnQiLCJNb2RpZmllciIsImVudiIsIm1ldGEiLCJwYXJhbXMiLCJoYXNoIiwiaGFzTW9kaWZpZXIiLCJ0ZW1wbGF0ZU1ldGEiLCJjb21waWxlQXJncyIsIm1vZGlmaWVyIiwibG9va3VwTW9kaWZpZXIiLCJFcnJvciIsIlN0YXRpY0F0dHIiLCJ2YWx1ZSIsIm5hbWVzcGFjZSIsInN0YXRpY0F0dHIiLCJEeW5hbWljQXR0ciIsImR5bmFtaWNBdHRyIiwiVHJ1c3RpbmdBdHRyIiwidHJ1c3RpbmciLCJkeW5hbWljQXR0ck5TIiwiT3BlbkVsZW1lbnQiLCJvcGVuUHJpbWl0aXZlRWxlbWVudCIsIk9wZW5Db21wb25lbnRFbGVtZW50IiwicHVzaENvbXBvbmVudE9wZXJhdGlvbnMiLCJvcGVuRWxlbWVudFdpdGhPcGVyYXRpb25zIiwiRGlkQ3JlYXRlRWxlbWVudCIsImRpZENyZWF0ZUVsZW1lbnQiLCJzMCIsIkRpZFJlbmRlckxheW91dCIsImRpZFJlbmRlckxheW91dCIsIkFwcGVuZCIsImlubGluZXMiLCJtYWNyb3MiLCJyZXR1cm5lZCIsImlzR2V0IiwiRSIsImlzTWF5YmVMb2NhbCIsImd1YXJkZWRBcHBlbmQiLCJjYXV0aW91c0FwcGVuZCIsIkJsb2NrIiwiX3RlbXBsYXRlIiwiX2ludmVyc2UiLCJ0ZW1wbGF0ZSIsImludmVyc2UiLCJ0ZW1wbGF0ZUJsb2NrIiwic2NhbiIsImludmVyc2VCbG9jayIsImJsb2NrcyIsIkludm9rZUR5bmFtaWNMYXlvdXQiLCJhdHRycyIsImludm9rZSIsInZtIiwibGF5b3V0Iiwic3ltYm9scyIsImhhc0V2YWwiLCJzeW1ib2xUYWJsZSIsInN0YWNrIiwic2NvcGUiLCJwdXNoUm9vdFNjb3BlIiwiYmluZFNlbGYiLCJwb3AiLCJiaW5kQmxvY2siLCJpbmRleE9mIiwibG9va3VwIiwiJGV2YWwiLCJjYWxsZXJOYW1lcyIsImkiLCJzeW1ib2wiLCJiaW5kU3ltYm9sIiwibnVtUG9zaXRpb25hbEFyZ3MiLCJpbnZlcnNlU3ltYm9sIiwiZGVmYXVsdFN5bWJvbCIsImRlZmF1bHRCbG9jayIsImJpbmRFdmFsU2NvcGUiLCJwdXNoRnJhbWUiLCJjYWxsIiwiaGFuZGxlIiwidG9KU09OIiwiR2xpbW1lckRlYnVnIiwiQ29tcG9uZW50IiwidGFnIiwiYXJncyIsImJsb2NrIiwiaGFzQ29tcG9uZW50RGVmaW5pdGlvbiIsImNoaWxkIiwiYXR0cnNCbG9jayIsImRlZmluaXRpb24iLCJnZXRDb21wb25lbnREZWZpbml0aW9uIiwicHVzaENvbXBvbmVudE1hbmFnZXIiLCJpbnZva2VDb21wb25lbnQiLCJwYXJhbWV0ZXJzIiwic3RtdHMiLCJzdGF0ZW1lbnRzIiwiUGFydGlhbEludm9rZXIiLCJvdXRlclN5bWJvbHMiLCJldmFsSW5mbyIsIl9wYXJ0aWFsIiwicGFydGlhbCIsInBhcnRpYWxTeW1ib2xzIiwib3V0ZXJTY29wZSIsInBhcnRpYWxTY29wZSIsImJpbmRDYWxsZXJTY29wZSIsImdldENhbGxlclNjb3BlIiwiZ2V0RXZhbFNjb3BlIiwiZ2V0U2VsZiIsImxvY2FscyIsInNsb3QiLCJyZWYiLCJnZXRTeW1ib2wiLCJldmFsU2NvcGUiLCJ1bmRlZmluZWQiLCJiaW5kIiwiYmluZFBhcnRpYWxNYXAiLCJQYXJ0aWFsIiwiaGVscGVyIiwibmFtZVJlZiIsInBvc2l0aW9uYWwiLCJhdCIsIm4iLCJoYXNQYXJ0aWFsIiwibG9va3VwUGFydGlhbCIsIlN0cmluZyIsInN0YXJ0TGFiZWxzIiwicmV0dXJuVG8iLCJwdXNoSW1tZWRpYXRlIiwicHVzaEFyZ3MiLCJkdXAiLCJ0ZXN0IiwiZW50ZXIiLCJqdW1wVW5sZXNzIiwiZ2V0UGFydGlhbFRlbXBsYXRlIiwiY29tcGlsZUR5bmFtaWNCbG9jayIsImludm9rZUR5bmFtaWMiLCJwb3BTY29wZSIsInBvcEZyYW1lIiwibGFiZWwiLCJleGl0IiwicmV0dXJuIiwic3RvcExhYmVscyIsIkludm9rZUR5bmFtaWNZaWVsZCIsImNhbGxlckNvdW50IiwicHVzaENhbGxlclNjb3BlIiwidGFibGUiLCJjYWxsZWVDb3VudCIsImNvdW50IiwiTWF0aCIsIm1pbiIsImZyb21CYXNlIiwiWWllbGQiLCJ0byIsImdldEJsb2NrIiwiRGVidWdnZXIiLCJkZWJ1Z2dlciIsIkNsaWVudFNpZGVTdGF0ZW1lbnQiLCJFWFBSRVNTSU9OUyIsIkNMSUVOVF9TSURFX0VYUFJTIiwiRXhwcmVzc2lvbnMiLCJleHByZXNzaW9uIiwiQXJyYXkiLCJpc0FycmF5IiwicHJpbWl0aXZlIiwiVW5rbm93biIsImhhc0hlbHBlciIsIkhlbHBlciIsImFzUGFydGlhbCIsInJlc29sdmVNYXliZUxvY2FsIiwiZ2V0VmFyaWFibGUiLCJnZXRQcm9wZXJ0eSIsIkNvbmNhdCIsInBhcnRzIiwiY29uY2F0IiwiRnVuY3Rpb25FeHByZXNzaW9uIiwiZnVuY3Rpb24iLCJsb29rdXBIZWxwZXIiLCJHZXQiLCJoZWFkIiwicGF0aCIsIk1heWJlTG9jYWwiLCJzbGljZSIsIlVuZGVmaW5lZCIsIkhhc0Jsb2NrIiwiaGFzQmxvY2siLCJIYXNCbG9ja1BhcmFtcyIsImhhc0Jsb2NrUGFyYW1zIiwiQ2xpZW50U2lkZUV4cHJlc3Npb24iLCJCbG9ja3MiLCJhZGRNaXNzaW5nIiwibWlzc2luZyIsImhhbmRsZWQiLCJCTE9DS1MiLCJJbmxpbmVzIiwiSU5MSU5FUyIsIl9oYXNoIiwiaW52b2tlU3RhdGljIiwianVtcCIsImp1bXBJZiIsInB1dEl0ZXJhdG9yIiwiZnAiLCJlbnRlckxpc3QiLCJpdGVyYXRlIiwiZXhpdExpc3QiLCJrZXlzIiwidmFsdWVzIiwicHVzaFJlbW90ZUVsZW1lbnQiLCJwb3BSZW1vdGVFbGVtZW50IiwiX3BhcmFtcyIsImV4cHJlc3Npb25zIiwicHVzaER5bmFtaWNTY29wZSIsImJpbmREeW5hbWljU2NvcGUiLCJwb3BEeW5hbWljU2NvcGUiLCJzdGF0ZW1lbnQiLCJiIl0sIm1hcHBpbmdzIjoiOzs7Ozs7UUFxVGdCQSxJLEdBQUFBLEk7UUFzRUFDLFcsR0FBQUEsVztRQWdGQUMsZ0IsR0FBQUEsZ0I7UUFzT0FDLGdCLEdBQUFBLGdCO1FBR0FDLGlCLEdBQUFBLGlCOztBQXByQmhCOztBQUNBOztBQUNBOztJQUFZQyxVOztBQUNaOzs7O0FBQ0E7O0FBQ0E7O0lBQVlDLFU7O0FBQ1o7Ozs7Ozs7O0FBQ0EsSUFBSUMsTUFBTUYsV0FBV0UsR0FBckI7QUFDTyxNQUFNQyxvQ0FBYyxRQUFwQjtBQUNQLE1BQU1DLFNBQU4sQ0FBZ0I7QUFDWkMsZ0JBQVlDLFNBQVMsQ0FBckIsRUFBd0I7QUFDcEIsYUFBS0EsTUFBTCxHQUFjQSxNQUFkO0FBQ0EsYUFBS0MsS0FBTCxHQUFhLGlCQUFiO0FBQ0EsYUFBS0MsS0FBTCxHQUFhLEVBQWI7QUFDSDtBQUNEQyxRQUFJQyxJQUFKLEVBQVVDLElBQVYsRUFBZ0I7QUFDWixhQUFLSCxLQUFMLENBQVdJLElBQVgsQ0FBZ0JELElBQWhCO0FBQ0EsYUFBS0osS0FBTCxDQUFXRyxJQUFYLElBQW1CLEtBQUtGLEtBQUwsQ0FBV0ssTUFBWCxHQUFvQixDQUF2QztBQUNIO0FBQ0RDLFlBQVFDLElBQVIsRUFBY0MsT0FBZCxFQUF1QjtBQUNuQixZQUFJTixPQUFPSyxLQUFLLEtB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