@odoo/owl 2.0.0-beta-10 → 2.0.0-beta-11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/owl.cjs.js CHANGED
@@ -171,6 +171,10 @@ function toClassObj(expr) {
171
171
  for (let key in expr) {
172
172
  const value = expr[key];
173
173
  if (value) {
174
+ key = trim.call(key);
175
+ if (!key) {
176
+ continue;
177
+ }
174
178
  const words = split.call(key, wordRegexp);
175
179
  for (let word of words) {
176
180
  result[word] = value;
@@ -1487,6 +1491,7 @@ function cancelFibers(fibers) {
1487
1491
  fiber.render = throwOnRender;
1488
1492
  if (node.status === 0 /* NEW */) {
1489
1493
  node.destroy();
1494
+ delete node.parent.children[node.parentKey];
1490
1495
  }
1491
1496
  node.fiber = null;
1492
1497
  if (fiber.bdom) {
@@ -2875,13 +2880,14 @@ function shallowEqual(l1, l2) {
2875
2880
  return true;
2876
2881
  }
2877
2882
  class LazyValue {
2878
- constructor(fn, ctx, node) {
2883
+ constructor(fn, ctx, component, node) {
2879
2884
  this.fn = fn;
2880
2885
  this.ctx = capture(ctx);
2886
+ this.component = component;
2881
2887
  this.node = node;
2882
2888
  }
2883
2889
  evaluate() {
2884
- return this.fn(this.ctx, this.node);
2890
+ return this.fn.call(this.component, this.ctx, this.node);
2885
2891
  }
2886
2892
  toString() {
2887
2893
  return this.evaluate().toString();
@@ -2890,9 +2896,9 @@ class LazyValue {
2890
2896
  /*
2891
2897
  * Safely outputs `value` as a block depending on the nature of `value`
2892
2898
  */
2893
- function safeOutput(value) {
2894
- if (!value) {
2895
- return value;
2899
+ function safeOutput(value, defaultValue) {
2900
+ if (value === undefined) {
2901
+ return defaultValue ? toggler("default", defaultValue) : toggler("undefined", text(""));
2896
2902
  }
2897
2903
  let safeKey;
2898
2904
  let block;
@@ -3178,7 +3184,7 @@ const STATIC_TOKEN_MAP = Object.assign(Object.create(null), {
3178
3184
  });
3179
3185
  // note that the space after typeof is relevant. It makes sure that the formatted
3180
3186
  // expression has a space after typeof. Currently we don't support delete and void
3181
- const OPERATORS = "...,.,===,==,+,!==,!=,!,||,&&,>=,>,<=,<,?,-,*,/,%,typeof ,=>,=,;,in ,new ".split(",");
3187
+ const OPERATORS = "...,.,===,==,+,!==,!=,!,||,&&,>=,>,<=,<,?,-,*,/,%,typeof ,=>,=,;,in ,new ,|,&,^,~".split(",");
3182
3188
  let tokenizeString = function (expr) {
3183
3189
  let s = expr[0];
3184
3190
  let start = s;
@@ -4065,16 +4071,24 @@ class CodeGenerator {
4065
4071
  this.insertAnchor(block);
4066
4072
  }
4067
4073
  block = this.createBlock(block, "html", ctx);
4068
- this.helpers.add(ast.expr === "0" ? "zero" : "safeOutput");
4069
- let expr = ast.expr === "0" ? "ctx[zero]" : `safeOutput(${compileExpr(ast.expr)})`;
4070
- if (ast.body) {
4071
- const nextId = BlockDescription.nextBlockId;
4074
+ let blockStr;
4075
+ if (ast.expr === "0") {
4076
+ this.helpers.add("zero");
4077
+ blockStr = `ctx[zero]`;
4078
+ }
4079
+ else if (ast.body) {
4080
+ let bodyValue = null;
4081
+ bodyValue = BlockDescription.nextBlockId;
4072
4082
  const subCtx = createContext(ctx);
4073
4083
  this.compileAST({ type: 3 /* Multi */, content: ast.body }, subCtx);
4074
- this.helpers.add("withDefault");
4075
- expr = `withDefault(${expr}, b${nextId})`;
4084
+ this.helpers.add("safeOutput");
4085
+ blockStr = `safeOutput(${compileExpr(ast.expr)}, b${bodyValue})`;
4086
+ }
4087
+ else {
4088
+ this.helpers.add("safeOutput");
4089
+ blockStr = `safeOutput(${compileExpr(ast.expr)})`;
4076
4090
  }
4077
- this.insertBlock(`${expr}`, block, ctx);
4091
+ this.insertBlock(blockStr, block, ctx);
4078
4092
  }
4079
4093
  compileTIf(ast, ctx, nextNode) {
4080
4094
  let { block, forceNewBlock, index } = ctx;
@@ -4267,16 +4281,21 @@ class CodeGenerator {
4267
4281
  }
4268
4282
  compileTCall(ast, ctx) {
4269
4283
  let { block, forceNewBlock } = ctx;
4284
+ let ctxVar = ctx.ctxVar || "ctx";
4285
+ if (ast.context) {
4286
+ ctxVar = generateId("ctx");
4287
+ this.addLine(`let ${ctxVar} = ${compileExpr(ast.context)};`);
4288
+ }
4270
4289
  if (ast.body) {
4271
- this.addLine(`ctx = Object.create(ctx);`);
4272
- this.addLine(`ctx[isBoundary] = 1;`);
4290
+ this.addLine(`${ctxVar} = Object.create(${ctxVar});`);
4291
+ this.addLine(`${ctxVar}[isBoundary] = 1;`);
4273
4292
  this.helpers.add("isBoundary");
4274
4293
  const nextId = BlockDescription.nextBlockId;
4275
- const subCtx = createContext(ctx, { preventRoot: true });
4294
+ const subCtx = createContext(ctx, { preventRoot: true, ctxVar });
4276
4295
  this.compileAST({ type: 3 /* Multi */, content: ast.body }, subCtx);
4277
4296
  if (nextId !== BlockDescription.nextBlockId) {
4278
4297
  this.helpers.add("zero");
4279
- this.addLine(`ctx[zero] = b${nextId};`);
4298
+ this.addLine(`${ctxVar}[zero] = b${nextId};`);
4280
4299
  }
4281
4300
  }
4282
4301
  const isDynamic = INTERP_REGEXP.test(ast.name);
@@ -4294,7 +4313,7 @@ class CodeGenerator {
4294
4313
  }
4295
4314
  this.define(templateVar, subTemplate);
4296
4315
  block = this.createBlock(block, "multi", ctx);
4297
- this.insertBlock(`call(this, ${templateVar}, ctx, node, ${key})`, block, {
4316
+ this.insertBlock(`call(this, ${templateVar}, ${ctxVar}, node, ${key})`, block, {
4298
4317
  ...ctx,
4299
4318
  forceNewBlock: !block,
4300
4319
  });
@@ -4303,13 +4322,13 @@ class CodeGenerator {
4303
4322
  const id = generateId(`callTemplate_`);
4304
4323
  this.staticDefs.push({ id, expr: `app.getTemplate(${subTemplate})` });
4305
4324
  block = this.createBlock(block, "multi", ctx);
4306
- this.insertBlock(`${id}.call(this, ctx, node, ${key})`, block, {
4325
+ this.insertBlock(`${id}.call(this, ${ctxVar}, node, ${key})`, block, {
4307
4326
  ...ctx,
4308
4327
  forceNewBlock: !block,
4309
4328
  });
4310
4329
  }
4311
4330
  if (ast.body && !ctx.isLast) {
4312
- this.addLine(`ctx = ctx.__proto__;`);
4331
+ this.addLine(`${ctxVar} = ${ctxVar}.__proto__;`);
4313
4332
  }
4314
4333
  }
4315
4334
  compileTCallBlock(ast, ctx) {
@@ -4330,7 +4349,7 @@ class CodeGenerator {
4330
4349
  this.helpers.add("LazyValue");
4331
4350
  const bodyAst = { type: 3 /* Multi */, content: ast.body };
4332
4351
  const name = this.compileInNewTarget("value", bodyAst, ctx);
4333
- let value = `new LazyValue(${name}, ctx, node)`;
4352
+ let value = `new LazyValue(${name}, ctx, this, node)`;
4334
4353
  value = ast.value ? (value ? `withDefault(${expr}, ${value})` : expr) : value;
4335
4354
  this.addLine(`ctx[\`${ast.name}\`] = ${value};`);
4336
4355
  }
@@ -4348,7 +4367,7 @@ class CodeGenerator {
4348
4367
  value = expr;
4349
4368
  }
4350
4369
  this.helpers.add("setContextValue");
4351
- this.addLine(`setContextValue(ctx, "${ast.name}", ${value});`);
4370
+ this.addLine(`setContextValue(${ctx.ctxVar || "ctx"}, "${ast.name}", ${value});`);
4352
4371
  }
4353
4372
  }
4354
4373
  generateComponentKey() {
@@ -4470,7 +4489,7 @@ class CodeGenerator {
4470
4489
  id,
4471
4490
  expr: `app.createComponent(${ast.isDynamic ? null : expr}, ${!ast.isDynamic}, ${!!ast.slots}, ${!!ast.dynamicProps}, ${!ast.props && !ast.dynamicProps})`,
4472
4491
  });
4473
- let blockExpr = `${id}(${propString}, ${keyArg}, node, ctx, ${ast.isDynamic ? expr : null})`;
4492
+ let blockExpr = `${id}(${propString}, ${keyArg}, node, this, ${ast.isDynamic ? expr : null})`;
4474
4493
  if (ast.isDynamic) {
4475
4494
  blockExpr = `toggler(${expr}, ${blockExpr})`;
4476
4495
  }
@@ -4903,10 +4922,12 @@ function parseTCall(node, ctx) {
4903
4922
  return null;
4904
4923
  }
4905
4924
  const subTemplate = node.getAttribute("t-call");
4925
+ const context = node.getAttribute("t-call-context");
4906
4926
  node.removeAttribute("t-call");
4927
+ node.removeAttribute("t-call-context");
4907
4928
  if (node.tagName !== "t") {
4908
4929
  const ast = parseNode(node, ctx);
4909
- const tcall = { type: 7 /* TCall */, name: subTemplate, body: null };
4930
+ const tcall = { type: 7 /* TCall */, name: subTemplate, body: null, context };
4910
4931
  if (ast && ast.type === 2 /* DomNode */) {
4911
4932
  ast.content = [tcall];
4912
4933
  return ast;
@@ -4923,6 +4944,7 @@ function parseTCall(node, ctx) {
4923
4944
  type: 7 /* TCall */,
4924
4945
  name: subTemplate,
4925
4946
  body: body.length ? body : null,
4947
+ context,
4926
4948
  };
4927
4949
  }
4928
4950
  // -----------------------------------------------------------------------------
@@ -5526,8 +5548,7 @@ class App extends TemplateSet {
5526
5548
  return (props, key, ctx, parent, C) => {
5527
5549
  let children = ctx.children;
5528
5550
  let node = children[key];
5529
- if (node &&
5530
- (node.status === 2 /* DESTROYED */ || (isDynamic && node.component.constructor !== C))) {
5551
+ if (isDynamic && node && node.component.constructor !== C) {
5531
5552
  node = undefined;
5532
5553
  }
5533
5554
  const parentFiber = ctx.fiber;
@@ -5736,7 +5757,7 @@ exports.whenReady = whenReady;
5736
5757
  exports.xml = xml;
5737
5758
 
5738
5759
 
5739
- __info__.version = '2.0.0-beta-10';
5740
- __info__.date = '2022-06-22T08:33:26.205Z';
5741
- __info__.hash = '2e03332';
5760
+ __info__.version = '2.0.0-beta-11';
5761
+ __info__.date = '2022-06-28T13:28:26.775Z';
5762
+ __info__.hash = '76c389a';
5742
5763
  __info__.url = 'https://github.com/odoo/owl';
package/dist/owl.es.js CHANGED
@@ -167,6 +167,10 @@ function toClassObj(expr) {
167
167
  for (let key in expr) {
168
168
  const value = expr[key];
169
169
  if (value) {
170
+ key = trim.call(key);
171
+ if (!key) {
172
+ continue;
173
+ }
170
174
  const words = split.call(key, wordRegexp);
171
175
  for (let word of words) {
172
176
  result[word] = value;
@@ -1483,6 +1487,7 @@ function cancelFibers(fibers) {
1483
1487
  fiber.render = throwOnRender;
1484
1488
  if (node.status === 0 /* NEW */) {
1485
1489
  node.destroy();
1490
+ delete node.parent.children[node.parentKey];
1486
1491
  }
1487
1492
  node.fiber = null;
1488
1493
  if (fiber.bdom) {
@@ -2871,13 +2876,14 @@ function shallowEqual(l1, l2) {
2871
2876
  return true;
2872
2877
  }
2873
2878
  class LazyValue {
2874
- constructor(fn, ctx, node) {
2879
+ constructor(fn, ctx, component, node) {
2875
2880
  this.fn = fn;
2876
2881
  this.ctx = capture(ctx);
2882
+ this.component = component;
2877
2883
  this.node = node;
2878
2884
  }
2879
2885
  evaluate() {
2880
- return this.fn(this.ctx, this.node);
2886
+ return this.fn.call(this.component, this.ctx, this.node);
2881
2887
  }
2882
2888
  toString() {
2883
2889
  return this.evaluate().toString();
@@ -2886,9 +2892,9 @@ class LazyValue {
2886
2892
  /*
2887
2893
  * Safely outputs `value` as a block depending on the nature of `value`
2888
2894
  */
2889
- function safeOutput(value) {
2890
- if (!value) {
2891
- return value;
2895
+ function safeOutput(value, defaultValue) {
2896
+ if (value === undefined) {
2897
+ return defaultValue ? toggler("default", defaultValue) : toggler("undefined", text(""));
2892
2898
  }
2893
2899
  let safeKey;
2894
2900
  let block;
@@ -3174,7 +3180,7 @@ const STATIC_TOKEN_MAP = Object.assign(Object.create(null), {
3174
3180
  });
3175
3181
  // note that the space after typeof is relevant. It makes sure that the formatted
3176
3182
  // expression has a space after typeof. Currently we don't support delete and void
3177
- const OPERATORS = "...,.,===,==,+,!==,!=,!,||,&&,>=,>,<=,<,?,-,*,/,%,typeof ,=>,=,;,in ,new ".split(",");
3183
+ const OPERATORS = "...,.,===,==,+,!==,!=,!,||,&&,>=,>,<=,<,?,-,*,/,%,typeof ,=>,=,;,in ,new ,|,&,^,~".split(",");
3178
3184
  let tokenizeString = function (expr) {
3179
3185
  let s = expr[0];
3180
3186
  let start = s;
@@ -4061,16 +4067,24 @@ class CodeGenerator {
4061
4067
  this.insertAnchor(block);
4062
4068
  }
4063
4069
  block = this.createBlock(block, "html", ctx);
4064
- this.helpers.add(ast.expr === "0" ? "zero" : "safeOutput");
4065
- let expr = ast.expr === "0" ? "ctx[zero]" : `safeOutput(${compileExpr(ast.expr)})`;
4066
- if (ast.body) {
4067
- const nextId = BlockDescription.nextBlockId;
4070
+ let blockStr;
4071
+ if (ast.expr === "0") {
4072
+ this.helpers.add("zero");
4073
+ blockStr = `ctx[zero]`;
4074
+ }
4075
+ else if (ast.body) {
4076
+ let bodyValue = null;
4077
+ bodyValue = BlockDescription.nextBlockId;
4068
4078
  const subCtx = createContext(ctx);
4069
4079
  this.compileAST({ type: 3 /* Multi */, content: ast.body }, subCtx);
4070
- this.helpers.add("withDefault");
4071
- expr = `withDefault(${expr}, b${nextId})`;
4080
+ this.helpers.add("safeOutput");
4081
+ blockStr = `safeOutput(${compileExpr(ast.expr)}, b${bodyValue})`;
4082
+ }
4083
+ else {
4084
+ this.helpers.add("safeOutput");
4085
+ blockStr = `safeOutput(${compileExpr(ast.expr)})`;
4072
4086
  }
4073
- this.insertBlock(`${expr}`, block, ctx);
4087
+ this.insertBlock(blockStr, block, ctx);
4074
4088
  }
4075
4089
  compileTIf(ast, ctx, nextNode) {
4076
4090
  let { block, forceNewBlock, index } = ctx;
@@ -4263,16 +4277,21 @@ class CodeGenerator {
4263
4277
  }
4264
4278
  compileTCall(ast, ctx) {
4265
4279
  let { block, forceNewBlock } = ctx;
4280
+ let ctxVar = ctx.ctxVar || "ctx";
4281
+ if (ast.context) {
4282
+ ctxVar = generateId("ctx");
4283
+ this.addLine(`let ${ctxVar} = ${compileExpr(ast.context)};`);
4284
+ }
4266
4285
  if (ast.body) {
4267
- this.addLine(`ctx = Object.create(ctx);`);
4268
- this.addLine(`ctx[isBoundary] = 1;`);
4286
+ this.addLine(`${ctxVar} = Object.create(${ctxVar});`);
4287
+ this.addLine(`${ctxVar}[isBoundary] = 1;`);
4269
4288
  this.helpers.add("isBoundary");
4270
4289
  const nextId = BlockDescription.nextBlockId;
4271
- const subCtx = createContext(ctx, { preventRoot: true });
4290
+ const subCtx = createContext(ctx, { preventRoot: true, ctxVar });
4272
4291
  this.compileAST({ type: 3 /* Multi */, content: ast.body }, subCtx);
4273
4292
  if (nextId !== BlockDescription.nextBlockId) {
4274
4293
  this.helpers.add("zero");
4275
- this.addLine(`ctx[zero] = b${nextId};`);
4294
+ this.addLine(`${ctxVar}[zero] = b${nextId};`);
4276
4295
  }
4277
4296
  }
4278
4297
  const isDynamic = INTERP_REGEXP.test(ast.name);
@@ -4290,7 +4309,7 @@ class CodeGenerator {
4290
4309
  }
4291
4310
  this.define(templateVar, subTemplate);
4292
4311
  block = this.createBlock(block, "multi", ctx);
4293
- this.insertBlock(`call(this, ${templateVar}, ctx, node, ${key})`, block, {
4312
+ this.insertBlock(`call(this, ${templateVar}, ${ctxVar}, node, ${key})`, block, {
4294
4313
  ...ctx,
4295
4314
  forceNewBlock: !block,
4296
4315
  });
@@ -4299,13 +4318,13 @@ class CodeGenerator {
4299
4318
  const id = generateId(`callTemplate_`);
4300
4319
  this.staticDefs.push({ id, expr: `app.getTemplate(${subTemplate})` });
4301
4320
  block = this.createBlock(block, "multi", ctx);
4302
- this.insertBlock(`${id}.call(this, ctx, node, ${key})`, block, {
4321
+ this.insertBlock(`${id}.call(this, ${ctxVar}, node, ${key})`, block, {
4303
4322
  ...ctx,
4304
4323
  forceNewBlock: !block,
4305
4324
  });
4306
4325
  }
4307
4326
  if (ast.body && !ctx.isLast) {
4308
- this.addLine(`ctx = ctx.__proto__;`);
4327
+ this.addLine(`${ctxVar} = ${ctxVar}.__proto__;`);
4309
4328
  }
4310
4329
  }
4311
4330
  compileTCallBlock(ast, ctx) {
@@ -4326,7 +4345,7 @@ class CodeGenerator {
4326
4345
  this.helpers.add("LazyValue");
4327
4346
  const bodyAst = { type: 3 /* Multi */, content: ast.body };
4328
4347
  const name = this.compileInNewTarget("value", bodyAst, ctx);
4329
- let value = `new LazyValue(${name}, ctx, node)`;
4348
+ let value = `new LazyValue(${name}, ctx, this, node)`;
4330
4349
  value = ast.value ? (value ? `withDefault(${expr}, ${value})` : expr) : value;
4331
4350
  this.addLine(`ctx[\`${ast.name}\`] = ${value};`);
4332
4351
  }
@@ -4344,7 +4363,7 @@ class CodeGenerator {
4344
4363
  value = expr;
4345
4364
  }
4346
4365
  this.helpers.add("setContextValue");
4347
- this.addLine(`setContextValue(ctx, "${ast.name}", ${value});`);
4366
+ this.addLine(`setContextValue(${ctx.ctxVar || "ctx"}, "${ast.name}", ${value});`);
4348
4367
  }
4349
4368
  }
4350
4369
  generateComponentKey() {
@@ -4466,7 +4485,7 @@ class CodeGenerator {
4466
4485
  id,
4467
4486
  expr: `app.createComponent(${ast.isDynamic ? null : expr}, ${!ast.isDynamic}, ${!!ast.slots}, ${!!ast.dynamicProps}, ${!ast.props && !ast.dynamicProps})`,
4468
4487
  });
4469
- let blockExpr = `${id}(${propString}, ${keyArg}, node, ctx, ${ast.isDynamic ? expr : null})`;
4488
+ let blockExpr = `${id}(${propString}, ${keyArg}, node, this, ${ast.isDynamic ? expr : null})`;
4470
4489
  if (ast.isDynamic) {
4471
4490
  blockExpr = `toggler(${expr}, ${blockExpr})`;
4472
4491
  }
@@ -4899,10 +4918,12 @@ function parseTCall(node, ctx) {
4899
4918
  return null;
4900
4919
  }
4901
4920
  const subTemplate = node.getAttribute("t-call");
4921
+ const context = node.getAttribute("t-call-context");
4902
4922
  node.removeAttribute("t-call");
4923
+ node.removeAttribute("t-call-context");
4903
4924
  if (node.tagName !== "t") {
4904
4925
  const ast = parseNode(node, ctx);
4905
- const tcall = { type: 7 /* TCall */, name: subTemplate, body: null };
4926
+ const tcall = { type: 7 /* TCall */, name: subTemplate, body: null, context };
4906
4927
  if (ast && ast.type === 2 /* DomNode */) {
4907
4928
  ast.content = [tcall];
4908
4929
  return ast;
@@ -4919,6 +4940,7 @@ function parseTCall(node, ctx) {
4919
4940
  type: 7 /* TCall */,
4920
4941
  name: subTemplate,
4921
4942
  body: body.length ? body : null,
4943
+ context,
4922
4944
  };
4923
4945
  }
4924
4946
  // -----------------------------------------------------------------------------
@@ -5522,8 +5544,7 @@ class App extends TemplateSet {
5522
5544
  return (props, key, ctx, parent, C) => {
5523
5545
  let children = ctx.children;
5524
5546
  let node = children[key];
5525
- if (node &&
5526
- (node.status === 2 /* DESTROYED */ || (isDynamic && node.component.constructor !== C))) {
5547
+ if (isDynamic && node && node.component.constructor !== C) {
5527
5548
  node = undefined;
5528
5549
  }
5529
5550
  const parentFiber = ctx.fiber;
@@ -5700,7 +5721,7 @@ TemplateSet.prototype._compileTemplate = function _compileTemplate(name, templat
5700
5721
  export { App, Component, EventBus, __info__, blockDom, loadFile, markRaw, markup, mount, onError, onMounted, onPatched, onRendered, onWillDestroy, onWillPatch, onWillRender, onWillStart, onWillUnmount, onWillUpdateProps, reactive, status, toRaw, useChildSubEnv, useComponent, useEffect, useEnv, useExternalListener, useRef, useState, useSubEnv, validate, whenReady, xml };
5701
5722
 
5702
5723
 
5703
- __info__.version = '2.0.0-beta-10';
5704
- __info__.date = '2022-06-22T08:33:26.205Z';
5705
- __info__.hash = '2e03332';
5724
+ __info__.version = '2.0.0-beta-11';
5725
+ __info__.date = '2022-06-28T13:28:26.775Z';
5726
+ __info__.hash = '76c389a';
5706
5727
  __info__.url = 'https://github.com/odoo/owl';
package/dist/owl.iife.js CHANGED
@@ -170,6 +170,10 @@
170
170
  for (let key in expr) {
171
171
  const value = expr[key];
172
172
  if (value) {
173
+ key = trim.call(key);
174
+ if (!key) {
175
+ continue;
176
+ }
173
177
  const words = split.call(key, wordRegexp);
174
178
  for (let word of words) {
175
179
  result[word] = value;
@@ -1486,6 +1490,7 @@
1486
1490
  fiber.render = throwOnRender;
1487
1491
  if (node.status === 0 /* NEW */) {
1488
1492
  node.destroy();
1493
+ delete node.parent.children[node.parentKey];
1489
1494
  }
1490
1495
  node.fiber = null;
1491
1496
  if (fiber.bdom) {
@@ -2874,13 +2879,14 @@
2874
2879
  return true;
2875
2880
  }
2876
2881
  class LazyValue {
2877
- constructor(fn, ctx, node) {
2882
+ constructor(fn, ctx, component, node) {
2878
2883
  this.fn = fn;
2879
2884
  this.ctx = capture(ctx);
2885
+ this.component = component;
2880
2886
  this.node = node;
2881
2887
  }
2882
2888
  evaluate() {
2883
- return this.fn(this.ctx, this.node);
2889
+ return this.fn.call(this.component, this.ctx, this.node);
2884
2890
  }
2885
2891
  toString() {
2886
2892
  return this.evaluate().toString();
@@ -2889,9 +2895,9 @@
2889
2895
  /*
2890
2896
  * Safely outputs `value` as a block depending on the nature of `value`
2891
2897
  */
2892
- function safeOutput(value) {
2893
- if (!value) {
2894
- return value;
2898
+ function safeOutput(value, defaultValue) {
2899
+ if (value === undefined) {
2900
+ return defaultValue ? toggler("default", defaultValue) : toggler("undefined", text(""));
2895
2901
  }
2896
2902
  let safeKey;
2897
2903
  let block;
@@ -3177,7 +3183,7 @@
3177
3183
  });
3178
3184
  // note that the space after typeof is relevant. It makes sure that the formatted
3179
3185
  // expression has a space after typeof. Currently we don't support delete and void
3180
- const OPERATORS = "...,.,===,==,+,!==,!=,!,||,&&,>=,>,<=,<,?,-,*,/,%,typeof ,=>,=,;,in ,new ".split(",");
3186
+ const OPERATORS = "...,.,===,==,+,!==,!=,!,||,&&,>=,>,<=,<,?,-,*,/,%,typeof ,=>,=,;,in ,new ,|,&,^,~".split(",");
3181
3187
  let tokenizeString = function (expr) {
3182
3188
  let s = expr[0];
3183
3189
  let start = s;
@@ -4064,16 +4070,24 @@
4064
4070
  this.insertAnchor(block);
4065
4071
  }
4066
4072
  block = this.createBlock(block, "html", ctx);
4067
- this.helpers.add(ast.expr === "0" ? "zero" : "safeOutput");
4068
- let expr = ast.expr === "0" ? "ctx[zero]" : `safeOutput(${compileExpr(ast.expr)})`;
4069
- if (ast.body) {
4070
- const nextId = BlockDescription.nextBlockId;
4073
+ let blockStr;
4074
+ if (ast.expr === "0") {
4075
+ this.helpers.add("zero");
4076
+ blockStr = `ctx[zero]`;
4077
+ }
4078
+ else if (ast.body) {
4079
+ let bodyValue = null;
4080
+ bodyValue = BlockDescription.nextBlockId;
4071
4081
  const subCtx = createContext(ctx);
4072
4082
  this.compileAST({ type: 3 /* Multi */, content: ast.body }, subCtx);
4073
- this.helpers.add("withDefault");
4074
- expr = `withDefault(${expr}, b${nextId})`;
4083
+ this.helpers.add("safeOutput");
4084
+ blockStr = `safeOutput(${compileExpr(ast.expr)}, b${bodyValue})`;
4085
+ }
4086
+ else {
4087
+ this.helpers.add("safeOutput");
4088
+ blockStr = `safeOutput(${compileExpr(ast.expr)})`;
4075
4089
  }
4076
- this.insertBlock(`${expr}`, block, ctx);
4090
+ this.insertBlock(blockStr, block, ctx);
4077
4091
  }
4078
4092
  compileTIf(ast, ctx, nextNode) {
4079
4093
  let { block, forceNewBlock, index } = ctx;
@@ -4266,16 +4280,21 @@
4266
4280
  }
4267
4281
  compileTCall(ast, ctx) {
4268
4282
  let { block, forceNewBlock } = ctx;
4283
+ let ctxVar = ctx.ctxVar || "ctx";
4284
+ if (ast.context) {
4285
+ ctxVar = generateId("ctx");
4286
+ this.addLine(`let ${ctxVar} = ${compileExpr(ast.context)};`);
4287
+ }
4269
4288
  if (ast.body) {
4270
- this.addLine(`ctx = Object.create(ctx);`);
4271
- this.addLine(`ctx[isBoundary] = 1;`);
4289
+ this.addLine(`${ctxVar} = Object.create(${ctxVar});`);
4290
+ this.addLine(`${ctxVar}[isBoundary] = 1;`);
4272
4291
  this.helpers.add("isBoundary");
4273
4292
  const nextId = BlockDescription.nextBlockId;
4274
- const subCtx = createContext(ctx, { preventRoot: true });
4293
+ const subCtx = createContext(ctx, { preventRoot: true, ctxVar });
4275
4294
  this.compileAST({ type: 3 /* Multi */, content: ast.body }, subCtx);
4276
4295
  if (nextId !== BlockDescription.nextBlockId) {
4277
4296
  this.helpers.add("zero");
4278
- this.addLine(`ctx[zero] = b${nextId};`);
4297
+ this.addLine(`${ctxVar}[zero] = b${nextId};`);
4279
4298
  }
4280
4299
  }
4281
4300
  const isDynamic = INTERP_REGEXP.test(ast.name);
@@ -4293,7 +4312,7 @@
4293
4312
  }
4294
4313
  this.define(templateVar, subTemplate);
4295
4314
  block = this.createBlock(block, "multi", ctx);
4296
- this.insertBlock(`call(this, ${templateVar}, ctx, node, ${key})`, block, {
4315
+ this.insertBlock(`call(this, ${templateVar}, ${ctxVar}, node, ${key})`, block, {
4297
4316
  ...ctx,
4298
4317
  forceNewBlock: !block,
4299
4318
  });
@@ -4302,13 +4321,13 @@
4302
4321
  const id = generateId(`callTemplate_`);
4303
4322
  this.staticDefs.push({ id, expr: `app.getTemplate(${subTemplate})` });
4304
4323
  block = this.createBlock(block, "multi", ctx);
4305
- this.insertBlock(`${id}.call(this, ctx, node, ${key})`, block, {
4324
+ this.insertBlock(`${id}.call(this, ${ctxVar}, node, ${key})`, block, {
4306
4325
  ...ctx,
4307
4326
  forceNewBlock: !block,
4308
4327
  });
4309
4328
  }
4310
4329
  if (ast.body && !ctx.isLast) {
4311
- this.addLine(`ctx = ctx.__proto__;`);
4330
+ this.addLine(`${ctxVar} = ${ctxVar}.__proto__;`);
4312
4331
  }
4313
4332
  }
4314
4333
  compileTCallBlock(ast, ctx) {
@@ -4329,7 +4348,7 @@
4329
4348
  this.helpers.add("LazyValue");
4330
4349
  const bodyAst = { type: 3 /* Multi */, content: ast.body };
4331
4350
  const name = this.compileInNewTarget("value", bodyAst, ctx);
4332
- let value = `new LazyValue(${name}, ctx, node)`;
4351
+ let value = `new LazyValue(${name}, ctx, this, node)`;
4333
4352
  value = ast.value ? (value ? `withDefault(${expr}, ${value})` : expr) : value;
4334
4353
  this.addLine(`ctx[\`${ast.name}\`] = ${value};`);
4335
4354
  }
@@ -4347,7 +4366,7 @@
4347
4366
  value = expr;
4348
4367
  }
4349
4368
  this.helpers.add("setContextValue");
4350
- this.addLine(`setContextValue(ctx, "${ast.name}", ${value});`);
4369
+ this.addLine(`setContextValue(${ctx.ctxVar || "ctx"}, "${ast.name}", ${value});`);
4351
4370
  }
4352
4371
  }
4353
4372
  generateComponentKey() {
@@ -4469,7 +4488,7 @@
4469
4488
  id,
4470
4489
  expr: `app.createComponent(${ast.isDynamic ? null : expr}, ${!ast.isDynamic}, ${!!ast.slots}, ${!!ast.dynamicProps}, ${!ast.props && !ast.dynamicProps})`,
4471
4490
  });
4472
- let blockExpr = `${id}(${propString}, ${keyArg}, node, ctx, ${ast.isDynamic ? expr : null})`;
4491
+ let blockExpr = `${id}(${propString}, ${keyArg}, node, this, ${ast.isDynamic ? expr : null})`;
4473
4492
  if (ast.isDynamic) {
4474
4493
  blockExpr = `toggler(${expr}, ${blockExpr})`;
4475
4494
  }
@@ -4902,10 +4921,12 @@
4902
4921
  return null;
4903
4922
  }
4904
4923
  const subTemplate = node.getAttribute("t-call");
4924
+ const context = node.getAttribute("t-call-context");
4905
4925
  node.removeAttribute("t-call");
4926
+ node.removeAttribute("t-call-context");
4906
4927
  if (node.tagName !== "t") {
4907
4928
  const ast = parseNode(node, ctx);
4908
- const tcall = { type: 7 /* TCall */, name: subTemplate, body: null };
4929
+ const tcall = { type: 7 /* TCall */, name: subTemplate, body: null, context };
4909
4930
  if (ast && ast.type === 2 /* DomNode */) {
4910
4931
  ast.content = [tcall];
4911
4932
  return ast;
@@ -4922,6 +4943,7 @@
4922
4943
  type: 7 /* TCall */,
4923
4944
  name: subTemplate,
4924
4945
  body: body.length ? body : null,
4946
+ context,
4925
4947
  };
4926
4948
  }
4927
4949
  // -----------------------------------------------------------------------------
@@ -5525,8 +5547,7 @@ See https://github.com/odoo/owl/blob/${hash}/doc/reference/app.md#configuration
5525
5547
  return (props, key, ctx, parent, C) => {
5526
5548
  let children = ctx.children;
5527
5549
  let node = children[key];
5528
- if (node &&
5529
- (node.status === 2 /* DESTROYED */ || (isDynamic && node.component.constructor !== C))) {
5550
+ if (isDynamic && node && node.component.constructor !== C) {
5530
5551
  node = undefined;
5531
5552
  }
5532
5553
  const parentFiber = ctx.fiber;
@@ -5737,9 +5758,9 @@ See https://github.com/odoo/owl/blob/${hash}/doc/reference/app.md#configuration
5737
5758
  Object.defineProperty(exports, '__esModule', { value: true });
5738
5759
 
5739
5760
 
5740
- __info__.version = '2.0.0-beta-10';
5741
- __info__.date = '2022-06-22T08:33:26.205Z';
5742
- __info__.hash = '2e03332';
5761
+ __info__.version = '2.0.0-beta-11';
5762
+ __info__.date = '2022-06-28T13:28:26.775Z';
5763
+ __info__.hash = '76c389a';
5743
5764
  __info__.url = 'https://github.com/odoo/owl';
5744
5765
 
5745
5766
 
@@ -1 +1 @@
1
- !function(t){"use strict";function e(t){t=t.slice();const e=[];let n;for(;(n=t[0])&&"string"==typeof n;)e.push(t.shift());return{modifiers:e,data:t}}const n={shouldNormalizeDom:!0,mainEventHandler:(t,n,o)=>("function"==typeof t?t(n):Array.isArray(t)&&(t=e(t).data)[0](t[1],n),!1)};class o{constructor(t,e){this.key=t,this.child=e}mount(t,e){this.parentEl=t,this.child.mount(t,e)}moveBefore(t,e){this.child.moveBefore(t?t.child:null,e)}patch(t,e){if(this===t)return;let n=this.child,o=t.child;this.key===t.key?n.patch(o,e):(o.mount(this.parentEl,n.firstNode()),e&&n.beforeRemove(),n.remove(),this.child=o,this.key=t.key)}beforeRemove(){this.child.beforeRemove()}remove(){this.child.remove()}firstNode(){return this.child.firstNode()}toString(){return this.child.toString()}}function r(t,e){return new o(t,e)}const{setAttribute:i,removeAttribute:s}=Element.prototype,l=DOMTokenList.prototype,a=l.add,c=l.remove,h=Array.isArray,{split:u,trim:d}=String.prototype,f=/\s+/;function p(t,e){switch(e){case!1:case void 0:s.call(this,t);break;case!0:i.call(this,t,"");break;default:i.call(this,t,e)}}function m(t){return function(e){p.call(this,t,e)}}function b(t){if(h(t))p.call(this,t[0],t[1]);else for(let e in t)p.call(this,e,t[e])}function g(t,e){if(h(t)){const n=t[0],o=t[1];if(n===e[0]){if(o===e[1])return;p.call(this,n,o)}else s.call(this,e[0]),p.call(this,n,o)}else{for(let n in e)n in t||s.call(this,n);for(let n in t){const o=t[n];o!==e[n]&&p.call(this,n,o)}}}function y(t){const e={};switch(typeof t){case"string":const n=d.call(t);if(!n)return{};let o=u.call(n,f);for(let t=0,n=o.length;t<n;t++)e[o[t]]=!0;return e;case"object":for(let n in t){const o=t[n];if(o){const t=u.call(n,f);for(let n of t)e[n]=o}}return e;case"undefined":return{};case"number":return{[t]:!0};default:return{[t]:!0}}}function v(t){t=""===t?{}:y(t);const e=this.classList;for(let n in t)a.call(e,n)}function w(t,e){e=""===e?{}:y(e),t=""===t?{}:y(t);const n=this.classList;for(let o in e)o in t||c.call(n,o);for(let o in t)o in e||a.call(n,o)}function x(t){return function(e){this[t]=0===e?0:e||""}}function k(t,e){switch(t){case"input":return"checked"===e||"indeterminate"===e||"value"===e||"readonly"===e||"disabled"===e;case"option":return"selected"===e||"disabled"===e;case"textarea":return"value"===e||"readonly"===e||"disabled"===e;case"select":return"value"===e||"disabled"===e;case"button":case"optgroup":return"disabled"===e}return!1}function $(t){const e=t.split(".")[0],o=t.includes(".capture");return t.includes(".synthetic")?function(t,e=!1){let o="__event__synthetic_"+t;e&&(o+="_capture");!function(t,e,o=!1){if(A[e])return;document.addEventListener(t,(t=>function(t,e){let o=e.target;for(;null!==o;){const r=o[t];if(r)for(const t of Object.values(r)){if(n.mainEventHandler(t,e,o))return}o=o.parentNode}}(e,t)),{capture:o}),A[e]=!0}(t,o,e);const r=E++;function i(t){const e=this[o]||{};e[r]=t,this[o]=e}function s(){delete this[o]}return{setup:i,update:i,remove:s}}(e,o):function(t,e=!1){let o=`__event__${t}_${N++}`;e&&(o+="_capture");function r(t){const e=t.currentTarget;if(!e||!document.contains(e))return;const r=e[o];r&&n.mainEventHandler(r,t,e)}function i(n){this[o]=n,this.addEventListener(t,r,{capture:e})}function s(){delete this[o],this.removeEventListener(t,r,{capture:e})}function l(t){this[o]=t}return{setup:i,update:l,remove:s}}(e,o)}let N=1;let E=1;const A={};const T=Node.prototype,_=T.insertBefore,S=(C=T,D="textContent",Object.getOwnPropertyDescriptor(C,D)).set;var C,D;const L=T.removeChild;class B{constructor(t){this.children=t}mount(t,e){const n=this.children,o=n.length,r=new Array(o);for(let i=0;i<o;i++){let o=n[i];if(o)o.mount(t,e);else{const n=document.createTextNode("");r[i]=n,_.call(t,n,e)}}this.anchors=r,this.parentEl=t}moveBefore(t,e){if(t){const n=t.children[0];e=(n?n.firstNode():t.anchors[0])||null}const n=this.children,o=this.parentEl,r=this.anchors;for(let t=0,i=n.length;t<i;t++){let i=n[t];if(i)i.moveBefore(null,e);else{const n=r[t];_.call(o,n,e)}}}patch(t,e){if(this===t)return;const n=this.children,o=t.children,r=this.anchors,i=this.parentEl;for(let t=0,s=n.length;t<s;t++){const s=n[t],l=o[t];if(s)if(l)s.patch(l,e);else{const o=s.firstNode(),l=document.createTextNode("");r[t]=l,_.call(i,l,o),e&&s.beforeRemove(),s.remove(),n[t]=void 0}else if(l){n[t]=l;const e=r[t];l.mount(i,e),L.call(i,e)}}}beforeRemove(){const t=this.children;for(let e=0,n=t.length;e<n;e++){const n=t[e];n&&n.beforeRemove()}}remove(){const t=this.parentEl;if(this.isOnlyChild)S.call(t,"");else{const e=this.children,n=this.anchors;for(let o=0,r=e.length;o<r;o++){const r=e[o];r?r.remove():L.call(t,n[o])}}}firstNode(){const t=this.children[0];return t?t.firstNode():this.anchors[0]}toString(){return this.children.map((t=>t?t.toString():"")).join("")}}function R(t){return new B(t)}const O=Node.prototype,P=CharacterData.prototype,I=O.insertBefore,j=((t,e)=>Object.getOwnPropertyDescriptor(t,e))(P,"data").set,M=O.removeChild;class W{constructor(t){this.text=t}mountNode(t,e,n){this.parentEl=e,I.call(e,t,n),this.el=t}moveBefore(t,e){const n=t?t.el:e;I.call(this.parentEl,this.el,n)}beforeRemove(){}remove(){M.call(this.parentEl,this.el)}firstNode(){return this.el}toString(){return this.text}}class F extends W{mount(t,e){this.mountNode(document.createTextNode(H(this.text)),t,e)}patch(t){const e=t.text;this.text!==e&&(j.call(this.el,H(e)),this.text=e)}}class V extends W{mount(t,e){this.mountNode(document.createComment(H(this.text)),t,e)}patch(){}}function z(t){return new F(t)}function K(t){return new V(t)}function H(t){switch(typeof t){case"string":return t;case"number":return String(t);case"boolean":return t?"true":"false";default:return t||""}}const U=(t,e)=>Object.getOwnPropertyDescriptor(t,e),q=Node.prototype,G=Element.prototype,X=U(CharacterData.prototype,"data").set,Y=U(q,"firstChild").get,Z=U(q,"nextSibling").get,J=()=>{},Q={};function tt(t){if(t in Q)return Q[t];const e=(new DOMParser).parseFromString(`<t>${t}</t>`,"text/xml").firstChild.firstChild;n.shouldNormalizeDom&&et(e);const o=nt(e),r=it(o),i=function(t,e){let n=function(t,e){const{refN:n,collectors:o,children:r}=e,i=o.length;e.locations.sort(((t,e)=>t.idx-e.idx));const s=e.locations.map((t=>({refIdx:t.refIdx,setData:t.setData,updateData:t.updateData}))),l=s.length,a=r.length,c=r,h=n>0,u=q.cloneNode,d=q.insertBefore,f=G.remove;class p{constructor(t){this.data=t}beforeRemove(){}remove(){f.call(this.el)}firstNode(){return this.el}moveBefore(t,e){const n=t?t.el:e;d.call(this.parentEl,this.el,n)}toString(){const t=document.createElement("div");return this.mount(t,null),t.innerHTML}mount(e,n){const o=u.call(t,!0);d.call(e,o,n),this.el=o,this.parentEl=e}patch(t,e){}}h&&(p.prototype.mount=function(e,r){const h=u.call(t,!0),f=new Array(n);this.refs=f,f[0]=h;for(let t=0;t<i;t++){const e=o[t];f[e.idx]=e.getVal.call(f[e.prevIdx])}if(l){const t=this.data;for(let e=0;e<l;e++){const n=s[e];n.setData.call(f[n.refIdx],t[e])}}if(d.call(e,h,r),a){const t=this.children;for(let e=0;e<a;e++){const n=t[e];if(n){const t=c[e],o=t.afterRefIdx?f[t.afterRefIdx]:null;n.isOnlyChild=t.isOnlyChild,n.mount(f[t.parentRefIdx],o)}}}this.el=h,this.parentEl=e},p.prototype.patch=function(t,e){if(this===t)return;const n=this.refs;if(l){const e=this.data,o=t.data;for(let t=0;t<l;t++){const r=e[t],i=o[t];if(r!==i){const e=s[t];e.updateData.call(n[e.refIdx],i,r)}}this.data=o}if(a){let o=this.children;const r=t.children;for(let t=0;t<a;t++){const i=o[t],s=r[t];if(i)s?i.patch(s,e):(e&&i.beforeRemove(),i.remove(),o[t]=void 0);else if(s){const e=c[t],r=e.afterRefIdx?n[e.afterRefIdx]:null;s.mount(n[e.parentRefIdx],r),o[t]=s}}}});return p}(t,e);if(e.cbRefs.length){const t=e.cbRefs,o=e.refList;let r=t.length;n=class extends n{mount(t,e){o.push(new Array(r)),super.mount(t,e);for(let t of o.pop())t()}remove(){super.remove();for(let e of t){(0,this.data[e])(null)}}}}if(e.children.length)return n=class extends n{constructor(t,e){super(t),this.children=e}},n.prototype.beforeRemove=B.prototype.beforeRemove,(t,e=[])=>new n(t,e);return t=>new n(t)}(o.el,r);return Q[t]=i,i}function et(t){if(t.nodeType!==Node.TEXT_NODE||/\S/.test(t.textContent)){if(t.nodeType!==Node.ELEMENT_NODE||"pre"!==t.tagName)for(let e=t.childNodes.length-1;e>=0;--e)et(t.childNodes.item(e))}else t.remove()}function nt(t,e=null,n=null){switch(t.nodeType){case Node.ELEMENT_NODE:{let o=n&&n.currentNS;const r=t.tagName;let i=void 0;const s=[];if(r.startsWith("block-text-")){const t=parseInt(r.slice(11),10);s.push({type:"text",idx:t}),i=document.createTextNode("")}if(r.startsWith("block-child-")){n.isRef||ot(n);const t=parseInt(r.slice(12),10);s.push({type:"child",idx:t}),i=document.createTextNode("")}const l=t.attributes,a=l.getNamedItem("block-ns");if(a&&(l.removeNamedItem("block-ns"),o=a.value),i||(i=o?document.createElementNS(o,r):document.createElement(r)),i instanceof Element)for(let t=0;t<l.length;t++){const e=l[t].name,n=l[t].value;if(e.startsWith("block-handler-")){const t=parseInt(e.slice(14),10);s.push({type:"handler",idx:t,event:n})}else if(e.startsWith("block-attribute-")){const t=parseInt(e.slice(16),10);s.push({type:"attribute",idx:t,name:n,tag:r})}else"block-attributes"===e?s.push({type:"attributes",idx:parseInt(n,10)}):"block-ref"===e?s.push({type:"ref",idx:parseInt(n,10)}):i.setAttribute(l[t].name,n)}const c={parent:e,firstChild:null,nextSibling:null,el:i,info:s,refN:0,currentNS:o};if(t.firstChild){const e=t.childNodes[0];if(1===t.childNodes.length&&e.nodeType===Node.ELEMENT_NODE&&e.tagName.startsWith("block-child-")){const t=e.tagName,n=parseInt(t.slice(12),10);s.push({idx:n,type:"child",isOnlyChild:!0})}else{c.firstChild=nt(t.firstChild,c,c),i.appendChild(c.firstChild.el);let e=t.firstChild,n=c.firstChild;for(;e=e.nextSibling;)n.nextSibling=nt(e,n,c),i.appendChild(n.nextSibling.el),n=n.nextSibling}}return c.info.length&&ot(c),c}case Node.TEXT_NODE:case Node.COMMENT_NODE:return{parent:e,firstChild:null,nextSibling:null,el:t.nodeType===Node.TEXT_NODE?document.createTextNode(t.textContent):document.createComment(t.textContent),info:[],refN:0,currentNS:null}}throw new Error("boom")}function ot(t){t.isRef=!0;do{t.refN++}while(t=t.parent)}function rt(t){let e=t.parent;for(;e&&e.nextSibling===t;)t=e,e=e.parent;return e}function it(t,e,n){if(!e){e={collectors:[],locations:[],children:new Array(t.info.filter((t=>"child"===t.type)).length),cbRefs:[],refN:t.refN,refList:[]},n=0}if(t.refN){const o=n,r=t.isRef,i=t.firstChild?t.firstChild.refN:0,s=t.nextSibling?t.nextSibling.refN:0;if(r){for(let e of t.info)e.refIdx=o;t.refIdx=o,function(t,e){for(let n of e.info)switch(n.type){case"text":t.locations.push({idx:n.idx,refIdx:n.refIdx,setData:st,updateData:st});break;case"child":n.isOnlyChild?t.children[n.idx]={parentRefIdx:n.refIdx,isOnlyChild:!0}:t.children[n.idx]={parentRefIdx:rt(e).refIdx,afterRefIdx:n.refIdx};break;case"attribute":{const e=n.refIdx;let o,r;if(k(n.tag,n.name)){const t=x(n.name);r=t,o=t}else"class"===n.name?(r=v,o=w):(r=m(n.name),o=r);t.locations.push({idx:n.idx,refIdx:e,setData:r,updateData:o});break}case"attributes":t.locations.push({idx:n.idx,refIdx:n.refIdx,setData:b,updateData:g});break;case"handler":{const{setup:e,update:o}=$(n.event);t.locations.push({idx:n.idx,refIdx:n.refIdx,setData:e,updateData:o});break}case"ref":const o=t.cbRefs.push(n.idx)-1;t.locations.push({idx:n.idx,refIdx:n.refIdx,setData:lt(o,t.refList),updateData:J})}}(e,t),n++}if(s){const r=n+i;e.collectors.push({idx:r,prevIdx:o,getVal:Z}),it(t.nextSibling,e,r)}i&&(e.collectors.push({idx:n,prevIdx:o,getVal:Y}),it(t.firstChild,e,n))}return e}function st(t){X.call(this,H(t))}function lt(t,e){return function(n){e[e.length-1][t]=()=>n(this)}}const at=Node.prototype,ct=at.insertBefore,ht=at.appendChild,ut=at.removeChild,dt=((t,e)=>Object.getOwnPropertyDescriptor(t,e))(at,"textContent").set;class ft{constructor(t){this.children=t}mount(t,e){const n=this.children,o=document.createTextNode("");this.anchor=o,ct.call(t,o,e);const r=n.length;if(r){const e=n[0].mount;for(let i=0;i<r;i++)e.call(n[i],t,o)}this.parentEl=t}moveBefore(t,e){if(t){const n=t.children[0];e=(n?n.firstNode():t.anchor)||null}const n=this.children;for(let t=0,o=n.length;t<o;t++)n[t].moveBefore(null,e);this.parentEl.insertBefore(this.anchor,e)}patch(t,e){if(this===t)return;const n=this.children,o=t.children;if(0===o.length&&0===n.length)return;this.children=o;const r=o[0]||n[0],{mount:i,patch:s,remove:l,beforeRemove:a,moveBefore:c,firstNode:h}=r,u=this.anchor,d=this.isOnlyChild,f=this.parentEl;if(0===o.length&&d){if(e)for(let t=0,e=n.length;t<e;t++)a.call(n[t]);return dt.call(f,""),void ht.call(f,u)}let p=0,m=0,b=n[0],g=o[0],y=n.length-1,v=o.length-1,w=n[y],x=o[v],k=void 0;for(;p<=y&&m<=v;){if(null===b){b=n[++p];continue}if(null===w){w=n[--y];continue}let t=b.key,r=g.key;if(t===r){s.call(b,g,e),o[m]=b,b=n[++p],g=o[++m];continue}let l=w.key,a=x.key;if(l===a){s.call(w,x,e),o[v]=w,w=n[--y],x=o[--v];continue}if(t===a){s.call(b,x,e),o[v]=b;const t=o[v+1];c.call(b,t,u),b=n[++p],x=o[--v];continue}if(l===r){s.call(w,g,e),o[m]=w;const t=n[p];c.call(w,t,u),w=n[--y],g=o[++m];continue}k=k||mt(n,p,y);let d=k[r];if(void 0===d)i.call(g,f,h.call(b)||null);else{const t=n[d];c.call(t,b,null),s.call(t,g,e),o[m]=t,n[d]=null}g=o[++m]}if(p<=y||m<=v)if(p>y){const t=o[v+1],e=t?h.call(t)||null:u;for(let t=m;t<=v;t++)i.call(o[t],f,e)}else for(let t=p;t<=y;t++){let o=n[t];o&&(e&&a.call(o),l.call(o))}}beforeRemove(){const t=this.children,e=t.length;if(e){const n=t[0].beforeRemove;for(let o=0;o<e;o++)n.call(t[o])}}remove(){const{parentEl:t,anchor:e}=this;if(this.isOnlyChild)dt.call(t,"");else{const n=this.children,o=n.length;if(o){const t=n[0].remove;for(let e=0;e<o;e++)t.call(n[e])}ut.call(t,e)}}firstNode(){const t=this.children[0];return t?t.firstNode():void 0}toString(){return this.children.map((t=>t.toString())).join("")}}function pt(t){return new ft(t)}function mt(t,e,n){let o={};for(let r=e;r<=n;r++)o[t[r].key]=r;return o}const bt=Node.prototype,gt=bt.insertBefore,yt=bt.removeChild;class vt{constructor(t){this.content=[],this.html=t}mount(t,e){this.parentEl=t;const n=document.createElement("template");n.innerHTML=this.html,this.content=[...n.content.childNodes];for(let n of this.content)gt.call(t,n,e);if(!this.content.length){const n=document.createTextNode("");this.content.push(n),gt.call(t,n,e)}}moveBefore(t,e){const n=t?t.content[0]:e,o=this.parentEl;for(let t of this.content)gt.call(o,t,n)}patch(t){if(this===t)return;const e=t.html;if(this.html!==e){const n=this.parentEl,o=this.content[0],r=document.createElement("template");r.innerHTML=e;const i=[...r.content.childNodes];for(let t of i)gt.call(n,t,o);if(!i.length){const t=document.createTextNode("");i.push(t),gt.call(n,t,o)}this.remove(),this.content=i,this.html=t.html}}beforeRemove(){}remove(){const t=this.parentEl;for(let e of this.content)yt.call(t,e)}firstNode(){return this.content[0]}toString(){return this.html}}function wt(t){return new vt(t)}function xt(t,e,n=null){t.mount(e,n)}const kt=new WeakMap,$t=new WeakMap;function Nt(t,e){if(!t)return!1;const n=t.fiber;n&&kt.set(n,e);const o=$t.get(t);if(o){let t=!1;for(let n=o.length-1;n>=0;n--)try{o[n](e),t=!0;break}catch(t){e=t}if(t)return!0}return Nt(t.parent,e)}function Et(t){const e=t.error,n="node"in t?t.node:t.fiber.node,o="fiber"in t?t.fiber:n.fiber;let r=o;do{r.node.fiber=r,r=r.parent}while(r);kt.set(o.root,e);if(!Nt(n,e)){console.warn("[Owl] Unhandled error. Destroying the root component");try{n.app.destroy()}catch(t){console.error(t)}}}function At(){throw new Error("Attempted to render cancelled fiber")}function Tt(t){let e=0;for(let n of t){let t=n.node;n.render=At,0===t.status&&t.destroy(),t.fiber=null,n.bdom?t.forceNextRender=!0:e++,e+=Tt(n.children)}return e}class _t{constructor(t,e){if(this.bdom=null,this.children=[],this.appliedToDom=!1,this.deep=!1,this.childrenMap={},this.node=t,this.parent=e,e){this.deep=e.deep;const t=e.root;t.setCounter(t.counter+1),this.root=t,e.children.push(this)}else this.root=this}render(){let t=this.root.node,e=t.app.scheduler,n=t.parent;for(;n;){if(n.fiber){let o=n.fiber.root;if(0!==o.counter||!(t.parentKey in n.fiber.childrenMap))return void e.delayedRenders.push(this);n=o.node}t=n,n=n.parent}this._render()}_render(){const t=this.node,e=this.root;if(e){try{this.bdom=!0,this.bdom=t.renderFn()}catch(e){Et({node:t,error:e})}e.setCounter(e.counter-1)}}}class St extends _t{constructor(){super(...arguments),this.counter=1,this.willPatch=[],this.patched=[],this.mounted=[],this.locked=!1}complete(){const t=this.node;this.locked=!0;let e=void 0;try{for(e of this.willPatch){let t=e.node;if(t.fiber===e){const e=t.component;for(let n of t.willPatch)n.call(e)}}e=void 0,t._patch(),this.locked=!1;let n=this.mounted;for(;e=n.pop();)if(e=e,e.appliedToDom)for(let t of e.node.mounted)t();let o=this.patched;for(;e=o.pop();)if(e=e,e.appliedToDom)for(let t of e.node.patched)t()}catch(t){this.locked=!1,Et({fiber:e||this,error:t})}}setCounter(t){this.counter=t,0===t&&this.node.app.scheduler.flush()}}class Ct extends St{constructor(t,e,n={}){super(t,null),this.target=e,this.position=n.position||"last-child"}complete(){let t=this;try{const e=this.node;if(e.children=this.childrenMap,e.app.constructor.validateTarget(this.target),e.bdom)e.updateDom();else if(e.bdom=this.bdom,"last-child"===this.position||0===this.target.childNodes.length)xt(e.bdom,this.target);else{const t=this.target.childNodes[0];xt(e.bdom,this.target,t)}e.fiber=null,e.status=1,this.appliedToDom=!0;let n=this.mounted;for(;t=n.pop();)if(t.appliedToDom)for(let e of t.node.mounted)e()}catch(e){Et({fiber:t,error:e})}}}const Dt=Symbol("Target"),Lt=Symbol("Skip"),Bt=Symbol("Key changes"),Rt=Object.prototype.toString,Ot=Object.prototype.hasOwnProperty,Pt=new Set(["Object","Array","Set","Map","WeakMap"]),It=new Set(["Set","Map","WeakMap"]);function jt(t){return Rt.call(t).slice(8,-1)}function Mt(t){return"object"==typeof t&&Pt.has(jt(t))}function Wt(t,e){return Mt(t)?Xt(t,e):t}function Ft(t){return t[Lt]=!0,t}function Vt(t){return t[Dt]||t}const zt=new WeakMap;function Kt(t,e,n){zt.get(t)||zt.set(t,new Map);const o=zt.get(t);o.get(e)||o.set(e,new Set),o.get(e).add(n),Ut.has(n)||Ut.set(n,new Set),Ut.get(n).add(t)}function Ht(t,e){const n=zt.get(t);if(!n)return;const o=n.get(e);if(o)for(const t of[...o])qt(t),t()}const Ut=new WeakMap;function qt(t){const e=Ut.get(t);if(e){for(const n of e){const e=zt.get(n);if(e)for(const n of e.values())n.delete(t)}e.clear()}}const Gt=new WeakMap;function Xt(t,e=(()=>{})){if(!Mt(t))throw new Error("Cannot make the given value reactive");if(Lt in t)return t;const n=t[Dt];if(n)return Xt(n,e);Gt.has(t)||Gt.set(t,new WeakMap);const o=Gt.get(t);if(!o.has(e)){const n=jt(t),r=It.has(n)?function(t,e,n){const o=ne[n](t,e);return Object.assign(Yt(e),{get:(t,n)=>n===Dt?t:Ot.call(o,n)?o[n]:(Kt(t,n,e),Wt(t[n],e))})}(t,e,n):Yt(e),i=new Proxy(t,r);o.set(e,i)}return o.get(e)}function Yt(t){return{get(e,n,o){if(n===Dt)return e;const r=Object.getOwnPropertyDescriptor(e,n);return!r||r.writable||r.configurable?(Kt(e,n,t),Wt(Reflect.get(e,n,o),t)):Reflect.get(e,n,o)},set(t,e,n,o){const r=!Ot.call(t,e),i=Reflect.get(t,e,o),s=Reflect.set(t,e,n,o);return r&&Ht(t,Bt),(i!==n||Array.isArray(t)&&"length"===e)&&Ht(t,e),s},deleteProperty(t,e){const n=Reflect.deleteProperty(t,e);return Ht(t,Bt),Ht(t,e),n},ownKeys:e=>(Kt(e,Bt,t),Reflect.ownKeys(e)),has:(e,n)=>(Kt(e,Bt,t),Reflect.has(e,n))}}function Zt(t,e,n){return o=>(o=Vt(o),Kt(e,o,n),Wt(e[t](o),n))}function Jt(t,e,n){return function*(){Kt(e,Bt,n);const o=e.keys();for(const r of e[t]()){const t=o.next().value;Kt(e,t,n),yield Wt(r,n)}}}function Qt(t,e){return function(n,o){Kt(t,Bt,e),t.forEach((function(r,i,s){Kt(t,i,e),n.call(o,Wt(r,e),Wt(i,e),Wt(s,e))}),o)}}function te(t,e,n){return(o,r)=>{o=Vt(o);const i=n.has(o),s=n[e](o),l=n[t](o,r);return i!==n.has(o)&&Ht(n,Bt),s!==r&&Ht(n,o),l}}function ee(t){return()=>{const e=[...t.keys()];t.clear(),Ht(t,Bt);for(const n of e)Ht(t,n)}}const ne={Set:(t,e)=>({has:Zt("has",t,e),add:te("add","has",t),delete:te("delete","has",t),keys:Jt("keys",t,e),values:Jt("values",t,e),entries:Jt("entries",t,e),[Symbol.iterator]:Jt(Symbol.iterator,t,e),forEach:Qt(t,e),clear:ee(t),get size(){return Kt(t,Bt,e),t.size}}),Map:(t,e)=>({has:Zt("has",t,e),get:Zt("get",t,e),set:te("set","get",t),delete:te("delete","has",t),keys:Jt("keys",t,e),values:Jt("values",t,e),entries:Jt("entries",t,e),[Symbol.iterator]:Jt(Symbol.iterator,t,e),forEach:Qt(t,e),clear:ee(t),get size(){return Kt(t,Bt,e),t.size}}),WeakMap:(t,e)=>({has:Zt("has",t,e),get:Zt("get",t,e),set:te("set","get",t),delete:te("delete","has",t)})};class oe extends EventTarget{trigger(t,e){this.dispatchEvent(new CustomEvent(t,{detail:e}))}}class re extends String{}let ie=null;function se(){if(!ie)throw new Error("No active component (a hook function should only be called in 'setup')");return ie}function le(t,e){for(let n in e)void 0===t[n]&&(t[n]=e[n])}const ae=new WeakMap;function ce(t){const e=se();let n=ae.get(e);return n||(n=function(t){let e=!1;return async()=>{await Promise.resolve(),e||(e=!0,Promise.resolve().then((()=>e=!1)),t())}}(e.render.bind(e,!1)),ae.set(e,n),e.willDestroy.push(qt.bind(null,n))),Xt(t,n)}class he{constructor(t,e,n,o,r){this.fiber=null,this.bdom=null,this.status=0,this.forceNextRender=!1,this.children=Object.create(null),this.refs={},this.willStart=[],this.willUpdateProps=[],this.willUnmount=[],this.mounted=[],this.willPatch=[],this.patched=[],this.willDestroy=[],ie=this,this.app=n,this.parent=o,this.props=e,this.parentKey=r,this.level=o?o.level+1:0;const i=t.defaultProps;e=Object.assign({},e),i&&le(e,i);const s=o&&o.childEnv||n.env;this.childEnv=s;for(const t in e){const n=e[t];n&&"object"==typeof n&&n[Dt]&&(e[t]=ce(n))}this.component=new t(e,s,this),this.renderFn=n.getTemplate(t.template).bind(this.component,this.component,this),this.component.setup(),ie=null}mountComponent(t,e){const n=new Ct(this,t,e);this.app.scheduler.addFiber(n),this.initiateRender(n)}async initiateRender(t){this.fiber=t,this.mounted.length&&t.root.mounted.push(t);const e=this.component;try{await Promise.all(this.willStart.map((t=>t.call(e))))}catch(t){return void Et({node:this,error:t})}0===this.status&&this.fiber===t&&t.render()}async render(t){let e=this.fiber;if(e&&(e.root.locked||!0===e.bdom)&&(await Promise.resolve(),e=this.fiber),e){if(!e.bdom&&!kt.has(e))return void(t&&(e.deep=t));t=t||e.deep}else if(!this.bdom)return;const n=function(t){let e=t.fiber;if(e){let t=e.root;return t.locked=!0,t.setCounter(t.counter+1-Tt(e.children)),t.locked=!1,e.children=[],e.childrenMap={},e.bdom=null,kt.has(e)&&(kt.delete(e),kt.delete(t),e.appliedToDom=!1),e}const n=new St(t,null);return t.willPatch.length&&n.willPatch.push(n),t.patched.length&&n.patched.push(n),n}(this);n.deep=t,this.fiber=n,this.app.scheduler.addFiber(n),await Promise.resolve(),2!==this.status&&(this.fiber!==n||!e&&n.parent||n.render())}destroy(){let t=1===this.status;this._destroy(),t&&this.bdom.remove()}_destroy(){const t=this.component;if(1===this.status)for(let e of this.willUnmount)e.call(t);for(let t of Object.values(this.children))t._destroy();if(this.willDestroy.length)try{for(let e of this.willDestroy)e.call(t)}catch(t){Et({error:t,node:this})}this.status=2}async updateAndRender(t,e){const n=t;t=Object.assign({},t);const o=function(t,e){let n=t.fiber;return n&&(Tt(n.children),n.root=null),new _t(t,e)}(this,e);this.fiber=o;const r=this.component,i=r.constructor.defaultProps;i&&le(t,i),ie=this;for(const e in t){const n=t[e];n&&"object"==typeof n&&n[Dt]&&(t[e]=ce(n))}ie=null;const s=Promise.all(this.willUpdateProps.map((e=>e.call(r,t))));if(await s,o!==this.fiber)return;r.props=t,this.props=n,o.render();const l=e.root;this.willPatch.length&&l.willPatch.push(o),this.patched.length&&l.patched.push(o)}updateDom(){if(this.fiber)if(this.bdom===this.fiber.bdom)for(let t in this.children){this.children[t].updateDom()}else this.bdom.patch(this.fiber.bdom,!1),this.fiber.appliedToDom=!0,this.fiber=null}firstNode(){const t=this.bdom;return t?t.firstNode():void 0}mount(t,e){const n=this.fiber.bdom;this.bdom=n,n.mount(t,e),this.status=1,this.fiber.appliedToDom=!0,this.children=this.fiber.childrenMap,this.fiber=null}moveBefore(t,e){this.bdom.moveBefore(t?t.bdom:null,e)}patch(){this.fiber&&this.fiber.parent&&this._patch()}_patch(){let t=!1;for(let e in this.children){t=!0;break}const e=this.fiber;this.children=e.childrenMap,this.bdom.patch(e.bdom,t),e.appliedToDom=!0,this.fiber=null}beforeRemove(){this._destroy()}remove(){this.bdom.remove()}get name(){return this.component.constructor.name}get subscriptions(){const t=ae.get(this);return t?(e=t,[...Ut.get(e)||[]].map((t=>{const e=zt.get(t);return{target:t,keys:e?[...e.keys()]:[]}}))):[];var e}}const ue=Symbol("timeout");function de(t,e){const n=new Error(`The following error occurred in ${e}: `),o=new Error(e+"'s promise hasn't resolved after 3 seconds"),r=se();return(...i)=>{try{const s=t(...i);if(s instanceof Promise){if("onWillStart"===e||"onWillUpdateProps"===e){const t=r.fiber;Promise.race([s,new Promise((t=>setTimeout((()=>t(ue)),3e3)))]).then((e=>{e===ue&&r.fiber===t&&console.warn(o)}))}return s.catch((t=>{throw n.cause=t,t instanceof Error&&(n.message+=`"${t.message}"`),n}))}return s}catch(t){throw t instanceof Error&&(n.message+=`"${t.message}"`),n}}}function fe(t){const e=se(),n=e.app.dev?de:t=>t;e.mounted.push(n(t.bind(e.component),"onMounted"))}function pe(t){const e=se(),n=e.app.dev?de:t=>t;e.patched.push(n(t.bind(e.component),"onPatched"))}function me(t){const e=se(),n=e.app.dev?de:t=>t;e.willUnmount.unshift(n(t.bind(e.component),"onWillUnmount"))}class be{constructor(t,e,n){this.props=t,this.env=e,this.__owl__=n}setup(){}render(t=!1){this.__owl__.render(!0===t)}}be.template="";const ge=z("").constructor;class ye extends ge{constructor(t,e){super(""),this.target=null,this.selector=t,this.realBDom=e}mount(t,e){if(super.mount(t,e),this.target=document.querySelector(this.selector),!this.target){let t=this.el;for(;t&&t.parentElement instanceof HTMLElement;)t=t.parentElement;if(this.target=t&&t.querySelector(this.selector),!this.target)throw new Error("invalid portal target")}this.realBDom.mount(this.target,null)}beforeRemove(){this.realBDom.beforeRemove()}remove(){this.realBDom&&(super.remove(),this.realBDom.remove(),this.realBDom=null)}patch(t){super.patch(t),this.realBDom?this.realBDom.patch(t.realBDom,!0):(this.realBDom=t.realBDom,this.realBDom.mount(this.target,null))}}class ve extends be{setup(){const t=this.__owl__,e=t.renderFn;t.renderFn=()=>new ye(this.props.target,e()),me((()=>{t.bdom&&t.bdom.remove()}))}}ve.template="__portal__",ve.props={target:{type:String},slots:!0};const we=t=>Array.isArray(t),xe=t=>"object"!=typeof t,ke=t=>"object"==typeof t&&t&&"value"in t;function $e(t){return"object"==typeof t&&"optional"in t&&t.optional||!1}function Ne(t){return"*"===t||!0===t?"value":t.name.toLowerCase()}function Ee(t){return xe(t)?Ne(t):we(t)?t.map(Ee).join(" or "):ke(t)?String(t.value):"element"in t?`list of ${Ee({type:t.element,optional:!1})}s`:"shape"in t?"object":Ee(t.type||"*")}function Ae(t,e){var n;Array.isArray(e)&&(n=e,e=Object.fromEntries(n.map((t=>t.endsWith("?")?[t.slice(0,-1),{optional:!0}]:[t,{type:"*",optional:!1}]))));let o=[];for(let n in t)if(n in e){let r=Te(n,t[n],e[n]);r&&o.push(r)}else"*"in e||o.push(`unknown key '${n}'`);for(let n in e){const r=e[n];if("*"!==n&&!$e(r)&&!(n in t)){const t="object"==typeof r&&!Array.isArray(r);let e="*"===r||(t&&"type"in r?"*"===r.type:t)?"":` (should be a ${Ee(r)})`;o.push(`'${n}' is missing${e}`)}}return o}function Te(t,e,n){if(void 0===e)return $e(n)?null:`'${t}' is undefined (should be a ${Ee(n)})`;if(xe(n))return function(t,e,n){if("function"==typeof n)if("object"==typeof e){if(!(e instanceof n))return`'${t}' is not a ${Ne(n)}`}else if(typeof e!==n.name.toLowerCase())return`'${t}' is not a ${Ne(n)}`;return null}(t,e,n);if(ke(n))return e===n.value?null:`'${t}' is not equal to '${n.value}'`;if(we(n)){return n.find((n=>!Te(t,e,n)))?null:`'${t}' is not a ${Ee(n)}`}let o=null;if("element"in n)o=function(t,e,n){if(!Array.isArray(e))return`'${t}' is not a list of ${Ee(n)}s`;for(let o=0;o<e.length;o++){const r=Te(`${t}[${o}]`,e[o],n);if(r)return r}return null}(t,e,n.element);else if("shape"in n&&!o)if("object"!=typeof e||Array.isArray(e))o=`'${t}' is not an object`;else{const r=Ae(e,n.shape);r.length&&(o=`'${t}' has not the correct shape (${r.join(", ")})`)}return"type"in n&&!o&&(o=Te(t,e,n.type)),"validate"in n&&!o&&(o=n.validate(e)?null:`'${t}' is not valid`),o}const _e=Object.create;function Se(t){const e=t.__owl__.component,n=_e(e);for(let e in t)n[e]=t[e];return n}const Ce=Symbol("isBoundary");class De{constructor(t,e,n){this.fn=t,this.ctx=Se(e),this.node=n}evaluate(){return this.fn(this.ctx,this.node)}toString(){return this.evaluate().toString()}}let Le=new WeakMap;const Be=WeakMap.prototype.get,Re=WeakMap.prototype.set;function Oe(t,e,n){const o="string"!=typeof t?t:n.constructor.components[t];if(!o)return;const r=o.props;if(!r)return void(n.__owl__.app.warnIfNoStaticProps&&console.warn(`Component '${o.name}' does not have a static props description`));const i=o.defaultProps;if(i){let t=t=>Array.isArray(r)?r.includes(t):t in r&&!("*"in r)&&!$e(r[t]);for(let e in i)if(t(e))throw new Error(`A default value cannot be defined for a mandatory prop (name: '${e}', component: ${o.name})`)}const s=Ae(e,r);if(s.length)throw new Error(`Invalid props for component '${o.name}': `+s.join(", "))}const Pe={withDefault:function(t,e){return null==t||!1===t?e:t},zero:Symbol("zero"),isBoundary:Ce,callSlot:function(t,e,n,o,i,s,l){n=n+"__slot_"+o;const a=t.props.slots||{},{__render:c,__ctx:h,__scope:u}=a[o]||{},d=_e(h||{});u&&(d[u]=s);const f=c?c.call(h.__owl__.component,d,e,n):null;if(l){let s=void 0,a=void 0;return f?s=i?r(o,f):f:a=l.call(t.__owl__.component,t,e,n),R([s,a])}return f||z("")},capture:Se,withKey:function(t,e){return t.key=e,t},prepareList:function(t){let e,n;if(Array.isArray(t))e=t,n=t;else{if(!t)throw new Error("Invalid loop expression");n=Object.keys(t),e=Object.values(t)}const o=n.length;return[e,n,o,new Array(o)]},setContextValue:function(t,e,n){const o=t;for(;!t.hasOwnProperty(e)&&!t.hasOwnProperty(Ce);){const e=t.__proto__;if(!e){t=o;break}t=e}t[e]=n},multiRefSetter:function(t,e){let n=0;return o=>{if(o&&(n++,n>1))throw new Error("Cannot have 2 elements with same ref name at the same time");(0===n||o)&&(t[e]=o)}},shallowEqual:function(t,e){for(let n=0,o=t.length;n<o;n++)if(t[n]!==e[n])return!1;return!0},toNumber:function(t){const e=parseFloat(t);return isNaN(e)?t:e},validateProps:Oe,LazyValue:De,safeOutput:function(t){if(!t)return t;let e,n;switch(typeof t){case"object":t instanceof re?(e="string_safe",n=wt(t)):t instanceof De?(e="lazy_value",n=t.evaluate()):t instanceof String?(e="string_unsafe",n=z(t)):(e="block_safe",n=t);break;case"string":e="string_unsafe",n=z(t);break;default:e="string_unsafe",n=z(String(t))}return r(e,n)},bind:function(t,e){let n=t.__owl__.component,o=Be.call(Le,n);o||(o=new WeakMap,Re.call(Le,n,o));let r=Be.call(o,e);return r||(r=e.bind(n),Re.call(o,e,r)),r},createCatcher:function(t){const e=Object.keys(t).length;class n{constructor(t,e){this.handlerFns=[],this.afterNode=null,this.child=t,this.handlerData=e}mount(e,n){this.parentEl=e,this.child.mount(e,n),this.afterNode=document.createTextNode(""),e.insertBefore(this.afterNode,n),this.wrapHandlerData();for(let n in t){const o=t[n],r=$(n);this.handlerFns[o]=r,r.setup.call(e,this.handlerData[o])}}wrapHandlerData(){for(let t=0;t<e;t++){let e=this.handlerData[t],n=e.length-2,o=e[n];const r=this;e[n]=function(t){const e=t.target;let n=r.child.firstNode();const i=r.afterNode;for(;n!==i;){if(n.contains(e))return o.call(this,t);n=n.nextSibling}}}}moveBefore(t,e){this.child.moveBefore(t?t.child:null,e),this.parentEl.insertBefore(this.afterNode,e)}patch(t,n){if(this!==t){this.handlerData=t.handlerData,this.wrapHandlerData();for(let t=0;t<e;t++)this.handlerFns[t].update.call(this.parentEl,this.handlerData[t]);this.child.patch(t.child,n)}}beforeRemove(){this.child.beforeRemove()}remove(){for(let t=0;t<e;t++)this.handlerFns[t].remove.call(this.parentEl);this.child.remove(),this.afterNode.remove()}firstNode(){return this.child.firstNode()}toString(){return this.child.toString()}}return function(t,e){return new n(t,e)}},markRaw:Ft},Ie={text:z,createBlock:tt,list:pt,multi:R,html:wt,toggler:r,comment:K};class je{constructor(t={}){this.rawTemplates=Object.create(Me),this.templates={},this.Portal=ve,this.dev=t.dev||!1,this.translateFn=t.translateFn,this.translatableAttributes=t.translatableAttributes,t.templates&&this.addTemplates(t.templates)}static registerTemplate(t,e){Me[t]=e}addTemplate(t,e){if(t in this.rawTemplates){const n=this.rawTemplates[t];if(("string"==typeof n?n:n instanceof Element?n.outerHTML:n.toString())===("string"==typeof e?e:e.outerHTML))return;throw new Error(`Template ${t} already defined with different content`)}this.rawTemplates[t]=e}addTemplates(t){if(t){t=t instanceof Document?t:function(t){const e=(new DOMParser).parseFromString(t,"text/xml");if(e.getElementsByTagName("parsererror").length){let n="Invalid XML in template.";const o=e.getElementsByTagName("parsererror")[0].textContent;if(o){n+="\nThe parser has produced the following error message:\n"+o;const e=/\d+/g,r=e.exec(o);if(r){const i=Number(r[0]),s=t.split("\n")[i-1],l=e.exec(o);if(s&&l){const t=Number(l[0])-1;s[t]&&(n+=`\nThe error might be located at xml line ${i} column ${t}\n${s}\n${"-".repeat(t-1)}^`)}}}throw new Error(n)}return e}(t);for(const e of t.querySelectorAll("[t-name]")){const t=e.getAttribute("t-name");this.addTemplate(t,e)}}}getTemplate(t){if(!(t in this.templates)){const e=this.rawTemplates[t];if(void 0===e){let e="";try{e=` (for component "${se().component.constructor.name}")`}catch{}throw new Error(`Missing template: "${t}"${e}`)}const n="function"==typeof e&&!(e instanceof Element)?e:this._compileTemplate(t,e),o=this.templates;this.templates[t]=function(e,n){return o[t].call(this,e,n)};const r=n(this,Ie,Pe);this.templates[t]=r}return this.templates[t]}_compileTemplate(t,e){throw new Error("Unable to compile a template. Please use owl full build instead")}callTemplate(t,e,n,o,i){return r(e,this.getTemplate(e).call(t,n,o,i))}}const Me={};function We(...t){const e="__template__"+We.nextId++,n=String.raw(...t);return Me[e]=n,e}We.nextId=1,je.registerTemplate("__portal__",(function(t,e,n){let{callSlot:o}=n;return function(t,e,n=""){return o(t,e,n,"default",!1,null)}}));const Fe="true,false,NaN,null,undefined,debugger,console,window,in,instanceof,new,function,return,this,eval,void,Math,RegExp,Array,Object,Date".split(","),Ve=Object.assign(Object.create(null),{and:"&&",or:"||",gt:">",gte:">=",lt:"<",lte:"<="}),ze=Object.assign(Object.create(null),{"{":"LEFT_BRACE","}":"RIGHT_BRACE","[":"LEFT_BRACKET","]":"RIGHT_BRACKET",":":"COLON",",":"COMMA","(":"LEFT_PAREN",")":"RIGHT_PAREN"}),Ke="...,.,===,==,+,!==,!=,!,||,&&,>=,>,<=,<,?,-,*,/,%,typeof ,=>,=,;,in ,new ".split(",");const He=[function(t){let e=t[0],n=e;if("'"!==e&&'"'!==e&&"`"!==e)return!1;let o,r=1;for(;t[r]&&t[r]!==n;){if(o=t[r],e+=o,"\\"===o){if(r++,o=t[r],!o)throw new Error("Invalid expression");e+=o}r++}if(t[r]!==n)throw new Error("Invalid expression");return e+=n,"`"===n?{type:"TEMPLATE_STRING",value:e,replace:t=>e.replace(/\$\{(.*?)\}/g,((e,n)=>"${"+t(n)+"}"))}:{type:"VALUE",value:e}},function(t){let e=t[0];if(e&&e.match(/[0-9]/)){let n=1;for(;t[n]&&t[n].match(/[0-9]|\./);)e+=t[n],n++;return{type:"VALUE",value:e}}return!1},function(t){for(let e of Ke)if(t.startsWith(e))return{type:"OPERATOR",value:e};return!1},function(t){let e=t[0];if(e&&e.match(/[a-zA-Z_\$]/)){let n=1;for(;t[n]&&t[n].match(/\w/);)e+=t[n],n++;return e in Ve?{type:"OPERATOR",value:Ve[e],size:e.length}:{type:"SYMBOL",value:e}}return!1},function(t){const e=t[0];return!(!e||!(e in ze))&&{type:ze[e],value:e}}];const Ue=t=>t&&("LEFT_BRACE"===t.type||"COMMA"===t.type),qe=t=>t&&("RIGHT_BRACE"===t.type||"COMMA"===t.type);function Ge(t){const e=new Set,n=function(t){const e=[];let n,o=!0,r=t;try{for(;o;)if(r=r.trim(),r){for(let t of He)if(o=t(r),o){e.push(o),r=r.slice(o.size||o.value.length);break}}else o=!1}catch(t){n=t}if(r.length||n)throw new Error(`Tokenizer error: could not tokenize \`${t}\``);return e}(t);let o=0,r=[];for(;o<n.length;){let t=n[o],i=n[o-1],s=n[o+1],l=r[r.length-1];switch(t.type){case"LEFT_BRACE":case"LEFT_BRACKET":r.push(t.type);break;case"RIGHT_BRACE":case"RIGHT_BRACKET":r.pop()}let a="SYMBOL"===t.type&&!Fe.includes(t.value);if("SYMBOL"!==t.type||Fe.includes(t.value)||i&&("LEFT_BRACE"===l&&Ue(i)&&qe(s)&&(n.splice(o+1,0,{type:"COLON",value:":"},{...t}),s=n[o+1]),"OPERATOR"===i.type&&"."===i.value?a=!1:"LEFT_BRACE"!==i.type&&"COMMA"!==i.type||s&&"COLON"===s.type&&(a=!1)),"TEMPLATE_STRING"===t.type&&(t.value=t.replace((t=>Ye(t)))),s&&"OPERATOR"===s.type&&"=>"===s.value)if("RIGHT_PAREN"===t.type){let t=o-1;for(;t>0&&"LEFT_PAREN"!==n[t].type;)"SYMBOL"===n[t].type&&n[t].originalValue&&(n[t].value=n[t].originalValue,e.add(n[t].value)),t--}else e.add(t.value);a&&(t.varName=t.value,e.has(t.value)||(t.originalValue=t.value,t.value=`ctx['${t.value}']`)),o++}for(const t of n)"SYMBOL"===t.type&&t.varName&&e.has(t.value)&&(t.originalValue=t.value,t.value="_"+t.value,t.isLocal=!0);return n}const Xe=new Map([["in "," in "]]);function Ye(t){return Ge(t).map((t=>Xe.get(t.value)||t.value)).join("")}const Ze=/\{\{.*?\}\}|\#\{.*?\}/g;function Je(t,e){let n=t.match(Ze);return n&&n[0].length===t.length?`(${e(t.slice(2,"{"===n[0][0]?-2:-1))})`:"`"+t.replace(Ze,(t=>"${"+e(t.slice(2,"{"===t[0]?-2:-1))+"}"))+"`"}function Qe(t){return Je(t,Ye)}const tn=document.implementation.createDocument(null,null,null),en=new Set(["stop","capture","prevent","self","synthetic"]);let nn={};function on(t=""){return nn[t]=(nn[t]||0)+1,t+nn[t]}class rn{constructor(t,e){this.dynamicTagName=null,this.isRoot=!1,this.hasDynamicChildren=!1,this.children=[],this.data=[],this.childNumber=0,this.parentVar="",this.id=rn.nextBlockId++,this.varName="b"+this.id,this.blockName="block"+this.id,this.target=t,this.type=e}insertData(t,e="d"){const n=on(e);return this.target.addLine(`let ${n} = ${t};`),this.data.push(n)-1}insert(t){this.currentDom?this.currentDom.appendChild(t):this.dom=t}generateExpr(t){if("block"===this.type){const t=this.children.length;let e=this.data.length?`[${this.data.join(", ")}]`:t?"[]":"";return t&&(e+=", ["+this.children.map((t=>t.varName)).join(", ")+"]"),this.dynamicTagName?`toggler(${this.dynamicTagName}, ${this.blockName}(${this.dynamicTagName})(${e}))`:`${this.blockName}(${e})`}return"list"===this.type?`list(c_block${this.id})`:t}asXmlString(){const t=tn.createElement("t");return t.appendChild(this.dom),t.innerHTML}}function sn(t,e){return Object.assign({block:null,index:0,forceNewBlock:!0,translate:t.translate,tKeyExpr:null,nameSpace:t.nameSpace,tModelSelectedExpr:t.tModelSelectedExpr},e)}rn.nextBlockId=1;class ln{constructor(t,e){this.indentLevel=0,this.loopLevel=0,this.code=[],this.hasRoot=!1,this.hasCache=!1,this.hasRef=!1,this.refInfo={},this.shouldProtectScope=!1,this.name=t,this.on=e||null}addLine(t,e){const n=new Array(this.indentLevel+2).join(" ");void 0===e?this.code.push(n+t):this.code.splice(e,0,n+t)}generateCode(){let t=[];if(t.push(`function ${this.name}(ctx, node, key = "") {`),this.hasRef){t.push(" const refs = ctx.__owl__.refs;");for(let e in this.refInfo){const[n,o]=this.refInfo[e];t.push(` const ${n} = ${o};`)}}this.shouldProtectScope&&(t.push(" ctx = Object.create(ctx);"),t.push(" ctx[isBoundary] = 1")),this.hasCache&&(t.push(" let cache = ctx.cache || {};"),t.push(" let nextCache = ctx.cache = {};"));for(let e of this.code)t.push(e);return this.hasRoot||t.push("return text('');"),t.push("}"),t.join("\n ")}}const an=["label","title","placeholder","alt"],cn=/^(\s*)([\s\S]+?)(\s*)$/;class hn{constructor(t,e){if(this.blocks=[],this.nextBlockId=1,this.isDebug=!1,this.targets=[],this.target=new ln("template"),this.translatableAttributes=an,this.staticDefs=[],this.helpers=new Set,this.translateFn=e.translateFn||(t=>t),e.translatableAttributes){const t=new Set(an);for(let n of e.translatableAttributes)n.startsWith("-")?t.delete(n.slice(1)):t.add(n);this.translatableAttributes=[...t]}this.hasSafeContext=e.hasSafeContext||!1,this.dev=e.dev||!1,this.ast=t,this.templateName=e.name}generateCode(){const t=this.ast;this.isDebug=12===t.type,rn.nextBlockId=1,nn={},this.compileAST(t,{block:null,index:0,forceNewBlock:!1,isLast:!0,translate:!0,tKeyExpr:null});let e=[" let { text, createBlock, list, multi, html, toggler, comment } = bdom;"];this.helpers.size&&e.push(`let { ${[...this.helpers].join(", ")} } = helpers;`),this.templateName&&e.push(`// Template name: "${this.templateName}"`);for(let{id:t,expr:n}of this.staticDefs)e.push(`const ${t} = ${n};`);if(this.blocks.length){e.push("");for(let t of this.blocks)if(t.dom){let n=t.asXmlString();n=n.replace(/`/g,"\\`"),t.dynamicTagName?(n=n.replace(/^<\w+/,`<\${tag || '${t.dom.nodeName}'}`),n=n.replace(/\w+>$/,`\${tag || '${t.dom.nodeName}'}>`),e.push(`let ${t.blockName} = tag => createBlock(\`${n}\`);`)):e.push(`let ${t.blockName} = createBlock(\`${n}\`);`)}}if(this.targets.length)for(let t of this.targets)e.push(""),e=e.concat(t.generateCode());e.push(""),e=e.concat("return "+this.target.generateCode());const n=e.join("\n ");if(this.isDebug){const t="[Owl Debug]\n"+n;console.log(t)}return n}compileInNewTarget(t,e,n,o){const r=on(t),i=this.target,s=new ln(r,o);return this.targets.push(s),this.target=s,this.compileAST(e,sn(n)),this.target=i,r}addLine(t,e){this.target.addLine(t,e)}define(t,e){this.addLine(`const ${t} = ${e};`)}insertAnchor(t){const e="block-child-"+t.children.length,n=tn.createElement(e);t.insert(n)}createBlock(t,e,n){const o=this.target.hasRoot,r=new rn(this.target,e);return o||n.preventRoot||(this.target.hasRoot=!0,r.isRoot=!0),t&&(t.children.push(r),"list"===t.type&&(r.parentVar="c_block"+t.id)),r}insertBlock(t,e,n){let o=e.generateExpr(t);const r=n.tKeyExpr;if(e.parentVar){let t="key"+this.target.loopLevel;return r&&(t=`${r} + ${t}`),this.helpers.add("withKey"),void this.addLine(`${e.parentVar}[${n.index}] = withKey(${o}, ${t});`)}r&&(o=`toggler(${r}, ${o})`),e.isRoot&&!n.preventRoot?(this.target.on&&(o=this.wrapWithEventCatcher(o,this.target.on)),this.addLine(`return ${o};`)):this.define(e.varName,o)}captureExpression(t,e=!1){if(!e&&!t.includes("=>"))return Ye(t);const n=Ge(t),o=new Map;return n.map((t=>{if(t.varName&&!t.isLocal){if(!o.has(t.varName)){const e=on("v");o.set(t.varName,e),this.define(e,t.value)}t.value=o.get(t.varName)}return t.value})).join("")}compileAST(t,e){switch(t.type){case 1:this.compileComment(t,e);break;case 0:this.compileText(t,e);break;case 2:this.compileTDomNode(t,e);break;case 4:this.compileTEsc(t,e);break;case 8:this.compileTOut(t,e);break;case 5:this.compileTIf(t,e);break;case 9:this.compileTForeach(t,e);break;case 10:this.compileTKey(t,e);break;case 3:this.compileMulti(t,e);break;case 7:this.compileTCall(t,e);break;case 15:this.compileTCallBlock(t,e);break;case 6:this.compileTSet(t,e);break;case 11:this.compileComponent(t,e);break;case 12:this.compileDebug(t,e);break;case 13:this.compileLog(t,e);break;case 14:this.compileTSlot(t,e);break;case 16:this.compileTTranslation(t,e);break;case 17:this.compileTPortal(t,e)}}compileDebug(t,e){this.addLine("debugger;"),t.content&&this.compileAST(t.content,e)}compileLog(t,e){this.addLine(`console.log(${Ye(t.expr)});`),t.content&&this.compileAST(t.content,e)}compileComment(t,e){let{block:n,forceNewBlock:o}=e;if(!n||o)n=this.createBlock(n,"comment",e),this.insertBlock(`comment(\`${t.value}\`)`,n,{...e,forceNewBlock:o&&!n});else{const e=tn.createComment(t.value);n.insert(e)}}compileText(t,e){let{block:n,forceNewBlock:o}=e,r=t.value;if(r&&!1!==e.translate){const t=cn.exec(r);r=t[1]+this.translateFn(t[2])+t[3]}if(!n||o)n=this.createBlock(n,"text",e),this.insertBlock(`text(\`${r}\`)`,n,{...e,forceNewBlock:o&&!n});else{const e=0===t.type?tn.createTextNode:tn.createComment;n.insert(e.call(tn,r))}}generateHandlerCode(t,e){const n=t.split(".").slice(1).map((t=>{if(!en.has(t))throw new Error(`Unknown event modifier: '${t}'`);return`"${t}"`}));let o="";return n.length&&(o=n.join(",")+", "),`[${o}${this.captureExpression(e)}, ctx]`}compileTDomNode(t,e){let{block:n,forceNewBlock:o}=e;const r=!n||o||null!==t.dynamicTag||t.ns;let i=this.target.code.length;if(r&&((t.dynamicTag||e.tKeyExpr||t.ns)&&e.block&&this.insertAnchor(e.block),n=this.createBlock(n,"block",e),this.blocks.push(n),t.dynamicTag)){const e=on("tag");this.define(e,Ye(t.dynamicTag)),n.dynamicTagName=e}const s={},l=t.ns||e.nameSpace;l&&r&&(s["block-ns"]=l);for(let o in t.attrs){let r,i;if(o.startsWith("t-attf")){r=Qe(t.attrs[o]);const e=n.insertData(r,"attr");i=o.slice(7),s["block-attribute-"+e]=i}else if(o.startsWith("t-att")){r=Ye(t.attrs[o]);const e=n.insertData(r,"attr");"t-att"===o?s["block-attributes"]=String(e):(i=o.slice(6),s["block-attribute-"+e]=i)}else this.translatableAttributes.includes(o)?s[o]=this.translateFn(t.attrs[o]):(r=`"${t.attrs[o]}"`,i=o,s[o]=t.attrs[o]);if("value"===i&&e.tModelSelectedExpr){s["block-attribute-"+n.insertData(`${e.tModelSelectedExpr} === ${r}`,"attr")]="selected"}}for(let e in t.on){const o=this.generateHandlerCode(e,t.on[e]);s["block-handler-"+n.insertData(o,"hdlr")]=e}if(t.ref){this.target.hasRef=!0;if(Ze.test(t.ref)){const e=Je(t.ref,(t=>this.captureExpression(t,!0))),o=n.insertData(`(el) => refs[${e}] = el`,"ref");s["block-ref"]=String(o)}else{let e=t.ref;if(e in this.target.refInfo){this.helpers.add("multiRefSetter");const t=this.target.refInfo[e],o=n.data.push(t[0])-1;s["block-ref"]=String(o),t[1]=`multiRefSetter(refs, \`${e}\`)`}else{let t=on("ref");this.target.refInfo[e]=[t,`(el) => refs[\`${e}\`] = el`];const o=n.data.push(t)-1;s["block-ref"]=String(o)}}}let a;if(t.model){const{hasDynamicChildren:e,baseExpr:o,expr:r,eventType:i,shouldNumberize:l,shouldTrim:c,targetAttr:h,specialInitTargetAttr:u}=t.model,d=Ye(o),f=on("bExpr");this.define(f,d);const p=Ye(r),m=on("expr");this.define(m,p);const b=`${f}[${m}]`;let g;if(u)g=n.insertData(`${b} === '${s[h]}'`,"attr"),s["block-attribute-"+g]=u;else if(e){a=""+on("bValue"),this.define(a,b)}else g=n.insertData(""+b,"attr"),s["block-attribute-"+g]=h;this.helpers.add("toNumber");let y="ev.target."+h;y=c?y+".trim()":y,y=l?`toNumber(${y})`:y;const v=`[(ev) => { ${b} = ${y}; }]`;g=n.insertData(v,"hdlr"),s["block-handler-"+g]=i}const c=tn.createElement(t.tag);for(const[t,e]of Object.entries(s))"class"===t&&""===e||c.setAttribute(t,e);if(n.insert(c),t.content.length){const o=n.currentDom;n.currentDom=c;const r=t.content;for(let o=0;o<r.length;o++){const i=t.content[o],s=sn(e,{block:n,index:n.childNumber,forceNewBlock:!1,isLast:e.isLast&&o===r.length-1,tKeyExpr:e.tKeyExpr,nameSpace:l,tModelSelectedExpr:a});this.compileAST(i,s)}n.currentDom=o}if(r&&(this.insertBlock(n.blockName+"(ddd)",n,e),n.children.length&&n.hasDynamicChildren)){const t=this.target.code,e=n.children.slice();let o=e.shift();for(let n=i;n<t.length&&(!t[n].trimStart().startsWith(`const ${o.varName} `)||(t[n]=t[n].replace("const "+o.varName,o.varName),o=e.shift(),o));n++);this.addLine(`let ${n.children.map((t=>t.varName))};`,i)}}compileTEsc(t,e){let n,{block:o,forceNewBlock:r}=e;if("0"===t.expr?(this.helpers.add("zero"),n="ctx[zero]"):(n=Ye(t.expr),t.defaultValue&&(this.helpers.add("withDefault"),n=`withDefault(${n}, \`${t.defaultValue}\`)`)),!o||r)o=this.createBlock(o,"text",e),this.insertBlock(`text(${n})`,o,{...e,forceNewBlock:r&&!o});else{const t=o.insertData(n,"txt"),e=tn.createElement("block-text-"+t);o.insert(e)}}compileTOut(t,e){let{block:n}=e;n&&this.insertAnchor(n),n=this.createBlock(n,"html",e),this.helpers.add("0"===t.expr?"zero":"safeOutput");let o="0"===t.expr?"ctx[zero]":`safeOutput(${Ye(t.expr)})`;if(t.body){const n=rn.nextBlockId,r=sn(e);this.compileAST({type:3,content:t.body},r),this.helpers.add("withDefault"),o=`withDefault(${o}, b${n})`}this.insertBlock(""+o,n,e)}compileTIf(t,e,n){let{block:o,forceNewBlock:r,index:i}=e,s=i;const l=this.target.code.length,a=!o||"multi"!==o.type&&r;o&&(o.hasDynamicChildren=!0),(!o||"multi"!==o.type&&r)&&(o=this.createBlock(o,"multi",e)),this.addLine(`if (${Ye(t.condition)}) {`),this.target.indentLevel++,this.insertAnchor(o);const c=sn(e,{block:o,index:s});if(this.compileAST(t.content,c),this.target.indentLevel--,t.tElif)for(let n of t.tElif){this.addLine(`} else if (${Ye(n.condition)}) {`),this.target.indentLevel++,this.insertAnchor(o);const t=sn(e,{block:o,index:s});this.compileAST(n.content,t),this.target.indentLevel--}if(t.tElse){this.addLine("} else {"),this.target.indentLevel++,this.insertAnchor(o);const n=sn(e,{block:o,index:s});this.compileAST(t.tElse,n),this.target.indentLevel--}if(this.addLine("}"),a){if(o.children.length){const t=this.target.code,e=o.children.slice();let n=e.shift();for(let o=l;o<t.length&&(!t[o].trimStart().startsWith(`const ${n.varName} `)||(t[o]=t[o].replace("const "+n.varName,n.varName),n=e.shift(),n));o++);this.addLine(`let ${o.children.map((t=>t.varName))};`,l)}const t=o.children.map((t=>t.varName)).join(", ");this.insertBlock(`multi([${t}])`,o,e)}}compileTForeach(t,e){let{block:n}=e;n&&this.insertAnchor(n),n=this.createBlock(n,"list",e),this.target.loopLevel++;const o="i"+this.target.loopLevel;this.addLine("ctx = Object.create(ctx);");const r="v_block"+n.id,i="k_block"+n.id,s="l_block"+n.id,l="c_block"+n.id;let a;this.helpers.add("prepareList"),this.define(`[${i}, ${r}, ${s}, ${l}]`,`prepareList(${Ye(t.collection)});`),this.dev&&this.define("keys"+n.id,"new Set()"),this.addLine(`for (let ${o} = 0; ${o} < ${s}; ${o}++) {`),this.target.indentLevel++,this.addLine(`ctx[\`${t.elem}\`] = ${r}[${o}];`),t.hasNoFirst||this.addLine(`ctx[\`${t.elem}_first\`] = ${o} === 0;`),t.hasNoLast||this.addLine(`ctx[\`${t.elem}_last\`] = ${o} === ${r}.length - 1;`),t.hasNoIndex||this.addLine(`ctx[\`${t.elem}_index\`] = ${o};`),t.hasNoValue||this.addLine(`ctx[\`${t.elem}_value\`] = ${i}[${o}];`),this.define("key"+this.target.loopLevel,t.key?Ye(t.key):o),this.dev&&(this.addLine(`if (keys${n.id}.has(key${this.target.loopLevel})) { throw new Error(\`Got duplicate key in t-foreach: \${key${this.target.loopLevel}}\`)}`),this.addLine(`keys${n.id}.add(key${this.target.loopLevel});`)),t.memo&&(this.target.hasCache=!0,a=on(),this.define("memo"+a,Ye(t.memo)),this.define("vnode"+a,`cache[key${this.target.loopLevel}];`),this.addLine(`if (vnode${a}) {`),this.target.indentLevel++,this.addLine(`if (shallowEqual(vnode${a}.memo, memo${a})) {`),this.target.indentLevel++,this.addLine(`${l}[${o}] = vnode${a};`),this.addLine(`nextCache[key${this.target.loopLevel}] = vnode${a};`),this.addLine("continue;"),this.target.indentLevel--,this.addLine("}"),this.target.indentLevel--,this.addLine("}"));const c=sn(e,{block:n,index:o});this.compileAST(t.body,c),t.memo&&this.addLine(`nextCache[key${this.target.loopLevel}] = Object.assign(${l}[${o}], {memo: memo${a}});`),this.target.indentLevel--,this.target.loopLevel--,this.addLine("}"),e.isLast||this.addLine("ctx = ctx.__proto__;"),this.insertBlock("l",n,e)}compileTKey(t,e){const n=on("tKey_");this.define(n,Ye(t.expr)),e=sn(e,{tKeyExpr:n,block:e.block,index:e.index}),this.compileAST(t.content,e)}compileMulti(t,e){let{block:n,forceNewBlock:o}=e;const r=!n||o;let i=this.target.code.length;if(r){if(t.content.filter((t=>6!==t.type)).length<=1){for(let n of t.content)this.compileAST(n,e);return}n=this.createBlock(n,"multi",e)}let s=0;for(let o=0,r=t.content.length;o<r;o++){const i=t.content[o],l=6===i.type,a=sn(e,{block:n,index:s,forceNewBlock:!l,preventRoot:e.preventRoot,isLast:e.isLast&&o===r-1});this.compileAST(i,a),l||s++}if(r){if(n.hasDynamicChildren&&n.children.length){const t=this.target.code,e=n.children.slice();let o=e.shift();for(let n=i;n<t.length&&(!t[n].trimStart().startsWith(`const ${o.varName} `)||(t[n]=t[n].replace("const "+o.varName,o.varName),o=e.shift(),o));n++);this.addLine(`let ${n.children.map((t=>t.varName))};`,i)}const t=n.children.map((t=>t.varName)).join(", ");this.insertBlock(`multi([${t}])`,n,e)}}compileTCall(t,e){let{block:n,forceNewBlock:o}=e;if(t.body){this.addLine("ctx = Object.create(ctx);"),this.addLine("ctx[isBoundary] = 1;"),this.helpers.add("isBoundary");const n=rn.nextBlockId,o=sn(e,{preventRoot:!0});this.compileAST({type:3,content:t.body},o),n!==rn.nextBlockId&&(this.helpers.add("zero"),this.addLine(`ctx[zero] = b${n};`))}const r=Ze.test(t.name),i=r?Qe(t.name):"`"+t.name+"`";n&&(o||this.insertAnchor(n));const s=`key + \`${this.generateComponentKey()}\``;if(r){const t=on("template");this.staticDefs.find((t=>"call"===t.id))||this.staticDefs.push({id:"call",expr:"app.callTemplate.bind(app)"}),this.define(t,i),n=this.createBlock(n,"multi",e),this.insertBlock(`call(this, ${t}, ctx, node, ${s})`,n,{...e,forceNewBlock:!n})}else{const t=on("callTemplate_");this.staticDefs.push({id:t,expr:`app.getTemplate(${i})`}),n=this.createBlock(n,"multi",e),this.insertBlock(`${t}.call(this, ctx, node, ${s})`,n,{...e,forceNewBlock:!n})}t.body&&!e.isLast&&this.addLine("ctx = ctx.__proto__;")}compileTCallBlock(t,e){let{block:n,forceNewBlock:o}=e;n&&(o||this.insertAnchor(n)),n=this.createBlock(n,"multi",e),this.insertBlock(Ye(t.name),n,{...e,forceNewBlock:!n})}compileTSet(t,e){this.target.shouldProtectScope=!0,this.helpers.add("isBoundary").add("withDefault");const n=t.value?Ye(t.value||""):"null";if(t.body){this.helpers.add("LazyValue");const o={type:3,content:t.body};let r=`new LazyValue(${this.compileInNewTarget("value",o,e)}, ctx, node)`;r=t.value?r?`withDefault(${n}, ${r})`:n:r,this.addLine(`ctx[\`${t.name}\`] = ${r};`)}else{let e;e=t.defaultValue?t.value?`withDefault(${n}, \`${t.defaultValue}\`)`:`\`${t.defaultValue}\``:n,this.helpers.add("setContextValue"),this.addLine(`setContextValue(ctx, "${t.name}", ${e});`)}}generateComponentKey(){const t=[on("__")];for(let e=0;e<this.target.loopLevel;e++)t.push(`\${key${e+1}}`);return t.join("__")}formatProp(t,e){if(e=this.captureExpression(e),t.includes(".")){let[n,o]=t.split(".");if("bind"!==o)throw new Error("Invalid prop suffix");this.helpers.add("bind"),t=n,e=`bind(ctx, ${e||void 0})`}return`${t=/^[a-z_]+$/i.test(t)?t:`'${t}'`}: ${e||void 0}`}formatPropObject(t){return Object.entries(t).map((([t,e])=>this.formatProp(t,e)))}getPropString(t,e){let n=`{${t.join(",")}}`;return e&&(n=`Object.assign({}, ${Ye(e)}${t.length?", "+n:""})`),n}compileComponent(t,e){let{block:n}=e;const o="slots"in(t.props||{}),r=t.props?this.formatPropObject(t.props):[];let i="";if(t.slots){let n="ctx";!this.target.loopLevel&&this.hasSafeContext||(n=on("ctx"),this.helpers.add("capture"),this.define(n,"capture(ctx)"));let o=[];for(let r in t.slots){const i=t.slots[r],s=[];if(i.content){const t=this.compileInNewTarget("slot",i.content,e,i.on);s.push(`__render: ${t}, __ctx: ${n}`)}const l=t.slots[r].scope;l&&s.push(`__scope: "${l}"`),t.slots[r].attrs&&s.push(...this.formatPropObject(t.slots[r].attrs));const a=`{${s.join(", ")}}`;o.push(`'${r}': ${a}`)}i=`{${o.join(", ")}}`}!i||t.dynamicProps||o||(this.helpers.add("markRaw"),r.push(`slots: markRaw(${i})`));let s,l=this.getPropString(r,t.dynamicProps);(i&&(t.dynamicProps||o)||this.dev)&&(s=on("props"),this.define(s,l),l=s),i&&(t.dynamicProps||o)&&(this.helpers.add("markRaw"),this.addLine(`${s}.slots = markRaw(Object.assign(${i}, ${s}.slots))`));const a=this.generateComponentKey();let c;t.isDynamic?(c=on("Comp"),this.define(c,Ye(t.name))):c=`\`${t.name}\``,this.dev&&this.addLine(`helpers.validateProps(${c}, ${s}, ctx);`),n&&(!1===e.forceNewBlock||e.tKeyExpr)&&this.insertAnchor(n);let h=`key + \`${a}\``;e.tKeyExpr&&(h=`${e.tKeyExpr} + ${h}`);let u=on("comp");this.staticDefs.push({id:u,expr:`app.createComponent(${t.isDynamic?null:c}, ${!t.isDynamic}, ${!!t.slots}, ${!!t.dynamicProps}, ${!t.props&&!t.dynamicProps})`});let d=`${u}(${l}, ${h}, node, ctx, ${t.isDynamic?c:null})`;t.isDynamic&&(d=`toggler(${c}, ${d})`),t.on&&(d=this.wrapWithEventCatcher(d,t.on)),n=this.createBlock(n,"multi",e),this.insertBlock(d,n,e)}wrapWithEventCatcher(t,e){this.helpers.add("createCatcher");let n=on("catcher"),o={},r=[];for(let t in e){let n=on("hdlr"),i=r.push(n)-1;o[t]=i;const s=this.generateHandlerCode(t,e[t]);this.define(n,s)}return this.staticDefs.push({id:n,expr:`createCatcher(${JSON.stringify(o)})`}),`${n}(${t}, [${r.join(",")}])`}compileTSlot(t,e){this.helpers.add("callSlot");let n,o,{block:r}=e,i=!1;t.name.match(Ze)?(i=!0,o=Qe(t.name)):o="'"+t.name+"'";const s=t.attrs?t.attrs["t-props"]:null;t.attrs&&delete t.attrs["t-props"];const l=t.attrs?this.formatPropObject(t.attrs):[],a=this.getPropString(l,s);if(t.defaultContent){n=`callSlot(ctx, node, key, ${o}, ${i}, ${a}, ${this.compileInNewTarget("defaultContent",t.defaultContent,e)})`}else if(i){let t=on("slot");this.define(t,o),n=`toggler(${t}, callSlot(ctx, node, key, ${t}, ${i}, ${a}))`}else n=`callSlot(ctx, node, key, ${o}, ${i}, ${a})`;t.on&&(n=this.wrapWithEventCatcher(n,t.on)),r&&this.insertAnchor(r),r=this.createBlock(r,"multi",e),this.insertBlock(n,r,{...e,forceNewBlock:!1})}compileTTranslation(t,e){t.content&&this.compileAST(t.content,Object.assign({},e,{translate:!1}))}compileTPortal(t,e){this.staticDefs.find((t=>"Portal"===t.id))||this.staticDefs.push({id:"Portal",expr:"app.Portal"});let{block:n}=e;const o=this.compileInNewTarget("slot",t.content,e),r=this.generateComponentKey();let i="ctx";!this.target.loopLevel&&this.hasSafeContext||(i=on("ctx"),this.helpers.add("capture"),this.define(i,"capture(ctx)"));let s=on("comp");this.staticDefs.push({id:s,expr:"app.createComponent(null, false, true, false, false)"});const l=`${s}({target: ${Ye(t.target)},slots: {'default': {__render: ${o}, __ctx: ${i}}}}, key + \`${r}\`, node, ctx, Portal)`;n&&this.insertAnchor(n),n=this.createBlock(n,"multi",e),this.insertBlock(l,n,{...e,forceNewBlock:!1})}}const un=new WeakMap;function dn(t){if("string"==typeof t){return fn(function(t){const e=(new DOMParser).parseFromString(t,"text/xml");if(e.getElementsByTagName("parsererror").length){let n="Invalid XML in template.";const o=e.getElementsByTagName("parsererror")[0].textContent;if(o){n+="\nThe parser has produced the following error message:\n"+o;const e=/\d+/g,r=e.exec(o);if(r){const i=Number(r[0]),s=t.split("\n")[i-1],l=e.exec(o);if(s&&l){const t=Number(l[0])-1;s[t]&&(n+=`\nThe error might be located at xml line ${i} column ${t}\n${s}\n${"-".repeat(t-1)}^`)}}}throw new Error(n)}return e}(`<t>${t}</t>`).firstChild)}let e=un.get(t);return e||(e=fn(t.cloneNode(!0)),un.set(t,e)),e}function fn(t){var e;(function(t){let e=t.querySelectorAll("[t-elif], [t-else]");for(let t=0,n=e.length;t<n;t++){let n=e[t],o=n.previousElementSibling,r=t=>o.getAttribute(t),i=t=>+!!n.getAttribute(t);if(!o||!r("t-if")&&!r("t-elif"))throw new Error("t-elif and t-else directives must be preceded by a t-if or t-elif directive");{if(r("t-foreach"))throw new Error("t-if cannot stay at the same level as t-foreach when using t-elif or t-else");if(["t-if","t-elif","t-else"].map(i).reduce((function(t,e){return t+e}))>1)throw new Error("Only one conditional branching directive is allowed per node");let t;for(;(t=n.previousSibling)!==o;){if(t.nodeValue.trim().length&&8!==t.nodeType)throw new Error("text is not allowed between branching directives");t.remove()}}}})(e=t),function(t){const e=[...t.querySelectorAll("[t-esc]")].filter((t=>t.tagName[0]===t.tagName[0].toUpperCase()||t.hasAttribute("t-component")));for(const t of e){if(t.childNodes.length)throw new Error("Cannot have t-esc on a component that already has content");const e=t.getAttribute("t-esc");t.removeAttribute("t-esc");const n=t.ownerDocument.createElement("t");null!=e&&n.setAttribute("t-esc",e),t.appendChild(n)}}(e);return pn(t,{inPreTag:!1,inSVG:!1})||{type:0,value:""}}function pn(t,e){return t instanceof Element?function(t,e){if(t.hasAttribute("t-debug"))return t.removeAttribute("t-debug"),{type:12,content:pn(t,e)};if(t.hasAttribute("t-log")){const n=t.getAttribute("t-log");return t.removeAttribute("t-log"),{type:13,expr:n,content:pn(t,e)}}return null}(t,e)||function(t,e){if(!t.hasAttribute("t-foreach"))return null;const n=t.outerHTML,o=t.getAttribute("t-foreach");t.removeAttribute("t-foreach");const r=t.getAttribute("t-as")||"";t.removeAttribute("t-as");const i=t.getAttribute("t-key");if(!i)throw new Error(`"Directive t-foreach should always be used with a t-key!" (expression: t-foreach="${o}" t-as="${r}")`);t.removeAttribute("t-key");const s=t.getAttribute("t-memo")||"";t.removeAttribute("t-memo");const l=pn(t,e);if(!l)return null;const a=!n.includes("t-call"),c=a&&!n.includes(r+"_first"),h=a&&!n.includes(r+"_last"),u=a&&!n.includes(r+"_index"),d=a&&!n.includes(r+"_value");return{type:9,collection:o,elem:r,body:l,memo:s,key:i,hasNoFirst:c,hasNoLast:h,hasNoIndex:u,hasNoValue:d}}(t,e)||function(t,e){if(!t.hasAttribute("t-if"))return null;const n=t.getAttribute("t-if");t.removeAttribute("t-if");const o=pn(t,e)||{type:0,value:""};let r=t.nextElementSibling;const i=[];for(;r&&r.hasAttribute("t-elif");){const t=r.getAttribute("t-elif");r.removeAttribute("t-elif");const n=pn(r,e),o=r.nextElementSibling;r.remove(),r=o,n&&i.push({condition:t,content:n})}let s=null;r&&r.hasAttribute("t-else")&&(r.removeAttribute("t-else"),s=pn(r,e),r.remove());return{type:5,condition:n,content:o,tElif:i.length?i:null,tElse:s}}(t,e)||function(t,e){if(!t.hasAttribute("t-portal"))return null;const n=t.getAttribute("t-portal");t.removeAttribute("t-portal");const o=pn(t,e);if(!o)return{type:0,value:""};return{type:17,target:n,content:o}}(t,e)||function(t,e){if(!t.hasAttribute("t-call"))return null;const n=t.getAttribute("t-call");if(t.removeAttribute("t-call"),"t"!==t.tagName){const o=pn(t,e),r={type:7,name:n,body:null};if(o&&2===o.type)return o.content=[r],o;if(o&&11===o.type)return{...o,slots:{default:{content:r,scope:null,on:null,attrs:null}}}}const o=xn(t,e);return{type:7,name:n,body:o.length?o:null}}(t,e)||function(t,e){if(!t.hasAttribute("t-call-block"))return null;return{type:15,name:t.getAttribute("t-call-block")}}(t)||function(t,e){if(!t.hasAttribute("t-esc"))return null;const n=t.getAttribute("t-esc");t.removeAttribute("t-esc");const o={type:4,expr:n,defaultValue:t.textContent||""};let r=t.getAttribute("t-ref");t.removeAttribute("t-ref");const i=pn(t,e);if(!i)return o;if(2===i.type)return{...i,ref:r,content:[o]};if(11===i.type)throw new Error("t-esc is not supported on Component nodes");return o}(t,e)||function(t,e){if(!t.hasAttribute("t-key"))return null;const n=t.getAttribute("t-key");t.removeAttribute("t-key");const o=pn(t,e);if(!o)return null;return{type:10,expr:n,content:o}}(t,e)||function(t,e){if("off"!==t.getAttribute("t-translation"))return null;return t.removeAttribute("t-translation"),{type:16,content:pn(t,e)}}(t,e)||function(t,e){if(!t.hasAttribute("t-slot"))return null;const n=t.getAttribute("t-slot");t.removeAttribute("t-slot");let o=null,r=null;for(let e of t.getAttributeNames()){const n=t.getAttribute(e);e.startsWith("t-on-")?(r=r||{},r[e.slice(5)]=n):(o=o||{},o[e]=n)}return{type:14,name:n,attrs:o,on:r,defaultContent:kn(t,e)}}(t,e)||function(t,e){if(!t.hasAttribute("t-out")&&!t.hasAttribute("t-raw"))return null;t.hasAttribute("t-raw")&&console.warn('t-raw has been deprecated in favor of t-out. If the value to render is not wrapped by the "markup" function, it will be escaped');const n=t.getAttribute("t-out")||t.getAttribute("t-raw");t.removeAttribute("t-out"),t.removeAttribute("t-raw");const o={type:8,expr:n,body:null},r=t.getAttribute("t-ref");t.removeAttribute("t-ref");const i=pn(t,e);if(!i)return o;if(2===i.type)return o.body=i.content.length?i.content:null,{...i,ref:r,content:[o]};return o}(t,e)||function(t,e){let n=t.tagName;const o=n[0];let r=t.hasAttribute("t-component");if(r&&"t"!==n)throw new Error(`Directive 't-component' can only be used on <t> nodes (used on a <${n}>)`);if(o!==o.toUpperCase()&&!r)return null;r&&(n=t.getAttribute("t-component"),t.removeAttribute("t-component"));const i=t.getAttribute("t-props");t.removeAttribute("t-props");const s=t.getAttribute("t-slot-scope");t.removeAttribute("t-slot-scope");let l=null,a=null;for(let e of t.getAttributeNames()){const n=t.getAttribute(e);if(e.startsWith("t-")){if(!e.startsWith("t-on-")){const t=wn.get(e.split("-").slice(0,2).join("-"));throw new Error(t||"unsupported directive on Component: "+e)}l=l||{},l[e.slice(5)]=n}else a=a||{},a[e]=n}let c=null;if(t.hasChildNodes()){const n=t.cloneNode(!0),o=Array.from(n.querySelectorAll("[t-set-slot]"));for(let t of o){if("t"!==t.tagName)throw new Error(`Directive 't-set-slot' can only be used on <t> nodes (used on a <${t.tagName}>)`);const o=t.getAttribute("t-set-slot");let r=t.parentElement,i=!1;for(;r!==n;){if(r.hasAttribute("t-component")||r.tagName[0]===r.tagName[0].toUpperCase()){i=!0;break}r=r.parentElement}if(i)continue;t.removeAttribute("t-set-slot"),t.remove();const s=pn(t,e);let l=null,a=null,h=null;for(let e of t.getAttributeNames()){const n=t.getAttribute(e);"t-slot-scope"!==e?e.startsWith("t-on-")?(l=l||{},l[e.slice(5)]=n):(a=a||{},a[e]=n):h=n}c=c||{},c[o]={content:s,on:l,attrs:a,scope:h}}const r=kn(n,e);r&&(c=c||{},c.default={content:r,on:l,attrs:null,scope:s})}return{type:11,name:n,isDynamic:r,dynamicProps:i,props:a,slots:c,on:l}}(t,e)||function(t,e){const{tagName:n}=t,o=t.getAttribute("t-tag");if(t.removeAttribute("t-tag"),"t"===n&&!o)return null;if(n.startsWith("block-"))throw new Error(`Invalid tag name: '${n}'`);e=Object.assign({},e),"pre"===n&&(e.inPreTag=!0);const r=vn.has(n)&&!e.inSVG;e.inSVG=e.inSVG||r;const i=r?"http://www.w3.org/2000/svg":null,s=t.getAttribute("t-ref");t.removeAttribute("t-ref");const l=t.getAttributeNames();let a=null,c=null,h=null;for(let o of l){const r=t.getAttribute(o);if(o.startsWith("t-on")){if("t-on"===o)throw new Error("Missing event name with t-on directive");c=c||{},c[o.slice(5)]=r}else if(o.startsWith("t-model")){if(!["input","select","textarea"].includes(n))throw new Error("The t-model directive only works with <input>, <textarea> and <select>");let i,s;if(gn.test(r)){const t=r.lastIndexOf(".");i=r.slice(0,t),s=`'${r.slice(t+1)}'`}else{if(!yn.test(r))throw new Error(`Invalid t-model expression: "${r}" (it should be assignable)`);{const t=r.lastIndexOf("[");i=r.slice(0,t),s=r.slice(t+1,-1)}}const l=t.getAttribute("type"),a="input"===n,c="select"===n,u="textarea"===n,d=a&&"checkbox"===l,f=a&&"radio"===l,p=a&&!d&&!f,m=o.includes(".lazy"),b=o.includes(".number");h={baseExpr:i,expr:s,targetAttr:d?"checked":"value",specialInitTargetAttr:f?"checked":null,eventType:f?"click":c||m?"change":"input",hasDynamicChildren:!1,shouldTrim:o.includes(".trim")&&(p||u),shouldNumberize:b&&(p||u)},c&&((e=Object.assign({},e)).tModelInfo=h)}else{if(o.startsWith("block-"))throw new Error(`Invalid attribute: '${o}'`);if("t-name"!==o){if(o.startsWith("t-")&&!o.startsWith("t-att"))throw new Error(`Unknown QWeb directive: '${o}'`);const t=e.tModelInfo;t&&["t-att-value","t-attf-value"].includes(o)&&(t.hasDynamicChildren=!0),a=a||{},a[o]=r}}}const u=xn(t,e);return{type:2,tag:n,dynamicTag:o,attrs:a,on:c,ref:s,content:u,model:h,ns:i}}(t,e)||function(t,e){if(!t.hasAttribute("t-set"))return null;const n=t.getAttribute("t-set"),o=t.getAttribute("t-value")||null,r=t.innerHTML===t.textContent&&t.textContent||null;let i=null;t.textContent!==t.innerHTML&&(i=xn(t,e));return{type:6,name:n,value:o,defaultValue:r,body:i}}(t,e)||function(t,e){if("t"!==t.tagName)return null;return kn(t,e)}(t,e):function(t,e){if(t.nodeType===Node.TEXT_NODE){let n=t.textContent||"";if(!e.inPreTag){if(mn.test(n)&&!n.trim())return null;n=n.replace(bn," ")}return{type:0,value:n}}if(t.nodeType===Node.COMMENT_NODE)return{type:1,value:t.textContent||""};return null}(t,e)}const mn=/[\r\n]/,bn=/\s+/g;const gn=/\.[\w_]+\s*$/,yn=/\[[^\[]+\]\s*$/,vn=new Set(["svg","g","path"]);const wn=new Map([["t-ref","t-ref is no longer supported on components. Consider exposing only the public part of the component's API through a callback prop."],["t-att","t-att makes no sense on component: props are already treated as expressions"],["t-attf","t-attf is not supported on components: use template strings for string interpolation in props"]]);function xn(t,e){const n=[];for(let o of t.childNodes){const t=pn(o,e);t&&(3===t.type?n.push(...t.content):n.push(t))}return n}function kn(t,e){const n=xn(t,e);switch(n.length){case 0:return null;case 1:return n[0];default:return{type:3,content:n}}}class $n{constructor(){this.tasks=new Set,this.frame=0,this.delayedRenders=[],this.requestAnimationFrame=$n.requestAnimationFrame}addFiber(t){this.tasks.add(t.root)}flush(){if(this.delayedRenders.length){let t=this.delayedRenders;this.delayedRenders=[];for(let e of t)e.root&&2!==e.node.status&&e.node.fiber===e&&e.render()}0===this.frame&&(this.frame=this.requestAnimationFrame((()=>{this.frame=0,this.tasks.forEach((t=>this.processFiber(t)));for(let t of this.tasks)2===t.node.status&&this.tasks.delete(t)})))}processFiber(t){if(t.root!==t)return void this.tasks.delete(t);const e=kt.has(t);e&&0!==t.counter?this.tasks.delete(t):2!==t.node.status?0===t.counter&&(e||t.complete(),this.tasks.delete(t)):this.tasks.delete(t)}}$n.requestAnimationFrame=window.requestAnimationFrame.bind(window);let Nn=!1;class En extends je{constructor(t,e={}){super(e),this.scheduler=new $n,this.root=null,this.Root=t,e.test&&(this.dev=!0),this.warnIfNoStaticProps=e.warnIfNoStaticProps||!1,!this.dev||e.test||Nn||(console.info(`Owl is running in 'dev' mode.\n\nThis is not suitable for production use.\nSee https://github.com/odoo/owl/blob/${window.owl?window.owl.__info__.hash:"master"}/doc/reference/app.md#configuration for more information.`),Nn=!0);const n=e.env||{},o=Object.getOwnPropertyDescriptors(n);this.env=Object.freeze(Object.create(Object.getPrototypeOf(n),o)),this.props=e.props||{}}mount(t,e){En.validateTarget(t),this.dev&&Oe(this.Root,this.props,{__owl__:{app:this}});const n=this.makeNode(this.Root,this.props),o=this.mountNode(n,t,e);return this.root=n,o}makeNode(t,e){return new he(t,e,this,null,null)}mountNode(t,e,n){const o=new Promise(((e,n)=>{let o=!1;t.mounted.push((()=>{e(t.component),o=!0}));let r=$t.get(t);r||(r=[],$t.set(t,r)),r.unshift((t=>{throw o?console.error(t):n(t),t}))}));return t.mountComponent(e,n),o}destroy(){this.root&&(this.scheduler.flush(),this.root.destroy())}createComponent(t,e,n,o,r){const i=!e;const s=n?(t,e)=>!0:r?(t,e)=>!1:function(t,e){for(let n in t)if(t[n]!==e[n])return!0;return o&&Object.keys(t).length!==Object.keys(e).length},l=he.prototype.updateAndRender,a=he.prototype.initiateRender;return(n,o,r,c,h)=>{let u=r.children,d=u[o];d&&(2===d.status||i&&d.component.constructor!==h)&&(d=void 0);const f=r.fiber;if(d)(s(d.props,n)||f.deep||d.forceNextRender)&&(d.forceNextRender=!1,l.call(d,n,f));else{if(e){if(!(h=c.constructor.components[t]))throw new Error(`Cannot find the definition of component "${t}"`);if(!(h.prototype instanceof be))throw new Error(`"${t}" is not a Component. It must inherit from the Component class`)}d=new he(h,n,this,r,o),u[o]=d,a.call(d,new _t(d,f))}return f.childrenMap[o]=d,d}}}function An(t,e){const n=Object.create(t),o=Object.getOwnPropertyDescriptors(e);return Object.freeze(Object.defineProperties(n,o))}function Tn(t){const e=se();e.childEnv=An(e.childEnv,t)}En.validateTarget=function(t){if(!(t instanceof HTMLElement))throw new Error("Cannot mount component: the target is not a valid DOM element");if(!document.body.contains(t))throw new Error("Cannot mount a component on a detached dom node")},n.shouldNormalizeDom=!1,n.mainEventHandler=(t,n,o)=>{const{data:r,modifiers:i}=e(t);t=r;let s=!1;if(i.length){let t=!1;const e=n.target===o;for(const o of i)switch(o){case"self":if(t=!0,e)continue;return s;case"prevent":(t&&e||!t)&&n.preventDefault();continue;case"stop":(t&&e||!t)&&n.stopPropagation(),s=!0;continue}}if(Object.hasOwnProperty.call(t,0)){const e=t[0];if("function"!=typeof e)throw new Error(`Invalid handler (expected a function, received: '${e}')`);let o=t[1]?t[1].__owl__:null;o&&1!==o.status||e.call(o?o.component:null,n)}return s};const _n={config:n,mount:xt,patch:function(t,e,n=!1){t.patch(e,n)},remove:function(t,e=!1){e&&t.beforeRemove(),t.remove()},list:pt,multi:R,text:z,toggler:r,createBlock:tt,html:wt,comment:K},Sn={};je.prototype._compileTemplate=function(t,e){return function(t,e={}){const n=dn(t),o=t instanceof Node?!(t instanceof Element)||null===t.querySelector("[t-set], [t-call]"):!t.includes("t-set")&&!t.includes("t-call"),r=new hn(n,{...e,hasSafeContext:o}).generateCode();return new Function("app, bdom, helpers",r)}(e,{name:t,dev:this.dev,translateFn:this.translateFn,translatableAttributes:this.translatableAttributes})},t.App=En,t.Component=be,t.EventBus=oe,t.__info__=Sn,t.blockDom=_n,t.loadFile=async function(t){const e=await fetch(t);if(!e.ok)throw new Error("Error while fetching xml templates");return await e.text()},t.markRaw=Ft,t.markup=function(t){return new re(t)},t.mount=async function(t,e,n={}){return new En(t,n).mount(e,n)},t.onError=function(t){const e=se();let n=$t.get(e);n||(n=[],$t.set(e,n)),n.push(t.bind(e.component))},t.onMounted=fe,t.onPatched=pe,t.onRendered=function(t){const e=se(),n=e.renderFn,o=e.app.dev?de:t=>t;t=o(t.bind(e.component),"onRendered"),e.renderFn=()=>{const e=n();return t(),e}},t.onWillDestroy=function(t){const e=se(),n=e.app.dev?de:t=>t;e.willDestroy.push(n(t.bind(e.component),"onWillDestroy"))},t.onWillPatch=function(t){const e=se(),n=e.app.dev?de:t=>t;e.willPatch.unshift(n(t.bind(e.component),"onWillPatch"))},t.onWillRender=function(t){const e=se(),n=e.renderFn,o=e.app.dev?de:t=>t;t=o(t.bind(e.component),"onWillRender"),e.renderFn=()=>(t(),n())},t.onWillStart=function(t){const e=se(),n=e.app.dev?de:t=>t;e.willStart.push(n(t.bind(e.component),"onWillStart"))},t.onWillUnmount=me,t.onWillUpdateProps=function(t){const e=se(),n=e.app.dev?de:t=>t;e.willUpdateProps.push(n(t.bind(e.component),"onWillUpdateProps"))},t.reactive=Xt,t.status=function(t){switch(t.__owl__.status){case 0:return"new";case 1:return"mounted";case 2:return"destroyed"}},t.toRaw=Vt,t.useChildSubEnv=Tn,t.useComponent=function(){return ie.component},t.useEffect=function(t,e=(()=>[NaN])){let n,o;fe((()=>{o=e(),n=t(...o)})),pe((()=>{const r=e();r.some(((t,e)=>t!==o[e]))&&(o=r,n&&n(),n=t(...o))})),me((()=>n&&n()))},t.useEnv=function(){return se().component.env},t.useExternalListener=function(t,e,n,o){const r=se(),i=n.bind(r.component);fe((()=>t.addEventListener(e,i,o))),me((()=>t.removeEventListener(e,i,o)))},t.useRef=function(t){const e=se().refs;return{get el(){return e[t]||null}}},t.useState=ce,t.useSubEnv=function(t){const e=se();e.component.env=An(e.component.env,t),Tn(t)},t.validate=function(t,e){let n=Ae(t,e);if(n.length)throw new Error("Invalid object: "+n.join(", "))},t.whenReady=function(t){return new Promise((function(t){"loading"!==document.readyState?t(!0):document.addEventListener("DOMContentLoaded",t,!1)})).then(t||function(){})},t.xml=We,Object.defineProperty(t,"__esModule",{value:!0}),Sn.version="2.0.0-beta-10",Sn.date="2022-06-22T08:33:26.205Z",Sn.hash="2e03332",Sn.url="https://github.com/odoo/owl"}(this.owl=this.owl||{});
1
+ !function(t){"use strict";function e(t){t=t.slice();const e=[];let n;for(;(n=t[0])&&"string"==typeof n;)e.push(t.shift());return{modifiers:e,data:t}}const n={shouldNormalizeDom:!0,mainEventHandler:(t,n,o)=>("function"==typeof t?t(n):Array.isArray(t)&&(t=e(t).data)[0](t[1],n),!1)};class o{constructor(t,e){this.key=t,this.child=e}mount(t,e){this.parentEl=t,this.child.mount(t,e)}moveBefore(t,e){this.child.moveBefore(t?t.child:null,e)}patch(t,e){if(this===t)return;let n=this.child,o=t.child;this.key===t.key?n.patch(o,e):(o.mount(this.parentEl,n.firstNode()),e&&n.beforeRemove(),n.remove(),this.child=o,this.key=t.key)}beforeRemove(){this.child.beforeRemove()}remove(){this.child.remove()}firstNode(){return this.child.firstNode()}toString(){return this.child.toString()}}function r(t,e){return new o(t,e)}const{setAttribute:i,removeAttribute:s}=Element.prototype,l=DOMTokenList.prototype,a=l.add,c=l.remove,h=Array.isArray,{split:u,trim:d}=String.prototype,f=/\s+/;function p(t,e){switch(e){case!1:case void 0:s.call(this,t);break;case!0:i.call(this,t,"");break;default:i.call(this,t,e)}}function m(t){return function(e){p.call(this,t,e)}}function b(t){if(h(t))p.call(this,t[0],t[1]);else for(let e in t)p.call(this,e,t[e])}function g(t,e){if(h(t)){const n=t[0],o=t[1];if(n===e[0]){if(o===e[1])return;p.call(this,n,o)}else s.call(this,e[0]),p.call(this,n,o)}else{for(let n in e)n in t||s.call(this,n);for(let n in t){const o=t[n];o!==e[n]&&p.call(this,n,o)}}}function y(t){const e={};switch(typeof t){case"string":const n=d.call(t);if(!n)return{};let o=u.call(n,f);for(let t=0,n=o.length;t<n;t++)e[o[t]]=!0;return e;case"object":for(let n in t){const o=t[n];if(o){if(n=d.call(n),!n)continue;const t=u.call(n,f);for(let n of t)e[n]=o}}return e;case"undefined":return{};case"number":return{[t]:!0};default:return{[t]:!0}}}function v(t){t=""===t?{}:y(t);const e=this.classList;for(let n in t)a.call(e,n)}function w(t,e){e=""===e?{}:y(e),t=""===t?{}:y(t);const n=this.classList;for(let o in e)o in t||c.call(n,o);for(let o in t)o in e||a.call(n,o)}function x(t){return function(e){this[t]=0===e?0:e||""}}function k(t,e){switch(t){case"input":return"checked"===e||"indeterminate"===e||"value"===e||"readonly"===e||"disabled"===e;case"option":return"selected"===e||"disabled"===e;case"textarea":return"value"===e||"readonly"===e||"disabled"===e;case"select":return"value"===e||"disabled"===e;case"button":case"optgroup":return"disabled"===e}return!1}function $(t){const e=t.split(".")[0],o=t.includes(".capture");return t.includes(".synthetic")?function(t,e=!1){let o="__event__synthetic_"+t;e&&(o+="_capture");!function(t,e,o=!1){if(A[e])return;document.addEventListener(t,(t=>function(t,e){let o=e.target;for(;null!==o;){const r=o[t];if(r)for(const t of Object.values(r)){if(n.mainEventHandler(t,e,o))return}o=o.parentNode}}(e,t)),{capture:o}),A[e]=!0}(t,o,e);const r=E++;function i(t){const e=this[o]||{};e[r]=t,this[o]=e}function s(){delete this[o]}return{setup:i,update:i,remove:s}}(e,o):function(t,e=!1){let o=`__event__${t}_${N++}`;e&&(o+="_capture");function r(t){const e=t.currentTarget;if(!e||!document.contains(e))return;const r=e[o];r&&n.mainEventHandler(r,t,e)}function i(n){this[o]=n,this.addEventListener(t,r,{capture:e})}function s(){delete this[o],this.removeEventListener(t,r,{capture:e})}function l(t){this[o]=t}return{setup:i,update:l,remove:s}}(e,o)}let N=1;let E=1;const A={};const T=Node.prototype,_=T.insertBefore,S=(C=T,D="textContent",Object.getOwnPropertyDescriptor(C,D)).set;var C,D;const L=T.removeChild;class B{constructor(t){this.children=t}mount(t,e){const n=this.children,o=n.length,r=new Array(o);for(let i=0;i<o;i++){let o=n[i];if(o)o.mount(t,e);else{const n=document.createTextNode("");r[i]=n,_.call(t,n,e)}}this.anchors=r,this.parentEl=t}moveBefore(t,e){if(t){const n=t.children[0];e=(n?n.firstNode():t.anchors[0])||null}const n=this.children,o=this.parentEl,r=this.anchors;for(let t=0,i=n.length;t<i;t++){let i=n[t];if(i)i.moveBefore(null,e);else{const n=r[t];_.call(o,n,e)}}}patch(t,e){if(this===t)return;const n=this.children,o=t.children,r=this.anchors,i=this.parentEl;for(let t=0,s=n.length;t<s;t++){const s=n[t],l=o[t];if(s)if(l)s.patch(l,e);else{const o=s.firstNode(),l=document.createTextNode("");r[t]=l,_.call(i,l,o),e&&s.beforeRemove(),s.remove(),n[t]=void 0}else if(l){n[t]=l;const e=r[t];l.mount(i,e),L.call(i,e)}}}beforeRemove(){const t=this.children;for(let e=0,n=t.length;e<n;e++){const n=t[e];n&&n.beforeRemove()}}remove(){const t=this.parentEl;if(this.isOnlyChild)S.call(t,"");else{const e=this.children,n=this.anchors;for(let o=0,r=e.length;o<r;o++){const r=e[o];r?r.remove():L.call(t,n[o])}}}firstNode(){const t=this.children[0];return t?t.firstNode():this.anchors[0]}toString(){return this.children.map((t=>t?t.toString():"")).join("")}}function O(t){return new B(t)}const R=Node.prototype,P=CharacterData.prototype,I=R.insertBefore,j=((t,e)=>Object.getOwnPropertyDescriptor(t,e))(P,"data").set,M=R.removeChild;class W{constructor(t){this.text=t}mountNode(t,e,n){this.parentEl=e,I.call(e,t,n),this.el=t}moveBefore(t,e){const n=t?t.el:e;I.call(this.parentEl,this.el,n)}beforeRemove(){}remove(){M.call(this.parentEl,this.el)}firstNode(){return this.el}toString(){return this.text}}class F extends W{mount(t,e){this.mountNode(document.createTextNode(H(this.text)),t,e)}patch(t){const e=t.text;this.text!==e&&(j.call(this.el,H(e)),this.text=e)}}class V extends W{mount(t,e){this.mountNode(document.createComment(H(this.text)),t,e)}patch(){}}function z(t){return new F(t)}function K(t){return new V(t)}function H(t){switch(typeof t){case"string":return t;case"number":return String(t);case"boolean":return t?"true":"false";default:return t||""}}const U=(t,e)=>Object.getOwnPropertyDescriptor(t,e),q=Node.prototype,G=Element.prototype,X=U(CharacterData.prototype,"data").set,Y=U(q,"firstChild").get,Z=U(q,"nextSibling").get,J=()=>{},Q={};function tt(t){if(t in Q)return Q[t];const e=(new DOMParser).parseFromString(`<t>${t}</t>`,"text/xml").firstChild.firstChild;n.shouldNormalizeDom&&et(e);const o=nt(e),r=it(o),i=function(t,e){let n=function(t,e){const{refN:n,collectors:o,children:r}=e,i=o.length;e.locations.sort(((t,e)=>t.idx-e.idx));const s=e.locations.map((t=>({refIdx:t.refIdx,setData:t.setData,updateData:t.updateData}))),l=s.length,a=r.length,c=r,h=n>0,u=q.cloneNode,d=q.insertBefore,f=G.remove;class p{constructor(t){this.data=t}beforeRemove(){}remove(){f.call(this.el)}firstNode(){return this.el}moveBefore(t,e){const n=t?t.el:e;d.call(this.parentEl,this.el,n)}toString(){const t=document.createElement("div");return this.mount(t,null),t.innerHTML}mount(e,n){const o=u.call(t,!0);d.call(e,o,n),this.el=o,this.parentEl=e}patch(t,e){}}h&&(p.prototype.mount=function(e,r){const h=u.call(t,!0),f=new Array(n);this.refs=f,f[0]=h;for(let t=0;t<i;t++){const e=o[t];f[e.idx]=e.getVal.call(f[e.prevIdx])}if(l){const t=this.data;for(let e=0;e<l;e++){const n=s[e];n.setData.call(f[n.refIdx],t[e])}}if(d.call(e,h,r),a){const t=this.children;for(let e=0;e<a;e++){const n=t[e];if(n){const t=c[e],o=t.afterRefIdx?f[t.afterRefIdx]:null;n.isOnlyChild=t.isOnlyChild,n.mount(f[t.parentRefIdx],o)}}}this.el=h,this.parentEl=e},p.prototype.patch=function(t,e){if(this===t)return;const n=this.refs;if(l){const e=this.data,o=t.data;for(let t=0;t<l;t++){const r=e[t],i=o[t];if(r!==i){const e=s[t];e.updateData.call(n[e.refIdx],i,r)}}this.data=o}if(a){let o=this.children;const r=t.children;for(let t=0;t<a;t++){const i=o[t],s=r[t];if(i)s?i.patch(s,e):(e&&i.beforeRemove(),i.remove(),o[t]=void 0);else if(s){const e=c[t],r=e.afterRefIdx?n[e.afterRefIdx]:null;s.mount(n[e.parentRefIdx],r),o[t]=s}}}});return p}(t,e);if(e.cbRefs.length){const t=e.cbRefs,o=e.refList;let r=t.length;n=class extends n{mount(t,e){o.push(new Array(r)),super.mount(t,e);for(let t of o.pop())t()}remove(){super.remove();for(let e of t){(0,this.data[e])(null)}}}}if(e.children.length)return n=class extends n{constructor(t,e){super(t),this.children=e}},n.prototype.beforeRemove=B.prototype.beforeRemove,(t,e=[])=>new n(t,e);return t=>new n(t)}(o.el,r);return Q[t]=i,i}function et(t){if(t.nodeType!==Node.TEXT_NODE||/\S/.test(t.textContent)){if(t.nodeType!==Node.ELEMENT_NODE||"pre"!==t.tagName)for(let e=t.childNodes.length-1;e>=0;--e)et(t.childNodes.item(e))}else t.remove()}function nt(t,e=null,n=null){switch(t.nodeType){case Node.ELEMENT_NODE:{let o=n&&n.currentNS;const r=t.tagName;let i=void 0;const s=[];if(r.startsWith("block-text-")){const t=parseInt(r.slice(11),10);s.push({type:"text",idx:t}),i=document.createTextNode("")}if(r.startsWith("block-child-")){n.isRef||ot(n);const t=parseInt(r.slice(12),10);s.push({type:"child",idx:t}),i=document.createTextNode("")}const l=t.attributes,a=l.getNamedItem("block-ns");if(a&&(l.removeNamedItem("block-ns"),o=a.value),i||(i=o?document.createElementNS(o,r):document.createElement(r)),i instanceof Element)for(let t=0;t<l.length;t++){const e=l[t].name,n=l[t].value;if(e.startsWith("block-handler-")){const t=parseInt(e.slice(14),10);s.push({type:"handler",idx:t,event:n})}else if(e.startsWith("block-attribute-")){const t=parseInt(e.slice(16),10);s.push({type:"attribute",idx:t,name:n,tag:r})}else"block-attributes"===e?s.push({type:"attributes",idx:parseInt(n,10)}):"block-ref"===e?s.push({type:"ref",idx:parseInt(n,10)}):i.setAttribute(l[t].name,n)}const c={parent:e,firstChild:null,nextSibling:null,el:i,info:s,refN:0,currentNS:o};if(t.firstChild){const e=t.childNodes[0];if(1===t.childNodes.length&&e.nodeType===Node.ELEMENT_NODE&&e.tagName.startsWith("block-child-")){const t=e.tagName,n=parseInt(t.slice(12),10);s.push({idx:n,type:"child",isOnlyChild:!0})}else{c.firstChild=nt(t.firstChild,c,c),i.appendChild(c.firstChild.el);let e=t.firstChild,n=c.firstChild;for(;e=e.nextSibling;)n.nextSibling=nt(e,n,c),i.appendChild(n.nextSibling.el),n=n.nextSibling}}return c.info.length&&ot(c),c}case Node.TEXT_NODE:case Node.COMMENT_NODE:return{parent:e,firstChild:null,nextSibling:null,el:t.nodeType===Node.TEXT_NODE?document.createTextNode(t.textContent):document.createComment(t.textContent),info:[],refN:0,currentNS:null}}throw new Error("boom")}function ot(t){t.isRef=!0;do{t.refN++}while(t=t.parent)}function rt(t){let e=t.parent;for(;e&&e.nextSibling===t;)t=e,e=e.parent;return e}function it(t,e,n){if(!e){e={collectors:[],locations:[],children:new Array(t.info.filter((t=>"child"===t.type)).length),cbRefs:[],refN:t.refN,refList:[]},n=0}if(t.refN){const o=n,r=t.isRef,i=t.firstChild?t.firstChild.refN:0,s=t.nextSibling?t.nextSibling.refN:0;if(r){for(let e of t.info)e.refIdx=o;t.refIdx=o,function(t,e){for(let n of e.info)switch(n.type){case"text":t.locations.push({idx:n.idx,refIdx:n.refIdx,setData:st,updateData:st});break;case"child":n.isOnlyChild?t.children[n.idx]={parentRefIdx:n.refIdx,isOnlyChild:!0}:t.children[n.idx]={parentRefIdx:rt(e).refIdx,afterRefIdx:n.refIdx};break;case"attribute":{const e=n.refIdx;let o,r;if(k(n.tag,n.name)){const t=x(n.name);r=t,o=t}else"class"===n.name?(r=v,o=w):(r=m(n.name),o=r);t.locations.push({idx:n.idx,refIdx:e,setData:r,updateData:o});break}case"attributes":t.locations.push({idx:n.idx,refIdx:n.refIdx,setData:b,updateData:g});break;case"handler":{const{setup:e,update:o}=$(n.event);t.locations.push({idx:n.idx,refIdx:n.refIdx,setData:e,updateData:o});break}case"ref":const o=t.cbRefs.push(n.idx)-1;t.locations.push({idx:n.idx,refIdx:n.refIdx,setData:lt(o,t.refList),updateData:J})}}(e,t),n++}if(s){const r=n+i;e.collectors.push({idx:r,prevIdx:o,getVal:Z}),it(t.nextSibling,e,r)}i&&(e.collectors.push({idx:n,prevIdx:o,getVal:Y}),it(t.firstChild,e,n))}return e}function st(t){X.call(this,H(t))}function lt(t,e){return function(n){e[e.length-1][t]=()=>n(this)}}const at=Node.prototype,ct=at.insertBefore,ht=at.appendChild,ut=at.removeChild,dt=((t,e)=>Object.getOwnPropertyDescriptor(t,e))(at,"textContent").set;class ft{constructor(t){this.children=t}mount(t,e){const n=this.children,o=document.createTextNode("");this.anchor=o,ct.call(t,o,e);const r=n.length;if(r){const e=n[0].mount;for(let i=0;i<r;i++)e.call(n[i],t,o)}this.parentEl=t}moveBefore(t,e){if(t){const n=t.children[0];e=(n?n.firstNode():t.anchor)||null}const n=this.children;for(let t=0,o=n.length;t<o;t++)n[t].moveBefore(null,e);this.parentEl.insertBefore(this.anchor,e)}patch(t,e){if(this===t)return;const n=this.children,o=t.children;if(0===o.length&&0===n.length)return;this.children=o;const r=o[0]||n[0],{mount:i,patch:s,remove:l,beforeRemove:a,moveBefore:c,firstNode:h}=r,u=this.anchor,d=this.isOnlyChild,f=this.parentEl;if(0===o.length&&d){if(e)for(let t=0,e=n.length;t<e;t++)a.call(n[t]);return dt.call(f,""),void ht.call(f,u)}let p=0,m=0,b=n[0],g=o[0],y=n.length-1,v=o.length-1,w=n[y],x=o[v],k=void 0;for(;p<=y&&m<=v;){if(null===b){b=n[++p];continue}if(null===w){w=n[--y];continue}let t=b.key,r=g.key;if(t===r){s.call(b,g,e),o[m]=b,b=n[++p],g=o[++m];continue}let l=w.key,a=x.key;if(l===a){s.call(w,x,e),o[v]=w,w=n[--y],x=o[--v];continue}if(t===a){s.call(b,x,e),o[v]=b;const t=o[v+1];c.call(b,t,u),b=n[++p],x=o[--v];continue}if(l===r){s.call(w,g,e),o[m]=w;const t=n[p];c.call(w,t,u),w=n[--y],g=o[++m];continue}k=k||mt(n,p,y);let d=k[r];if(void 0===d)i.call(g,f,h.call(b)||null);else{const t=n[d];c.call(t,b,null),s.call(t,g,e),o[m]=t,n[d]=null}g=o[++m]}if(p<=y||m<=v)if(p>y){const t=o[v+1],e=t?h.call(t)||null:u;for(let t=m;t<=v;t++)i.call(o[t],f,e)}else for(let t=p;t<=y;t++){let o=n[t];o&&(e&&a.call(o),l.call(o))}}beforeRemove(){const t=this.children,e=t.length;if(e){const n=t[0].beforeRemove;for(let o=0;o<e;o++)n.call(t[o])}}remove(){const{parentEl:t,anchor:e}=this;if(this.isOnlyChild)dt.call(t,"");else{const n=this.children,o=n.length;if(o){const t=n[0].remove;for(let e=0;e<o;e++)t.call(n[e])}ut.call(t,e)}}firstNode(){const t=this.children[0];return t?t.firstNode():void 0}toString(){return this.children.map((t=>t.toString())).join("")}}function pt(t){return new ft(t)}function mt(t,e,n){let o={};for(let r=e;r<=n;r++)o[t[r].key]=r;return o}const bt=Node.prototype,gt=bt.insertBefore,yt=bt.removeChild;class vt{constructor(t){this.content=[],this.html=t}mount(t,e){this.parentEl=t;const n=document.createElement("template");n.innerHTML=this.html,this.content=[...n.content.childNodes];for(let n of this.content)gt.call(t,n,e);if(!this.content.length){const n=document.createTextNode("");this.content.push(n),gt.call(t,n,e)}}moveBefore(t,e){const n=t?t.content[0]:e,o=this.parentEl;for(let t of this.content)gt.call(o,t,n)}patch(t){if(this===t)return;const e=t.html;if(this.html!==e){const n=this.parentEl,o=this.content[0],r=document.createElement("template");r.innerHTML=e;const i=[...r.content.childNodes];for(let t of i)gt.call(n,t,o);if(!i.length){const t=document.createTextNode("");i.push(t),gt.call(n,t,o)}this.remove(),this.content=i,this.html=t.html}}beforeRemove(){}remove(){const t=this.parentEl;for(let e of this.content)yt.call(t,e)}firstNode(){return this.content[0]}toString(){return this.html}}function wt(t){return new vt(t)}function xt(t,e,n=null){t.mount(e,n)}const kt=new WeakMap,$t=new WeakMap;function Nt(t,e){if(!t)return!1;const n=t.fiber;n&&kt.set(n,e);const o=$t.get(t);if(o){let t=!1;for(let n=o.length-1;n>=0;n--)try{o[n](e),t=!0;break}catch(t){e=t}if(t)return!0}return Nt(t.parent,e)}function Et(t){const e=t.error,n="node"in t?t.node:t.fiber.node,o="fiber"in t?t.fiber:n.fiber;let r=o;do{r.node.fiber=r,r=r.parent}while(r);kt.set(o.root,e);if(!Nt(n,e)){console.warn("[Owl] Unhandled error. Destroying the root component");try{n.app.destroy()}catch(t){console.error(t)}}}function At(){throw new Error("Attempted to render cancelled fiber")}function Tt(t){let e=0;for(let n of t){let t=n.node;n.render=At,0===t.status&&(t.destroy(),delete t.parent.children[t.parentKey]),t.fiber=null,n.bdom?t.forceNextRender=!0:e++,e+=Tt(n.children)}return e}class _t{constructor(t,e){if(this.bdom=null,this.children=[],this.appliedToDom=!1,this.deep=!1,this.childrenMap={},this.node=t,this.parent=e,e){this.deep=e.deep;const t=e.root;t.setCounter(t.counter+1),this.root=t,e.children.push(this)}else this.root=this}render(){let t=this.root.node,e=t.app.scheduler,n=t.parent;for(;n;){if(n.fiber){let o=n.fiber.root;if(0!==o.counter||!(t.parentKey in n.fiber.childrenMap))return void e.delayedRenders.push(this);n=o.node}t=n,n=n.parent}this._render()}_render(){const t=this.node,e=this.root;if(e){try{this.bdom=!0,this.bdom=t.renderFn()}catch(e){Et({node:t,error:e})}e.setCounter(e.counter-1)}}}class St extends _t{constructor(){super(...arguments),this.counter=1,this.willPatch=[],this.patched=[],this.mounted=[],this.locked=!1}complete(){const t=this.node;this.locked=!0;let e=void 0;try{for(e of this.willPatch){let t=e.node;if(t.fiber===e){const e=t.component;for(let n of t.willPatch)n.call(e)}}e=void 0,t._patch(),this.locked=!1;let n=this.mounted;for(;e=n.pop();)if(e=e,e.appliedToDom)for(let t of e.node.mounted)t();let o=this.patched;for(;e=o.pop();)if(e=e,e.appliedToDom)for(let t of e.node.patched)t()}catch(t){this.locked=!1,Et({fiber:e||this,error:t})}}setCounter(t){this.counter=t,0===t&&this.node.app.scheduler.flush()}}class Ct extends St{constructor(t,e,n={}){super(t,null),this.target=e,this.position=n.position||"last-child"}complete(){let t=this;try{const e=this.node;if(e.children=this.childrenMap,e.app.constructor.validateTarget(this.target),e.bdom)e.updateDom();else if(e.bdom=this.bdom,"last-child"===this.position||0===this.target.childNodes.length)xt(e.bdom,this.target);else{const t=this.target.childNodes[0];xt(e.bdom,this.target,t)}e.fiber=null,e.status=1,this.appliedToDom=!0;let n=this.mounted;for(;t=n.pop();)if(t.appliedToDom)for(let e of t.node.mounted)e()}catch(e){Et({fiber:t,error:e})}}}const Dt=Symbol("Target"),Lt=Symbol("Skip"),Bt=Symbol("Key changes"),Ot=Object.prototype.toString,Rt=Object.prototype.hasOwnProperty,Pt=new Set(["Object","Array","Set","Map","WeakMap"]),It=new Set(["Set","Map","WeakMap"]);function jt(t){return Ot.call(t).slice(8,-1)}function Mt(t){return"object"==typeof t&&Pt.has(jt(t))}function Wt(t,e){return Mt(t)?Xt(t,e):t}function Ft(t){return t[Lt]=!0,t}function Vt(t){return t[Dt]||t}const zt=new WeakMap;function Kt(t,e,n){zt.get(t)||zt.set(t,new Map);const o=zt.get(t);o.get(e)||o.set(e,new Set),o.get(e).add(n),Ut.has(n)||Ut.set(n,new Set),Ut.get(n).add(t)}function Ht(t,e){const n=zt.get(t);if(!n)return;const o=n.get(e);if(o)for(const t of[...o])qt(t),t()}const Ut=new WeakMap;function qt(t){const e=Ut.get(t);if(e){for(const n of e){const e=zt.get(n);if(e)for(const n of e.values())n.delete(t)}e.clear()}}const Gt=new WeakMap;function Xt(t,e=(()=>{})){if(!Mt(t))throw new Error("Cannot make the given value reactive");if(Lt in t)return t;const n=t[Dt];if(n)return Xt(n,e);Gt.has(t)||Gt.set(t,new WeakMap);const o=Gt.get(t);if(!o.has(e)){const n=jt(t),r=It.has(n)?function(t,e,n){const o=ne[n](t,e);return Object.assign(Yt(e),{get:(t,n)=>n===Dt?t:Rt.call(o,n)?o[n]:(Kt(t,n,e),Wt(t[n],e))})}(t,e,n):Yt(e),i=new Proxy(t,r);o.set(e,i)}return o.get(e)}function Yt(t){return{get(e,n,o){if(n===Dt)return e;const r=Object.getOwnPropertyDescriptor(e,n);return!r||r.writable||r.configurable?(Kt(e,n,t),Wt(Reflect.get(e,n,o),t)):Reflect.get(e,n,o)},set(t,e,n,o){const r=!Rt.call(t,e),i=Reflect.get(t,e,o),s=Reflect.set(t,e,n,o);return r&&Ht(t,Bt),(i!==n||Array.isArray(t)&&"length"===e)&&Ht(t,e),s},deleteProperty(t,e){const n=Reflect.deleteProperty(t,e);return Ht(t,Bt),Ht(t,e),n},ownKeys:e=>(Kt(e,Bt,t),Reflect.ownKeys(e)),has:(e,n)=>(Kt(e,Bt,t),Reflect.has(e,n))}}function Zt(t,e,n){return o=>(o=Vt(o),Kt(e,o,n),Wt(e[t](o),n))}function Jt(t,e,n){return function*(){Kt(e,Bt,n);const o=e.keys();for(const r of e[t]()){const t=o.next().value;Kt(e,t,n),yield Wt(r,n)}}}function Qt(t,e){return function(n,o){Kt(t,Bt,e),t.forEach((function(r,i,s){Kt(t,i,e),n.call(o,Wt(r,e),Wt(i,e),Wt(s,e))}),o)}}function te(t,e,n){return(o,r)=>{o=Vt(o);const i=n.has(o),s=n[e](o),l=n[t](o,r);return i!==n.has(o)&&Ht(n,Bt),s!==r&&Ht(n,o),l}}function ee(t){return()=>{const e=[...t.keys()];t.clear(),Ht(t,Bt);for(const n of e)Ht(t,n)}}const ne={Set:(t,e)=>({has:Zt("has",t,e),add:te("add","has",t),delete:te("delete","has",t),keys:Jt("keys",t,e),values:Jt("values",t,e),entries:Jt("entries",t,e),[Symbol.iterator]:Jt(Symbol.iterator,t,e),forEach:Qt(t,e),clear:ee(t),get size(){return Kt(t,Bt,e),t.size}}),Map:(t,e)=>({has:Zt("has",t,e),get:Zt("get",t,e),set:te("set","get",t),delete:te("delete","has",t),keys:Jt("keys",t,e),values:Jt("values",t,e),entries:Jt("entries",t,e),[Symbol.iterator]:Jt(Symbol.iterator,t,e),forEach:Qt(t,e),clear:ee(t),get size(){return Kt(t,Bt,e),t.size}}),WeakMap:(t,e)=>({has:Zt("has",t,e),get:Zt("get",t,e),set:te("set","get",t),delete:te("delete","has",t)})};class oe extends EventTarget{trigger(t,e){this.dispatchEvent(new CustomEvent(t,{detail:e}))}}class re extends String{}let ie=null;function se(){if(!ie)throw new Error("No active component (a hook function should only be called in 'setup')");return ie}function le(t,e){for(let n in e)void 0===t[n]&&(t[n]=e[n])}const ae=new WeakMap;function ce(t){const e=se();let n=ae.get(e);return n||(n=function(t){let e=!1;return async()=>{await Promise.resolve(),e||(e=!0,Promise.resolve().then((()=>e=!1)),t())}}(e.render.bind(e,!1)),ae.set(e,n),e.willDestroy.push(qt.bind(null,n))),Xt(t,n)}class he{constructor(t,e,n,o,r){this.fiber=null,this.bdom=null,this.status=0,this.forceNextRender=!1,this.children=Object.create(null),this.refs={},this.willStart=[],this.willUpdateProps=[],this.willUnmount=[],this.mounted=[],this.willPatch=[],this.patched=[],this.willDestroy=[],ie=this,this.app=n,this.parent=o,this.props=e,this.parentKey=r,this.level=o?o.level+1:0;const i=t.defaultProps;e=Object.assign({},e),i&&le(e,i);const s=o&&o.childEnv||n.env;this.childEnv=s;for(const t in e){const n=e[t];n&&"object"==typeof n&&n[Dt]&&(e[t]=ce(n))}this.component=new t(e,s,this),this.renderFn=n.getTemplate(t.template).bind(this.component,this.component,this),this.component.setup(),ie=null}mountComponent(t,e){const n=new Ct(this,t,e);this.app.scheduler.addFiber(n),this.initiateRender(n)}async initiateRender(t){this.fiber=t,this.mounted.length&&t.root.mounted.push(t);const e=this.component;try{await Promise.all(this.willStart.map((t=>t.call(e))))}catch(t){return void Et({node:this,error:t})}0===this.status&&this.fiber===t&&t.render()}async render(t){let e=this.fiber;if(e&&(e.root.locked||!0===e.bdom)&&(await Promise.resolve(),e=this.fiber),e){if(!e.bdom&&!kt.has(e))return void(t&&(e.deep=t));t=t||e.deep}else if(!this.bdom)return;const n=function(t){let e=t.fiber;if(e){let t=e.root;return t.locked=!0,t.setCounter(t.counter+1-Tt(e.children)),t.locked=!1,e.children=[],e.childrenMap={},e.bdom=null,kt.has(e)&&(kt.delete(e),kt.delete(t),e.appliedToDom=!1),e}const n=new St(t,null);return t.willPatch.length&&n.willPatch.push(n),t.patched.length&&n.patched.push(n),n}(this);n.deep=t,this.fiber=n,this.app.scheduler.addFiber(n),await Promise.resolve(),2!==this.status&&(this.fiber!==n||!e&&n.parent||n.render())}destroy(){let t=1===this.status;this._destroy(),t&&this.bdom.remove()}_destroy(){const t=this.component;if(1===this.status)for(let e of this.willUnmount)e.call(t);for(let t of Object.values(this.children))t._destroy();if(this.willDestroy.length)try{for(let e of this.willDestroy)e.call(t)}catch(t){Et({error:t,node:this})}this.status=2}async updateAndRender(t,e){const n=t;t=Object.assign({},t);const o=function(t,e){let n=t.fiber;return n&&(Tt(n.children),n.root=null),new _t(t,e)}(this,e);this.fiber=o;const r=this.component,i=r.constructor.defaultProps;i&&le(t,i),ie=this;for(const e in t){const n=t[e];n&&"object"==typeof n&&n[Dt]&&(t[e]=ce(n))}ie=null;const s=Promise.all(this.willUpdateProps.map((e=>e.call(r,t))));if(await s,o!==this.fiber)return;r.props=t,this.props=n,o.render();const l=e.root;this.willPatch.length&&l.willPatch.push(o),this.patched.length&&l.patched.push(o)}updateDom(){if(this.fiber)if(this.bdom===this.fiber.bdom)for(let t in this.children){this.children[t].updateDom()}else this.bdom.patch(this.fiber.bdom,!1),this.fiber.appliedToDom=!0,this.fiber=null}firstNode(){const t=this.bdom;return t?t.firstNode():void 0}mount(t,e){const n=this.fiber.bdom;this.bdom=n,n.mount(t,e),this.status=1,this.fiber.appliedToDom=!0,this.children=this.fiber.childrenMap,this.fiber=null}moveBefore(t,e){this.bdom.moveBefore(t?t.bdom:null,e)}patch(){this.fiber&&this.fiber.parent&&this._patch()}_patch(){let t=!1;for(let e in this.children){t=!0;break}const e=this.fiber;this.children=e.childrenMap,this.bdom.patch(e.bdom,t),e.appliedToDom=!0,this.fiber=null}beforeRemove(){this._destroy()}remove(){this.bdom.remove()}get name(){return this.component.constructor.name}get subscriptions(){const t=ae.get(this);return t?(e=t,[...Ut.get(e)||[]].map((t=>{const e=zt.get(t);return{target:t,keys:e?[...e.keys()]:[]}}))):[];var e}}const ue=Symbol("timeout");function de(t,e){const n=new Error(`The following error occurred in ${e}: `),o=new Error(e+"'s promise hasn't resolved after 3 seconds"),r=se();return(...i)=>{try{const s=t(...i);if(s instanceof Promise){if("onWillStart"===e||"onWillUpdateProps"===e){const t=r.fiber;Promise.race([s,new Promise((t=>setTimeout((()=>t(ue)),3e3)))]).then((e=>{e===ue&&r.fiber===t&&console.warn(o)}))}return s.catch((t=>{throw n.cause=t,t instanceof Error&&(n.message+=`"${t.message}"`),n}))}return s}catch(t){throw t instanceof Error&&(n.message+=`"${t.message}"`),n}}}function fe(t){const e=se(),n=e.app.dev?de:t=>t;e.mounted.push(n(t.bind(e.component),"onMounted"))}function pe(t){const e=se(),n=e.app.dev?de:t=>t;e.patched.push(n(t.bind(e.component),"onPatched"))}function me(t){const e=se(),n=e.app.dev?de:t=>t;e.willUnmount.unshift(n(t.bind(e.component),"onWillUnmount"))}class be{constructor(t,e,n){this.props=t,this.env=e,this.__owl__=n}setup(){}render(t=!1){this.__owl__.render(!0===t)}}be.template="";const ge=z("").constructor;class ye extends ge{constructor(t,e){super(""),this.target=null,this.selector=t,this.realBDom=e}mount(t,e){if(super.mount(t,e),this.target=document.querySelector(this.selector),!this.target){let t=this.el;for(;t&&t.parentElement instanceof HTMLElement;)t=t.parentElement;if(this.target=t&&t.querySelector(this.selector),!this.target)throw new Error("invalid portal target")}this.realBDom.mount(this.target,null)}beforeRemove(){this.realBDom.beforeRemove()}remove(){this.realBDom&&(super.remove(),this.realBDom.remove(),this.realBDom=null)}patch(t){super.patch(t),this.realBDom?this.realBDom.patch(t.realBDom,!0):(this.realBDom=t.realBDom,this.realBDom.mount(this.target,null))}}class ve extends be{setup(){const t=this.__owl__,e=t.renderFn;t.renderFn=()=>new ye(this.props.target,e()),me((()=>{t.bdom&&t.bdom.remove()}))}}ve.template="__portal__",ve.props={target:{type:String},slots:!0};const we=t=>Array.isArray(t),xe=t=>"object"!=typeof t,ke=t=>"object"==typeof t&&t&&"value"in t;function $e(t){return"object"==typeof t&&"optional"in t&&t.optional||!1}function Ne(t){return"*"===t||!0===t?"value":t.name.toLowerCase()}function Ee(t){return xe(t)?Ne(t):we(t)?t.map(Ee).join(" or "):ke(t)?String(t.value):"element"in t?`list of ${Ee({type:t.element,optional:!1})}s`:"shape"in t?"object":Ee(t.type||"*")}function Ae(t,e){var n;Array.isArray(e)&&(n=e,e=Object.fromEntries(n.map((t=>t.endsWith("?")?[t.slice(0,-1),{optional:!0}]:[t,{type:"*",optional:!1}]))));let o=[];for(let n in t)if(n in e){let r=Te(n,t[n],e[n]);r&&o.push(r)}else"*"in e||o.push(`unknown key '${n}'`);for(let n in e){const r=e[n];if("*"!==n&&!$e(r)&&!(n in t)){const t="object"==typeof r&&!Array.isArray(r);let e="*"===r||(t&&"type"in r?"*"===r.type:t)?"":` (should be a ${Ee(r)})`;o.push(`'${n}' is missing${e}`)}}return o}function Te(t,e,n){if(void 0===e)return $e(n)?null:`'${t}' is undefined (should be a ${Ee(n)})`;if(xe(n))return function(t,e,n){if("function"==typeof n)if("object"==typeof e){if(!(e instanceof n))return`'${t}' is not a ${Ne(n)}`}else if(typeof e!==n.name.toLowerCase())return`'${t}' is not a ${Ne(n)}`;return null}(t,e,n);if(ke(n))return e===n.value?null:`'${t}' is not equal to '${n.value}'`;if(we(n)){return n.find((n=>!Te(t,e,n)))?null:`'${t}' is not a ${Ee(n)}`}let o=null;if("element"in n)o=function(t,e,n){if(!Array.isArray(e))return`'${t}' is not a list of ${Ee(n)}s`;for(let o=0;o<e.length;o++){const r=Te(`${t}[${o}]`,e[o],n);if(r)return r}return null}(t,e,n.element);else if("shape"in n&&!o)if("object"!=typeof e||Array.isArray(e))o=`'${t}' is not an object`;else{const r=Ae(e,n.shape);r.length&&(o=`'${t}' has not the correct shape (${r.join(", ")})`)}return"type"in n&&!o&&(o=Te(t,e,n.type)),"validate"in n&&!o&&(o=n.validate(e)?null:`'${t}' is not valid`),o}const _e=Object.create;function Se(t){const e=t.__owl__.component,n=_e(e);for(let e in t)n[e]=t[e];return n}const Ce=Symbol("isBoundary");class De{constructor(t,e,n,o){this.fn=t,this.ctx=Se(e),this.component=n,this.node=o}evaluate(){return this.fn.call(this.component,this.ctx,this.node)}toString(){return this.evaluate().toString()}}let Le=new WeakMap;const Be=WeakMap.prototype.get,Oe=WeakMap.prototype.set;function Re(t,e,n){const o="string"!=typeof t?t:n.constructor.components[t];if(!o)return;const r=o.props;if(!r)return void(n.__owl__.app.warnIfNoStaticProps&&console.warn(`Component '${o.name}' does not have a static props description`));const i=o.defaultProps;if(i){let t=t=>Array.isArray(r)?r.includes(t):t in r&&!("*"in r)&&!$e(r[t]);for(let e in i)if(t(e))throw new Error(`A default value cannot be defined for a mandatory prop (name: '${e}', component: ${o.name})`)}const s=Ae(e,r);if(s.length)throw new Error(`Invalid props for component '${o.name}': `+s.join(", "))}const Pe={withDefault:function(t,e){return null==t||!1===t?e:t},zero:Symbol("zero"),isBoundary:Ce,callSlot:function(t,e,n,o,i,s,l){n=n+"__slot_"+o;const a=t.props.slots||{},{__render:c,__ctx:h,__scope:u}=a[o]||{},d=_e(h||{});u&&(d[u]=s);const f=c?c.call(h.__owl__.component,d,e,n):null;if(l){let s=void 0,a=void 0;return f?s=i?r(o,f):f:a=l.call(t.__owl__.component,t,e,n),O([s,a])}return f||z("")},capture:Se,withKey:function(t,e){return t.key=e,t},prepareList:function(t){let e,n;if(Array.isArray(t))e=t,n=t;else{if(!t)throw new Error("Invalid loop expression");n=Object.keys(t),e=Object.values(t)}const o=n.length;return[e,n,o,new Array(o)]},setContextValue:function(t,e,n){const o=t;for(;!t.hasOwnProperty(e)&&!t.hasOwnProperty(Ce);){const e=t.__proto__;if(!e){t=o;break}t=e}t[e]=n},multiRefSetter:function(t,e){let n=0;return o=>{if(o&&(n++,n>1))throw new Error("Cannot have 2 elements with same ref name at the same time");(0===n||o)&&(t[e]=o)}},shallowEqual:function(t,e){for(let n=0,o=t.length;n<o;n++)if(t[n]!==e[n])return!1;return!0},toNumber:function(t){const e=parseFloat(t);return isNaN(e)?t:e},validateProps:Re,LazyValue:De,safeOutput:function(t,e){if(void 0===t)return e?r("default",e):r("undefined",z(""));let n,o;switch(typeof t){case"object":t instanceof re?(n="string_safe",o=wt(t)):t instanceof De?(n="lazy_value",o=t.evaluate()):t instanceof String?(n="string_unsafe",o=z(t)):(n="block_safe",o=t);break;case"string":n="string_unsafe",o=z(t);break;default:n="string_unsafe",o=z(String(t))}return r(n,o)},bind:function(t,e){let n=t.__owl__.component,o=Be.call(Le,n);o||(o=new WeakMap,Oe.call(Le,n,o));let r=Be.call(o,e);return r||(r=e.bind(n),Oe.call(o,e,r)),r},createCatcher:function(t){const e=Object.keys(t).length;class n{constructor(t,e){this.handlerFns=[],this.afterNode=null,this.child=t,this.handlerData=e}mount(e,n){this.parentEl=e,this.child.mount(e,n),this.afterNode=document.createTextNode(""),e.insertBefore(this.afterNode,n),this.wrapHandlerData();for(let n in t){const o=t[n],r=$(n);this.handlerFns[o]=r,r.setup.call(e,this.handlerData[o])}}wrapHandlerData(){for(let t=0;t<e;t++){let e=this.handlerData[t],n=e.length-2,o=e[n];const r=this;e[n]=function(t){const e=t.target;let n=r.child.firstNode();const i=r.afterNode;for(;n!==i;){if(n.contains(e))return o.call(this,t);n=n.nextSibling}}}}moveBefore(t,e){this.child.moveBefore(t?t.child:null,e),this.parentEl.insertBefore(this.afterNode,e)}patch(t,n){if(this!==t){this.handlerData=t.handlerData,this.wrapHandlerData();for(let t=0;t<e;t++)this.handlerFns[t].update.call(this.parentEl,this.handlerData[t]);this.child.patch(t.child,n)}}beforeRemove(){this.child.beforeRemove()}remove(){for(let t=0;t<e;t++)this.handlerFns[t].remove.call(this.parentEl);this.child.remove(),this.afterNode.remove()}firstNode(){return this.child.firstNode()}toString(){return this.child.toString()}}return function(t,e){return new n(t,e)}},markRaw:Ft},Ie={text:z,createBlock:tt,list:pt,multi:O,html:wt,toggler:r,comment:K};class je{constructor(t={}){this.rawTemplates=Object.create(Me),this.templates={},this.Portal=ve,this.dev=t.dev||!1,this.translateFn=t.translateFn,this.translatableAttributes=t.translatableAttributes,t.templates&&this.addTemplates(t.templates)}static registerTemplate(t,e){Me[t]=e}addTemplate(t,e){if(t in this.rawTemplates){const n=this.rawTemplates[t];if(("string"==typeof n?n:n instanceof Element?n.outerHTML:n.toString())===("string"==typeof e?e:e.outerHTML))return;throw new Error(`Template ${t} already defined with different content`)}this.rawTemplates[t]=e}addTemplates(t){if(t){t=t instanceof Document?t:function(t){const e=(new DOMParser).parseFromString(t,"text/xml");if(e.getElementsByTagName("parsererror").length){let n="Invalid XML in template.";const o=e.getElementsByTagName("parsererror")[0].textContent;if(o){n+="\nThe parser has produced the following error message:\n"+o;const e=/\d+/g,r=e.exec(o);if(r){const i=Number(r[0]),s=t.split("\n")[i-1],l=e.exec(o);if(s&&l){const t=Number(l[0])-1;s[t]&&(n+=`\nThe error might be located at xml line ${i} column ${t}\n${s}\n${"-".repeat(t-1)}^`)}}}throw new Error(n)}return e}(t);for(const e of t.querySelectorAll("[t-name]")){const t=e.getAttribute("t-name");this.addTemplate(t,e)}}}getTemplate(t){if(!(t in this.templates)){const e=this.rawTemplates[t];if(void 0===e){let e="";try{e=` (for component "${se().component.constructor.name}")`}catch{}throw new Error(`Missing template: "${t}"${e}`)}const n="function"==typeof e&&!(e instanceof Element)?e:this._compileTemplate(t,e),o=this.templates;this.templates[t]=function(e,n){return o[t].call(this,e,n)};const r=n(this,Ie,Pe);this.templates[t]=r}return this.templates[t]}_compileTemplate(t,e){throw new Error("Unable to compile a template. Please use owl full build instead")}callTemplate(t,e,n,o,i){return r(e,this.getTemplate(e).call(t,n,o,i))}}const Me={};function We(...t){const e="__template__"+We.nextId++,n=String.raw(...t);return Me[e]=n,e}We.nextId=1,je.registerTemplate("__portal__",(function(t,e,n){let{callSlot:o}=n;return function(t,e,n=""){return o(t,e,n,"default",!1,null)}}));const Fe="true,false,NaN,null,undefined,debugger,console,window,in,instanceof,new,function,return,this,eval,void,Math,RegExp,Array,Object,Date".split(","),Ve=Object.assign(Object.create(null),{and:"&&",or:"||",gt:">",gte:">=",lt:"<",lte:"<="}),ze=Object.assign(Object.create(null),{"{":"LEFT_BRACE","}":"RIGHT_BRACE","[":"LEFT_BRACKET","]":"RIGHT_BRACKET",":":"COLON",",":"COMMA","(":"LEFT_PAREN",")":"RIGHT_PAREN"}),Ke="...,.,===,==,+,!==,!=,!,||,&&,>=,>,<=,<,?,-,*,/,%,typeof ,=>,=,;,in ,new ,|,&,^,~".split(",");const He=[function(t){let e=t[0],n=e;if("'"!==e&&'"'!==e&&"`"!==e)return!1;let o,r=1;for(;t[r]&&t[r]!==n;){if(o=t[r],e+=o,"\\"===o){if(r++,o=t[r],!o)throw new Error("Invalid expression");e+=o}r++}if(t[r]!==n)throw new Error("Invalid expression");return e+=n,"`"===n?{type:"TEMPLATE_STRING",value:e,replace:t=>e.replace(/\$\{(.*?)\}/g,((e,n)=>"${"+t(n)+"}"))}:{type:"VALUE",value:e}},function(t){let e=t[0];if(e&&e.match(/[0-9]/)){let n=1;for(;t[n]&&t[n].match(/[0-9]|\./);)e+=t[n],n++;return{type:"VALUE",value:e}}return!1},function(t){for(let e of Ke)if(t.startsWith(e))return{type:"OPERATOR",value:e};return!1},function(t){let e=t[0];if(e&&e.match(/[a-zA-Z_\$]/)){let n=1;for(;t[n]&&t[n].match(/\w/);)e+=t[n],n++;return e in Ve?{type:"OPERATOR",value:Ve[e],size:e.length}:{type:"SYMBOL",value:e}}return!1},function(t){const e=t[0];return!(!e||!(e in ze))&&{type:ze[e],value:e}}];const Ue=t=>t&&("LEFT_BRACE"===t.type||"COMMA"===t.type),qe=t=>t&&("RIGHT_BRACE"===t.type||"COMMA"===t.type);function Ge(t){const e=new Set,n=function(t){const e=[];let n,o=!0,r=t;try{for(;o;)if(r=r.trim(),r){for(let t of He)if(o=t(r),o){e.push(o),r=r.slice(o.size||o.value.length);break}}else o=!1}catch(t){n=t}if(r.length||n)throw new Error(`Tokenizer error: could not tokenize \`${t}\``);return e}(t);let o=0,r=[];for(;o<n.length;){let t=n[o],i=n[o-1],s=n[o+1],l=r[r.length-1];switch(t.type){case"LEFT_BRACE":case"LEFT_BRACKET":r.push(t.type);break;case"RIGHT_BRACE":case"RIGHT_BRACKET":r.pop()}let a="SYMBOL"===t.type&&!Fe.includes(t.value);if("SYMBOL"!==t.type||Fe.includes(t.value)||i&&("LEFT_BRACE"===l&&Ue(i)&&qe(s)&&(n.splice(o+1,0,{type:"COLON",value:":"},{...t}),s=n[o+1]),"OPERATOR"===i.type&&"."===i.value?a=!1:"LEFT_BRACE"!==i.type&&"COMMA"!==i.type||s&&"COLON"===s.type&&(a=!1)),"TEMPLATE_STRING"===t.type&&(t.value=t.replace((t=>Ye(t)))),s&&"OPERATOR"===s.type&&"=>"===s.value)if("RIGHT_PAREN"===t.type){let t=o-1;for(;t>0&&"LEFT_PAREN"!==n[t].type;)"SYMBOL"===n[t].type&&n[t].originalValue&&(n[t].value=n[t].originalValue,e.add(n[t].value)),t--}else e.add(t.value);a&&(t.varName=t.value,e.has(t.value)||(t.originalValue=t.value,t.value=`ctx['${t.value}']`)),o++}for(const t of n)"SYMBOL"===t.type&&t.varName&&e.has(t.value)&&(t.originalValue=t.value,t.value="_"+t.value,t.isLocal=!0);return n}const Xe=new Map([["in "," in "]]);function Ye(t){return Ge(t).map((t=>Xe.get(t.value)||t.value)).join("")}const Ze=/\{\{.*?\}\}|\#\{.*?\}/g;function Je(t,e){let n=t.match(Ze);return n&&n[0].length===t.length?`(${e(t.slice(2,"{"===n[0][0]?-2:-1))})`:"`"+t.replace(Ze,(t=>"${"+e(t.slice(2,"{"===t[0]?-2:-1))+"}"))+"`"}function Qe(t){return Je(t,Ye)}const tn=document.implementation.createDocument(null,null,null),en=new Set(["stop","capture","prevent","self","synthetic"]);let nn={};function on(t=""){return nn[t]=(nn[t]||0)+1,t+nn[t]}class rn{constructor(t,e){this.dynamicTagName=null,this.isRoot=!1,this.hasDynamicChildren=!1,this.children=[],this.data=[],this.childNumber=0,this.parentVar="",this.id=rn.nextBlockId++,this.varName="b"+this.id,this.blockName="block"+this.id,this.target=t,this.type=e}insertData(t,e="d"){const n=on(e);return this.target.addLine(`let ${n} = ${t};`),this.data.push(n)-1}insert(t){this.currentDom?this.currentDom.appendChild(t):this.dom=t}generateExpr(t){if("block"===this.type){const t=this.children.length;let e=this.data.length?`[${this.data.join(", ")}]`:t?"[]":"";return t&&(e+=", ["+this.children.map((t=>t.varName)).join(", ")+"]"),this.dynamicTagName?`toggler(${this.dynamicTagName}, ${this.blockName}(${this.dynamicTagName})(${e}))`:`${this.blockName}(${e})`}return"list"===this.type?`list(c_block${this.id})`:t}asXmlString(){const t=tn.createElement("t");return t.appendChild(this.dom),t.innerHTML}}function sn(t,e){return Object.assign({block:null,index:0,forceNewBlock:!0,translate:t.translate,tKeyExpr:null,nameSpace:t.nameSpace,tModelSelectedExpr:t.tModelSelectedExpr},e)}rn.nextBlockId=1;class ln{constructor(t,e){this.indentLevel=0,this.loopLevel=0,this.code=[],this.hasRoot=!1,this.hasCache=!1,this.hasRef=!1,this.refInfo={},this.shouldProtectScope=!1,this.name=t,this.on=e||null}addLine(t,e){const n=new Array(this.indentLevel+2).join(" ");void 0===e?this.code.push(n+t):this.code.splice(e,0,n+t)}generateCode(){let t=[];if(t.push(`function ${this.name}(ctx, node, key = "") {`),this.hasRef){t.push(" const refs = ctx.__owl__.refs;");for(let e in this.refInfo){const[n,o]=this.refInfo[e];t.push(` const ${n} = ${o};`)}}this.shouldProtectScope&&(t.push(" ctx = Object.create(ctx);"),t.push(" ctx[isBoundary] = 1")),this.hasCache&&(t.push(" let cache = ctx.cache || {};"),t.push(" let nextCache = ctx.cache = {};"));for(let e of this.code)t.push(e);return this.hasRoot||t.push("return text('');"),t.push("}"),t.join("\n ")}}const an=["label","title","placeholder","alt"],cn=/^(\s*)([\s\S]+?)(\s*)$/;class hn{constructor(t,e){if(this.blocks=[],this.nextBlockId=1,this.isDebug=!1,this.targets=[],this.target=new ln("template"),this.translatableAttributes=an,this.staticDefs=[],this.helpers=new Set,this.translateFn=e.translateFn||(t=>t),e.translatableAttributes){const t=new Set(an);for(let n of e.translatableAttributes)n.startsWith("-")?t.delete(n.slice(1)):t.add(n);this.translatableAttributes=[...t]}this.hasSafeContext=e.hasSafeContext||!1,this.dev=e.dev||!1,this.ast=t,this.templateName=e.name}generateCode(){const t=this.ast;this.isDebug=12===t.type,rn.nextBlockId=1,nn={},this.compileAST(t,{block:null,index:0,forceNewBlock:!1,isLast:!0,translate:!0,tKeyExpr:null});let e=[" let { text, createBlock, list, multi, html, toggler, comment } = bdom;"];this.helpers.size&&e.push(`let { ${[...this.helpers].join(", ")} } = helpers;`),this.templateName&&e.push(`// Template name: "${this.templateName}"`);for(let{id:t,expr:n}of this.staticDefs)e.push(`const ${t} = ${n};`);if(this.blocks.length){e.push("");for(let t of this.blocks)if(t.dom){let n=t.asXmlString();n=n.replace(/`/g,"\\`"),t.dynamicTagName?(n=n.replace(/^<\w+/,`<\${tag || '${t.dom.nodeName}'}`),n=n.replace(/\w+>$/,`\${tag || '${t.dom.nodeName}'}>`),e.push(`let ${t.blockName} = tag => createBlock(\`${n}\`);`)):e.push(`let ${t.blockName} = createBlock(\`${n}\`);`)}}if(this.targets.length)for(let t of this.targets)e.push(""),e=e.concat(t.generateCode());e.push(""),e=e.concat("return "+this.target.generateCode());const n=e.join("\n ");if(this.isDebug){const t="[Owl Debug]\n"+n;console.log(t)}return n}compileInNewTarget(t,e,n,o){const r=on(t),i=this.target,s=new ln(r,o);return this.targets.push(s),this.target=s,this.compileAST(e,sn(n)),this.target=i,r}addLine(t,e){this.target.addLine(t,e)}define(t,e){this.addLine(`const ${t} = ${e};`)}insertAnchor(t){const e="block-child-"+t.children.length,n=tn.createElement(e);t.insert(n)}createBlock(t,e,n){const o=this.target.hasRoot,r=new rn(this.target,e);return o||n.preventRoot||(this.target.hasRoot=!0,r.isRoot=!0),t&&(t.children.push(r),"list"===t.type&&(r.parentVar="c_block"+t.id)),r}insertBlock(t,e,n){let o=e.generateExpr(t);const r=n.tKeyExpr;if(e.parentVar){let t="key"+this.target.loopLevel;return r&&(t=`${r} + ${t}`),this.helpers.add("withKey"),void this.addLine(`${e.parentVar}[${n.index}] = withKey(${o}, ${t});`)}r&&(o=`toggler(${r}, ${o})`),e.isRoot&&!n.preventRoot?(this.target.on&&(o=this.wrapWithEventCatcher(o,this.target.on)),this.addLine(`return ${o};`)):this.define(e.varName,o)}captureExpression(t,e=!1){if(!e&&!t.includes("=>"))return Ye(t);const n=Ge(t),o=new Map;return n.map((t=>{if(t.varName&&!t.isLocal){if(!o.has(t.varName)){const e=on("v");o.set(t.varName,e),this.define(e,t.value)}t.value=o.get(t.varName)}return t.value})).join("")}compileAST(t,e){switch(t.type){case 1:this.compileComment(t,e);break;case 0:this.compileText(t,e);break;case 2:this.compileTDomNode(t,e);break;case 4:this.compileTEsc(t,e);break;case 8:this.compileTOut(t,e);break;case 5:this.compileTIf(t,e);break;case 9:this.compileTForeach(t,e);break;case 10:this.compileTKey(t,e);break;case 3:this.compileMulti(t,e);break;case 7:this.compileTCall(t,e);break;case 15:this.compileTCallBlock(t,e);break;case 6:this.compileTSet(t,e);break;case 11:this.compileComponent(t,e);break;case 12:this.compileDebug(t,e);break;case 13:this.compileLog(t,e);break;case 14:this.compileTSlot(t,e);break;case 16:this.compileTTranslation(t,e);break;case 17:this.compileTPortal(t,e)}}compileDebug(t,e){this.addLine("debugger;"),t.content&&this.compileAST(t.content,e)}compileLog(t,e){this.addLine(`console.log(${Ye(t.expr)});`),t.content&&this.compileAST(t.content,e)}compileComment(t,e){let{block:n,forceNewBlock:o}=e;if(!n||o)n=this.createBlock(n,"comment",e),this.insertBlock(`comment(\`${t.value}\`)`,n,{...e,forceNewBlock:o&&!n});else{const e=tn.createComment(t.value);n.insert(e)}}compileText(t,e){let{block:n,forceNewBlock:o}=e,r=t.value;if(r&&!1!==e.translate){const t=cn.exec(r);r=t[1]+this.translateFn(t[2])+t[3]}if(!n||o)n=this.createBlock(n,"text",e),this.insertBlock(`text(\`${r}\`)`,n,{...e,forceNewBlock:o&&!n});else{const e=0===t.type?tn.createTextNode:tn.createComment;n.insert(e.call(tn,r))}}generateHandlerCode(t,e){const n=t.split(".").slice(1).map((t=>{if(!en.has(t))throw new Error(`Unknown event modifier: '${t}'`);return`"${t}"`}));let o="";return n.length&&(o=n.join(",")+", "),`[${o}${this.captureExpression(e)}, ctx]`}compileTDomNode(t,e){let{block:n,forceNewBlock:o}=e;const r=!n||o||null!==t.dynamicTag||t.ns;let i=this.target.code.length;if(r&&((t.dynamicTag||e.tKeyExpr||t.ns)&&e.block&&this.insertAnchor(e.block),n=this.createBlock(n,"block",e),this.blocks.push(n),t.dynamicTag)){const e=on("tag");this.define(e,Ye(t.dynamicTag)),n.dynamicTagName=e}const s={},l=t.ns||e.nameSpace;l&&r&&(s["block-ns"]=l);for(let o in t.attrs){let r,i;if(o.startsWith("t-attf")){r=Qe(t.attrs[o]);const e=n.insertData(r,"attr");i=o.slice(7),s["block-attribute-"+e]=i}else if(o.startsWith("t-att")){r=Ye(t.attrs[o]);const e=n.insertData(r,"attr");"t-att"===o?s["block-attributes"]=String(e):(i=o.slice(6),s["block-attribute-"+e]=i)}else this.translatableAttributes.includes(o)?s[o]=this.translateFn(t.attrs[o]):(r=`"${t.attrs[o]}"`,i=o,s[o]=t.attrs[o]);if("value"===i&&e.tModelSelectedExpr){s["block-attribute-"+n.insertData(`${e.tModelSelectedExpr} === ${r}`,"attr")]="selected"}}for(let e in t.on){const o=this.generateHandlerCode(e,t.on[e]);s["block-handler-"+n.insertData(o,"hdlr")]=e}if(t.ref){this.target.hasRef=!0;if(Ze.test(t.ref)){const e=Je(t.ref,(t=>this.captureExpression(t,!0))),o=n.insertData(`(el) => refs[${e}] = el`,"ref");s["block-ref"]=String(o)}else{let e=t.ref;if(e in this.target.refInfo){this.helpers.add("multiRefSetter");const t=this.target.refInfo[e],o=n.data.push(t[0])-1;s["block-ref"]=String(o),t[1]=`multiRefSetter(refs, \`${e}\`)`}else{let t=on("ref");this.target.refInfo[e]=[t,`(el) => refs[\`${e}\`] = el`];const o=n.data.push(t)-1;s["block-ref"]=String(o)}}}let a;if(t.model){const{hasDynamicChildren:e,baseExpr:o,expr:r,eventType:i,shouldNumberize:l,shouldTrim:c,targetAttr:h,specialInitTargetAttr:u}=t.model,d=Ye(o),f=on("bExpr");this.define(f,d);const p=Ye(r),m=on("expr");this.define(m,p);const b=`${f}[${m}]`;let g;if(u)g=n.insertData(`${b} === '${s[h]}'`,"attr"),s["block-attribute-"+g]=u;else if(e){a=""+on("bValue"),this.define(a,b)}else g=n.insertData(""+b,"attr"),s["block-attribute-"+g]=h;this.helpers.add("toNumber");let y="ev.target."+h;y=c?y+".trim()":y,y=l?`toNumber(${y})`:y;const v=`[(ev) => { ${b} = ${y}; }]`;g=n.insertData(v,"hdlr"),s["block-handler-"+g]=i}const c=tn.createElement(t.tag);for(const[t,e]of Object.entries(s))"class"===t&&""===e||c.setAttribute(t,e);if(n.insert(c),t.content.length){const o=n.currentDom;n.currentDom=c;const r=t.content;for(let o=0;o<r.length;o++){const i=t.content[o],s=sn(e,{block:n,index:n.childNumber,forceNewBlock:!1,isLast:e.isLast&&o===r.length-1,tKeyExpr:e.tKeyExpr,nameSpace:l,tModelSelectedExpr:a});this.compileAST(i,s)}n.currentDom=o}if(r&&(this.insertBlock(n.blockName+"(ddd)",n,e),n.children.length&&n.hasDynamicChildren)){const t=this.target.code,e=n.children.slice();let o=e.shift();for(let n=i;n<t.length&&(!t[n].trimStart().startsWith(`const ${o.varName} `)||(t[n]=t[n].replace("const "+o.varName,o.varName),o=e.shift(),o));n++);this.addLine(`let ${n.children.map((t=>t.varName))};`,i)}}compileTEsc(t,e){let n,{block:o,forceNewBlock:r}=e;if("0"===t.expr?(this.helpers.add("zero"),n="ctx[zero]"):(n=Ye(t.expr),t.defaultValue&&(this.helpers.add("withDefault"),n=`withDefault(${n}, \`${t.defaultValue}\`)`)),!o||r)o=this.createBlock(o,"text",e),this.insertBlock(`text(${n})`,o,{...e,forceNewBlock:r&&!o});else{const t=o.insertData(n,"txt"),e=tn.createElement("block-text-"+t);o.insert(e)}}compileTOut(t,e){let n,{block:o}=e;if(o&&this.insertAnchor(o),o=this.createBlock(o,"html",e),"0"===t.expr)this.helpers.add("zero"),n="ctx[zero]";else if(t.body){let o=null;o=rn.nextBlockId;const r=sn(e);this.compileAST({type:3,content:t.body},r),this.helpers.add("safeOutput"),n=`safeOutput(${Ye(t.expr)}, b${o})`}else this.helpers.add("safeOutput"),n=`safeOutput(${Ye(t.expr)})`;this.insertBlock(n,o,e)}compileTIf(t,e,n){let{block:o,forceNewBlock:r,index:i}=e,s=i;const l=this.target.code.length,a=!o||"multi"!==o.type&&r;o&&(o.hasDynamicChildren=!0),(!o||"multi"!==o.type&&r)&&(o=this.createBlock(o,"multi",e)),this.addLine(`if (${Ye(t.condition)}) {`),this.target.indentLevel++,this.insertAnchor(o);const c=sn(e,{block:o,index:s});if(this.compileAST(t.content,c),this.target.indentLevel--,t.tElif)for(let n of t.tElif){this.addLine(`} else if (${Ye(n.condition)}) {`),this.target.indentLevel++,this.insertAnchor(o);const t=sn(e,{block:o,index:s});this.compileAST(n.content,t),this.target.indentLevel--}if(t.tElse){this.addLine("} else {"),this.target.indentLevel++,this.insertAnchor(o);const n=sn(e,{block:o,index:s});this.compileAST(t.tElse,n),this.target.indentLevel--}if(this.addLine("}"),a){if(o.children.length){const t=this.target.code,e=o.children.slice();let n=e.shift();for(let o=l;o<t.length&&(!t[o].trimStart().startsWith(`const ${n.varName} `)||(t[o]=t[o].replace("const "+n.varName,n.varName),n=e.shift(),n));o++);this.addLine(`let ${o.children.map((t=>t.varName))};`,l)}const t=o.children.map((t=>t.varName)).join(", ");this.insertBlock(`multi([${t}])`,o,e)}}compileTForeach(t,e){let{block:n}=e;n&&this.insertAnchor(n),n=this.createBlock(n,"list",e),this.target.loopLevel++;const o="i"+this.target.loopLevel;this.addLine("ctx = Object.create(ctx);");const r="v_block"+n.id,i="k_block"+n.id,s="l_block"+n.id,l="c_block"+n.id;let a;this.helpers.add("prepareList"),this.define(`[${i}, ${r}, ${s}, ${l}]`,`prepareList(${Ye(t.collection)});`),this.dev&&this.define("keys"+n.id,"new Set()"),this.addLine(`for (let ${o} = 0; ${o} < ${s}; ${o}++) {`),this.target.indentLevel++,this.addLine(`ctx[\`${t.elem}\`] = ${r}[${o}];`),t.hasNoFirst||this.addLine(`ctx[\`${t.elem}_first\`] = ${o} === 0;`),t.hasNoLast||this.addLine(`ctx[\`${t.elem}_last\`] = ${o} === ${r}.length - 1;`),t.hasNoIndex||this.addLine(`ctx[\`${t.elem}_index\`] = ${o};`),t.hasNoValue||this.addLine(`ctx[\`${t.elem}_value\`] = ${i}[${o}];`),this.define("key"+this.target.loopLevel,t.key?Ye(t.key):o),this.dev&&(this.addLine(`if (keys${n.id}.has(key${this.target.loopLevel})) { throw new Error(\`Got duplicate key in t-foreach: \${key${this.target.loopLevel}}\`)}`),this.addLine(`keys${n.id}.add(key${this.target.loopLevel});`)),t.memo&&(this.target.hasCache=!0,a=on(),this.define("memo"+a,Ye(t.memo)),this.define("vnode"+a,`cache[key${this.target.loopLevel}];`),this.addLine(`if (vnode${a}) {`),this.target.indentLevel++,this.addLine(`if (shallowEqual(vnode${a}.memo, memo${a})) {`),this.target.indentLevel++,this.addLine(`${l}[${o}] = vnode${a};`),this.addLine(`nextCache[key${this.target.loopLevel}] = vnode${a};`),this.addLine("continue;"),this.target.indentLevel--,this.addLine("}"),this.target.indentLevel--,this.addLine("}"));const c=sn(e,{block:n,index:o});this.compileAST(t.body,c),t.memo&&this.addLine(`nextCache[key${this.target.loopLevel}] = Object.assign(${l}[${o}], {memo: memo${a}});`),this.target.indentLevel--,this.target.loopLevel--,this.addLine("}"),e.isLast||this.addLine("ctx = ctx.__proto__;"),this.insertBlock("l",n,e)}compileTKey(t,e){const n=on("tKey_");this.define(n,Ye(t.expr)),e=sn(e,{tKeyExpr:n,block:e.block,index:e.index}),this.compileAST(t.content,e)}compileMulti(t,e){let{block:n,forceNewBlock:o}=e;const r=!n||o;let i=this.target.code.length;if(r){if(t.content.filter((t=>6!==t.type)).length<=1){for(let n of t.content)this.compileAST(n,e);return}n=this.createBlock(n,"multi",e)}let s=0;for(let o=0,r=t.content.length;o<r;o++){const i=t.content[o],l=6===i.type,a=sn(e,{block:n,index:s,forceNewBlock:!l,preventRoot:e.preventRoot,isLast:e.isLast&&o===r-1});this.compileAST(i,a),l||s++}if(r){if(n.hasDynamicChildren&&n.children.length){const t=this.target.code,e=n.children.slice();let o=e.shift();for(let n=i;n<t.length&&(!t[n].trimStart().startsWith(`const ${o.varName} `)||(t[n]=t[n].replace("const "+o.varName,o.varName),o=e.shift(),o));n++);this.addLine(`let ${n.children.map((t=>t.varName))};`,i)}const t=n.children.map((t=>t.varName)).join(", ");this.insertBlock(`multi([${t}])`,n,e)}}compileTCall(t,e){let{block:n,forceNewBlock:o}=e,r=e.ctxVar||"ctx";if(t.context&&(r=on("ctx"),this.addLine(`let ${r} = ${Ye(t.context)};`)),t.body){this.addLine(`${r} = Object.create(${r});`),this.addLine(r+"[isBoundary] = 1;"),this.helpers.add("isBoundary");const n=rn.nextBlockId,o=sn(e,{preventRoot:!0,ctxVar:r});this.compileAST({type:3,content:t.body},o),n!==rn.nextBlockId&&(this.helpers.add("zero"),this.addLine(`${r}[zero] = b${n};`))}const i=Ze.test(t.name),s=i?Qe(t.name):"`"+t.name+"`";n&&(o||this.insertAnchor(n));const l=`key + \`${this.generateComponentKey()}\``;if(i){const t=on("template");this.staticDefs.find((t=>"call"===t.id))||this.staticDefs.push({id:"call",expr:"app.callTemplate.bind(app)"}),this.define(t,s),n=this.createBlock(n,"multi",e),this.insertBlock(`call(this, ${t}, ${r}, node, ${l})`,n,{...e,forceNewBlock:!n})}else{const t=on("callTemplate_");this.staticDefs.push({id:t,expr:`app.getTemplate(${s})`}),n=this.createBlock(n,"multi",e),this.insertBlock(`${t}.call(this, ${r}, node, ${l})`,n,{...e,forceNewBlock:!n})}t.body&&!e.isLast&&this.addLine(`${r} = ${r}.__proto__;`)}compileTCallBlock(t,e){let{block:n,forceNewBlock:o}=e;n&&(o||this.insertAnchor(n)),n=this.createBlock(n,"multi",e),this.insertBlock(Ye(t.name),n,{...e,forceNewBlock:!n})}compileTSet(t,e){this.target.shouldProtectScope=!0,this.helpers.add("isBoundary").add("withDefault");const n=t.value?Ye(t.value||""):"null";if(t.body){this.helpers.add("LazyValue");const o={type:3,content:t.body};let r=`new LazyValue(${this.compileInNewTarget("value",o,e)}, ctx, this, node)`;r=t.value?r?`withDefault(${n}, ${r})`:n:r,this.addLine(`ctx[\`${t.name}\`] = ${r};`)}else{let o;o=t.defaultValue?t.value?`withDefault(${n}, \`${t.defaultValue}\`)`:`\`${t.defaultValue}\``:n,this.helpers.add("setContextValue"),this.addLine(`setContextValue(${e.ctxVar||"ctx"}, "${t.name}", ${o});`)}}generateComponentKey(){const t=[on("__")];for(let e=0;e<this.target.loopLevel;e++)t.push(`\${key${e+1}}`);return t.join("__")}formatProp(t,e){if(e=this.captureExpression(e),t.includes(".")){let[n,o]=t.split(".");if("bind"!==o)throw new Error("Invalid prop suffix");this.helpers.add("bind"),t=n,e=`bind(ctx, ${e||void 0})`}return`${t=/^[a-z_]+$/i.test(t)?t:`'${t}'`}: ${e||void 0}`}formatPropObject(t){return Object.entries(t).map((([t,e])=>this.formatProp(t,e)))}getPropString(t,e){let n=`{${t.join(",")}}`;return e&&(n=`Object.assign({}, ${Ye(e)}${t.length?", "+n:""})`),n}compileComponent(t,e){let{block:n}=e;const o="slots"in(t.props||{}),r=t.props?this.formatPropObject(t.props):[];let i="";if(t.slots){let n="ctx";!this.target.loopLevel&&this.hasSafeContext||(n=on("ctx"),this.helpers.add("capture"),this.define(n,"capture(ctx)"));let o=[];for(let r in t.slots){const i=t.slots[r],s=[];if(i.content){const t=this.compileInNewTarget("slot",i.content,e,i.on);s.push(`__render: ${t}, __ctx: ${n}`)}const l=t.slots[r].scope;l&&s.push(`__scope: "${l}"`),t.slots[r].attrs&&s.push(...this.formatPropObject(t.slots[r].attrs));const a=`{${s.join(", ")}}`;o.push(`'${r}': ${a}`)}i=`{${o.join(", ")}}`}!i||t.dynamicProps||o||(this.helpers.add("markRaw"),r.push(`slots: markRaw(${i})`));let s,l=this.getPropString(r,t.dynamicProps);(i&&(t.dynamicProps||o)||this.dev)&&(s=on("props"),this.define(s,l),l=s),i&&(t.dynamicProps||o)&&(this.helpers.add("markRaw"),this.addLine(`${s}.slots = markRaw(Object.assign(${i}, ${s}.slots))`));const a=this.generateComponentKey();let c;t.isDynamic?(c=on("Comp"),this.define(c,Ye(t.name))):c=`\`${t.name}\``,this.dev&&this.addLine(`helpers.validateProps(${c}, ${s}, ctx);`),n&&(!1===e.forceNewBlock||e.tKeyExpr)&&this.insertAnchor(n);let h=`key + \`${a}\``;e.tKeyExpr&&(h=`${e.tKeyExpr} + ${h}`);let u=on("comp");this.staticDefs.push({id:u,expr:`app.createComponent(${t.isDynamic?null:c}, ${!t.isDynamic}, ${!!t.slots}, ${!!t.dynamicProps}, ${!t.props&&!t.dynamicProps})`});let d=`${u}(${l}, ${h}, node, this, ${t.isDynamic?c:null})`;t.isDynamic&&(d=`toggler(${c}, ${d})`),t.on&&(d=this.wrapWithEventCatcher(d,t.on)),n=this.createBlock(n,"multi",e),this.insertBlock(d,n,e)}wrapWithEventCatcher(t,e){this.helpers.add("createCatcher");let n=on("catcher"),o={},r=[];for(let t in e){let n=on("hdlr"),i=r.push(n)-1;o[t]=i;const s=this.generateHandlerCode(t,e[t]);this.define(n,s)}return this.staticDefs.push({id:n,expr:`createCatcher(${JSON.stringify(o)})`}),`${n}(${t}, [${r.join(",")}])`}compileTSlot(t,e){this.helpers.add("callSlot");let n,o,{block:r}=e,i=!1;t.name.match(Ze)?(i=!0,o=Qe(t.name)):o="'"+t.name+"'";const s=t.attrs?t.attrs["t-props"]:null;t.attrs&&delete t.attrs["t-props"];const l=t.attrs?this.formatPropObject(t.attrs):[],a=this.getPropString(l,s);if(t.defaultContent){n=`callSlot(ctx, node, key, ${o}, ${i}, ${a}, ${this.compileInNewTarget("defaultContent",t.defaultContent,e)})`}else if(i){let t=on("slot");this.define(t,o),n=`toggler(${t}, callSlot(ctx, node, key, ${t}, ${i}, ${a}))`}else n=`callSlot(ctx, node, key, ${o}, ${i}, ${a})`;t.on&&(n=this.wrapWithEventCatcher(n,t.on)),r&&this.insertAnchor(r),r=this.createBlock(r,"multi",e),this.insertBlock(n,r,{...e,forceNewBlock:!1})}compileTTranslation(t,e){t.content&&this.compileAST(t.content,Object.assign({},e,{translate:!1}))}compileTPortal(t,e){this.staticDefs.find((t=>"Portal"===t.id))||this.staticDefs.push({id:"Portal",expr:"app.Portal"});let{block:n}=e;const o=this.compileInNewTarget("slot",t.content,e),r=this.generateComponentKey();let i="ctx";!this.target.loopLevel&&this.hasSafeContext||(i=on("ctx"),this.helpers.add("capture"),this.define(i,"capture(ctx)"));let s=on("comp");this.staticDefs.push({id:s,expr:"app.createComponent(null, false, true, false, false)"});const l=`${s}({target: ${Ye(t.target)},slots: {'default': {__render: ${o}, __ctx: ${i}}}}, key + \`${r}\`, node, ctx, Portal)`;n&&this.insertAnchor(n),n=this.createBlock(n,"multi",e),this.insertBlock(l,n,{...e,forceNewBlock:!1})}}const un=new WeakMap;function dn(t){if("string"==typeof t){return fn(function(t){const e=(new DOMParser).parseFromString(t,"text/xml");if(e.getElementsByTagName("parsererror").length){let n="Invalid XML in template.";const o=e.getElementsByTagName("parsererror")[0].textContent;if(o){n+="\nThe parser has produced the following error message:\n"+o;const e=/\d+/g,r=e.exec(o);if(r){const i=Number(r[0]),s=t.split("\n")[i-1],l=e.exec(o);if(s&&l){const t=Number(l[0])-1;s[t]&&(n+=`\nThe error might be located at xml line ${i} column ${t}\n${s}\n${"-".repeat(t-1)}^`)}}}throw new Error(n)}return e}(`<t>${t}</t>`).firstChild)}let e=un.get(t);return e||(e=fn(t.cloneNode(!0)),un.set(t,e)),e}function fn(t){var e;(function(t){let e=t.querySelectorAll("[t-elif], [t-else]");for(let t=0,n=e.length;t<n;t++){let n=e[t],o=n.previousElementSibling,r=t=>o.getAttribute(t),i=t=>+!!n.getAttribute(t);if(!o||!r("t-if")&&!r("t-elif"))throw new Error("t-elif and t-else directives must be preceded by a t-if or t-elif directive");{if(r("t-foreach"))throw new Error("t-if cannot stay at the same level as t-foreach when using t-elif or t-else");if(["t-if","t-elif","t-else"].map(i).reduce((function(t,e){return t+e}))>1)throw new Error("Only one conditional branching directive is allowed per node");let t;for(;(t=n.previousSibling)!==o;){if(t.nodeValue.trim().length&&8!==t.nodeType)throw new Error("text is not allowed between branching directives");t.remove()}}}})(e=t),function(t){const e=[...t.querySelectorAll("[t-esc]")].filter((t=>t.tagName[0]===t.tagName[0].toUpperCase()||t.hasAttribute("t-component")));for(const t of e){if(t.childNodes.length)throw new Error("Cannot have t-esc on a component that already has content");const e=t.getAttribute("t-esc");t.removeAttribute("t-esc");const n=t.ownerDocument.createElement("t");null!=e&&n.setAttribute("t-esc",e),t.appendChild(n)}}(e);return pn(t,{inPreTag:!1,inSVG:!1})||{type:0,value:""}}function pn(t,e){return t instanceof Element?function(t,e){if(t.hasAttribute("t-debug"))return t.removeAttribute("t-debug"),{type:12,content:pn(t,e)};if(t.hasAttribute("t-log")){const n=t.getAttribute("t-log");return t.removeAttribute("t-log"),{type:13,expr:n,content:pn(t,e)}}return null}(t,e)||function(t,e){if(!t.hasAttribute("t-foreach"))return null;const n=t.outerHTML,o=t.getAttribute("t-foreach");t.removeAttribute("t-foreach");const r=t.getAttribute("t-as")||"";t.removeAttribute("t-as");const i=t.getAttribute("t-key");if(!i)throw new Error(`"Directive t-foreach should always be used with a t-key!" (expression: t-foreach="${o}" t-as="${r}")`);t.removeAttribute("t-key");const s=t.getAttribute("t-memo")||"";t.removeAttribute("t-memo");const l=pn(t,e);if(!l)return null;const a=!n.includes("t-call"),c=a&&!n.includes(r+"_first"),h=a&&!n.includes(r+"_last"),u=a&&!n.includes(r+"_index"),d=a&&!n.includes(r+"_value");return{type:9,collection:o,elem:r,body:l,memo:s,key:i,hasNoFirst:c,hasNoLast:h,hasNoIndex:u,hasNoValue:d}}(t,e)||function(t,e){if(!t.hasAttribute("t-if"))return null;const n=t.getAttribute("t-if");t.removeAttribute("t-if");const o=pn(t,e)||{type:0,value:""};let r=t.nextElementSibling;const i=[];for(;r&&r.hasAttribute("t-elif");){const t=r.getAttribute("t-elif");r.removeAttribute("t-elif");const n=pn(r,e),o=r.nextElementSibling;r.remove(),r=o,n&&i.push({condition:t,content:n})}let s=null;r&&r.hasAttribute("t-else")&&(r.removeAttribute("t-else"),s=pn(r,e),r.remove());return{type:5,condition:n,content:o,tElif:i.length?i:null,tElse:s}}(t,e)||function(t,e){if(!t.hasAttribute("t-portal"))return null;const n=t.getAttribute("t-portal");t.removeAttribute("t-portal");const o=pn(t,e);if(!o)return{type:0,value:""};return{type:17,target:n,content:o}}(t,e)||function(t,e){if(!t.hasAttribute("t-call"))return null;const n=t.getAttribute("t-call"),o=t.getAttribute("t-call-context");if(t.removeAttribute("t-call"),t.removeAttribute("t-call-context"),"t"!==t.tagName){const r=pn(t,e),i={type:7,name:n,body:null,context:o};if(r&&2===r.type)return r.content=[i],r;if(r&&11===r.type)return{...r,slots:{default:{content:i,scope:null,on:null,attrs:null}}}}const r=xn(t,e);return{type:7,name:n,body:r.length?r:null,context:o}}(t,e)||function(t,e){if(!t.hasAttribute("t-call-block"))return null;return{type:15,name:t.getAttribute("t-call-block")}}(t)||function(t,e){if(!t.hasAttribute("t-esc"))return null;const n=t.getAttribute("t-esc");t.removeAttribute("t-esc");const o={type:4,expr:n,defaultValue:t.textContent||""};let r=t.getAttribute("t-ref");t.removeAttribute("t-ref");const i=pn(t,e);if(!i)return o;if(2===i.type)return{...i,ref:r,content:[o]};if(11===i.type)throw new Error("t-esc is not supported on Component nodes");return o}(t,e)||function(t,e){if(!t.hasAttribute("t-key"))return null;const n=t.getAttribute("t-key");t.removeAttribute("t-key");const o=pn(t,e);if(!o)return null;return{type:10,expr:n,content:o}}(t,e)||function(t,e){if("off"!==t.getAttribute("t-translation"))return null;return t.removeAttribute("t-translation"),{type:16,content:pn(t,e)}}(t,e)||function(t,e){if(!t.hasAttribute("t-slot"))return null;const n=t.getAttribute("t-slot");t.removeAttribute("t-slot");let o=null,r=null;for(let e of t.getAttributeNames()){const n=t.getAttribute(e);e.startsWith("t-on-")?(r=r||{},r[e.slice(5)]=n):(o=o||{},o[e]=n)}return{type:14,name:n,attrs:o,on:r,defaultContent:kn(t,e)}}(t,e)||function(t,e){if(!t.hasAttribute("t-out")&&!t.hasAttribute("t-raw"))return null;t.hasAttribute("t-raw")&&console.warn('t-raw has been deprecated in favor of t-out. If the value to render is not wrapped by the "markup" function, it will be escaped');const n=t.getAttribute("t-out")||t.getAttribute("t-raw");t.removeAttribute("t-out"),t.removeAttribute("t-raw");const o={type:8,expr:n,body:null},r=t.getAttribute("t-ref");t.removeAttribute("t-ref");const i=pn(t,e);if(!i)return o;if(2===i.type)return o.body=i.content.length?i.content:null,{...i,ref:r,content:[o]};return o}(t,e)||function(t,e){let n=t.tagName;const o=n[0];let r=t.hasAttribute("t-component");if(r&&"t"!==n)throw new Error(`Directive 't-component' can only be used on <t> nodes (used on a <${n}>)`);if(o!==o.toUpperCase()&&!r)return null;r&&(n=t.getAttribute("t-component"),t.removeAttribute("t-component"));const i=t.getAttribute("t-props");t.removeAttribute("t-props");const s=t.getAttribute("t-slot-scope");t.removeAttribute("t-slot-scope");let l=null,a=null;for(let e of t.getAttributeNames()){const n=t.getAttribute(e);if(e.startsWith("t-")){if(!e.startsWith("t-on-")){const t=wn.get(e.split("-").slice(0,2).join("-"));throw new Error(t||"unsupported directive on Component: "+e)}l=l||{},l[e.slice(5)]=n}else a=a||{},a[e]=n}let c=null;if(t.hasChildNodes()){const n=t.cloneNode(!0),o=Array.from(n.querySelectorAll("[t-set-slot]"));for(let t of o){if("t"!==t.tagName)throw new Error(`Directive 't-set-slot' can only be used on <t> nodes (used on a <${t.tagName}>)`);const o=t.getAttribute("t-set-slot");let r=t.parentElement,i=!1;for(;r!==n;){if(r.hasAttribute("t-component")||r.tagName[0]===r.tagName[0].toUpperCase()){i=!0;break}r=r.parentElement}if(i)continue;t.removeAttribute("t-set-slot"),t.remove();const s=pn(t,e);let l=null,a=null,h=null;for(let e of t.getAttributeNames()){const n=t.getAttribute(e);"t-slot-scope"!==e?e.startsWith("t-on-")?(l=l||{},l[e.slice(5)]=n):(a=a||{},a[e]=n):h=n}c=c||{},c[o]={content:s,on:l,attrs:a,scope:h}}const r=kn(n,e);r&&(c=c||{},c.default={content:r,on:l,attrs:null,scope:s})}return{type:11,name:n,isDynamic:r,dynamicProps:i,props:a,slots:c,on:l}}(t,e)||function(t,e){const{tagName:n}=t,o=t.getAttribute("t-tag");if(t.removeAttribute("t-tag"),"t"===n&&!o)return null;if(n.startsWith("block-"))throw new Error(`Invalid tag name: '${n}'`);e=Object.assign({},e),"pre"===n&&(e.inPreTag=!0);const r=vn.has(n)&&!e.inSVG;e.inSVG=e.inSVG||r;const i=r?"http://www.w3.org/2000/svg":null,s=t.getAttribute("t-ref");t.removeAttribute("t-ref");const l=t.getAttributeNames();let a=null,c=null,h=null;for(let o of l){const r=t.getAttribute(o);if(o.startsWith("t-on")){if("t-on"===o)throw new Error("Missing event name with t-on directive");c=c||{},c[o.slice(5)]=r}else if(o.startsWith("t-model")){if(!["input","select","textarea"].includes(n))throw new Error("The t-model directive only works with <input>, <textarea> and <select>");let i,s;if(gn.test(r)){const t=r.lastIndexOf(".");i=r.slice(0,t),s=`'${r.slice(t+1)}'`}else{if(!yn.test(r))throw new Error(`Invalid t-model expression: "${r}" (it should be assignable)`);{const t=r.lastIndexOf("[");i=r.slice(0,t),s=r.slice(t+1,-1)}}const l=t.getAttribute("type"),a="input"===n,c="select"===n,u="textarea"===n,d=a&&"checkbox"===l,f=a&&"radio"===l,p=a&&!d&&!f,m=o.includes(".lazy"),b=o.includes(".number");h={baseExpr:i,expr:s,targetAttr:d?"checked":"value",specialInitTargetAttr:f?"checked":null,eventType:f?"click":c||m?"change":"input",hasDynamicChildren:!1,shouldTrim:o.includes(".trim")&&(p||u),shouldNumberize:b&&(p||u)},c&&((e=Object.assign({},e)).tModelInfo=h)}else{if(o.startsWith("block-"))throw new Error(`Invalid attribute: '${o}'`);if("t-name"!==o){if(o.startsWith("t-")&&!o.startsWith("t-att"))throw new Error(`Unknown QWeb directive: '${o}'`);const t=e.tModelInfo;t&&["t-att-value","t-attf-value"].includes(o)&&(t.hasDynamicChildren=!0),a=a||{},a[o]=r}}}const u=xn(t,e);return{type:2,tag:n,dynamicTag:o,attrs:a,on:c,ref:s,content:u,model:h,ns:i}}(t,e)||function(t,e){if(!t.hasAttribute("t-set"))return null;const n=t.getAttribute("t-set"),o=t.getAttribute("t-value")||null,r=t.innerHTML===t.textContent&&t.textContent||null;let i=null;t.textContent!==t.innerHTML&&(i=xn(t,e));return{type:6,name:n,value:o,defaultValue:r,body:i}}(t,e)||function(t,e){if("t"!==t.tagName)return null;return kn(t,e)}(t,e):function(t,e){if(t.nodeType===Node.TEXT_NODE){let n=t.textContent||"";if(!e.inPreTag){if(mn.test(n)&&!n.trim())return null;n=n.replace(bn," ")}return{type:0,value:n}}if(t.nodeType===Node.COMMENT_NODE)return{type:1,value:t.textContent||""};return null}(t,e)}const mn=/[\r\n]/,bn=/\s+/g;const gn=/\.[\w_]+\s*$/,yn=/\[[^\[]+\]\s*$/,vn=new Set(["svg","g","path"]);const wn=new Map([["t-ref","t-ref is no longer supported on components. Consider exposing only the public part of the component's API through a callback prop."],["t-att","t-att makes no sense on component: props are already treated as expressions"],["t-attf","t-attf is not supported on components: use template strings for string interpolation in props"]]);function xn(t,e){const n=[];for(let o of t.childNodes){const t=pn(o,e);t&&(3===t.type?n.push(...t.content):n.push(t))}return n}function kn(t,e){const n=xn(t,e);switch(n.length){case 0:return null;case 1:return n[0];default:return{type:3,content:n}}}class $n{constructor(){this.tasks=new Set,this.frame=0,this.delayedRenders=[],this.requestAnimationFrame=$n.requestAnimationFrame}addFiber(t){this.tasks.add(t.root)}flush(){if(this.delayedRenders.length){let t=this.delayedRenders;this.delayedRenders=[];for(let e of t)e.root&&2!==e.node.status&&e.node.fiber===e&&e.render()}0===this.frame&&(this.frame=this.requestAnimationFrame((()=>{this.frame=0,this.tasks.forEach((t=>this.processFiber(t)));for(let t of this.tasks)2===t.node.status&&this.tasks.delete(t)})))}processFiber(t){if(t.root!==t)return void this.tasks.delete(t);const e=kt.has(t);e&&0!==t.counter?this.tasks.delete(t):2!==t.node.status?0===t.counter&&(e||t.complete(),this.tasks.delete(t)):this.tasks.delete(t)}}$n.requestAnimationFrame=window.requestAnimationFrame.bind(window);let Nn=!1;class En extends je{constructor(t,e={}){super(e),this.scheduler=new $n,this.root=null,this.Root=t,e.test&&(this.dev=!0),this.warnIfNoStaticProps=e.warnIfNoStaticProps||!1,!this.dev||e.test||Nn||(console.info(`Owl is running in 'dev' mode.\n\nThis is not suitable for production use.\nSee https://github.com/odoo/owl/blob/${window.owl?window.owl.__info__.hash:"master"}/doc/reference/app.md#configuration for more information.`),Nn=!0);const n=e.env||{},o=Object.getOwnPropertyDescriptors(n);this.env=Object.freeze(Object.create(Object.getPrototypeOf(n),o)),this.props=e.props||{}}mount(t,e){En.validateTarget(t),this.dev&&Re(this.Root,this.props,{__owl__:{app:this}});const n=this.makeNode(this.Root,this.props),o=this.mountNode(n,t,e);return this.root=n,o}makeNode(t,e){return new he(t,e,this,null,null)}mountNode(t,e,n){const o=new Promise(((e,n)=>{let o=!1;t.mounted.push((()=>{e(t.component),o=!0}));let r=$t.get(t);r||(r=[],$t.set(t,r)),r.unshift((t=>{throw o?console.error(t):n(t),t}))}));return t.mountComponent(e,n),o}destroy(){this.root&&(this.scheduler.flush(),this.root.destroy())}createComponent(t,e,n,o,r){const i=!e;const s=n?(t,e)=>!0:r?(t,e)=>!1:function(t,e){for(let n in t)if(t[n]!==e[n])return!0;return o&&Object.keys(t).length!==Object.keys(e).length},l=he.prototype.updateAndRender,a=he.prototype.initiateRender;return(n,o,r,c,h)=>{let u=r.children,d=u[o];i&&d&&d.component.constructor!==h&&(d=void 0);const f=r.fiber;if(d)(s(d.props,n)||f.deep||d.forceNextRender)&&(d.forceNextRender=!1,l.call(d,n,f));else{if(e){if(!(h=c.constructor.components[t]))throw new Error(`Cannot find the definition of component "${t}"`);if(!(h.prototype instanceof be))throw new Error(`"${t}" is not a Component. It must inherit from the Component class`)}d=new he(h,n,this,r,o),u[o]=d,a.call(d,new _t(d,f))}return f.childrenMap[o]=d,d}}}function An(t,e){const n=Object.create(t),o=Object.getOwnPropertyDescriptors(e);return Object.freeze(Object.defineProperties(n,o))}function Tn(t){const e=se();e.childEnv=An(e.childEnv,t)}En.validateTarget=function(t){if(!(t instanceof HTMLElement))throw new Error("Cannot mount component: the target is not a valid DOM element");if(!document.body.contains(t))throw new Error("Cannot mount a component on a detached dom node")},n.shouldNormalizeDom=!1,n.mainEventHandler=(t,n,o)=>{const{data:r,modifiers:i}=e(t);t=r;let s=!1;if(i.length){let t=!1;const e=n.target===o;for(const o of i)switch(o){case"self":if(t=!0,e)continue;return s;case"prevent":(t&&e||!t)&&n.preventDefault();continue;case"stop":(t&&e||!t)&&n.stopPropagation(),s=!0;continue}}if(Object.hasOwnProperty.call(t,0)){const e=t[0];if("function"!=typeof e)throw new Error(`Invalid handler (expected a function, received: '${e}')`);let o=t[1]?t[1].__owl__:null;o&&1!==o.status||e.call(o?o.component:null,n)}return s};const _n={config:n,mount:xt,patch:function(t,e,n=!1){t.patch(e,n)},remove:function(t,e=!1){e&&t.beforeRemove(),t.remove()},list:pt,multi:O,text:z,toggler:r,createBlock:tt,html:wt,comment:K},Sn={};je.prototype._compileTemplate=function(t,e){return function(t,e={}){const n=dn(t),o=t instanceof Node?!(t instanceof Element)||null===t.querySelector("[t-set], [t-call]"):!t.includes("t-set")&&!t.includes("t-call"),r=new hn(n,{...e,hasSafeContext:o}).generateCode();return new Function("app, bdom, helpers",r)}(e,{name:t,dev:this.dev,translateFn:this.translateFn,translatableAttributes:this.translatableAttributes})},t.App=En,t.Component=be,t.EventBus=oe,t.__info__=Sn,t.blockDom=_n,t.loadFile=async function(t){const e=await fetch(t);if(!e.ok)throw new Error("Error while fetching xml templates");return await e.text()},t.markRaw=Ft,t.markup=function(t){return new re(t)},t.mount=async function(t,e,n={}){return new En(t,n).mount(e,n)},t.onError=function(t){const e=se();let n=$t.get(e);n||(n=[],$t.set(e,n)),n.push(t.bind(e.component))},t.onMounted=fe,t.onPatched=pe,t.onRendered=function(t){const e=se(),n=e.renderFn,o=e.app.dev?de:t=>t;t=o(t.bind(e.component),"onRendered"),e.renderFn=()=>{const e=n();return t(),e}},t.onWillDestroy=function(t){const e=se(),n=e.app.dev?de:t=>t;e.willDestroy.push(n(t.bind(e.component),"onWillDestroy"))},t.onWillPatch=function(t){const e=se(),n=e.app.dev?de:t=>t;e.willPatch.unshift(n(t.bind(e.component),"onWillPatch"))},t.onWillRender=function(t){const e=se(),n=e.renderFn,o=e.app.dev?de:t=>t;t=o(t.bind(e.component),"onWillRender"),e.renderFn=()=>(t(),n())},t.onWillStart=function(t){const e=se(),n=e.app.dev?de:t=>t;e.willStart.push(n(t.bind(e.component),"onWillStart"))},t.onWillUnmount=me,t.onWillUpdateProps=function(t){const e=se(),n=e.app.dev?de:t=>t;e.willUpdateProps.push(n(t.bind(e.component),"onWillUpdateProps"))},t.reactive=Xt,t.status=function(t){switch(t.__owl__.status){case 0:return"new";case 1:return"mounted";case 2:return"destroyed"}},t.toRaw=Vt,t.useChildSubEnv=Tn,t.useComponent=function(){return ie.component},t.useEffect=function(t,e=(()=>[NaN])){let n,o;fe((()=>{o=e(),n=t(...o)})),pe((()=>{const r=e();r.some(((t,e)=>t!==o[e]))&&(o=r,n&&n(),n=t(...o))})),me((()=>n&&n()))},t.useEnv=function(){return se().component.env},t.useExternalListener=function(t,e,n,o){const r=se(),i=n.bind(r.component);fe((()=>t.addEventListener(e,i,o))),me((()=>t.removeEventListener(e,i,o)))},t.useRef=function(t){const e=se().refs;return{get el(){return e[t]||null}}},t.useState=ce,t.useSubEnv=function(t){const e=se();e.component.env=An(e.component.env,t),Tn(t)},t.validate=function(t,e){let n=Ae(t,e);if(n.length)throw new Error("Invalid object: "+n.join(", "))},t.whenReady=function(t){return new Promise((function(t){"loading"!==document.readyState?t(!0):document.addEventListener("DOMContentLoaded",t,!1)})).then(t||function(){})},t.xml=We,Object.defineProperty(t,"__esModule",{value:!0}),Sn.version="2.0.0-beta-11",Sn.date="2022-06-28T13:28:26.775Z",Sn.hash="76c389a",Sn.url="https://github.com/odoo/owl"}(this.owl=this.owl||{});
@@ -41,6 +41,7 @@ interface Context {
41
41
  tKeyExpr: string | null;
42
42
  nameSpace?: string;
43
43
  tModelSelectedExpr?: string;
44
+ ctxVar?: string;
44
45
  }
45
46
  declare class CodeTarget {
46
47
  name: string;
@@ -105,6 +105,7 @@ export interface ASTTCall {
105
105
  type: ASTType.TCall;
106
106
  name: string;
107
107
  body: AST[] | null;
108
+ context: string | null;
108
109
  }
109
110
  interface SlotDefinition {
110
111
  content: AST | null;
@@ -18,12 +18,13 @@ declare function shallowEqual(l1: any[], l2: any[]): boolean;
18
18
  declare class LazyValue {
19
19
  fn: any;
20
20
  ctx: any;
21
+ component: any;
21
22
  node: any;
22
- constructor(fn: any, ctx: any, node: any);
23
+ constructor(fn: any, ctx: any, component: any, node: any);
23
24
  evaluate(): any;
24
25
  toString(): any;
25
26
  }
26
- export declare function safeOutput(value: any): ReturnType<typeof toggler>;
27
+ export declare function safeOutput(value: any, defaultValue?: any): ReturnType<typeof toggler>;
27
28
  declare function bind(ctx: any, fn: Function): Function;
28
29
  declare type RefMap = {
29
30
  [key: string]: HTMLElement | null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@odoo/owl",
3
- "version": "2.0.0-beta-10",
3
+ "version": "2.0.0-beta-11",
4
4
  "description": "Odoo Web Library (OWL)",
5
5
  "main": "dist/owl.cjs.js",
6
6
  "browser": "dist/owl.iife.js",