@odoo/owl 2.3.0 → 2.4.1

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.
Binary file
package/dist/owl.cjs.js CHANGED
@@ -2274,6 +2274,12 @@ function collectionsProxyHandler(target, callback, targetRawType) {
2274
2274
  }
2275
2275
 
2276
2276
  let currentNode = null;
2277
+ function saveCurrent() {
2278
+ let n = currentNode;
2279
+ return () => {
2280
+ currentNode = n;
2281
+ };
2282
+ }
2277
2283
  function getCurrent() {
2278
2284
  if (!currentNode) {
2279
2285
  throw new OwlError("No active component (a hook function should only be called in 'setup')");
@@ -2602,42 +2608,47 @@ class ComponentNode {
2602
2608
  }
2603
2609
 
2604
2610
  const TIMEOUT = Symbol("timeout");
2611
+ const HOOK_TIMEOUT = {
2612
+ onWillStart: 3000,
2613
+ onWillUpdateProps: 3000,
2614
+ };
2605
2615
  function wrapError(fn, hookName) {
2606
- const error = new OwlError(`The following error occurred in ${hookName}: `);
2607
- const timeoutError = new OwlError(`${hookName}'s promise hasn't resolved after 3 seconds`);
2616
+ const error = new OwlError();
2617
+ const timeoutError = new OwlError();
2608
2618
  const node = getCurrent();
2609
2619
  return (...args) => {
2610
2620
  const onError = (cause) => {
2611
2621
  error.cause = cause;
2612
- if (cause instanceof Error) {
2613
- error.message += `"${cause.message}"`;
2614
- }
2615
- else {
2616
- error.message = `Something that is not an Error was thrown in ${hookName} (see this Error's "cause" property)`;
2617
- }
2622
+ error.message =
2623
+ cause instanceof Error
2624
+ ? `The following error occurred in ${hookName}: "${cause.message}"`
2625
+ : `Something that is not an Error was thrown in ${hookName} (see this Error's "cause" property)`;
2618
2626
  throw error;
2619
2627
  };
2628
+ let result;
2620
2629
  try {
2621
- const result = fn(...args);
2622
- if (result instanceof Promise) {
2623
- if (hookName === "onWillStart" || hookName === "onWillUpdateProps") {
2624
- const fiber = node.fiber;
2625
- Promise.race([
2626
- result.catch(() => { }),
2627
- new Promise((resolve) => setTimeout(() => resolve(TIMEOUT), 3000)),
2628
- ]).then((res) => {
2629
- if (res === TIMEOUT && node.fiber === fiber && node.status <= 2) {
2630
- console.warn(timeoutError);
2631
- }
2632
- });
2633
- }
2634
- return result.catch(onError);
2635
- }
2636
- return result;
2630
+ result = fn(...args);
2637
2631
  }
2638
2632
  catch (cause) {
2639
2633
  onError(cause);
2640
2634
  }
2635
+ if (!(result instanceof Promise)) {
2636
+ return result;
2637
+ }
2638
+ const timeout = HOOK_TIMEOUT[hookName];
2639
+ if (timeout) {
2640
+ const fiber = node.fiber;
2641
+ Promise.race([
2642
+ result.catch(() => { }),
2643
+ new Promise((resolve) => setTimeout(() => resolve(TIMEOUT), timeout)),
2644
+ ]).then((res) => {
2645
+ if (res === TIMEOUT && node.fiber === fiber && node.status <= 2) {
2646
+ timeoutError.message = `${hookName}'s promise hasn't resolved after ${timeout / 1000} seconds`;
2647
+ console.log(timeoutError);
2648
+ }
2649
+ });
2650
+ }
2651
+ return result.catch(onError);
2641
2652
  };
2642
2653
  }
2643
2654
  // -----------------------------------------------------------------------------
@@ -5556,7 +5567,7 @@ function compile(template, options = {}) {
5556
5567
  }
5557
5568
 
5558
5569
  // do not modify manually. This file is generated by the release script.
5559
- const version = "2.3.0";
5570
+ const version = "2.4.1";
5560
5571
 
5561
5572
  // -----------------------------------------------------------------------------
5562
5573
  // Scheduler
@@ -5567,6 +5578,7 @@ class Scheduler {
5567
5578
  this.frame = 0;
5568
5579
  this.delayedRenders = [];
5569
5580
  this.cancelledNodes = new Set();
5581
+ this.processing = false;
5570
5582
  this.requestAnimationFrame = Scheduler.requestAnimationFrame;
5571
5583
  }
5572
5584
  addFiber(fiber) {
@@ -5597,6 +5609,10 @@ class Scheduler {
5597
5609
  }
5598
5610
  }
5599
5611
  processTasks() {
5612
+ if (this.processing) {
5613
+ return;
5614
+ }
5615
+ this.processing = true;
5600
5616
  this.frame = 0;
5601
5617
  for (let node of this.cancelledNodes) {
5602
5618
  node._destroy();
@@ -5610,6 +5626,7 @@ class Scheduler {
5610
5626
  this.tasks.delete(task);
5611
5627
  }
5612
5628
  }
5629
+ this.processing = false;
5613
5630
  }
5614
5631
  processFiber(fiber) {
5615
5632
  if (fiber.root !== fiber) {
@@ -5651,6 +5668,7 @@ class App extends TemplateSet {
5651
5668
  constructor(Root, config = {}) {
5652
5669
  super(config);
5653
5670
  this.scheduler = new Scheduler();
5671
+ this.subRoots = new Set();
5654
5672
  this.root = null;
5655
5673
  this.name = config.name || "";
5656
5674
  this.Root = Root;
@@ -5669,14 +5687,44 @@ class App extends TemplateSet {
5669
5687
  this.props = config.props || {};
5670
5688
  }
5671
5689
  mount(target, options) {
5672
- App.validateTarget(target);
5673
- if (this.dev) {
5674
- validateProps(this.Root, this.props, { __owl__: { app: this } });
5675
- }
5676
- const node = this.makeNode(this.Root, this.props);
5677
- const prom = this.mountNode(node, target, options);
5678
- this.root = node;
5679
- return prom;
5690
+ const root = this.createRoot(this.Root, { props: this.props });
5691
+ this.root = root.node;
5692
+ this.subRoots.delete(root.node);
5693
+ return root.mount(target, options);
5694
+ }
5695
+ createRoot(Root, config = {}) {
5696
+ const props = config.props || {};
5697
+ // hack to make sure the sub root get the sub env if necessary. for owl 3,
5698
+ // would be nice to rethink the initialization process to make sure that
5699
+ // we can create a ComponentNode and give it explicitely the env, instead
5700
+ // of looking it up in the app
5701
+ const env = this.env;
5702
+ if (config.env) {
5703
+ this.env = config.env;
5704
+ }
5705
+ const restore = saveCurrent();
5706
+ const node = this.makeNode(Root, props);
5707
+ restore();
5708
+ if (config.env) {
5709
+ this.env = env;
5710
+ }
5711
+ this.subRoots.add(node);
5712
+ return {
5713
+ node,
5714
+ mount: (target, options) => {
5715
+ App.validateTarget(target);
5716
+ if (this.dev) {
5717
+ validateProps(Root, props, { __owl__: { app: this } });
5718
+ }
5719
+ const prom = this.mountNode(node, target, options);
5720
+ return prom;
5721
+ },
5722
+ destroy: () => {
5723
+ this.subRoots.delete(node);
5724
+ node.destroy();
5725
+ this.scheduler.processTasks();
5726
+ },
5727
+ };
5680
5728
  }
5681
5729
  makeNode(Component, props) {
5682
5730
  return new ComponentNode(Component, props, this, null, null);
@@ -5708,6 +5756,9 @@ class App extends TemplateSet {
5708
5756
  }
5709
5757
  destroy() {
5710
5758
  if (this.root) {
5759
+ for (let subroot of this.subRoots) {
5760
+ subroot.destroy();
5761
+ }
5711
5762
  this.root.destroy();
5712
5763
  this.scheduler.processTasks();
5713
5764
  }
@@ -6020,6 +6071,6 @@ exports.whenReady = whenReady;
6020
6071
  exports.xml = xml;
6021
6072
 
6022
6073
 
6023
- __info__.date = '2024-07-25T13:13:44.371Z';
6024
- __info__.hash = '0cde4b8';
6074
+ __info__.date = '2024-10-31T09:42:30.824Z';
6075
+ __info__.hash = 'b8d09e5';
6025
6076
  __info__.url = 'https://github.com/odoo/owl';
package/dist/owl.es.js CHANGED
@@ -2270,6 +2270,12 @@ function collectionsProxyHandler(target, callback, targetRawType) {
2270
2270
  }
2271
2271
 
2272
2272
  let currentNode = null;
2273
+ function saveCurrent() {
2274
+ let n = currentNode;
2275
+ return () => {
2276
+ currentNode = n;
2277
+ };
2278
+ }
2273
2279
  function getCurrent() {
2274
2280
  if (!currentNode) {
2275
2281
  throw new OwlError("No active component (a hook function should only be called in 'setup')");
@@ -2598,42 +2604,47 @@ class ComponentNode {
2598
2604
  }
2599
2605
 
2600
2606
  const TIMEOUT = Symbol("timeout");
2607
+ const HOOK_TIMEOUT = {
2608
+ onWillStart: 3000,
2609
+ onWillUpdateProps: 3000,
2610
+ };
2601
2611
  function wrapError(fn, hookName) {
2602
- const error = new OwlError(`The following error occurred in ${hookName}: `);
2603
- const timeoutError = new OwlError(`${hookName}'s promise hasn't resolved after 3 seconds`);
2612
+ const error = new OwlError();
2613
+ const timeoutError = new OwlError();
2604
2614
  const node = getCurrent();
2605
2615
  return (...args) => {
2606
2616
  const onError = (cause) => {
2607
2617
  error.cause = cause;
2608
- if (cause instanceof Error) {
2609
- error.message += `"${cause.message}"`;
2610
- }
2611
- else {
2612
- error.message = `Something that is not an Error was thrown in ${hookName} (see this Error's "cause" property)`;
2613
- }
2618
+ error.message =
2619
+ cause instanceof Error
2620
+ ? `The following error occurred in ${hookName}: "${cause.message}"`
2621
+ : `Something that is not an Error was thrown in ${hookName} (see this Error's "cause" property)`;
2614
2622
  throw error;
2615
2623
  };
2624
+ let result;
2616
2625
  try {
2617
- const result = fn(...args);
2618
- if (result instanceof Promise) {
2619
- if (hookName === "onWillStart" || hookName === "onWillUpdateProps") {
2620
- const fiber = node.fiber;
2621
- Promise.race([
2622
- result.catch(() => { }),
2623
- new Promise((resolve) => setTimeout(() => resolve(TIMEOUT), 3000)),
2624
- ]).then((res) => {
2625
- if (res === TIMEOUT && node.fiber === fiber && node.status <= 2) {
2626
- console.warn(timeoutError);
2627
- }
2628
- });
2629
- }
2630
- return result.catch(onError);
2631
- }
2632
- return result;
2626
+ result = fn(...args);
2633
2627
  }
2634
2628
  catch (cause) {
2635
2629
  onError(cause);
2636
2630
  }
2631
+ if (!(result instanceof Promise)) {
2632
+ return result;
2633
+ }
2634
+ const timeout = HOOK_TIMEOUT[hookName];
2635
+ if (timeout) {
2636
+ const fiber = node.fiber;
2637
+ Promise.race([
2638
+ result.catch(() => { }),
2639
+ new Promise((resolve) => setTimeout(() => resolve(TIMEOUT), timeout)),
2640
+ ]).then((res) => {
2641
+ if (res === TIMEOUT && node.fiber === fiber && node.status <= 2) {
2642
+ timeoutError.message = `${hookName}'s promise hasn't resolved after ${timeout / 1000} seconds`;
2643
+ console.log(timeoutError);
2644
+ }
2645
+ });
2646
+ }
2647
+ return result.catch(onError);
2637
2648
  };
2638
2649
  }
2639
2650
  // -----------------------------------------------------------------------------
@@ -5552,7 +5563,7 @@ function compile(template, options = {}) {
5552
5563
  }
5553
5564
 
5554
5565
  // do not modify manually. This file is generated by the release script.
5555
- const version = "2.3.0";
5566
+ const version = "2.4.1";
5556
5567
 
5557
5568
  // -----------------------------------------------------------------------------
5558
5569
  // Scheduler
@@ -5563,6 +5574,7 @@ class Scheduler {
5563
5574
  this.frame = 0;
5564
5575
  this.delayedRenders = [];
5565
5576
  this.cancelledNodes = new Set();
5577
+ this.processing = false;
5566
5578
  this.requestAnimationFrame = Scheduler.requestAnimationFrame;
5567
5579
  }
5568
5580
  addFiber(fiber) {
@@ -5593,6 +5605,10 @@ class Scheduler {
5593
5605
  }
5594
5606
  }
5595
5607
  processTasks() {
5608
+ if (this.processing) {
5609
+ return;
5610
+ }
5611
+ this.processing = true;
5596
5612
  this.frame = 0;
5597
5613
  for (let node of this.cancelledNodes) {
5598
5614
  node._destroy();
@@ -5606,6 +5622,7 @@ class Scheduler {
5606
5622
  this.tasks.delete(task);
5607
5623
  }
5608
5624
  }
5625
+ this.processing = false;
5609
5626
  }
5610
5627
  processFiber(fiber) {
5611
5628
  if (fiber.root !== fiber) {
@@ -5647,6 +5664,7 @@ class App extends TemplateSet {
5647
5664
  constructor(Root, config = {}) {
5648
5665
  super(config);
5649
5666
  this.scheduler = new Scheduler();
5667
+ this.subRoots = new Set();
5650
5668
  this.root = null;
5651
5669
  this.name = config.name || "";
5652
5670
  this.Root = Root;
@@ -5665,14 +5683,44 @@ class App extends TemplateSet {
5665
5683
  this.props = config.props || {};
5666
5684
  }
5667
5685
  mount(target, options) {
5668
- App.validateTarget(target);
5669
- if (this.dev) {
5670
- validateProps(this.Root, this.props, { __owl__: { app: this } });
5671
- }
5672
- const node = this.makeNode(this.Root, this.props);
5673
- const prom = this.mountNode(node, target, options);
5674
- this.root = node;
5675
- return prom;
5686
+ const root = this.createRoot(this.Root, { props: this.props });
5687
+ this.root = root.node;
5688
+ this.subRoots.delete(root.node);
5689
+ return root.mount(target, options);
5690
+ }
5691
+ createRoot(Root, config = {}) {
5692
+ const props = config.props || {};
5693
+ // hack to make sure the sub root get the sub env if necessary. for owl 3,
5694
+ // would be nice to rethink the initialization process to make sure that
5695
+ // we can create a ComponentNode and give it explicitely the env, instead
5696
+ // of looking it up in the app
5697
+ const env = this.env;
5698
+ if (config.env) {
5699
+ this.env = config.env;
5700
+ }
5701
+ const restore = saveCurrent();
5702
+ const node = this.makeNode(Root, props);
5703
+ restore();
5704
+ if (config.env) {
5705
+ this.env = env;
5706
+ }
5707
+ this.subRoots.add(node);
5708
+ return {
5709
+ node,
5710
+ mount: (target, options) => {
5711
+ App.validateTarget(target);
5712
+ if (this.dev) {
5713
+ validateProps(Root, props, { __owl__: { app: this } });
5714
+ }
5715
+ const prom = this.mountNode(node, target, options);
5716
+ return prom;
5717
+ },
5718
+ destroy: () => {
5719
+ this.subRoots.delete(node);
5720
+ node.destroy();
5721
+ this.scheduler.processTasks();
5722
+ },
5723
+ };
5676
5724
  }
5677
5725
  makeNode(Component, props) {
5678
5726
  return new ComponentNode(Component, props, this, null, null);
@@ -5704,6 +5752,9 @@ class App extends TemplateSet {
5704
5752
  }
5705
5753
  destroy() {
5706
5754
  if (this.root) {
5755
+ for (let subroot of this.subRoots) {
5756
+ subroot.destroy();
5757
+ }
5707
5758
  this.root.destroy();
5708
5759
  this.scheduler.processTasks();
5709
5760
  }
@@ -5981,6 +6032,6 @@ TemplateSet.prototype._compileTemplate = function _compileTemplate(name, templat
5981
6032
  export { App, Component, EventBus, OwlError, __info__, batched, 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, validateType, whenReady, xml };
5982
6033
 
5983
6034
 
5984
- __info__.date = '2024-07-25T13:13:44.371Z';
5985
- __info__.hash = '0cde4b8';
6035
+ __info__.date = '2024-10-31T09:42:30.824Z';
6036
+ __info__.hash = 'b8d09e5';
5986
6037
  __info__.url = 'https://github.com/odoo/owl';
package/dist/owl.iife.js CHANGED
@@ -2273,6 +2273,12 @@
2273
2273
  }
2274
2274
 
2275
2275
  let currentNode = null;
2276
+ function saveCurrent() {
2277
+ let n = currentNode;
2278
+ return () => {
2279
+ currentNode = n;
2280
+ };
2281
+ }
2276
2282
  function getCurrent() {
2277
2283
  if (!currentNode) {
2278
2284
  throw new OwlError("No active component (a hook function should only be called in 'setup')");
@@ -2601,42 +2607,47 @@
2601
2607
  }
2602
2608
 
2603
2609
  const TIMEOUT = Symbol("timeout");
2610
+ const HOOK_TIMEOUT = {
2611
+ onWillStart: 3000,
2612
+ onWillUpdateProps: 3000,
2613
+ };
2604
2614
  function wrapError(fn, hookName) {
2605
- const error = new OwlError(`The following error occurred in ${hookName}: `);
2606
- const timeoutError = new OwlError(`${hookName}'s promise hasn't resolved after 3 seconds`);
2615
+ const error = new OwlError();
2616
+ const timeoutError = new OwlError();
2607
2617
  const node = getCurrent();
2608
2618
  return (...args) => {
2609
2619
  const onError = (cause) => {
2610
2620
  error.cause = cause;
2611
- if (cause instanceof Error) {
2612
- error.message += `"${cause.message}"`;
2613
- }
2614
- else {
2615
- error.message = `Something that is not an Error was thrown in ${hookName} (see this Error's "cause" property)`;
2616
- }
2621
+ error.message =
2622
+ cause instanceof Error
2623
+ ? `The following error occurred in ${hookName}: "${cause.message}"`
2624
+ : `Something that is not an Error was thrown in ${hookName} (see this Error's "cause" property)`;
2617
2625
  throw error;
2618
2626
  };
2627
+ let result;
2619
2628
  try {
2620
- const result = fn(...args);
2621
- if (result instanceof Promise) {
2622
- if (hookName === "onWillStart" || hookName === "onWillUpdateProps") {
2623
- const fiber = node.fiber;
2624
- Promise.race([
2625
- result.catch(() => { }),
2626
- new Promise((resolve) => setTimeout(() => resolve(TIMEOUT), 3000)),
2627
- ]).then((res) => {
2628
- if (res === TIMEOUT && node.fiber === fiber && node.status <= 2) {
2629
- console.warn(timeoutError);
2630
- }
2631
- });
2632
- }
2633
- return result.catch(onError);
2634
- }
2635
- return result;
2629
+ result = fn(...args);
2636
2630
  }
2637
2631
  catch (cause) {
2638
2632
  onError(cause);
2639
2633
  }
2634
+ if (!(result instanceof Promise)) {
2635
+ return result;
2636
+ }
2637
+ const timeout = HOOK_TIMEOUT[hookName];
2638
+ if (timeout) {
2639
+ const fiber = node.fiber;
2640
+ Promise.race([
2641
+ result.catch(() => { }),
2642
+ new Promise((resolve) => setTimeout(() => resolve(TIMEOUT), timeout)),
2643
+ ]).then((res) => {
2644
+ if (res === TIMEOUT && node.fiber === fiber && node.status <= 2) {
2645
+ timeoutError.message = `${hookName}'s promise hasn't resolved after ${timeout / 1000} seconds`;
2646
+ console.log(timeoutError);
2647
+ }
2648
+ });
2649
+ }
2650
+ return result.catch(onError);
2640
2651
  };
2641
2652
  }
2642
2653
  // -----------------------------------------------------------------------------
@@ -5555,7 +5566,7 @@
5555
5566
  }
5556
5567
 
5557
5568
  // do not modify manually. This file is generated by the release script.
5558
- const version = "2.3.0";
5569
+ const version = "2.4.1";
5559
5570
 
5560
5571
  // -----------------------------------------------------------------------------
5561
5572
  // Scheduler
@@ -5566,6 +5577,7 @@
5566
5577
  this.frame = 0;
5567
5578
  this.delayedRenders = [];
5568
5579
  this.cancelledNodes = new Set();
5580
+ this.processing = false;
5569
5581
  this.requestAnimationFrame = Scheduler.requestAnimationFrame;
5570
5582
  }
5571
5583
  addFiber(fiber) {
@@ -5596,6 +5608,10 @@
5596
5608
  }
5597
5609
  }
5598
5610
  processTasks() {
5611
+ if (this.processing) {
5612
+ return;
5613
+ }
5614
+ this.processing = true;
5599
5615
  this.frame = 0;
5600
5616
  for (let node of this.cancelledNodes) {
5601
5617
  node._destroy();
@@ -5609,6 +5625,7 @@
5609
5625
  this.tasks.delete(task);
5610
5626
  }
5611
5627
  }
5628
+ this.processing = false;
5612
5629
  }
5613
5630
  processFiber(fiber) {
5614
5631
  if (fiber.root !== fiber) {
@@ -5650,6 +5667,7 @@ See https://github.com/odoo/owl/blob/${hash}/doc/reference/app.md#configuration
5650
5667
  constructor(Root, config = {}) {
5651
5668
  super(config);
5652
5669
  this.scheduler = new Scheduler();
5670
+ this.subRoots = new Set();
5653
5671
  this.root = null;
5654
5672
  this.name = config.name || "";
5655
5673
  this.Root = Root;
@@ -5668,14 +5686,44 @@ See https://github.com/odoo/owl/blob/${hash}/doc/reference/app.md#configuration
5668
5686
  this.props = config.props || {};
5669
5687
  }
5670
5688
  mount(target, options) {
5671
- App.validateTarget(target);
5672
- if (this.dev) {
5673
- validateProps(this.Root, this.props, { __owl__: { app: this } });
5674
- }
5675
- const node = this.makeNode(this.Root, this.props);
5676
- const prom = this.mountNode(node, target, options);
5677
- this.root = node;
5678
- return prom;
5689
+ const root = this.createRoot(this.Root, { props: this.props });
5690
+ this.root = root.node;
5691
+ this.subRoots.delete(root.node);
5692
+ return root.mount(target, options);
5693
+ }
5694
+ createRoot(Root, config = {}) {
5695
+ const props = config.props || {};
5696
+ // hack to make sure the sub root get the sub env if necessary. for owl 3,
5697
+ // would be nice to rethink the initialization process to make sure that
5698
+ // we can create a ComponentNode and give it explicitely the env, instead
5699
+ // of looking it up in the app
5700
+ const env = this.env;
5701
+ if (config.env) {
5702
+ this.env = config.env;
5703
+ }
5704
+ const restore = saveCurrent();
5705
+ const node = this.makeNode(Root, props);
5706
+ restore();
5707
+ if (config.env) {
5708
+ this.env = env;
5709
+ }
5710
+ this.subRoots.add(node);
5711
+ return {
5712
+ node,
5713
+ mount: (target, options) => {
5714
+ App.validateTarget(target);
5715
+ if (this.dev) {
5716
+ validateProps(Root, props, { __owl__: { app: this } });
5717
+ }
5718
+ const prom = this.mountNode(node, target, options);
5719
+ return prom;
5720
+ },
5721
+ destroy: () => {
5722
+ this.subRoots.delete(node);
5723
+ node.destroy();
5724
+ this.scheduler.processTasks();
5725
+ },
5726
+ };
5679
5727
  }
5680
5728
  makeNode(Component, props) {
5681
5729
  return new ComponentNode(Component, props, this, null, null);
@@ -5707,6 +5755,9 @@ See https://github.com/odoo/owl/blob/${hash}/doc/reference/app.md#configuration
5707
5755
  }
5708
5756
  destroy() {
5709
5757
  if (this.root) {
5758
+ for (let subroot of this.subRoots) {
5759
+ subroot.destroy();
5760
+ }
5710
5761
  this.root.destroy();
5711
5762
  this.scheduler.processTasks();
5712
5763
  }
@@ -6021,8 +6072,8 @@ See https://github.com/odoo/owl/blob/${hash}/doc/reference/app.md#configuration
6021
6072
  Object.defineProperty(exports, '__esModule', { value: true });
6022
6073
 
6023
6074
 
6024
- __info__.date = '2024-07-25T13:13:44.371Z';
6025
- __info__.hash = '0cde4b8';
6075
+ __info__.date = '2024-10-31T09:42:30.824Z';
6076
+ __info__.hash = 'b8d09e5';
6026
6077
  __info__.url = 'https://github.com/odoo/owl';
6027
6078
 
6028
6079
 
@@ -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)}moveBeforeDOMNode(t,e){this.child.moveBeforeDOMNode(t,e)}moveBeforeVNode(t,e){this.moveBeforeDOMNode(t&&t.firstNode()||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)}class s extends Error{}const{setAttribute:i,removeAttribute:l}=Element.prototype,a=DOMTokenList.prototype,c=a.add,h=a.remove,u=Array.isArray,{split:d,trim:f}=String.prototype,p=/\s+/;function m(t,e){switch(e){case!1:case void 0:l.call(this,t);break;case!0:i.call(this,t,"");break;default:i.call(this,t,e)}}function b(t){return function(e){m.call(this,t,e)}}function g(t){if(u(t))"class"===t[0]?w.call(this,t[1]):m.call(this,t[0],t[1]);else for(let e in t)"class"===e?w.call(this,t[e]):m.call(this,e,t[e])}function y(t,e){if(u(t)){const n=t[0],o=t[1];if(n===e[0]){if(o===e[1])return;"class"===n?$.call(this,o,e[1]):m.call(this,n,o)}else l.call(this,e[0]),m.call(this,n,o)}else{for(let n in e)n in t||("class"===n?$.call(this,"",e[n]):l.call(this,n));for(let n in t){const o=t[n];o!==e[n]&&("class"===n?$.call(this,o,e[n]):m.call(this,n,o))}}}function v(t){const e={};switch(typeof t){case"string":const n=f.call(t);if(!n)return{};let o=d.call(n,p);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=f.call(n),!n)continue;const t=d.call(n,p);for(let n of t)e[n]=o}}return e;case"undefined":return{};case"number":return{[t]:!0};default:return{[t]:!0}}}function w(t){t=""===t?{}:v(t);const e=this.classList;for(let n in t)c.call(e,n)}function $(t,e){e=""===e?{}:v(e),t=""===t?{}:v(t);const n=this.classList;for(let o in e)o in t||h.call(n,o);for(let o in t)o in e||c.call(n,o)}function x(t){let e=!1;return async(...n)=>{e||(e=!0,await Promise.resolve(),e=!1,t(...n))}}function N(t){if(!t)return!1;if(t.ownerDocument.contains(t))return!0;const e=t.getRootNode();return e instanceof ShadowRoot&&t.ownerDocument.contains(e.host)}class k extends EventTarget{trigger(t,e){this.dispatchEvent(new CustomEvent(t,{detail:e}))}}class E extends String{}function A(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=`${o}_capture`);!function(t,e,o=!1){if(C[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}),C[e]=!0}(t,o,e);const r=_++;function s(t){const e=this[o]||{};e[r]=t,this[o]=e}function i(){delete this[o]}return{setup:s,update:s,remove:i}}(e,o):function(t,e=!1){let o=`__event__${t}_${T++}`;e&&(o=`${o}_capture`);function r(t){const e=t.currentTarget;if(!e||!N(e))return;const r=e[o];r&&n.mainEventHandler(r,t,e)}function s(n){this[o]=n,this.addEventListener(t,r,{capture:e})}function i(){delete this[o],this.removeEventListener(t,r,{capture:e})}function l(t){this[o]=t}return{setup:s,update:l,remove:i}}(e,o)}let T=1;let _=1;const C={};const O=Node.prototype,S=O.insertBefore,D=(L=O,R="textContent",Object.getOwnPropertyDescriptor(L,R)).set;var L,R;const B=O.removeChild;class P{constructor(t){this.children=t}mount(t,e){const n=this.children,o=n.length,r=new Array(o);for(let s=0;s<o;s++){let o=n[s];if(o)o.mount(t,e);else{const n=document.createTextNode("");r[s]=n,S.call(t,n,e)}}this.anchors=r,this.parentEl=t}moveBeforeDOMNode(t,e=this.parentEl){this.parentEl=e;const n=this.children,o=this.anchors;for(let r=0,s=n.length;r<s;r++){let s=n[r];if(s)s.moveBeforeDOMNode(t,e);else{const n=o[r];S.call(e,n,t)}}}moveBeforeVNode(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,s=n.length;t<s;t++){let s=n[t];if(s)s.moveBeforeVNode(null,e);else{const n=r[t];S.call(o,n,e)}}}patch(t,e){if(this===t)return;const n=this.children,o=t.children,r=this.anchors,s=this.parentEl;for(let t=0,i=n.length;t<i;t++){const i=n[t],l=o[t];if(i)if(l)i.patch(l,e);else{const o=i.firstNode(),l=document.createTextNode("");r[t]=l,S.call(s,l,o),e&&i.beforeRemove(),i.remove(),n[t]=void 0}else if(l){n[t]=l;const e=r[t];l.mount(s,e),B.call(s,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)D.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():B.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 j(t){return new P(t)}const M=Node.prototype,I=CharacterData.prototype,W=M.insertBefore,F=((t,e)=>Object.getOwnPropertyDescriptor(t,e))(I,"data").set,V=M.removeChild;class K{constructor(t){this.text=t}mountNode(t,e,n){this.parentEl=e,W.call(e,t,n),this.el=t}moveBeforeDOMNode(t,e=this.parentEl){this.parentEl=e,W.call(e,this.el,t)}moveBeforeVNode(t,e){W.call(this.parentEl,this.el,t?t.el:e)}beforeRemove(){}remove(){V.call(this.parentEl,this.el)}firstNode(){return this.el}toString(){return this.text}}class z extends K{mount(t,e){this.mountNode(document.createTextNode(G(this.text)),t,e)}patch(t){const e=t.text;this.text!==e&&(F.call(this.el,G(e)),this.text=e)}}class H extends K{mount(t,e){this.mountNode(document.createComment(G(this.text)),t,e)}patch(){}}function U(t){return new z(t)}function q(t){return new H(t)}function G(t){switch(typeof t){case"string":return t;case"number":return String(t);case"boolean":return t?"true":"false";default:return t||""}}const X=(t,e)=>Object.getOwnPropertyDescriptor(t,e),Y=Node.prototype,Z=Element.prototype,J=X(CharacterData.prototype,"data").set,Q=X(Y,"firstChild").get,tt=X(Y,"nextSibling").get,et=()=>{};function nt(t){return function(e){this[t]=0===e?0:e?e.valueOf():""}}const ot={};function rt(t){if(t in ot)return ot[t];const e=(new DOMParser).parseFromString(`<t>${t}</t>`,"text/xml").firstChild.firstChild;n.shouldNormalizeDom&&st(e);const o=it(e),r=ct(o),s=function(t,e){let n=function(t,e){const{refN:n,collectors:o,children:r}=e,s=o.length;e.locations.sort(((t,e)=>t.idx-e.idx));const i=e.locations.map((t=>({refIdx:t.refIdx,setData:t.setData,updateData:t.updateData}))),l=i.length,a=r.length,c=r,h=n>0,u=Y.cloneNode,d=Y.insertBefore,f=Z.remove;class p{constructor(t){this.data=t}beforeRemove(){}remove(){f.call(this.el)}firstNode(){return this.el}moveBeforeDOMNode(t,e=this.parentEl){this.parentEl=e,d.call(e,this.el,t)}moveBeforeVNode(t,e){d.call(this.parentEl,this.el,t?t.el:e)}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<s;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=i[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],s=o[t];if(r!==s){const e=i[t];e.updateData.call(n[e.refIdx],s,r)}}this.data=o}if(a){let o=this.children;const r=t.children;for(let t=0;t<a;t++){const s=o[t],i=r[t];if(s)i?s.patch(i,e):(e&&s.beforeRemove(),s.remove(),o[t]=void 0);else if(i){const e=c[t],r=e.afterRefIdx?n[e.afterRefIdx]:null;i.mount(n[e.parentRefIdx],r),o[t]=i}}}});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=P.prototype.beforeRemove,(t,e=[])=>new n(t,e);return t=>new n(t)}(o.el,r);return ot[t]=s,s}function st(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)st(t.childNodes.item(e))}else t.remove()}function it(t,e=null,n=null){switch(t.nodeType){case Node.ELEMENT_NODE:{let o=n&&n.currentNS;const r=t.tagName;let s;const i=[];if(r.startsWith("block-text-")){const t=parseInt(r.slice(11),10);i.push({type:"text",idx:t}),s=document.createTextNode("")}if(r.startsWith("block-child-")){n.isRef||lt(n);const t=parseInt(r.slice(12),10);i.push({type:"child",idx:t}),s=document.createTextNode("")}if(o||(o=t.namespaceURI),s||(s=o?document.createElementNS(o,r):document.createElement(r)),s instanceof Element){if(!n){document.createElement("template").content.appendChild(s)}const e=t.attributes;for(let t=0;t<e.length;t++){const n=e[t].name,o=e[t].value;if(n.startsWith("block-handler-")){const t=parseInt(n.slice(14),10);i.push({type:"handler",idx:t,event:o})}else if(n.startsWith("block-attribute-")){const t=parseInt(n.slice(16),10);i.push({type:"attribute",idx:t,name:o,tag:r})}else if(n.startsWith("block-property-")){const t=parseInt(n.slice(15),10);i.push({type:"property",idx:t,name:o,tag:r})}else"block-attributes"===n?i.push({type:"attributes",idx:parseInt(o,10)}):"block-ref"===n?i.push({type:"ref",idx:parseInt(o,10)}):s.setAttribute(e[t].name,o)}}const l={parent:e,firstChild:null,nextSibling:null,el:s,info:i,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);i.push({idx:n,type:"child",isOnlyChild:!0})}else{l.firstChild=it(t.firstChild,l,l),s.appendChild(l.firstChild.el);let e=t.firstChild,n=l.firstChild;for(;e=e.nextSibling;)n.nextSibling=it(e,n,l),s.appendChild(n.nextSibling.el),n=n.nextSibling}}return l.info.length&&lt(l),l}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 s("boom")}function lt(t){t.isRef=!0;do{t.refN++}while(t=t.parent)}function at(t){let e=t.parent;for(;e&&e.nextSibling===t;)t=e,e=e.parent;return e}function ct(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,s=t.firstChild?t.firstChild.refN:0,i=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:ht,updateData:ht});break;case"child":n.isOnlyChild?t.children[n.idx]={parentRefIdx:n.refIdx,isOnlyChild:!0}:t.children[n.idx]={parentRefIdx:at(e).refIdx,afterRefIdx:n.refIdx};break;case"property":{const e=n.refIdx,o=nt(n.name);t.locations.push({idx:n.idx,refIdx:e,setData:o,updateData:o});break}case"attribute":{const e=n.refIdx;let o,r;"class"===n.name?(r=w,o=$):(r=b(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:g,updateData:y});break;case"handler":{const{setup:e,update:o}=A(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:ut(o,t.refList),updateData:et})}}(e,t),n++}if(i){const r=n+s;e.collectors.push({idx:r,prevIdx:o,getVal:tt}),ct(t.nextSibling,e,r)}s&&(e.collectors.push({idx:n,prevIdx:o,getVal:Q}),ct(t.firstChild,e,n))}return e}function ht(t){J.call(this,G(t))}function ut(t,e){return function(n){e[e.length-1][t]=()=>n(this)}}const dt=Node.prototype,ft=dt.insertBefore,pt=dt.appendChild,mt=dt.removeChild,bt=((t,e)=>Object.getOwnPropertyDescriptor(t,e))(dt,"textContent").set;class gt{constructor(t){this.children=t}mount(t,e){const n=this.children,o=document.createTextNode("");this.anchor=o,ft.call(t,o,e);const r=n.length;if(r){const e=n[0].mount;for(let s=0;s<r;s++)e.call(n[s],t,o)}this.parentEl=t}moveBeforeDOMNode(t,e=this.parentEl){this.parentEl=e;const n=this.children;for(let o=0,r=n.length;o<r;o++)n[o].moveBeforeDOMNode(t,e);e.insertBefore(this.anchor,t)}moveBeforeVNode(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].moveBeforeVNode(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:s,patch:i,remove:l,beforeRemove:a,moveBeforeVNode: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 bt.call(f,""),void pt.call(f,u)}let p,m=0,b=0,g=n[0],y=o[0],v=n.length-1,w=o.length-1,$=n[v],x=o[w];for(;m<=v&&b<=w;){if(null===g){g=n[++m];continue}if(null===$){$=n[--v];continue}let t=g.key,r=y.key;if(t===r){i.call(g,y,e),o[b]=g,g=n[++m],y=o[++b];continue}let l=$.key,a=x.key;if(l===a){i.call($,x,e),o[w]=$,$=n[--v],x=o[--w];continue}if(t===a){i.call(g,x,e),o[w]=g;const t=o[w+1];c.call(g,t,u),g=n[++m],x=o[--w];continue}if(l===r){i.call($,y,e),o[b]=$;const t=n[m];c.call($,t,u),$=n[--v],y=o[++b];continue}p=p||vt(n,m,v);let d=p[r];if(void 0===d)s.call(y,f,h.call(g)||null);else{const t=n[d];c.call(t,g,null),i.call(t,y,e),o[b]=t,n[d]=null}y=o[++b]}if(m<=v||b<=w)if(m>v){const t=o[w+1],e=t?h.call(t)||null:u;for(let t=b;t<=w;t++)s.call(o[t],f,e)}else for(let t=m;t<=v;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)bt.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])}mt.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 yt(t){return new gt(t)}function vt(t,e,n){let o={};for(let r=e;r<=n;r++)o[t[r].key]=r;return o}const wt=Node.prototype,$t=wt.insertBefore,xt=wt.removeChild;class Nt{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)$t.call(t,n,e);if(!this.content.length){const n=document.createTextNode("");this.content.push(n),$t.call(t,n,e)}}moveBeforeDOMNode(t,e=this.parentEl){this.parentEl=e;for(let n of this.content)$t.call(e,n,t)}moveBeforeVNode(t,e){const n=t?t.content[0]:e;this.moveBeforeDOMNode(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 s=[...r.content.childNodes];for(let t of s)$t.call(n,t,o);if(!s.length){const t=document.createTextNode("");s.push(t),$t.call(n,t,o)}this.remove(),this.content=s,this.html=t.html}}beforeRemove(){}remove(){const t=this.parentEl;for(let e of this.content)xt.call(t,e)}firstNode(){return this.content[0]}toString(){return this.html}}function kt(t){return new Nt(t)}function Et(t,e,n=null){t.mount(e,n)}const At=new WeakMap,Tt=new WeakMap;function _t(t,e){if(!t)return!1;const n=t.fiber;n&&At.set(n,e);const o=Tt.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 _t(t.parent,e)}function Ct(t){let{error:e}=t;e instanceof s||(e=Object.assign(new s('An error occured in the owl lifecycle (see this Error\'s "cause" property)'),{cause:e}));const n="node"in t?t.node:t.fiber.node,o="fiber"in t?t.fiber:n.fiber;if(o){let t=o;do{t.node.fiber=t,t=t.parent}while(t);At.set(o.root,e)}if(!_t(n,e)){console.warn("[Owl] Unhandled error. Destroying the root component");try{n.app.destroy()}catch(t){console.error(t)}throw e}}function Ot(){throw new s("Attempted to render cancelled fiber")}function St(t){let e=0;for(let n of t){let t=n.node;n.render=Ot,0===t.status&&t.cancel(),t.fiber=null,n.bdom?t.forceNextRender=!0:e++,e+=St(n.children)}return e}class Dt{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){t.app.handleError({node:t,error:e})}e.setCounter(e.counter-1)}}}class Lt extends Dt{constructor(){super(...arguments),this.counter=1,this.willPatch=[],this.patched=[],this.mounted=[],this.locked=!1}complete(){const t=this.node;let e;this.locked=!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.appliedToDom)for(let t of e.node.mounted)t();let o=this.patched;for(;e=o.pop();)if(e.appliedToDom)for(let t of e.node.patched)t()}catch(n){this.locked=!1,t.app.handleError({fiber:e||this,error:n})}}setCounter(t){this.counter=t,0===t&&this.node.app.scheduler.flush()}}class Rt extends Lt{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)Et(e.bdom,this.target);else{const t=this.target.childNodes[0];Et(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){this.node.app.handleError({fiber:t,error:e})}}}const Bt=Symbol("Key changes"),Pt=()=>{throw new Error("Called NO_CALLBACK. Owl is broken, please report this to the maintainers.")},jt=Object.prototype.toString,Mt=Object.prototype.hasOwnProperty,It=["Object","Array","Set","Map","WeakMap"],Wt=["Set","Map","WeakMap"];function Ft(t){return jt.call(Ut(t)).slice(8,-1)}function Vt(t){return"object"==typeof t&&It.includes(Ft(t))}function Kt(t,e){return Vt(t)?te(t,e):t}const zt=new WeakSet;function Ht(t){return zt.add(t),t}function Ut(t){return Jt.has(t)?Jt.get(t):t}const qt=new WeakMap;function Gt(t,e,n){if(n===Pt)return;qt.get(t)||qt.set(t,new Map);const o=qt.get(t);o.get(e)||o.set(e,new Set),o.get(e).add(n),Yt.has(n)||Yt.set(n,new Set),Yt.get(n).add(t)}function Xt(t,e){const n=qt.get(t);if(!n)return;const o=n.get(e);if(o)for(const t of[...o])Zt(t),t()}const Yt=new WeakMap;function Zt(t){const e=Yt.get(t);if(e){for(const n of e){const e=qt.get(n);if(e)for(const[n,o]of e.entries())o.delete(t),o.size||e.delete(n)}e.clear()}}const Jt=new WeakMap,Qt=new WeakMap;function te(t,e=Pt){if(!Vt(t))throw new s("Cannot make the given value reactive");if(zt.has(t))return t;if(Jt.has(t))return te(Jt.get(t),e);Qt.has(t)||Qt.set(t,new WeakMap);const n=Qt.get(t);if(!n.has(e)){const o=Ft(t),r=Wt.includes(o)?function(t,e,n){const o=le[n](t,e);return Object.assign(ee(e),{get:(t,n)=>Mt.call(o,n)?o[n]:(Gt(t,n,e),Kt(t[n],e))})}(t,e,o):ee(e),s=new Proxy(t,r);n.set(e,s),Jt.set(s,t)}return n.get(e)}function ee(t){return{get(e,n,o){const r=Object.getOwnPropertyDescriptor(e,n);return!r||r.writable||r.configurable?(Gt(e,n,t),Kt(Reflect.get(e,n,o),t)):Reflect.get(e,n,o)},set(t,e,n,o){const r=Mt.call(t,e),s=Reflect.get(t,e,o),i=Reflect.set(t,e,Ut(n),o);return!r&&Mt.call(t,e)&&Xt(t,Bt),(s!==Reflect.get(t,e,o)||"length"===e&&Array.isArray(t))&&Xt(t,e),i},deleteProperty(t,e){const n=Reflect.deleteProperty(t,e);return Xt(t,Bt),Xt(t,e),n},ownKeys:e=>(Gt(e,Bt,t),Reflect.ownKeys(e)),has:(e,n)=>(Gt(e,Bt,t),Reflect.has(e,n))}}function ne(t,e,n){return o=>(o=Ut(o),Gt(e,o,n),Kt(e[t](o),n))}function oe(t,e,n){return function*(){Gt(e,Bt,n);const o=e.keys();for(const r of e[t]()){const t=o.next().value;Gt(e,t,n),yield Kt(r,n)}}}function re(t,e){return function(n,o){Gt(t,Bt,e),t.forEach((function(r,s,i){Gt(t,s,e),n.call(o,Kt(r,e),Kt(s,e),Kt(i,e))}),o)}}function se(t,e,n){return(o,r)=>{o=Ut(o);const s=n.has(o),i=n[e](o),l=n[t](o,r);return s!==n.has(o)&&Xt(n,Bt),i!==n[e](o)&&Xt(n,o),l}}function ie(t){return()=>{const e=[...t.keys()];t.clear(),Xt(t,Bt);for(const n of e)Xt(t,n)}}const le={Set:(t,e)=>({has:ne("has",t,e),add:se("add","has",t),delete:se("delete","has",t),keys:oe("keys",t,e),values:oe("values",t,e),entries:oe("entries",t,e),[Symbol.iterator]:oe(Symbol.iterator,t,e),forEach:re(t,e),clear:ie(t),get size(){return Gt(t,Bt,e),t.size}}),Map:(t,e)=>({has:ne("has",t,e),get:ne("get",t,e),set:se("set","get",t),delete:se("delete","has",t),keys:oe("keys",t,e),values:oe("values",t,e),entries:oe("entries",t,e),[Symbol.iterator]:oe(Symbol.iterator,t,e),forEach:re(t,e),clear:ie(t),get size(){return Gt(t,Bt,e),t.size}}),WeakMap:(t,e)=>({has:ne("has",t,e),get:ne("get",t,e),set:se("set","get",t),delete:se("delete","has",t)})};let ae=null;function ce(){if(!ae)throw new s("No active component (a hook function should only be called in 'setup')");return ae}function he(t,e){for(let n in e)void 0===t[n]&&(t[n]=e[n])}const ue=new WeakMap;function de(t){const e=ce();let n=ue.get(e);return n||(n=x(e.render.bind(e,!1)),ue.set(e,n),e.willDestroy.push(Zt.bind(null,n))),te(t,n)}class fe{constructor(t,e,n,o,r){this.fiber=null,this.bdom=null,this.status=0,this.forceNextRender=!1,this.nextProps=null,this.children=Object.create(null),this.refs={},this.willStart=[],this.willUpdateProps=[],this.willUnmount=[],this.mounted=[],this.willPatch=[],this.patched=[],this.willDestroy=[],ae=this,this.app=n,this.parent=o,this.props=e,this.parentKey=r;const s=t.defaultProps;e=Object.assign({},e),s&&he(e,s);const i=o&&o.childEnv||n.env;this.childEnv=i;for(const t in e){const n=e[t];n&&"object"==typeof n&&Jt.has(n)&&(e[t]=de(n))}this.component=new t(e,i,this);const l=Object.assign(Object.create(this.component),{this:this.component});this.renderFn=n.getTemplate(t.template).bind(this.component,l,this),this.component.setup(),ae=null}mountComponent(t,e){const n=new Rt(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 this.app.handleError({node:this,error:t})}0===this.status&&this.fiber===t&&t.render()}async render(t){if(this.status>=2)return;let e=this.fiber;if(e&&(e.root.locked||!0===e.bdom)&&(await Promise.resolve(),e=this.fiber),e){if(!e.bdom&&!At.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-St(e.children)),t.locked=!1,e.children=[],e.childrenMap={},e.bdom=null,At.has(e)&&(At.delete(e),At.delete(t),e.appliedToDom=!1),e}const n=new Lt(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(),this.status>=2||this.fiber!==n||!e&&n.parent||n.render()}cancel(){this._cancel(),delete this.parent.children[this.parentKey],this.app.scheduler.scheduleDestroy(this)}_cancel(){this.status=2;const t=this.children;for(let e in t)t[e]._cancel()}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){this.app.handleError({error:t,node:this})}this.status=3}async updateAndRender(t,e){this.nextProps=t,t=Object.assign({},t);const n=function(t,e){let n=t.fiber;return n&&(St(n.children),n.root=null),new Dt(t,e)}(this,e);this.fiber=n;const o=this.component,r=o.constructor.defaultProps;r&&he(t,r),ae=this;for(const e in t){const n=t[e];n&&"object"==typeof n&&Jt.has(n)&&(t[e]=de(n))}ae=null;const s=Promise.all(this.willUpdateProps.map((e=>e.call(o,t))));if(await s,n!==this.fiber)return;o.props=t,n.render();const i=e.root;this.willPatch.length&&i.willPatch.push(n),this.patched.length&&i.patched.push(n)}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}setRef(t,e){e&&(this.refs[t]=e)}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}moveBeforeDOMNode(t,e){this.bdom.moveBeforeDOMNode(t,e)}moveBeforeVNode(t,e){this.bdom.moveBeforeVNode(t?t.bdom:null,e)}patch(){this.fiber&&this.fiber.parent&&(this._patch(),this.props=this.nextProps)}_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=ue.get(this);return t?(e=t,[...Yt.get(e)||[]].map((t=>{const n=qt.get(t);let o=[];if(n)for(const[t,r]of n)r.has(e)&&o.push(t);return{target:t,keys:o}}))):[];var e}}const pe=Symbol("timeout");function me(t,e){const n=new s(`The following error occurred in ${e}: `),o=new s(`${e}'s promise hasn't resolved after 3 seconds`),r=ce();return(...s)=>{const i=t=>{throw n.cause=t,t instanceof Error?n.message+=`"${t.message}"`:n.message=`Something that is not an Error was thrown in ${e} (see this Error's "cause" property)`,n};try{const n=t(...s);if(n instanceof Promise){if("onWillStart"===e||"onWillUpdateProps"===e){const t=r.fiber;Promise.race([n.catch((()=>{})),new Promise((t=>setTimeout((()=>t(pe)),3e3)))]).then((e=>{e===pe&&r.fiber===t&&r.status<=2&&console.warn(o)}))}return n.catch(i)}return n}catch(t){i(t)}}}function be(t){const e=ce(),n=e.app.dev?me:t=>t;e.mounted.push(n(t.bind(e.component),"onMounted"))}function ge(t){const e=ce(),n=e.app.dev?me:t=>t;e.patched.push(n(t.bind(e.component),"onPatched"))}function ye(t){const e=ce(),n=e.app.dev?me:t=>t;e.willUnmount.unshift(n(t.bind(e.component),"onWillUnmount"))}class ve{constructor(t,e,n){this.props=t,this.env=e,this.__owl__=n}setup(){}render(t=!1){this.__owl__.render(!0===t)}}ve.template="";const we=U("").constructor;class $e extends we{constructor(t,e){super(""),this.target=null,this.selector=t,this.content=e}mount(t,e){super.mount(t,e),this.target=document.querySelector(this.selector),this.target?this.content.mount(this.target,null):this.content.mount(t,e)}beforeRemove(){this.content.beforeRemove()}remove(){this.content&&(super.remove(),this.content.remove(),this.content=null)}patch(t){super.patch(t),this.content?this.content.patch(t.content,!0):(this.content=t.content,this.content.mount(this.target,null))}}class xe extends ve{setup(){const t=this.__owl__;be((()=>{const e=t.bdom;if(!e.target){const t=document.querySelector(this.props.target);if(!t)throw new s("invalid portal target");e.content.moveBeforeDOMNode(t.firstChild,t)}})),ye((()=>{t.bdom.remove()}))}}xe.template="__portal__",xe.props={target:{type:String},slots:!0};const Ne=t=>Array.isArray(t),ke=t=>"object"!=typeof t,Ee=t=>"object"==typeof t&&t&&"value"in t;function Ae(t){return"object"==typeof t&&"optional"in t&&t.optional||!1}function Te(t){return"*"===t||!0===t?"value":t.name.toLowerCase()}function _e(t){return ke(t)?Te(t):Ne(t)?t.map(_e).join(" or "):Ee(t)?String(t.value):"element"in t?`list of ${_e({type:t.element,optional:!1})}s`:"shape"in t?"object":_e(t.type||"*")}function Ce(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}])))),t=Ut(t);let o=[];for(let n in t)if(n in e){let r=Oe(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&&!Ae(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 ${_e(r)})`;o.push(`'${n}' is missing${e}`)}}return o}function Oe(t,e,n){if(void 0===e)return Ae(n)?null:`'${t}' is undefined (should be a ${_e(n)})`;if(ke(n))return function(t,e,n){if("function"==typeof n)if("object"==typeof e){if(!(e instanceof n))return`'${t}' is not a ${Te(n)}`}else if(typeof e!==n.name.toLowerCase())return`'${t}' is not a ${Te(n)}`;return null}(t,e,n);if(Ee(n))return e===n.value?null:`'${t}' is not equal to '${n.value}'`;if(Ne(n)){let o=n.find((n=>!Oe(t,e,n)));return o?null:`'${t}' is not a ${_e(n)}`}let o=null;if("element"in n)o=function(t,e,n){if(!Array.isArray(e))return`'${t}' is not a list of ${_e(n)}s`;for(let o=0;o<e.length;o++){const r=Oe(`${t}[${o}]`,e[o],n);if(r)return r}return null}(t,e,n.element);else if("shape"in n)if("object"!=typeof e||Array.isArray(e))o=`'${t}' is not an object`;else{const r=Ce(e,n.shape);r.length&&(o=`'${t}' doesn't have the correct shape (${r.join(", ")})`)}else if("values"in n)if("object"!=typeof e||Array.isArray(e))o=`'${t}' is not an object`;else{const r=Object.entries(e).map((([t,e])=>Oe(t,e,n.values))).filter(Boolean);r.length&&(o=`some of the values in '${t}' are invalid (${r.join(", ")})`)}return"type"in n&&!o&&(o=Oe(t,e,n.type)),"validate"in n&&!o&&(o=n.validate(e)?null:`'${t}' is not valid`),o}const Se=Object.create;function De(t){const e=Se(t);for(let n in t)e[n]=t[n];return e}const Le=Symbol("isBoundary");class Re{constructor(t,e,n,o,r){this.fn=t,this.ctx=De(e),this.component=n,this.node=o,this.key=r}evaluate(){return this.fn.call(this.component,this.ctx,this.node,this.key)}toString(){return this.evaluate().toString()}}function Be(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)&&!Ae(r[t]);for(let e in i)if(t(e))throw new s(`A default value cannot be defined for a mandatory prop (name: '${e}', component: ${o.name})`)}const l=Ce(e,r);if(l.length)throw new s(`Invalid props for component '${o.name}': `+l.join(", "))}const Pe={withDefault:function(t,e){return null==t||!1===t?e:t},zero:Symbol("zero"),isBoundary:Le,callSlot:function(t,e,n,o,s,i,l){n=n+"__slot_"+o;const a=t.props.slots||{},{__render:c,__ctx:h,__scope:u}=a[o]||{},d=Se(h||{});u&&(d[u]=i);const f=c?c(d,e,n):null;if(l){let i,a;return f?i=s?r(o,f):f:a=l(t,e,n),j([i,a])}return f||U("")},capture:De,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 instanceof Map)e=[...t.keys()],n=[...t.values()];else if(Symbol.iterator in Object(t))e=[...t],n=e;else{if(!t||"object"!=typeof t)throw new s(`Invalid loop expression: "${t}" is not iterable`);n=Object.values(t),e=Object.keys(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(Le);){const e=t.__proto__;if(!e){t=o;break}t=e}t[e]=n},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:Be,LazyValue:Re,safeOutput:function(t,e){if(null==t)return e?r("default",e):r("undefined",U(""));let n,o;switch(typeof t){case"object":t instanceof E?(n="string_safe",o=kt(t)):t instanceof Re?(n="lazy_value",o=t.evaluate()):t instanceof String?(n="string_unsafe",o=U(t)):(n="block_safe",o=t);break;case"string":n="string_unsafe",o=U(t);break;default:n="string_unsafe",o=U(String(t))}return r(n,o)},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=A(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 s=r.afterNode;for(;n&&n!==s;){if(n.contains(e))return o.call(this,t);n=n.nextSibling}}}}moveBeforeDOMNode(t,e=this.parentEl){this.parentEl=e,this.child.moveBeforeDOMNode(t,e),e.insertBefore(this.afterNode,t)}moveBeforeVNode(t,e){t&&(e=t.firstNode()||e),this.child.moveBeforeVNode(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:Ht,OwlError:s,makeRefWrapper:function(t){let e=new Set;return(n,o)=>{if(e.has(n))throw new s(`Cannot set the same ref more than once in the same component, ref "${n}" was set multiple times in ${t.name}`);return e.add(n),o}}};function je(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 s=Number(r[0]),i=t.split("\n")[s-1],l=e.exec(o);if(i&&l){const t=Number(l[0])-1;i[t]&&(n+=`\nThe error might be located at xml line ${s} column ${t}\n${i}\n${"-".repeat(t-1)}^`)}}}throw new s(n)}return e}const Me={text:U,createBlock:rt,list:yt,multi:j,html:kt,toggler:r,comment:q};class Ie{constructor(t={}){if(this.rawTemplates=Object.create(We),this.templates={},this.Portal=xe,this.dev=t.dev||!1,this.translateFn=t.translateFn,this.translatableAttributes=t.translatableAttributes,t.templates)if(t.templates instanceof Document||"string"==typeof t.templates)this.addTemplates(t.templates);else for(const e in t.templates)this.addTemplate(e,t.templates[e]);this.getRawTemplate=t.getTemplate}static registerTemplate(t,e){We[t]=e}addTemplate(t,e){if(t in this.rawTemplates){if(!this.dev)return;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 s(`Template ${t} already defined with different content`)}this.rawTemplates[t]=e}addTemplates(t){if(t){t=t instanceof Document?t:je(t);for(const e of t.querySelectorAll("[t-name]")){const t=e.getAttribute("t-name");this.addTemplate(t,e)}}}getTemplate(t){var e;if(!(t in this.templates)){const n=(null===(e=this.getRawTemplate)||void 0===e?void 0:e.call(this,t))||this.rawTemplates[t];if(void 0===n){let e="";try{e=` (for component "${ce().component.constructor.name}")`}catch{}throw new s(`Missing template: "${t}"${e}`)}const o="function"==typeof n&&!(n instanceof Element)?n:this._compileTemplate(t,n),r=this.templates;this.templates[t]=function(e,n){return r[t].call(this,e,n)};const i=o(this,Me,Pe);this.templates[t]=i}return this.templates[t]}_compileTemplate(t,e){throw new s("Unable to compile a template. Please use owl full build instead")}callTemplate(t,e,n,o,s){return r(e,this.getTemplate(e).call(t,n,o,s+e))}}const We={};function Fe(...t){const e="__template__"+Fe.nextId++,n=String.raw(...t);return We[e]=n,e}Fe.nextId=1,Ie.registerTemplate("__portal__",(function(t,e,n){let{callSlot:o}=n;return function(t,e,n=""){return new $e(t.props.target,o(t,e,n,"default",!1,null))}}));const Ve="true,false,NaN,null,undefined,debugger,console,window,in,instanceof,new,function,return,eval,void,Math,RegExp,Array,Object,Date".split(","),Ke=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"}),He="...,.,===,==,+,!==,!=,!,||,&&,>=,>,<=,<,?,-,*,/,%,typeof ,=>,=,;,in ,new ,|,&,^,~".split(",");const Ue=[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 s("Invalid expression");e+=o}r++}if(t[r]!==n)throw new s("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 He)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 Ke?{type:"OPERATOR",value:Ke[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 qe=t=>t&&("LEFT_BRACE"===t.type||"COMMA"===t.type),Ge=t=>t&&("RIGHT_BRACE"===t.type||"COMMA"===t.type);function Xe(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 Ue)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 s(`Tokenizer error: could not tokenize \`${t}\``);return e}(t);let o=0,r=[];for(;o<n.length;){let t=n[o],s=n[o-1],i=n[o+1],l=r[r.length-1];switch(t.type){case"LEFT_BRACE":case"LEFT_BRACKET":case"LEFT_PAREN":r.push(t.type);break;case"RIGHT_BRACE":case"RIGHT_BRACKET":case"RIGHT_PAREN":r.pop()}let a="SYMBOL"===t.type&&!Ve.includes(t.value);if("SYMBOL"!==t.type||Ve.includes(t.value)||s&&("LEFT_BRACE"===l&&qe(s)&&Ge(i)&&(n.splice(o+1,0,{type:"COLON",value:":"},{...t}),i=n[o+1]),"OPERATOR"===s.type&&"."===s.value?a=!1:"LEFT_BRACE"!==s.type&&"COMMA"!==s.type||i&&"COLON"===i.type&&(a=!1)),"TEMPLATE_STRING"===t.type&&(t.value=t.replace((t=>Ze(t)))),i&&"OPERATOR"===i.type&&"=>"===i.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 Ye=new Map([["in "," in "]]);function Ze(t){return Xe(t).map((t=>Ye.get(t.value)||t.value)).join("")}const Je=/\{\{.*?\}\}|\#\{.*?\}/g;function Qe(t,e){let n=t.match(Je);if(n&&n[0].length===t.length)return`(${e(t.slice(2,"{"===n[0][0]?-2:-1))})`;let o=t.replace(Je,(t=>"${"+e(t.slice(2,"{"===t[0]?-2:-1))+"}"));return"`"+o+"`"}function tn(t){return Qe(t,Ze)}const en=/\s+/g,nn=document.implementation.createDocument(null,null,null),on=new Set(["stop","capture","prevent","self","synthetic"]);let rn={};function sn(t=""){return rn[t]=(rn[t]||0)+1,t+rn[t]}function ln(t,e){switch(t){case"input":return"checked"===e||"indeterminate"===e||"value"===e||"readonly"===e||"readOnly"===e||"disabled"===e;case"option":return"selected"===e||"disabled"===e;case"textarea":return"value"===e||"readonly"===e||"readOnly"===e||"disabled"===e;case"select":return"value"===e||"disabled"===e;case"button":case"optgroup":return"disabled"===e}return!1}function an(t){return`\`${t.replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$\{/,"\\${")}\``}class cn{constructor(t,e){this.dynamicTagName=null,this.isRoot=!1,this.hasDynamicChildren=!1,this.children=[],this.data=[],this.childNumber=0,this.parentVar="",this.id=cn.nextBlockId++,this.varName="b"+this.id,this.blockName="block"+this.id,this.target=t,this.type=e}insertData(t,e="d"){const n=sn(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=nn.createElement("t");return t.appendChild(this.dom),t.innerHTML}}function hn(t,e){return Object.assign({block:null,index:0,forceNewBlock:!0,translate:t.translate,tKeyExpr:null,nameSpace:t.nameSpace,tModelSelectedExpr:t.tModelSelectedExpr},e)}cn.nextBlockId=1;class un{constructor(t,e){this.indentLevel=0,this.loopLevel=0,this.code=[],this.hasRoot=!1,this.hasCache=!1,this.shouldProtectScope=!1,this.hasRefWrapper=!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=[];t.push(`function ${this.name}(ctx, node, key = "") {`),this.shouldProtectScope&&(t.push(" ctx = Object.create(ctx);"),t.push(" ctx[isBoundary] = 1")),this.hasRefWrapper&&t.push(" let refWrapper = makeRefWrapper(this.__owl__);"),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 ")}currentKey(t){let e=this.loopLevel?`key${this.loopLevel}`:"key";return t.tKeyExpr&&(e=`${t.tKeyExpr} + ${e}`),e}}const dn=["label","title","placeholder","alt"],fn=/^(\s*)([\s\S]+?)(\s*)$/;class pn{constructor(t,e){if(this.blocks=[],this.nextBlockId=1,this.isDebug=!1,this.targets=[],this.target=new un("template"),this.translatableAttributes=dn,this.staticDefs=[],this.slotNames=new Set,this.helpers=new Set,this.translateFn=e.translateFn||(t=>t),e.translatableAttributes){const t=new Set(dn);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,cn.nextBlockId=1,rn={},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=an(t.asXmlString());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=sn(t),s=this.target,i=new un(r,o);return this.targets.push(i),this.target=i,this.compileAST(e,hn(n)),this.target=s,r}addLine(t,e){this.target.addLine(t,e)}define(t,e){this.addLine(`const ${t} = ${e};`)}insertAnchor(t,e=t.children.length){const n=`block-child-${e}`,o=nn.createElement(n);t.insert(o)}createBlock(t,e,n){const o=this.target.hasRoot,r=new cn(this.target,e);return o||(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);if(e.parentVar){let t=this.target.currentKey(n);return this.helpers.add("withKey"),void this.addLine(`${e.parentVar}[${n.index}] = withKey(${o}, ${t});`)}n.tKeyExpr&&(o=`toggler(${n.tKeyExpr}, ${o})`),e.isRoot?(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 Ze(t);const n=Xe(t),o=new Map;return n.map((t=>{if(t.varName&&!t.isLocal){if(!o.has(t.varName)){const e=sn("v");o.set(t.varName,e),this.define(e,t.value)}t.value=o.get(t.varName)}return t.value})).join("")}translate(t){const e=fn.exec(t);return e[1]+this.translateFn(e[2])+e[3]}compileAST(t,e){switch(t.type){case 1:return this.compileComment(t,e);case 0:return this.compileText(t,e);case 2:return this.compileTDomNode(t,e);case 4:return this.compileTEsc(t,e);case 8:return this.compileTOut(t,e);case 5:return this.compileTIf(t,e);case 9:return this.compileTForeach(t,e);case 10:return this.compileTKey(t,e);case 3:return this.compileMulti(t,e);case 7:return this.compileTCall(t,e);case 15:return this.compileTCallBlock(t,e);case 6:return this.compileTSet(t,e);case 11:return this.compileComponent(t,e);case 12:return this.compileDebug(t,e);case 13:return this.compileLog(t,e);case 14:return this.compileTSlot(t,e);case 16:return this.compileTTranslation(t,e);case 17:return this.compileTPortal(t,e)}}compileDebug(t,e){return this.addLine("debugger;"),t.content?this.compileAST(t.content,e):null}compileLog(t,e){return this.addLine(`console.log(${Ze(t.expr)});`),t.content?this.compileAST(t.content,e):null}compileComment(t,e){let{block:n,forceNewBlock:o}=e;if(!n||o)n=this.createBlock(n,"comment",e),this.insertBlock(`comment(${an(t.value)})`,n,{...e,forceNewBlock:o&&!n});else{const e=nn.createComment(t.value);n.insert(e)}return n.varName}compileText(t,e){let{block:n,forceNewBlock:o}=e,r=t.value;if(r&&!1!==e.translate&&(r=this.translate(r)),e.inPreTag||(r=r.replace(en," ")),!n||o)n=this.createBlock(n,"text",e),this.insertBlock(`text(${an(r)})`,n,{...e,forceNewBlock:o&&!n});else{const e=0===t.type?nn.createTextNode:nn.createComment;n.insert(e.call(nn,r))}return n.varName}generateHandlerCode(t,e){const n=t.split(".").slice(1).map((t=>{if(!on.has(t))throw new s(`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 s=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=sn("tag");this.define(e,Ze(t.dynamicTag)),n.dynamicTagName=e}const i={};for(let o in t.attrs){let r,s;if(o.startsWith("t-attf")){r=tn(t.attrs[o]);const e=n.insertData(r,"attr");s=o.slice(7),i["block-attribute-"+e]=s}else if(o.startsWith("t-att"))if(s="t-att"===o?null:o.slice(6),r=Ze(t.attrs[o]),s&&ln(t.tag,s)){"readonly"===s&&(s="readOnly"),r="value"===s?`new String((${r}) === 0 ? 0 : ((${r}) || ""))`:`new Boolean(${r})`;i[`block-property-${n.insertData(r,"prop")}`]=s}else{const t=n.insertData(r,"attr");"t-att"===o?i["block-attributes"]=String(t):i[`block-attribute-${t}`]=s}else this.translatableAttributes.includes(o)?i[o]=this.translateFn(t.attrs[o]):(r=`"${t.attrs[o]}"`,s=o,i[o]=t.attrs[o]);if("value"===s&&e.tModelSelectedExpr){i[`block-attribute-${n.insertData(`${e.tModelSelectedExpr} === ${r}`,"attr")}`]="selected"}}let l;if(t.model){const{hasDynamicChildren:e,baseExpr:o,expr:r,eventType:s,shouldNumberize:a,shouldTrim:c,targetAttr:h,specialInitTargetAttr:u}=t.model,d=Ze(o),f=sn("bExpr");this.define(f,d);const p=Ze(r),m=sn("expr");this.define(m,p);const b=`${f}[${m}]`;let g;if(u){let e=h in i&&`'${i[h]}'`;if(!e&&t.attrs){const n=t.attrs[`t-att-${h}`];n&&(e=Ze(n))}g=n.insertData(`${b} === ${e}`,"prop"),i[`block-property-${g}`]=u}else if(e){l=`${sn("bValue")}`,this.define(l,b)}else g=n.insertData(`${b}`,"prop"),i[`block-property-${g}`]=h;this.helpers.add("toNumber");let y=`ev.target.${h}`;y=c?`${y}.trim()`:y,y=a?`toNumber(${y})`:y;const v=`[(ev) => { ${b} = ${y}; }]`;g=n.insertData(v,"hdlr"),i[`block-handler-${g}`]=s}for(let e in t.on){const o=this.generateHandlerCode(e,t.on[e]);i[`block-handler-${n.insertData(o,"hdlr")}`]=e}if(t.ref){this.dev&&(this.helpers.add("makeRefWrapper"),this.target.hasRefWrapper=!0);const e=Je.test(t.ref);let o=`\`${t.ref}\``;e&&(o=Qe(t.ref,(t=>this.captureExpression(t,!0))));let r=`(el) => this.__owl__.setRef((${o}), el)`;this.dev&&(r=`refWrapper(${o}, ${r})`);const s=n.insertData(r,"ref");i["block-ref"]=String(s)}const a=t.ns||e.nameSpace,c=a?nn.createElementNS(a,t.tag):nn.createElement(t.tag);for(const[t,e]of Object.entries(i))"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 s=t.content[o],i=hn(e,{block:n,index:n.childNumber,forceNewBlock:!1,isLast:e.isLast&&o===r.length-1,tKeyExpr:e.tKeyExpr,nameSpace:a,tModelSelectedExpr:l,inPreTag:e.inPreTag||"pre"===t.tag});this.compileAST(s,i)}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=s;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)).join(", ")};`,s)}return n.varName}compileTEsc(t,e){let n,{block:o,forceNewBlock:r}=e;if("0"===t.expr?(this.helpers.add("zero"),n="ctx[zero]"):(n=Ze(t.expr),t.defaultValue&&(this.helpers.add("withDefault"),n=`withDefault(${n}, ${an(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=nn.createElement(`block-text-${t}`);o.insert(e)}return o.varName}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=cn.nextBlockId;const r=hn(e);this.compileAST({type:3,content:t.body},r),this.helpers.add("safeOutput"),n=`safeOutput(${Ze(t.expr)}, b${o})`}else this.helpers.add("safeOutput"),n=`safeOutput(${Ze(t.expr)})`;return this.insertBlock(n,o,e),o.varName}compileTIfBranch(t,e,n){this.target.indentLevel++;let o=e.children.length;this.compileAST(t,hn(n,{block:e,index:n.index})),e.children.length>o&&this.insertAnchor(e,o),this.target.indentLevel--}compileTIf(t,e,n){let{block:o,forceNewBlock:r}=e;const s=this.target.code.length,i=!o||"multi"!==o.type&&r;if(o&&(o.hasDynamicChildren=!0),(!o||"multi"!==o.type&&r)&&(o=this.createBlock(o,"multi",e)),this.addLine(`if (${Ze(t.condition)}) {`),this.compileTIfBranch(t.content,o,e),t.tElif)for(let n of t.tElif)this.addLine(`} else if (${Ze(n.condition)}) {`),this.compileTIfBranch(n.content,o,e);if(t.tElse&&(this.addLine("} else {"),this.compileTIfBranch(t.tElse,o,e)),this.addLine("}"),i){if(o.children.length){const t=this.target.code,e=o.children.slice();let n=e.shift();for(let o=s;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)).join(", ")};`,s)}const t=o.children.map((t=>t.varName)).join(", ");this.insertBlock(`multi([${t}])`,o,e)}return o.varName}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}`,s=`k_block${n.id}`,i=`l_block${n.id}`,l=`c_block${n.id}`;let a;this.helpers.add("prepareList"),this.define(`[${s}, ${r}, ${i}, ${l}]`,`prepareList(${Ze(t.collection)});`),this.dev&&this.define(`keys${n.id}`,"new Set()"),this.addLine(`for (let ${o} = 0; ${o} < ${i}; ${o}++) {`),this.target.indentLevel++,this.addLine(`ctx[\`${t.elem}\`] = ${s}[${o}];`),t.hasNoFirst||this.addLine(`ctx[\`${t.elem}_first\`] = ${o} === 0;`),t.hasNoLast||this.addLine(`ctx[\`${t.elem}_last\`] = ${o} === ${s}.length - 1;`),t.hasNoIndex||this.addLine(`ctx[\`${t.elem}_index\`] = ${o};`),t.hasNoValue||this.addLine(`ctx[\`${t.elem}_value\`] = ${r}[${o}];`),this.define(`key${this.target.loopLevel}`,t.key?Ze(t.key):o),this.dev&&(this.helpers.add("OwlError"),this.addLine(`if (keys${n.id}.has(String(key${this.target.loopLevel}))) { throw new OwlError(\`Got duplicate key in t-foreach: \${key${this.target.loopLevel}}\`)}`),this.addLine(`keys${n.id}.add(String(key${this.target.loopLevel}));`)),t.memo&&(this.target.hasCache=!0,a=sn(),this.define(`memo${a}`,Ze(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=hn(e,{block:n,index:o});return 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),n.varName}compileTKey(t,e){const n=sn("tKey_");return this.define(n,Ze(t.expr)),e=hn(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 s=this.target.code.length;if(r){let o=null;if(t.content.filter((t=>6!==t.type)).length<=1){for(let n of t.content){const t=this.compileAST(n,e);o=o||t}return o}n=this.createBlock(n,"multi",e)}let i=0;for(let o=0,r=t.content.length;o<r;o++){const s=t.content[o],l=6===s.type,a=hn(e,{block:n,index:i,forceNewBlock:!l,isLast:e.isLast&&o===r-1});this.compileAST(s,a),l||i++}if(r){if(n.hasDynamicChildren&&n.children.length){const t=this.target.code,e=n.children.slice();let o=e.shift();for(let n=s;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)).join(", ")};`,s)}const t=n.children.map((t=>t.varName)).join(", ");this.insertBlock(`multi([${t}])`,n,e)}return n.varName}compileTCall(t,e){let{block:n,forceNewBlock:o}=e,r=e.ctxVar||"ctx";t.context&&(r=sn("ctx"),this.addLine(`let ${r} = ${Ze(t.context)};`));const s=Je.test(t.name),i=s?tn(t.name):"`"+t.name+"`";if(n&&!o&&this.insertAnchor(n),n=this.createBlock(n,"multi",e),t.body){this.addLine(`${r} = Object.create(${r});`),this.addLine(`${r}[isBoundary] = 1;`),this.helpers.add("isBoundary");const n=hn(e,{ctxVar:r}),o=this.compileMulti({type:3,content:t.body},n);o&&(this.helpers.add("zero"),this.addLine(`${r}[zero] = ${o};`))}const l=this.generateComponentKey();if(s){const t=sn("template");this.staticDefs.find((t=>"call"===t.id))||this.staticDefs.push({id:"call",expr:"app.callTemplate.bind(app)"}),this.define(t,i),this.insertBlock(`call(this, ${t}, ${r}, node, ${l})`,n,{...e,forceNewBlock:!n})}else{const t=sn("callTemplate_");this.staticDefs.push({id:t,expr:`app.getTemplate(${i})`}),this.insertBlock(`${t}.call(this, ${r}, node, ${l})`,n,{...e,forceNewBlock:!n})}return t.body&&!e.isLast&&this.addLine(`${r} = ${r}.__proto__;`),n.varName}compileTCallBlock(t,e){let{block:n,forceNewBlock:o}=e;return n&&(o||this.insertAnchor(n)),n=this.createBlock(n,"multi",e),this.insertBlock(Ze(t.name),n,{...e,forceNewBlock:!n}),n.varName}compileTSet(t,e){this.target.shouldProtectScope=!0,this.helpers.add("isBoundary").add("withDefault");const n=t.value?Ze(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, ${this.target.currentKey(e)})`;r=t.value?r?`withDefault(${n}, ${r})`:n:r,this.addLine(`ctx[\`${t.name}\`] = ${r};`)}else{let o;if(t.defaultValue){const r=an(e.translate?this.translate(t.defaultValue):t.defaultValue);o=t.value?`withDefault(${n}, ${r})`:r}else o=n;this.helpers.add("setContextValue"),this.addLine(`setContextValue(${e.ctxVar||"ctx"}, "${t.name}", ${o});`)}return null}generateComponentKey(t="key"){const e=[sn("__")];for(let t=0;t<this.target.loopLevel;t++)e.push(`\${key${t+1}}`);return`${t} + \`${e.join("__")}\``}formatProp(t,e){if(e=t.endsWith(".translate")?an(this.translateFn(e)):this.captureExpression(e),t.includes(".")){let[n,o]=t.split(".");switch(t=n,o){case"bind":e=`(${e}).bind(this)`;break;case"alike":case"translate":break;default:throw new s("Invalid prop suffix")}}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({}, ${Ze(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 s="";if(t.slots){let n="ctx";!this.target.loopLevel&&this.hasSafeContext||(n=sn("ctx"),this.helpers.add("capture"),this.define(n,"capture(ctx)"));let o=[];for(let r in t.slots){const s=t.slots[r],i=[];if(s.content){const t=this.compileInNewTarget("slot",s.content,e,s.on);i.push(`__render: ${t}.bind(this), __ctx: ${n}`)}const l=t.slots[r].scope;l&&i.push(`__scope: "${l}"`),t.slots[r].attrs&&i.push(...this.formatPropObject(t.slots[r].attrs));const a=`{${i.join(", ")}}`;o.push(`'${r}': ${a}`)}s=`{${o.join(", ")}}`}!s||t.dynamicProps||o||(this.helpers.add("markRaw"),r.push(`slots: markRaw(${s})`));let i,l,a=this.getPropString(r,t.dynamicProps);(s&&(t.dynamicProps||o)||this.dev)&&(i=sn("props"),this.define(i,a),a=i),s&&(t.dynamicProps||o)&&(this.helpers.add("markRaw"),this.addLine(`${i}.slots = markRaw(Object.assign(${s}, ${i}.slots))`)),t.isDynamic?(l=sn("Comp"),this.define(l,Ze(t.name))):l=`\`${t.name}\``,this.dev&&this.addLine(`helpers.validateProps(${l}, ${i}, this);`),n&&(!1===e.forceNewBlock||e.tKeyExpr)&&this.insertAnchor(n);let c=this.generateComponentKey();e.tKeyExpr&&(c=`${e.tKeyExpr} + ${c}`);let h=sn("comp");const u=[];for(let e in t.props||{}){let[t,n]=e.split(".");n||u.push(`"${t}"`)}this.staticDefs.push({id:h,expr:`app.createComponent(${t.isDynamic?null:l}, ${!t.isDynamic}, ${!!t.slots}, ${!!t.dynamicProps}, [${u}])`}),t.isDynamic&&(c=`(${l}).name + ${c}`);let d=`${h}(${a}, ${c}, node, this, ${t.isDynamic?l:null})`;return t.isDynamic&&(d=`toggler(${l}, ${d})`),t.on&&(d=this.wrapWithEventCatcher(d,t.on)),n=this.createBlock(n,"multi",e),this.insertBlock(d,n,e),n.varName}wrapWithEventCatcher(t,e){this.helpers.add("createCatcher");let n=sn("catcher"),o={},r=[];for(let t in e){let n=sn("hdlr"),s=r.push(n)-1;o[t]=s;const i=this.generateHandlerCode(t,e[t]);this.define(n,i)}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,s=!1,i=!1;t.name.match(Je)?(s=!0,i=!0,o=tn(t.name)):(o="'"+t.name+"'",i=i||this.slotNames.has(t.name),this.slotNames.add(t.name));const l=t.attrs?t.attrs["t-props"]:null;t.attrs&&delete t.attrs["t-props"];let a=this.target.loopLevel?`key${this.target.loopLevel}`:"key";i&&(a=this.generateComponentKey(a));const c=t.attrs?this.formatPropObject(t.attrs):[],h=this.getPropString(c,l);if(t.defaultContent){n=`callSlot(ctx, node, ${a}, ${o}, ${s}, ${h}, ${this.compileInNewTarget("defaultContent",t.defaultContent,e)}.bind(this))`}else if(s){let t=sn("slot");this.define(t,o),n=`toggler(${t}, callSlot(ctx, node, ${a}, ${t}, ${s}, ${h}))`}else n=`callSlot(ctx, node, ${a}, ${o}, ${s}, ${h})`;return 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}),r.varName}compileTTranslation(t,e){return t.content?this.compileAST(t.content,Object.assign({},e,{translate:!1})):null}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);let r="ctx";!this.target.loopLevel&&this.hasSafeContext||(r=sn("ctx"),this.helpers.add("capture"),this.define(r,"capture(ctx)"));let s=sn("comp");this.staticDefs.push({id:s,expr:"app.createComponent(null, false, true, false, false)"});const i=`${s}({target: ${Ze(t.target)},slots: {'default': {__render: ${o}.bind(this), __ctx: ${r}}}}, ${this.generateComponentKey()}, node, ctx, Portal)`;return n&&this.insertAnchor(n),n=this.createBlock(n,"multi",e),this.insertBlock(i,n,{...e,forceNewBlock:!1}),n.varName}}const mn=new WeakMap;function bn(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 s("t-elif and t-else directives must be preceded by a t-if or t-elif directive");{if(r("t-foreach"))throw new s("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 s("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 s("text is not allowed between branching directives");t.remove()}}}})(e=t),function(t){for(const e of["t-esc","t-out"]){const n=[...t.querySelectorAll(`[${e}]`)].filter((t=>t.tagName[0]===t.tagName[0].toUpperCase()||t.hasAttribute("t-component")));for(const t of n){if(t.childNodes.length)throw new s(`Cannot have ${e} on a component that already has content`);const n=t.getAttribute(e);t.removeAttribute(e);const o=t.ownerDocument.createElement("t");null!=n&&o.setAttribute(e,n),t.appendChild(o)}}}(e);return gn(t,{inPreTag:!1})||{type:0,value:""}}function gn(t,e){return t instanceof Element?function(t,e){if(t.hasAttribute("t-debug"))return t.removeAttribute("t-debug"),{type:12,content:gn(t,e)};if(t.hasAttribute("t-log")){const n=t.getAttribute("t-log");return t.removeAttribute("t-log"),{type:13,expr:n,content:gn(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 s(`"Directive t-foreach should always be used with a t-key!" (expression: t-foreach="${o}" t-as="${r}")`);t.removeAttribute("t-key");const l=t.getAttribute("t-memo")||"";t.removeAttribute("t-memo");const a=gn(t,e);if(!a)return null;const c=!n.includes("t-call"),h=c&&!n.includes(`${r}_first`),u=c&&!n.includes(`${r}_last`),d=c&&!n.includes(`${r}_index`),f=c&&!n.includes(`${r}_value`);return{type:9,collection:o,elem:r,body:a,memo:l,key:i,hasNoFirst:h,hasNoLast:u,hasNoIndex:d,hasNoValue:f}}(t,e)||function(t,e){if(!t.hasAttribute("t-if"))return null;const n=t.getAttribute("t-if");t.removeAttribute("t-if");const o=gn(t,e)||{type:0,value:""};let r=t.nextElementSibling;const s=[];for(;r&&r.hasAttribute("t-elif");){const t=r.getAttribute("t-elif");r.removeAttribute("t-elif");const n=gn(r,e),o=r.nextElementSibling;r.remove(),r=o,n&&s.push({condition:t,content:n})}let i=null;r&&r.hasAttribute("t-else")&&(r.removeAttribute("t-else"),i=gn(r,e),r.remove());return{type:5,condition:n,content:o,tElif:s.length?s:null,tElse:i}}(t,e)||function(t,e){if(!t.hasAttribute("t-portal"))return null;const n=t.getAttribute("t-portal");t.removeAttribute("t-portal");const o=gn(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=gn(t,e),s={type:7,name:n,body:null,context:o};if(r&&2===r.type)return r.content=[s],r;if(r&&11===r.type)return{...r,slots:{default:{content:s,scope:null,on:null,attrs:null}}}}const r=Nn(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;const n=t.getAttribute("t-call-block");return{type:15,name:n}}(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 s=gn(t,e);if(!s)return o;if(2===s.type)return{...s,ref:r,content:[o]};return o}(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 s=gn(t,e);if(!s)return o;if(2===s.type)return o.body=s.content.length?s.content:null,{...s,ref:r,content:[o]};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=gn(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:gn(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){let n=t.tagName;const o=n[0];let r=t.hasAttribute("t-component");if(r&&"t"!==n)throw new s(`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 l=t.getAttribute("t-slot-scope");t.removeAttribute("t-slot-scope");let a=null,c=null;for(let e of t.getAttributeNames()){const n=t.getAttribute(e);if(e.startsWith("t-")){if(!e.startsWith("t-on-")){const t=xn.get(e.split("-").slice(0,2).join("-"));throw new s(t||`unsupported directive on Component: ${e}`)}a=a||{},a[e.slice(5)]=n}else c=c||{},c[e]=n}let h=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 s(`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&&r!==n;){if(r.hasAttribute("t-component")||r.tagName[0]===r.tagName[0].toUpperCase()){i=!0;break}r=r.parentElement}if(i||!r)continue;t.removeAttribute("t-set-slot"),t.remove();const l=gn(t,e);let a=null,c=null,u=null;for(let e of t.getAttributeNames()){const n=t.getAttribute(e);"t-slot-scope"!==e?e.startsWith("t-on-")?(a=a||{},a[e.slice(5)]=n):(c=c||{},c[e]=n):u=n}h=h||{},h[o]={content:l,on:a,attrs:c,scope:u}}const r=kn(n,e);h=h||{},r&&!h.default&&(h.default={content:r,on:a,attrs:null,scope:l})}return{type:11,name:n,isDynamic:r,dynamicProps:i,props:c,slots:h,on:a}}(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 s(`Invalid tag name: '${n}'`);e=Object.assign({},e),"pre"===n&&(e.inPreTag=!0);let r=!e.nameSpace&&$n.has(n)?"http://www.w3.org/2000/svg":null;const i=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 i=t.getAttribute(o);if("t-on"===o||"t-on-"===o)throw new s("Missing event name with t-on directive");if(o.startsWith("t-on-"))c=c||{},c[o.slice(5)]=i;else if(o.startsWith("t-model")){if(!["input","select","textarea"].includes(n))throw new s("The t-model directive only works with <input>, <textarea> and <select>");let r,l;if(vn.test(i)){const t=i.lastIndexOf(".");r=i.slice(0,t),l=`'${i.slice(t+1)}'`}else{if(!wn.test(i))throw new s(`Invalid t-model expression: "${i}" (it should be assignable)`);{const t=i.lastIndexOf("[");r=i.slice(0,t),l=i.slice(t+1,-1)}}const a=t.getAttribute("type"),c="input"===n,u="select"===n,d=c&&"checkbox"===a,f=c&&"radio"===a,p=o.includes(".trim"),m=p||o.includes(".lazy");h={baseExpr:r,expr:l,targetAttr:d?"checked":"value",specialInitTargetAttr:f?"checked":null,eventType:f?"click":u||m?"change":"input",hasDynamicChildren:!1,shouldTrim:p,shouldNumberize:o.includes(".number")},u&&((e=Object.assign({},e)).tModelInfo=h)}else{if(o.startsWith("block-"))throw new s(`Invalid attribute: '${o}'`);if("xmlns"===o)r=i;else if("t-name"!==o){if(o.startsWith("t-")&&!o.startsWith("t-att"))throw new s(`Unknown QWeb directive: '${o}'`);const t=e.tModelInfo;t&&["t-att-value","t-attf-value"].includes(o)&&(t.hasDynamicChildren=!0),a=a||{},a[o]=i}}}r&&(e.nameSpace=r);const u=Nn(t,e);return{type:2,tag:n,dynamicTag:o,attrs:a,on:c,ref:i,content:u,model:h,ns:r}}(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 s=null;t.textContent!==t.innerHTML&&(s=Nn(t,e));return{type:6,name:n,value:o,defaultValue:r,body:s}}(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||"";return e.inPreTag||!yn.test(n)||n.trim()?{type:0,value:n}:null}if(t.nodeType===Node.COMMENT_NODE)return{type:1,value:t.textContent||""};return null}(t,e)}const yn=/[\r\n]/;const vn=/\.[\w_]+\s*$/,wn=/\[[^\[]+\]\s*$/,$n=new Set(["svg","g","path"]);const xn=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 Nn(t,e){const n=[];for(let o of t.childNodes){const t=gn(o,e);t&&(3===t.type?n.push(...t.content):n.push(t))}return n}function kn(t,e){const n=Nn(t,e);switch(n.length){case 0:return null;case 1:return n[0];default:return{type:3,content:n}}}function En(t,e={}){const n=function(t){if("string"==typeof t)return bn(je(`<t>${t}</t>`).firstChild);let e=mn.get(t);return e||(e=bn(t.cloneNode(!0)),mn.set(t,e)),e}(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 pn(n,{...e,hasSafeContext:o}).generateCode();try{return new Function("app, bdom, helpers",r)}catch(t){const{name:n}=e,o=new s(`Failed to compile ${n?`template "${n}"`:"anonymous template"}: ${t.message}\n\ngenerated code:\nfunction(app, bdom, helpers) {\n${r}\n}`);throw o.cause=t,o}}class An{constructor(){this.tasks=new Set,this.frame=0,this.delayedRenders=[],this.cancelledNodes=new Set,this.requestAnimationFrame=An.requestAnimationFrame}addFiber(t){this.tasks.add(t.root)}scheduleDestroy(t){this.cancelledNodes.add(t),0===this.frame&&(this.frame=this.requestAnimationFrame((()=>this.processTasks())))}flush(){if(this.delayedRenders.length){let t=this.delayedRenders;this.delayedRenders=[];for(let e of t)e.root&&3!==e.node.status&&e.node.fiber===e&&e.render()}0===this.frame&&(this.frame=this.requestAnimationFrame((()=>this.processTasks())))}processTasks(){this.frame=0;for(let t of this.cancelledNodes)t._destroy();this.cancelledNodes.clear();for(let t of this.tasks)this.processFiber(t);for(let t of this.tasks)3===t.node.status&&this.tasks.delete(t)}processFiber(t){if(t.root!==t)return void this.tasks.delete(t);const e=At.has(t);e&&0!==t.counter?this.tasks.delete(t):3!==t.node.status?0===t.counter&&(e||t.complete(),this.tasks.delete(t)):this.tasks.delete(t)}}An.requestAnimationFrame=window.requestAnimationFrame.bind(window);let Tn=!1;const _n=new Set;window.__OWL_DEVTOOLS__||(window.__OWL_DEVTOOLS__={apps:_n,Fiber:Dt,RootFiber:Lt,toRaw:Ut,reactive:te});class Cn extends Ie{constructor(t,e={}){super(e),this.scheduler=new An,this.root=null,this.name=e.name||"",this.Root=t,_n.add(this),e.test&&(this.dev=!0),this.warnIfNoStaticProps=e.warnIfNoStaticProps||!1,!this.dev||e.test||Tn||(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.`),Tn=!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){Cn.validateTarget(t),this.dev&&Be(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 fe(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=Tt.get(t);r||(r=[],Tt.set(t,r)),r.unshift((t=>{throw o||n(t),t}))}));return t.mountComponent(e,n),o}destroy(){this.root&&(this.root.destroy(),this.scheduler.processTasks()),_n.delete(this)}createComponent(t,e,n,o,r){const i=!e;let l;const a=0===r.length;l=n?(t,e)=>!0:o?function(t,e){for(let n in t)if(t[n]!==e[n])return!0;return Object.keys(t).length!==Object.keys(e).length}:a?(t,e)=>!1:function(t,e){for(let n of r)if(t[n]!==e[n])return!0;return!1};const c=fe.prototype.updateAndRender,h=fe.prototype.initiateRender;return(n,o,r,a,u)=>{let d=r.children,f=d[o];i&&f&&f.component.constructor!==u&&(f=void 0);const p=r.fiber;if(f)(l(f.props,n)||p.deep||f.forceNextRender)&&(f.forceNextRender=!1,c.call(f,n,p));else{if(e){const e=a.constructor.components;if(!e)throw new s(`Cannot find the definition of component "${t}", missing static components key in parent`);if(!(u=e[t]))throw new s(`Cannot find the definition of component "${t}"`);if(!(u.prototype instanceof ve))throw new s(`"${t}" is not a Component. It must inherit from the Component class`)}f=new fe(u,n,this,r,o),d[o]=f,h.call(f,new Dt(f,p))}return p.childrenMap[o]=f,f}}handleError(...t){return Ct(...t)}}Cn.validateTarget=function(t){const e=t&&t.ownerDocument;if(e){const n=e.defaultView.HTMLElement;if(t instanceof n||t instanceof ShadowRoot){if(!e.body.contains(t instanceof n?t:t.host))throw new s("Cannot mount a component on a detached dom node");return}}throw new s("Cannot mount component: the target is not a valid DOM element")},Cn.apps=_n,Cn.version="2.3.0";function On(t,e){const n=Object.create(t),o=Object.getOwnPropertyDescriptors(e);return Object.freeze(Object.defineProperties(n,o))}function Sn(t){const e=ce();e.childEnv=On(e.childEnv,t)}n.shouldNormalizeDom=!1,n.mainEventHandler=(t,n,o)=>{const{data:r,modifiers:i}=e(t);t=r;let l=!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 l;case"prevent":(t&&e||!t)&&n.preventDefault();continue;case"stop":(t&&e||!t)&&n.stopPropagation(),l=!0;continue}}if(Object.hasOwnProperty.call(t,0)){const e=t[0];if("function"!=typeof e)throw new s(`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 l};const Dn={config:n,mount:Et,patch:function(t,e,n=!1){t.patch(e,n)},remove:function(t,e=!1){e&&t.beforeRemove(),t.remove()},list:yt,multi:j,text:U,toggler:r,createBlock:rt,html:kt,comment:q},Ln={version:Cn.version};Ie.prototype._compileTemplate=function(t,e){return En(e,{name:t,dev:this.dev,translateFn:this.translateFn,translatableAttributes:this.translatableAttributes})},t.App=Cn,t.Component=ve,t.EventBus=k,t.OwlError=s,t.__info__=Ln,t.batched=x,t.blockDom=Dn,t.loadFile=async function(t){const e=await fetch(t);if(!e.ok)throw new s("Error while fetching xml templates");return await e.text()},t.markRaw=Ht,t.markup=function(t){return new E(t)},t.mount=async function(t,e,n={}){return new Cn(t,n).mount(e,n)},t.onError=function(t){const e=ce();let n=Tt.get(e);n||(n=[],Tt.set(e,n)),n.push(t.bind(e.component))},t.onMounted=be,t.onPatched=ge,t.onRendered=function(t){const e=ce(),n=e.renderFn,o=e.app.dev?me:t=>t;t=o(t.bind(e.component),"onRendered"),e.renderFn=()=>{const e=n();return t(),e}},t.onWillDestroy=function(t){const e=ce(),n=e.app.dev?me:t=>t;e.willDestroy.push(n(t.bind(e.component),"onWillDestroy"))},t.onWillPatch=function(t){const e=ce(),n=e.app.dev?me:t=>t;e.willPatch.unshift(n(t.bind(e.component),"onWillPatch"))},t.onWillRender=function(t){const e=ce(),n=e.renderFn,o=e.app.dev?me:t=>t;t=o(t.bind(e.component),"onWillRender"),e.renderFn=()=>(t(),n())},t.onWillStart=function(t){const e=ce(),n=e.app.dev?me:t=>t;e.willStart.push(n(t.bind(e.component),"onWillStart"))},t.onWillUnmount=ye,t.onWillUpdateProps=function(t){const e=ce(),n=e.app.dev?me:t=>t;e.willUpdateProps.push(n(t.bind(e.component),"onWillUpdateProps"))},t.reactive=te,t.status=function(t){switch(t.__owl__.status){case 0:return"new";case 2:return"cancelled";case 1:return"mounted";case 3:return"destroyed"}},t.toRaw=Ut,t.useChildSubEnv=Sn,t.useComponent=function(){return ae.component},t.useEffect=function(t,e=(()=>[NaN])){let n,o;be((()=>{o=e(),n=t(...o)})),ge((()=>{const r=e();r.some(((t,e)=>t!==o[e]))&&(o=r,n&&n(),n=t(...o))})),ye((()=>n&&n()))},t.useEnv=function(){return ce().component.env},t.useExternalListener=function(t,e,n,o){const r=ce(),s=n.bind(r.component);be((()=>t.addEventListener(e,s,o))),ye((()=>t.removeEventListener(e,s,o)))},t.useRef=function(t){const e=ce().refs;return{get el(){const n=e[t];return N(n)?n:null}}},t.useState=de,t.useSubEnv=function(t){const e=ce();e.component.env=On(e.component.env,t),Sn(t)},t.validate=function(t,e){let n=Ce(t,e);if(n.length)throw new s("Invalid object: "+n.join(", "))},t.validateType=Oe,t.whenReady=function(t){return new Promise((function(t){"loading"!==document.readyState?t(!0):document.addEventListener("DOMContentLoaded",t,!1)})).then(t||function(){})},t.xml=Fe,Object.defineProperty(t,"__esModule",{value:!0}),Ln.date="2024-07-25T13:13:44.371Z",Ln.hash="0cde4b8",Ln.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)}moveBeforeDOMNode(t,e){this.child.moveBeforeDOMNode(t,e)}moveBeforeVNode(t,e){this.moveBeforeDOMNode(t&&t.firstNode()||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)}class s extends Error{}const{setAttribute:i,removeAttribute:l}=Element.prototype,a=DOMTokenList.prototype,c=a.add,h=a.remove,u=Array.isArray,{split:d,trim:f}=String.prototype,p=/\s+/;function m(t,e){switch(e){case!1:case void 0:l.call(this,t);break;case!0:i.call(this,t,"");break;default:i.call(this,t,e)}}function b(t){return function(e){m.call(this,t,e)}}function g(t){if(u(t))"class"===t[0]?w.call(this,t[1]):m.call(this,t[0],t[1]);else for(let e in t)"class"===e?w.call(this,t[e]):m.call(this,e,t[e])}function v(t,e){if(u(t)){const n=t[0],o=t[1];if(n===e[0]){if(o===e[1])return;"class"===n?$.call(this,o,e[1]):m.call(this,n,o)}else l.call(this,e[0]),m.call(this,n,o)}else{for(let n in e)n in t||("class"===n?$.call(this,"",e[n]):l.call(this,n));for(let n in t){const o=t[n];o!==e[n]&&("class"===n?$.call(this,o,e[n]):m.call(this,n,o))}}}function y(t){const e={};switch(typeof t){case"string":const n=f.call(t);if(!n)return{};let o=d.call(n,p);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=f.call(n),!n)continue;const t=d.call(n,p);for(let n of t)e[n]=o}}return e;case"undefined":return{};case"number":return{[t]:!0};default:return{[t]:!0}}}function w(t){t=""===t?{}:y(t);const e=this.classList;for(let n in t)c.call(e,n)}function $(t,e){e=""===e?{}:y(e),t=""===t?{}:y(t);const n=this.classList;for(let o in e)o in t||h.call(n,o);for(let o in t)o in e||c.call(n,o)}function x(t){let e=!1;return async(...n)=>{e||(e=!0,await Promise.resolve(),e=!1,t(...n))}}function N(t){if(!t)return!1;if(t.ownerDocument.contains(t))return!0;const e=t.getRootNode();return e instanceof ShadowRoot&&t.ownerDocument.contains(e.host)}class k extends EventTarget{trigger(t,e){this.dispatchEvent(new CustomEvent(t,{detail:e}))}}class E extends String{}function A(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=`${o}_capture`);!function(t,e,o=!1){if(S[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}),S[e]=!0}(t,o,e);const r=_++;function s(t){const e=this[o]||{};e[r]=t,this[o]=e}function i(){delete this[o]}return{setup:s,update:s,remove:i}}(e,o):function(t,e=!1){let o=`__event__${t}_${T++}`;e&&(o=`${o}_capture`);function r(t){const e=t.currentTarget;if(!e||!N(e))return;const r=e[o];r&&n.mainEventHandler(r,t,e)}function s(n){this[o]=n,this.addEventListener(t,r,{capture:e})}function i(){delete this[o],this.removeEventListener(t,r,{capture:e})}function l(t){this[o]=t}return{setup:s,update:l,remove:i}}(e,o)}let T=1;let _=1;const S={};const C=Node.prototype,O=C.insertBefore,D=(L=C,R="textContent",Object.getOwnPropertyDescriptor(L,R)).set;var L,R;const B=C.removeChild;class P{constructor(t){this.children=t}mount(t,e){const n=this.children,o=n.length,r=new Array(o);for(let s=0;s<o;s++){let o=n[s];if(o)o.mount(t,e);else{const n=document.createTextNode("");r[s]=n,O.call(t,n,e)}}this.anchors=r,this.parentEl=t}moveBeforeDOMNode(t,e=this.parentEl){this.parentEl=e;const n=this.children,o=this.anchors;for(let r=0,s=n.length;r<s;r++){let s=n[r];if(s)s.moveBeforeDOMNode(t,e);else{const n=o[r];O.call(e,n,t)}}}moveBeforeVNode(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,s=n.length;t<s;t++){let s=n[t];if(s)s.moveBeforeVNode(null,e);else{const n=r[t];O.call(o,n,e)}}}patch(t,e){if(this===t)return;const n=this.children,o=t.children,r=this.anchors,s=this.parentEl;for(let t=0,i=n.length;t<i;t++){const i=n[t],l=o[t];if(i)if(l)i.patch(l,e);else{const o=i.firstNode(),l=document.createTextNode("");r[t]=l,O.call(s,l,o),e&&i.beforeRemove(),i.remove(),n[t]=void 0}else if(l){n[t]=l;const e=r[t];l.mount(s,e),B.call(s,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)D.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():B.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 j(t){return new P(t)}const M=Node.prototype,I=CharacterData.prototype,W=M.insertBefore,F=((t,e)=>Object.getOwnPropertyDescriptor(t,e))(I,"data").set,V=M.removeChild;class K{constructor(t){this.text=t}mountNode(t,e,n){this.parentEl=e,W.call(e,t,n),this.el=t}moveBeforeDOMNode(t,e=this.parentEl){this.parentEl=e,W.call(e,this.el,t)}moveBeforeVNode(t,e){W.call(this.parentEl,this.el,t?t.el:e)}beforeRemove(){}remove(){V.call(this.parentEl,this.el)}firstNode(){return this.el}toString(){return this.text}}class z extends K{mount(t,e){this.mountNode(document.createTextNode(G(this.text)),t,e)}patch(t){const e=t.text;this.text!==e&&(F.call(this.el,G(e)),this.text=e)}}class H extends K{mount(t,e){this.mountNode(document.createComment(G(this.text)),t,e)}patch(){}}function U(t){return new z(t)}function q(t){return new H(t)}function G(t){switch(typeof t){case"string":return t;case"number":return String(t);case"boolean":return t?"true":"false";default:return t||""}}const X=(t,e)=>Object.getOwnPropertyDescriptor(t,e),Y=Node.prototype,Z=Element.prototype,J=X(CharacterData.prototype,"data").set,Q=X(Y,"firstChild").get,tt=X(Y,"nextSibling").get,et=()=>{};function nt(t){return function(e){this[t]=0===e?0:e?e.valueOf():""}}const ot={};function rt(t){if(t in ot)return ot[t];const e=(new DOMParser).parseFromString(`<t>${t}</t>`,"text/xml").firstChild.firstChild;n.shouldNormalizeDom&&st(e);const o=it(e),r=ct(o),s=function(t,e){let n=function(t,e){const{refN:n,collectors:o,children:r}=e,s=o.length;e.locations.sort(((t,e)=>t.idx-e.idx));const i=e.locations.map((t=>({refIdx:t.refIdx,setData:t.setData,updateData:t.updateData}))),l=i.length,a=r.length,c=r,h=n>0,u=Y.cloneNode,d=Y.insertBefore,f=Z.remove;class p{constructor(t){this.data=t}beforeRemove(){}remove(){f.call(this.el)}firstNode(){return this.el}moveBeforeDOMNode(t,e=this.parentEl){this.parentEl=e,d.call(e,this.el,t)}moveBeforeVNode(t,e){d.call(this.parentEl,this.el,t?t.el:e)}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<s;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=i[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],s=o[t];if(r!==s){const e=i[t];e.updateData.call(n[e.refIdx],s,r)}}this.data=o}if(a){let o=this.children;const r=t.children;for(let t=0;t<a;t++){const s=o[t],i=r[t];if(s)i?s.patch(i,e):(e&&s.beforeRemove(),s.remove(),o[t]=void 0);else if(i){const e=c[t],r=e.afterRefIdx?n[e.afterRefIdx]:null;i.mount(n[e.parentRefIdx],r),o[t]=i}}}});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=P.prototype.beforeRemove,(t,e=[])=>new n(t,e);return t=>new n(t)}(o.el,r);return ot[t]=s,s}function st(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)st(t.childNodes.item(e))}else t.remove()}function it(t,e=null,n=null){switch(t.nodeType){case Node.ELEMENT_NODE:{let o=n&&n.currentNS;const r=t.tagName;let s;const i=[];if(r.startsWith("block-text-")){const t=parseInt(r.slice(11),10);i.push({type:"text",idx:t}),s=document.createTextNode("")}if(r.startsWith("block-child-")){n.isRef||lt(n);const t=parseInt(r.slice(12),10);i.push({type:"child",idx:t}),s=document.createTextNode("")}if(o||(o=t.namespaceURI),s||(s=o?document.createElementNS(o,r):document.createElement(r)),s instanceof Element){if(!n){document.createElement("template").content.appendChild(s)}const e=t.attributes;for(let t=0;t<e.length;t++){const n=e[t].name,o=e[t].value;if(n.startsWith("block-handler-")){const t=parseInt(n.slice(14),10);i.push({type:"handler",idx:t,event:o})}else if(n.startsWith("block-attribute-")){const t=parseInt(n.slice(16),10);i.push({type:"attribute",idx:t,name:o,tag:r})}else if(n.startsWith("block-property-")){const t=parseInt(n.slice(15),10);i.push({type:"property",idx:t,name:o,tag:r})}else"block-attributes"===n?i.push({type:"attributes",idx:parseInt(o,10)}):"block-ref"===n?i.push({type:"ref",idx:parseInt(o,10)}):s.setAttribute(e[t].name,o)}}const l={parent:e,firstChild:null,nextSibling:null,el:s,info:i,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);i.push({idx:n,type:"child",isOnlyChild:!0})}else{l.firstChild=it(t.firstChild,l,l),s.appendChild(l.firstChild.el);let e=t.firstChild,n=l.firstChild;for(;e=e.nextSibling;)n.nextSibling=it(e,n,l),s.appendChild(n.nextSibling.el),n=n.nextSibling}}return l.info.length&&lt(l),l}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 s("boom")}function lt(t){t.isRef=!0;do{t.refN++}while(t=t.parent)}function at(t){let e=t.parent;for(;e&&e.nextSibling===t;)t=e,e=e.parent;return e}function ct(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,s=t.firstChild?t.firstChild.refN:0,i=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:ht,updateData:ht});break;case"child":n.isOnlyChild?t.children[n.idx]={parentRefIdx:n.refIdx,isOnlyChild:!0}:t.children[n.idx]={parentRefIdx:at(e).refIdx,afterRefIdx:n.refIdx};break;case"property":{const e=n.refIdx,o=nt(n.name);t.locations.push({idx:n.idx,refIdx:e,setData:o,updateData:o});break}case"attribute":{const e=n.refIdx;let o,r;"class"===n.name?(r=w,o=$):(r=b(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:g,updateData:v});break;case"handler":{const{setup:e,update:o}=A(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:ut(o,t.refList),updateData:et})}}(e,t),n++}if(i){const r=n+s;e.collectors.push({idx:r,prevIdx:o,getVal:tt}),ct(t.nextSibling,e,r)}s&&(e.collectors.push({idx:n,prevIdx:o,getVal:Q}),ct(t.firstChild,e,n))}return e}function ht(t){J.call(this,G(t))}function ut(t,e){return function(n){e[e.length-1][t]=()=>n(this)}}const dt=Node.prototype,ft=dt.insertBefore,pt=dt.appendChild,mt=dt.removeChild,bt=((t,e)=>Object.getOwnPropertyDescriptor(t,e))(dt,"textContent").set;class gt{constructor(t){this.children=t}mount(t,e){const n=this.children,o=document.createTextNode("");this.anchor=o,ft.call(t,o,e);const r=n.length;if(r){const e=n[0].mount;for(let s=0;s<r;s++)e.call(n[s],t,o)}this.parentEl=t}moveBeforeDOMNode(t,e=this.parentEl){this.parentEl=e;const n=this.children;for(let o=0,r=n.length;o<r;o++)n[o].moveBeforeDOMNode(t,e);e.insertBefore(this.anchor,t)}moveBeforeVNode(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].moveBeforeVNode(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:s,patch:i,remove:l,beforeRemove:a,moveBeforeVNode: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 bt.call(f,""),void pt.call(f,u)}let p,m=0,b=0,g=n[0],v=o[0],y=n.length-1,w=o.length-1,$=n[y],x=o[w];for(;m<=y&&b<=w;){if(null===g){g=n[++m];continue}if(null===$){$=n[--y];continue}let t=g.key,r=v.key;if(t===r){i.call(g,v,e),o[b]=g,g=n[++m],v=o[++b];continue}let l=$.key,a=x.key;if(l===a){i.call($,x,e),o[w]=$,$=n[--y],x=o[--w];continue}if(t===a){i.call(g,x,e),o[w]=g;const t=o[w+1];c.call(g,t,u),g=n[++m],x=o[--w];continue}if(l===r){i.call($,v,e),o[b]=$;const t=n[m];c.call($,t,u),$=n[--y],v=o[++b];continue}p=p||yt(n,m,y);let d=p[r];if(void 0===d)s.call(v,f,h.call(g)||null);else{const t=n[d];c.call(t,g,null),i.call(t,v,e),o[b]=t,n[d]=null}v=o[++b]}if(m<=y||b<=w)if(m>y){const t=o[w+1],e=t?h.call(t)||null:u;for(let t=b;t<=w;t++)s.call(o[t],f,e)}else for(let t=m;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)bt.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])}mt.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 vt(t){return new gt(t)}function yt(t,e,n){let o={};for(let r=e;r<=n;r++)o[t[r].key]=r;return o}const wt=Node.prototype,$t=wt.insertBefore,xt=wt.removeChild;class Nt{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)$t.call(t,n,e);if(!this.content.length){const n=document.createTextNode("");this.content.push(n),$t.call(t,n,e)}}moveBeforeDOMNode(t,e=this.parentEl){this.parentEl=e;for(let n of this.content)$t.call(e,n,t)}moveBeforeVNode(t,e){const n=t?t.content[0]:e;this.moveBeforeDOMNode(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 s=[...r.content.childNodes];for(let t of s)$t.call(n,t,o);if(!s.length){const t=document.createTextNode("");s.push(t),$t.call(n,t,o)}this.remove(),this.content=s,this.html=t.html}}beforeRemove(){}remove(){const t=this.parentEl;for(let e of this.content)xt.call(t,e)}firstNode(){return this.content[0]}toString(){return this.html}}function kt(t){return new Nt(t)}function Et(t,e,n=null){t.mount(e,n)}const At=new WeakMap,Tt=new WeakMap;function _t(t,e){if(!t)return!1;const n=t.fiber;n&&At.set(n,e);const o=Tt.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 _t(t.parent,e)}function St(t){let{error:e}=t;e instanceof s||(e=Object.assign(new s('An error occured in the owl lifecycle (see this Error\'s "cause" property)'),{cause:e}));const n="node"in t?t.node:t.fiber.node,o="fiber"in t?t.fiber:n.fiber;if(o){let t=o;do{t.node.fiber=t,t=t.parent}while(t);At.set(o.root,e)}if(!_t(n,e)){console.warn("[Owl] Unhandled error. Destroying the root component");try{n.app.destroy()}catch(t){console.error(t)}throw e}}function Ct(){throw new s("Attempted to render cancelled fiber")}function Ot(t){let e=0;for(let n of t){let t=n.node;n.render=Ct,0===t.status&&t.cancel(),t.fiber=null,n.bdom?t.forceNextRender=!0:e++,e+=Ot(n.children)}return e}class Dt{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){t.app.handleError({node:t,error:e})}e.setCounter(e.counter-1)}}}class Lt extends Dt{constructor(){super(...arguments),this.counter=1,this.willPatch=[],this.patched=[],this.mounted=[],this.locked=!1}complete(){const t=this.node;let e;this.locked=!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.appliedToDom)for(let t of e.node.mounted)t();let o=this.patched;for(;e=o.pop();)if(e.appliedToDom)for(let t of e.node.patched)t()}catch(n){this.locked=!1,t.app.handleError({fiber:e||this,error:n})}}setCounter(t){this.counter=t,0===t&&this.node.app.scheduler.flush()}}class Rt extends Lt{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)Et(e.bdom,this.target);else{const t=this.target.childNodes[0];Et(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){this.node.app.handleError({fiber:t,error:e})}}}const Bt=Symbol("Key changes"),Pt=()=>{throw new Error("Called NO_CALLBACK. Owl is broken, please report this to the maintainers.")},jt=Object.prototype.toString,Mt=Object.prototype.hasOwnProperty,It=["Object","Array","Set","Map","WeakMap"],Wt=["Set","Map","WeakMap"];function Ft(t){return jt.call(Ut(t)).slice(8,-1)}function Vt(t){return"object"==typeof t&&It.includes(Ft(t))}function Kt(t,e){return Vt(t)?te(t,e):t}const zt=new WeakSet;function Ht(t){return zt.add(t),t}function Ut(t){return Jt.has(t)?Jt.get(t):t}const qt=new WeakMap;function Gt(t,e,n){if(n===Pt)return;qt.get(t)||qt.set(t,new Map);const o=qt.get(t);o.get(e)||o.set(e,new Set),o.get(e).add(n),Yt.has(n)||Yt.set(n,new Set),Yt.get(n).add(t)}function Xt(t,e){const n=qt.get(t);if(!n)return;const o=n.get(e);if(o)for(const t of[...o])Zt(t),t()}const Yt=new WeakMap;function Zt(t){const e=Yt.get(t);if(e){for(const n of e){const e=qt.get(n);if(e)for(const[n,o]of e.entries())o.delete(t),o.size||e.delete(n)}e.clear()}}const Jt=new WeakMap,Qt=new WeakMap;function te(t,e=Pt){if(!Vt(t))throw new s("Cannot make the given value reactive");if(zt.has(t))return t;if(Jt.has(t))return te(Jt.get(t),e);Qt.has(t)||Qt.set(t,new WeakMap);const n=Qt.get(t);if(!n.has(e)){const o=Ft(t),r=Wt.includes(o)?function(t,e,n){const o=le[n](t,e);return Object.assign(ee(e),{get:(t,n)=>Mt.call(o,n)?o[n]:(Gt(t,n,e),Kt(t[n],e))})}(t,e,o):ee(e),s=new Proxy(t,r);n.set(e,s),Jt.set(s,t)}return n.get(e)}function ee(t){return{get(e,n,o){const r=Object.getOwnPropertyDescriptor(e,n);return!r||r.writable||r.configurable?(Gt(e,n,t),Kt(Reflect.get(e,n,o),t)):Reflect.get(e,n,o)},set(t,e,n,o){const r=Mt.call(t,e),s=Reflect.get(t,e,o),i=Reflect.set(t,e,Ut(n),o);return!r&&Mt.call(t,e)&&Xt(t,Bt),(s!==Reflect.get(t,e,o)||"length"===e&&Array.isArray(t))&&Xt(t,e),i},deleteProperty(t,e){const n=Reflect.deleteProperty(t,e);return Xt(t,Bt),Xt(t,e),n},ownKeys:e=>(Gt(e,Bt,t),Reflect.ownKeys(e)),has:(e,n)=>(Gt(e,Bt,t),Reflect.has(e,n))}}function ne(t,e,n){return o=>(o=Ut(o),Gt(e,o,n),Kt(e[t](o),n))}function oe(t,e,n){return function*(){Gt(e,Bt,n);const o=e.keys();for(const r of e[t]()){const t=o.next().value;Gt(e,t,n),yield Kt(r,n)}}}function re(t,e){return function(n,o){Gt(t,Bt,e),t.forEach((function(r,s,i){Gt(t,s,e),n.call(o,Kt(r,e),Kt(s,e),Kt(i,e))}),o)}}function se(t,e,n){return(o,r)=>{o=Ut(o);const s=n.has(o),i=n[e](o),l=n[t](o,r);return s!==n.has(o)&&Xt(n,Bt),i!==n[e](o)&&Xt(n,o),l}}function ie(t){return()=>{const e=[...t.keys()];t.clear(),Xt(t,Bt);for(const n of e)Xt(t,n)}}const le={Set:(t,e)=>({has:ne("has",t,e),add:se("add","has",t),delete:se("delete","has",t),keys:oe("keys",t,e),values:oe("values",t,e),entries:oe("entries",t,e),[Symbol.iterator]:oe(Symbol.iterator,t,e),forEach:re(t,e),clear:ie(t),get size(){return Gt(t,Bt,e),t.size}}),Map:(t,e)=>({has:ne("has",t,e),get:ne("get",t,e),set:se("set","get",t),delete:se("delete","has",t),keys:oe("keys",t,e),values:oe("values",t,e),entries:oe("entries",t,e),[Symbol.iterator]:oe(Symbol.iterator,t,e),forEach:re(t,e),clear:ie(t),get size(){return Gt(t,Bt,e),t.size}}),WeakMap:(t,e)=>({has:ne("has",t,e),get:ne("get",t,e),set:se("set","get",t),delete:se("delete","has",t)})};let ae=null;function ce(){if(!ae)throw new s("No active component (a hook function should only be called in 'setup')");return ae}function he(t,e){for(let n in e)void 0===t[n]&&(t[n]=e[n])}const ue=new WeakMap;function de(t){const e=ce();let n=ue.get(e);return n||(n=x(e.render.bind(e,!1)),ue.set(e,n),e.willDestroy.push(Zt.bind(null,n))),te(t,n)}class fe{constructor(t,e,n,o,r){this.fiber=null,this.bdom=null,this.status=0,this.forceNextRender=!1,this.nextProps=null,this.children=Object.create(null),this.refs={},this.willStart=[],this.willUpdateProps=[],this.willUnmount=[],this.mounted=[],this.willPatch=[],this.patched=[],this.willDestroy=[],ae=this,this.app=n,this.parent=o,this.props=e,this.parentKey=r;const s=t.defaultProps;e=Object.assign({},e),s&&he(e,s);const i=o&&o.childEnv||n.env;this.childEnv=i;for(const t in e){const n=e[t];n&&"object"==typeof n&&Jt.has(n)&&(e[t]=de(n))}this.component=new t(e,i,this);const l=Object.assign(Object.create(this.component),{this:this.component});this.renderFn=n.getTemplate(t.template).bind(this.component,l,this),this.component.setup(),ae=null}mountComponent(t,e){const n=new Rt(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 this.app.handleError({node:this,error:t})}0===this.status&&this.fiber===t&&t.render()}async render(t){if(this.status>=2)return;let e=this.fiber;if(e&&(e.root.locked||!0===e.bdom)&&(await Promise.resolve(),e=this.fiber),e){if(!e.bdom&&!At.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-Ot(e.children)),t.locked=!1,e.children=[],e.childrenMap={},e.bdom=null,At.has(e)&&(At.delete(e),At.delete(t),e.appliedToDom=!1),e}const n=new Lt(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(),this.status>=2||this.fiber!==n||!e&&n.parent||n.render()}cancel(){this._cancel(),delete this.parent.children[this.parentKey],this.app.scheduler.scheduleDestroy(this)}_cancel(){this.status=2;const t=this.children;for(let e in t)t[e]._cancel()}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){this.app.handleError({error:t,node:this})}this.status=3}async updateAndRender(t,e){this.nextProps=t,t=Object.assign({},t);const n=function(t,e){let n=t.fiber;return n&&(Ot(n.children),n.root=null),new Dt(t,e)}(this,e);this.fiber=n;const o=this.component,r=o.constructor.defaultProps;r&&he(t,r),ae=this;for(const e in t){const n=t[e];n&&"object"==typeof n&&Jt.has(n)&&(t[e]=de(n))}ae=null;const s=Promise.all(this.willUpdateProps.map((e=>e.call(o,t))));if(await s,n!==this.fiber)return;o.props=t,n.render();const i=e.root;this.willPatch.length&&i.willPatch.push(n),this.patched.length&&i.patched.push(n)}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}setRef(t,e){e&&(this.refs[t]=e)}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}moveBeforeDOMNode(t,e){this.bdom.moveBeforeDOMNode(t,e)}moveBeforeVNode(t,e){this.bdom.moveBeforeVNode(t?t.bdom:null,e)}patch(){this.fiber&&this.fiber.parent&&(this._patch(),this.props=this.nextProps)}_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=ue.get(this);return t?(e=t,[...Yt.get(e)||[]].map((t=>{const n=qt.get(t);let o=[];if(n)for(const[t,r]of n)r.has(e)&&o.push(t);return{target:t,keys:o}}))):[];var e}}const pe=Symbol("timeout"),me={onWillStart:3e3,onWillUpdateProps:3e3};function be(t,e){const n=new s,o=new s,r=ce();return(...s)=>{const i=t=>{throw n.cause=t,n.message=t instanceof Error?`The following error occurred in ${e}: "${t.message}"`:`Something that is not an Error was thrown in ${e} (see this Error's "cause" property)`,n};let l;try{l=t(...s)}catch(t){i(t)}if(!(l instanceof Promise))return l;const a=me[e];if(a){const t=r.fiber;Promise.race([l.catch((()=>{})),new Promise((t=>setTimeout((()=>t(pe)),a)))]).then((n=>{n===pe&&r.fiber===t&&r.status<=2&&(o.message=`${e}'s promise hasn't resolved after ${a/1e3} seconds`,console.log(o))}))}return l.catch(i)}}function ge(t){const e=ce(),n=e.app.dev?be:t=>t;e.mounted.push(n(t.bind(e.component),"onMounted"))}function ve(t){const e=ce(),n=e.app.dev?be:t=>t;e.patched.push(n(t.bind(e.component),"onPatched"))}function ye(t){const e=ce(),n=e.app.dev?be:t=>t;e.willUnmount.unshift(n(t.bind(e.component),"onWillUnmount"))}class we{constructor(t,e,n){this.props=t,this.env=e,this.__owl__=n}setup(){}render(t=!1){this.__owl__.render(!0===t)}}we.template="";const $e=U("").constructor;class xe extends $e{constructor(t,e){super(""),this.target=null,this.selector=t,this.content=e}mount(t,e){super.mount(t,e),this.target=document.querySelector(this.selector),this.target?this.content.mount(this.target,null):this.content.mount(t,e)}beforeRemove(){this.content.beforeRemove()}remove(){this.content&&(super.remove(),this.content.remove(),this.content=null)}patch(t){super.patch(t),this.content?this.content.patch(t.content,!0):(this.content=t.content,this.content.mount(this.target,null))}}class Ne extends we{setup(){const t=this.__owl__;ge((()=>{const e=t.bdom;if(!e.target){const t=document.querySelector(this.props.target);if(!t)throw new s("invalid portal target");e.content.moveBeforeDOMNode(t.firstChild,t)}})),ye((()=>{t.bdom.remove()}))}}Ne.template="__portal__",Ne.props={target:{type:String},slots:!0};const ke=t=>Array.isArray(t),Ee=t=>"object"!=typeof t,Ae=t=>"object"==typeof t&&t&&"value"in t;function Te(t){return"object"==typeof t&&"optional"in t&&t.optional||!1}function _e(t){return"*"===t||!0===t?"value":t.name.toLowerCase()}function Se(t){return Ee(t)?_e(t):ke(t)?t.map(Se).join(" or "):Ae(t)?String(t.value):"element"in t?`list of ${Se({type:t.element,optional:!1})}s`:"shape"in t?"object":Se(t.type||"*")}function Ce(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}])))),t=Ut(t);let o=[];for(let n in t)if(n in e){let r=Oe(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&&!Te(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 ${Se(r)})`;o.push(`'${n}' is missing${e}`)}}return o}function Oe(t,e,n){if(void 0===e)return Te(n)?null:`'${t}' is undefined (should be a ${Se(n)})`;if(Ee(n))return function(t,e,n){if("function"==typeof n)if("object"==typeof e){if(!(e instanceof n))return`'${t}' is not a ${_e(n)}`}else if(typeof e!==n.name.toLowerCase())return`'${t}' is not a ${_e(n)}`;return null}(t,e,n);if(Ae(n))return e===n.value?null:`'${t}' is not equal to '${n.value}'`;if(ke(n)){let o=n.find((n=>!Oe(t,e,n)));return o?null:`'${t}' is not a ${Se(n)}`}let o=null;if("element"in n)o=function(t,e,n){if(!Array.isArray(e))return`'${t}' is not a list of ${Se(n)}s`;for(let o=0;o<e.length;o++){const r=Oe(`${t}[${o}]`,e[o],n);if(r)return r}return null}(t,e,n.element);else if("shape"in n)if("object"!=typeof e||Array.isArray(e))o=`'${t}' is not an object`;else{const r=Ce(e,n.shape);r.length&&(o=`'${t}' doesn't have the correct shape (${r.join(", ")})`)}else if("values"in n)if("object"!=typeof e||Array.isArray(e))o=`'${t}' is not an object`;else{const r=Object.entries(e).map((([t,e])=>Oe(t,e,n.values))).filter(Boolean);r.length&&(o=`some of the values in '${t}' are invalid (${r.join(", ")})`)}return"type"in n&&!o&&(o=Oe(t,e,n.type)),"validate"in n&&!o&&(o=n.validate(e)?null:`'${t}' is not valid`),o}const De=Object.create;function Le(t){const e=De(t);for(let n in t)e[n]=t[n];return e}const Re=Symbol("isBoundary");class Be{constructor(t,e,n,o,r){this.fn=t,this.ctx=Le(e),this.component=n,this.node=o,this.key=r}evaluate(){return this.fn.call(this.component,this.ctx,this.node,this.key)}toString(){return this.evaluate().toString()}}function Pe(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)&&!Te(r[t]);for(let e in i)if(t(e))throw new s(`A default value cannot be defined for a mandatory prop (name: '${e}', component: ${o.name})`)}const l=Ce(e,r);if(l.length)throw new s(`Invalid props for component '${o.name}': `+l.join(", "))}const je={withDefault:function(t,e){return null==t||!1===t?e:t},zero:Symbol("zero"),isBoundary:Re,callSlot:function(t,e,n,o,s,i,l){n=n+"__slot_"+o;const a=t.props.slots||{},{__render:c,__ctx:h,__scope:u}=a[o]||{},d=De(h||{});u&&(d[u]=i);const f=c?c(d,e,n):null;if(l){let i,a;return f?i=s?r(o,f):f:a=l(t,e,n),j([i,a])}return f||U("")},capture:Le,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 instanceof Map)e=[...t.keys()],n=[...t.values()];else if(Symbol.iterator in Object(t))e=[...t],n=e;else{if(!t||"object"!=typeof t)throw new s(`Invalid loop expression: "${t}" is not iterable`);n=Object.values(t),e=Object.keys(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(Re);){const e=t.__proto__;if(!e){t=o;break}t=e}t[e]=n},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:Pe,LazyValue:Be,safeOutput:function(t,e){if(null==t)return e?r("default",e):r("undefined",U(""));let n,o;switch(typeof t){case"object":t instanceof E?(n="string_safe",o=kt(t)):t instanceof Be?(n="lazy_value",o=t.evaluate()):t instanceof String?(n="string_unsafe",o=U(t)):(n="block_safe",o=t);break;case"string":n="string_unsafe",o=U(t);break;default:n="string_unsafe",o=U(String(t))}return r(n,o)},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=A(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 s=r.afterNode;for(;n&&n!==s;){if(n.contains(e))return o.call(this,t);n=n.nextSibling}}}}moveBeforeDOMNode(t,e=this.parentEl){this.parentEl=e,this.child.moveBeforeDOMNode(t,e),e.insertBefore(this.afterNode,t)}moveBeforeVNode(t,e){t&&(e=t.firstNode()||e),this.child.moveBeforeVNode(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:Ht,OwlError:s,makeRefWrapper:function(t){let e=new Set;return(n,o)=>{if(e.has(n))throw new s(`Cannot set the same ref more than once in the same component, ref "${n}" was set multiple times in ${t.name}`);return e.add(n),o}}};function Me(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 s=Number(r[0]),i=t.split("\n")[s-1],l=e.exec(o);if(i&&l){const t=Number(l[0])-1;i[t]&&(n+=`\nThe error might be located at xml line ${s} column ${t}\n${i}\n${"-".repeat(t-1)}^`)}}}throw new s(n)}return e}const Ie={text:U,createBlock:rt,list:vt,multi:j,html:kt,toggler:r,comment:q};class We{constructor(t={}){if(this.rawTemplates=Object.create(Fe),this.templates={},this.Portal=Ne,this.dev=t.dev||!1,this.translateFn=t.translateFn,this.translatableAttributes=t.translatableAttributes,t.templates)if(t.templates instanceof Document||"string"==typeof t.templates)this.addTemplates(t.templates);else for(const e in t.templates)this.addTemplate(e,t.templates[e]);this.getRawTemplate=t.getTemplate}static registerTemplate(t,e){Fe[t]=e}addTemplate(t,e){if(t in this.rawTemplates){if(!this.dev)return;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 s(`Template ${t} already defined with different content`)}this.rawTemplates[t]=e}addTemplates(t){if(t){t=t instanceof Document?t:Me(t);for(const e of t.querySelectorAll("[t-name]")){const t=e.getAttribute("t-name");this.addTemplate(t,e)}}}getTemplate(t){var e;if(!(t in this.templates)){const n=(null===(e=this.getRawTemplate)||void 0===e?void 0:e.call(this,t))||this.rawTemplates[t];if(void 0===n){let e="";try{e=` (for component "${ce().component.constructor.name}")`}catch{}throw new s(`Missing template: "${t}"${e}`)}const o="function"==typeof n&&!(n instanceof Element)?n:this._compileTemplate(t,n),r=this.templates;this.templates[t]=function(e,n){return r[t].call(this,e,n)};const i=o(this,Ie,je);this.templates[t]=i}return this.templates[t]}_compileTemplate(t,e){throw new s("Unable to compile a template. Please use owl full build instead")}callTemplate(t,e,n,o,s){return r(e,this.getTemplate(e).call(t,n,o,s+e))}}const Fe={};function Ve(...t){const e="__template__"+Ve.nextId++,n=String.raw(...t);return Fe[e]=n,e}Ve.nextId=1,We.registerTemplate("__portal__",(function(t,e,n){let{callSlot:o}=n;return function(t,e,n=""){return new xe(t.props.target,o(t,e,n,"default",!1,null))}}));const Ke="true,false,NaN,null,undefined,debugger,console,window,in,instanceof,new,function,return,eval,void,Math,RegExp,Array,Object,Date".split(","),ze=Object.assign(Object.create(null),{and:"&&",or:"||",gt:">",gte:">=",lt:"<",lte:"<="}),He=Object.assign(Object.create(null),{"{":"LEFT_BRACE","}":"RIGHT_BRACE","[":"LEFT_BRACKET","]":"RIGHT_BRACKET",":":"COLON",",":"COMMA","(":"LEFT_PAREN",")":"RIGHT_PAREN"}),Ue="...,.,===,==,+,!==,!=,!,||,&&,>=,>,<=,<,?,-,*,/,%,typeof ,=>,=,;,in ,new ,|,&,^,~".split(",");const qe=[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 s("Invalid expression");e+=o}r++}if(t[r]!==n)throw new s("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 Ue)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 ze?{type:"OPERATOR",value:ze[e],size:e.length}:{type:"SYMBOL",value:e}}return!1},function(t){const e=t[0];return!(!e||!(e in He))&&{type:He[e],value:e}}];const Ge=t=>t&&("LEFT_BRACE"===t.type||"COMMA"===t.type),Xe=t=>t&&("RIGHT_BRACE"===t.type||"COMMA"===t.type);function Ye(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 qe)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 s(`Tokenizer error: could not tokenize \`${t}\``);return e}(t);let o=0,r=[];for(;o<n.length;){let t=n[o],s=n[o-1],i=n[o+1],l=r[r.length-1];switch(t.type){case"LEFT_BRACE":case"LEFT_BRACKET":case"LEFT_PAREN":r.push(t.type);break;case"RIGHT_BRACE":case"RIGHT_BRACKET":case"RIGHT_PAREN":r.pop()}let a="SYMBOL"===t.type&&!Ke.includes(t.value);if("SYMBOL"!==t.type||Ke.includes(t.value)||s&&("LEFT_BRACE"===l&&Ge(s)&&Xe(i)&&(n.splice(o+1,0,{type:"COLON",value:":"},{...t}),i=n[o+1]),"OPERATOR"===s.type&&"."===s.value?a=!1:"LEFT_BRACE"!==s.type&&"COMMA"!==s.type||i&&"COLON"===i.type&&(a=!1)),"TEMPLATE_STRING"===t.type&&(t.value=t.replace((t=>Je(t)))),i&&"OPERATOR"===i.type&&"=>"===i.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 Ze=new Map([["in "," in "]]);function Je(t){return Ye(t).map((t=>Ze.get(t.value)||t.value)).join("")}const Qe=/\{\{.*?\}\}|\#\{.*?\}/g;function tn(t,e){let n=t.match(Qe);if(n&&n[0].length===t.length)return`(${e(t.slice(2,"{"===n[0][0]?-2:-1))})`;let o=t.replace(Qe,(t=>"${"+e(t.slice(2,"{"===t[0]?-2:-1))+"}"));return"`"+o+"`"}function en(t){return tn(t,Je)}const nn=/\s+/g,on=document.implementation.createDocument(null,null,null),rn=new Set(["stop","capture","prevent","self","synthetic"]);let sn={};function ln(t=""){return sn[t]=(sn[t]||0)+1,t+sn[t]}function an(t,e){switch(t){case"input":return"checked"===e||"indeterminate"===e||"value"===e||"readonly"===e||"readOnly"===e||"disabled"===e;case"option":return"selected"===e||"disabled"===e;case"textarea":return"value"===e||"readonly"===e||"readOnly"===e||"disabled"===e;case"select":return"value"===e||"disabled"===e;case"button":case"optgroup":return"disabled"===e}return!1}function cn(t){return`\`${t.replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$\{/,"\\${")}\``}class hn{constructor(t,e){this.dynamicTagName=null,this.isRoot=!1,this.hasDynamicChildren=!1,this.children=[],this.data=[],this.childNumber=0,this.parentVar="",this.id=hn.nextBlockId++,this.varName="b"+this.id,this.blockName="block"+this.id,this.target=t,this.type=e}insertData(t,e="d"){const n=ln(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=on.createElement("t");return t.appendChild(this.dom),t.innerHTML}}function un(t,e){return Object.assign({block:null,index:0,forceNewBlock:!0,translate:t.translate,tKeyExpr:null,nameSpace:t.nameSpace,tModelSelectedExpr:t.tModelSelectedExpr},e)}hn.nextBlockId=1;class dn{constructor(t,e){this.indentLevel=0,this.loopLevel=0,this.code=[],this.hasRoot=!1,this.hasCache=!1,this.shouldProtectScope=!1,this.hasRefWrapper=!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=[];t.push(`function ${this.name}(ctx, node, key = "") {`),this.shouldProtectScope&&(t.push(" ctx = Object.create(ctx);"),t.push(" ctx[isBoundary] = 1")),this.hasRefWrapper&&t.push(" let refWrapper = makeRefWrapper(this.__owl__);"),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 ")}currentKey(t){let e=this.loopLevel?`key${this.loopLevel}`:"key";return t.tKeyExpr&&(e=`${t.tKeyExpr} + ${e}`),e}}const fn=["label","title","placeholder","alt"],pn=/^(\s*)([\s\S]+?)(\s*)$/;class mn{constructor(t,e){if(this.blocks=[],this.nextBlockId=1,this.isDebug=!1,this.targets=[],this.target=new dn("template"),this.translatableAttributes=fn,this.staticDefs=[],this.slotNames=new Set,this.helpers=new Set,this.translateFn=e.translateFn||(t=>t),e.translatableAttributes){const t=new Set(fn);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,hn.nextBlockId=1,sn={},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=cn(t.asXmlString());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=ln(t),s=this.target,i=new dn(r,o);return this.targets.push(i),this.target=i,this.compileAST(e,un(n)),this.target=s,r}addLine(t,e){this.target.addLine(t,e)}define(t,e){this.addLine(`const ${t} = ${e};`)}insertAnchor(t,e=t.children.length){const n=`block-child-${e}`,o=on.createElement(n);t.insert(o)}createBlock(t,e,n){const o=this.target.hasRoot,r=new hn(this.target,e);return o||(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);if(e.parentVar){let t=this.target.currentKey(n);return this.helpers.add("withKey"),void this.addLine(`${e.parentVar}[${n.index}] = withKey(${o}, ${t});`)}n.tKeyExpr&&(o=`toggler(${n.tKeyExpr}, ${o})`),e.isRoot?(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 Je(t);const n=Ye(t),o=new Map;return n.map((t=>{if(t.varName&&!t.isLocal){if(!o.has(t.varName)){const e=ln("v");o.set(t.varName,e),this.define(e,t.value)}t.value=o.get(t.varName)}return t.value})).join("")}translate(t){const e=pn.exec(t);return e[1]+this.translateFn(e[2])+e[3]}compileAST(t,e){switch(t.type){case 1:return this.compileComment(t,e);case 0:return this.compileText(t,e);case 2:return this.compileTDomNode(t,e);case 4:return this.compileTEsc(t,e);case 8:return this.compileTOut(t,e);case 5:return this.compileTIf(t,e);case 9:return this.compileTForeach(t,e);case 10:return this.compileTKey(t,e);case 3:return this.compileMulti(t,e);case 7:return this.compileTCall(t,e);case 15:return this.compileTCallBlock(t,e);case 6:return this.compileTSet(t,e);case 11:return this.compileComponent(t,e);case 12:return this.compileDebug(t,e);case 13:return this.compileLog(t,e);case 14:return this.compileTSlot(t,e);case 16:return this.compileTTranslation(t,e);case 17:return this.compileTPortal(t,e)}}compileDebug(t,e){return this.addLine("debugger;"),t.content?this.compileAST(t.content,e):null}compileLog(t,e){return this.addLine(`console.log(${Je(t.expr)});`),t.content?this.compileAST(t.content,e):null}compileComment(t,e){let{block:n,forceNewBlock:o}=e;if(!n||o)n=this.createBlock(n,"comment",e),this.insertBlock(`comment(${cn(t.value)})`,n,{...e,forceNewBlock:o&&!n});else{const e=on.createComment(t.value);n.insert(e)}return n.varName}compileText(t,e){let{block:n,forceNewBlock:o}=e,r=t.value;if(r&&!1!==e.translate&&(r=this.translate(r)),e.inPreTag||(r=r.replace(nn," ")),!n||o)n=this.createBlock(n,"text",e),this.insertBlock(`text(${cn(r)})`,n,{...e,forceNewBlock:o&&!n});else{const e=0===t.type?on.createTextNode:on.createComment;n.insert(e.call(on,r))}return n.varName}generateHandlerCode(t,e){const n=t.split(".").slice(1).map((t=>{if(!rn.has(t))throw new s(`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 s=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=ln("tag");this.define(e,Je(t.dynamicTag)),n.dynamicTagName=e}const i={};for(let o in t.attrs){let r,s;if(o.startsWith("t-attf")){r=en(t.attrs[o]);const e=n.insertData(r,"attr");s=o.slice(7),i["block-attribute-"+e]=s}else if(o.startsWith("t-att"))if(s="t-att"===o?null:o.slice(6),r=Je(t.attrs[o]),s&&an(t.tag,s)){"readonly"===s&&(s="readOnly"),r="value"===s?`new String((${r}) === 0 ? 0 : ((${r}) || ""))`:`new Boolean(${r})`;i[`block-property-${n.insertData(r,"prop")}`]=s}else{const t=n.insertData(r,"attr");"t-att"===o?i["block-attributes"]=String(t):i[`block-attribute-${t}`]=s}else this.translatableAttributes.includes(o)?i[o]=this.translateFn(t.attrs[o]):(r=`"${t.attrs[o]}"`,s=o,i[o]=t.attrs[o]);if("value"===s&&e.tModelSelectedExpr){i[`block-attribute-${n.insertData(`${e.tModelSelectedExpr} === ${r}`,"attr")}`]="selected"}}let l;if(t.model){const{hasDynamicChildren:e,baseExpr:o,expr:r,eventType:s,shouldNumberize:a,shouldTrim:c,targetAttr:h,specialInitTargetAttr:u}=t.model,d=Je(o),f=ln("bExpr");this.define(f,d);const p=Je(r),m=ln("expr");this.define(m,p);const b=`${f}[${m}]`;let g;if(u){let e=h in i&&`'${i[h]}'`;if(!e&&t.attrs){const n=t.attrs[`t-att-${h}`];n&&(e=Je(n))}g=n.insertData(`${b} === ${e}`,"prop"),i[`block-property-${g}`]=u}else if(e){l=`${ln("bValue")}`,this.define(l,b)}else g=n.insertData(`${b}`,"prop"),i[`block-property-${g}`]=h;this.helpers.add("toNumber");let v=`ev.target.${h}`;v=c?`${v}.trim()`:v,v=a?`toNumber(${v})`:v;const y=`[(ev) => { ${b} = ${v}; }]`;g=n.insertData(y,"hdlr"),i[`block-handler-${g}`]=s}for(let e in t.on){const o=this.generateHandlerCode(e,t.on[e]);i[`block-handler-${n.insertData(o,"hdlr")}`]=e}if(t.ref){this.dev&&(this.helpers.add("makeRefWrapper"),this.target.hasRefWrapper=!0);const e=Qe.test(t.ref);let o=`\`${t.ref}\``;e&&(o=tn(t.ref,(t=>this.captureExpression(t,!0))));let r=`(el) => this.__owl__.setRef((${o}), el)`;this.dev&&(r=`refWrapper(${o}, ${r})`);const s=n.insertData(r,"ref");i["block-ref"]=String(s)}const a=t.ns||e.nameSpace,c=a?on.createElementNS(a,t.tag):on.createElement(t.tag);for(const[t,e]of Object.entries(i))"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 s=t.content[o],i=un(e,{block:n,index:n.childNumber,forceNewBlock:!1,isLast:e.isLast&&o===r.length-1,tKeyExpr:e.tKeyExpr,nameSpace:a,tModelSelectedExpr:l,inPreTag:e.inPreTag||"pre"===t.tag});this.compileAST(s,i)}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=s;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)).join(", ")};`,s)}return n.varName}compileTEsc(t,e){let n,{block:o,forceNewBlock:r}=e;if("0"===t.expr?(this.helpers.add("zero"),n="ctx[zero]"):(n=Je(t.expr),t.defaultValue&&(this.helpers.add("withDefault"),n=`withDefault(${n}, ${cn(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=on.createElement(`block-text-${t}`);o.insert(e)}return o.varName}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=hn.nextBlockId;const r=un(e);this.compileAST({type:3,content:t.body},r),this.helpers.add("safeOutput"),n=`safeOutput(${Je(t.expr)}, b${o})`}else this.helpers.add("safeOutput"),n=`safeOutput(${Je(t.expr)})`;return this.insertBlock(n,o,e),o.varName}compileTIfBranch(t,e,n){this.target.indentLevel++;let o=e.children.length;this.compileAST(t,un(n,{block:e,index:n.index})),e.children.length>o&&this.insertAnchor(e,o),this.target.indentLevel--}compileTIf(t,e,n){let{block:o,forceNewBlock:r}=e;const s=this.target.code.length,i=!o||"multi"!==o.type&&r;if(o&&(o.hasDynamicChildren=!0),(!o||"multi"!==o.type&&r)&&(o=this.createBlock(o,"multi",e)),this.addLine(`if (${Je(t.condition)}) {`),this.compileTIfBranch(t.content,o,e),t.tElif)for(let n of t.tElif)this.addLine(`} else if (${Je(n.condition)}) {`),this.compileTIfBranch(n.content,o,e);if(t.tElse&&(this.addLine("} else {"),this.compileTIfBranch(t.tElse,o,e)),this.addLine("}"),i){if(o.children.length){const t=this.target.code,e=o.children.slice();let n=e.shift();for(let o=s;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)).join(", ")};`,s)}const t=o.children.map((t=>t.varName)).join(", ");this.insertBlock(`multi([${t}])`,o,e)}return o.varName}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}`,s=`k_block${n.id}`,i=`l_block${n.id}`,l=`c_block${n.id}`;let a;this.helpers.add("prepareList"),this.define(`[${s}, ${r}, ${i}, ${l}]`,`prepareList(${Je(t.collection)});`),this.dev&&this.define(`keys${n.id}`,"new Set()"),this.addLine(`for (let ${o} = 0; ${o} < ${i}; ${o}++) {`),this.target.indentLevel++,this.addLine(`ctx[\`${t.elem}\`] = ${s}[${o}];`),t.hasNoFirst||this.addLine(`ctx[\`${t.elem}_first\`] = ${o} === 0;`),t.hasNoLast||this.addLine(`ctx[\`${t.elem}_last\`] = ${o} === ${s}.length - 1;`),t.hasNoIndex||this.addLine(`ctx[\`${t.elem}_index\`] = ${o};`),t.hasNoValue||this.addLine(`ctx[\`${t.elem}_value\`] = ${r}[${o}];`),this.define(`key${this.target.loopLevel}`,t.key?Je(t.key):o),this.dev&&(this.helpers.add("OwlError"),this.addLine(`if (keys${n.id}.has(String(key${this.target.loopLevel}))) { throw new OwlError(\`Got duplicate key in t-foreach: \${key${this.target.loopLevel}}\`)}`),this.addLine(`keys${n.id}.add(String(key${this.target.loopLevel}));`)),t.memo&&(this.target.hasCache=!0,a=ln(),this.define(`memo${a}`,Je(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=un(e,{block:n,index:o});return 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),n.varName}compileTKey(t,e){const n=ln("tKey_");return this.define(n,Je(t.expr)),e=un(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 s=this.target.code.length;if(r){let o=null;if(t.content.filter((t=>6!==t.type)).length<=1){for(let n of t.content){const t=this.compileAST(n,e);o=o||t}return o}n=this.createBlock(n,"multi",e)}let i=0;for(let o=0,r=t.content.length;o<r;o++){const s=t.content[o],l=6===s.type,a=un(e,{block:n,index:i,forceNewBlock:!l,isLast:e.isLast&&o===r-1});this.compileAST(s,a),l||i++}if(r){if(n.hasDynamicChildren&&n.children.length){const t=this.target.code,e=n.children.slice();let o=e.shift();for(let n=s;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)).join(", ")};`,s)}const t=n.children.map((t=>t.varName)).join(", ");this.insertBlock(`multi([${t}])`,n,e)}return n.varName}compileTCall(t,e){let{block:n,forceNewBlock:o}=e,r=e.ctxVar||"ctx";t.context&&(r=ln("ctx"),this.addLine(`let ${r} = ${Je(t.context)};`));const s=Qe.test(t.name),i=s?en(t.name):"`"+t.name+"`";if(n&&!o&&this.insertAnchor(n),n=this.createBlock(n,"multi",e),t.body){this.addLine(`${r} = Object.create(${r});`),this.addLine(`${r}[isBoundary] = 1;`),this.helpers.add("isBoundary");const n=un(e,{ctxVar:r}),o=this.compileMulti({type:3,content:t.body},n);o&&(this.helpers.add("zero"),this.addLine(`${r}[zero] = ${o};`))}const l=this.generateComponentKey();if(s){const t=ln("template");this.staticDefs.find((t=>"call"===t.id))||this.staticDefs.push({id:"call",expr:"app.callTemplate.bind(app)"}),this.define(t,i),this.insertBlock(`call(this, ${t}, ${r}, node, ${l})`,n,{...e,forceNewBlock:!n})}else{const t=ln("callTemplate_");this.staticDefs.push({id:t,expr:`app.getTemplate(${i})`}),this.insertBlock(`${t}.call(this, ${r}, node, ${l})`,n,{...e,forceNewBlock:!n})}return t.body&&!e.isLast&&this.addLine(`${r} = ${r}.__proto__;`),n.varName}compileTCallBlock(t,e){let{block:n,forceNewBlock:o}=e;return n&&(o||this.insertAnchor(n)),n=this.createBlock(n,"multi",e),this.insertBlock(Je(t.name),n,{...e,forceNewBlock:!n}),n.varName}compileTSet(t,e){this.target.shouldProtectScope=!0,this.helpers.add("isBoundary").add("withDefault");const n=t.value?Je(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, ${this.target.currentKey(e)})`;r=t.value?r?`withDefault(${n}, ${r})`:n:r,this.addLine(`ctx[\`${t.name}\`] = ${r};`)}else{let o;if(t.defaultValue){const r=cn(e.translate?this.translate(t.defaultValue):t.defaultValue);o=t.value?`withDefault(${n}, ${r})`:r}else o=n;this.helpers.add("setContextValue"),this.addLine(`setContextValue(${e.ctxVar||"ctx"}, "${t.name}", ${o});`)}return null}generateComponentKey(t="key"){const e=[ln("__")];for(let t=0;t<this.target.loopLevel;t++)e.push(`\${key${t+1}}`);return`${t} + \`${e.join("__")}\``}formatProp(t,e){if(e=t.endsWith(".translate")?cn(this.translateFn(e)):this.captureExpression(e),t.includes(".")){let[n,o]=t.split(".");switch(t=n,o){case"bind":e=`(${e}).bind(this)`;break;case"alike":case"translate":break;default:throw new s("Invalid prop suffix")}}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({}, ${Je(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 s="";if(t.slots){let n="ctx";!this.target.loopLevel&&this.hasSafeContext||(n=ln("ctx"),this.helpers.add("capture"),this.define(n,"capture(ctx)"));let o=[];for(let r in t.slots){const s=t.slots[r],i=[];if(s.content){const t=this.compileInNewTarget("slot",s.content,e,s.on);i.push(`__render: ${t}.bind(this), __ctx: ${n}`)}const l=t.slots[r].scope;l&&i.push(`__scope: "${l}"`),t.slots[r].attrs&&i.push(...this.formatPropObject(t.slots[r].attrs));const a=`{${i.join(", ")}}`;o.push(`'${r}': ${a}`)}s=`{${o.join(", ")}}`}!s||t.dynamicProps||o||(this.helpers.add("markRaw"),r.push(`slots: markRaw(${s})`));let i,l,a=this.getPropString(r,t.dynamicProps);(s&&(t.dynamicProps||o)||this.dev)&&(i=ln("props"),this.define(i,a),a=i),s&&(t.dynamicProps||o)&&(this.helpers.add("markRaw"),this.addLine(`${i}.slots = markRaw(Object.assign(${s}, ${i}.slots))`)),t.isDynamic?(l=ln("Comp"),this.define(l,Je(t.name))):l=`\`${t.name}\``,this.dev&&this.addLine(`helpers.validateProps(${l}, ${i}, this);`),n&&(!1===e.forceNewBlock||e.tKeyExpr)&&this.insertAnchor(n);let c=this.generateComponentKey();e.tKeyExpr&&(c=`${e.tKeyExpr} + ${c}`);let h=ln("comp");const u=[];for(let e in t.props||{}){let[t,n]=e.split(".");n||u.push(`"${t}"`)}this.staticDefs.push({id:h,expr:`app.createComponent(${t.isDynamic?null:l}, ${!t.isDynamic}, ${!!t.slots}, ${!!t.dynamicProps}, [${u}])`}),t.isDynamic&&(c=`(${l}).name + ${c}`);let d=`${h}(${a}, ${c}, node, this, ${t.isDynamic?l:null})`;return t.isDynamic&&(d=`toggler(${l}, ${d})`),t.on&&(d=this.wrapWithEventCatcher(d,t.on)),n=this.createBlock(n,"multi",e),this.insertBlock(d,n,e),n.varName}wrapWithEventCatcher(t,e){this.helpers.add("createCatcher");let n=ln("catcher"),o={},r=[];for(let t in e){let n=ln("hdlr"),s=r.push(n)-1;o[t]=s;const i=this.generateHandlerCode(t,e[t]);this.define(n,i)}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,s=!1,i=!1;t.name.match(Qe)?(s=!0,i=!0,o=en(t.name)):(o="'"+t.name+"'",i=i||this.slotNames.has(t.name),this.slotNames.add(t.name));const l=t.attrs?t.attrs["t-props"]:null;t.attrs&&delete t.attrs["t-props"];let a=this.target.loopLevel?`key${this.target.loopLevel}`:"key";i&&(a=this.generateComponentKey(a));const c=t.attrs?this.formatPropObject(t.attrs):[],h=this.getPropString(c,l);if(t.defaultContent){n=`callSlot(ctx, node, ${a}, ${o}, ${s}, ${h}, ${this.compileInNewTarget("defaultContent",t.defaultContent,e)}.bind(this))`}else if(s){let t=ln("slot");this.define(t,o),n=`toggler(${t}, callSlot(ctx, node, ${a}, ${t}, ${s}, ${h}))`}else n=`callSlot(ctx, node, ${a}, ${o}, ${s}, ${h})`;return 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}),r.varName}compileTTranslation(t,e){return t.content?this.compileAST(t.content,Object.assign({},e,{translate:!1})):null}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);let r="ctx";!this.target.loopLevel&&this.hasSafeContext||(r=ln("ctx"),this.helpers.add("capture"),this.define(r,"capture(ctx)"));let s=ln("comp");this.staticDefs.push({id:s,expr:"app.createComponent(null, false, true, false, false)"});const i=`${s}({target: ${Je(t.target)},slots: {'default': {__render: ${o}.bind(this), __ctx: ${r}}}}, ${this.generateComponentKey()}, node, ctx, Portal)`;return n&&this.insertAnchor(n),n=this.createBlock(n,"multi",e),this.insertBlock(i,n,{...e,forceNewBlock:!1}),n.varName}}const bn=new WeakMap;function gn(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 s("t-elif and t-else directives must be preceded by a t-if or t-elif directive");{if(r("t-foreach"))throw new s("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 s("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 s("text is not allowed between branching directives");t.remove()}}}})(e=t),function(t){for(const e of["t-esc","t-out"]){const n=[...t.querySelectorAll(`[${e}]`)].filter((t=>t.tagName[0]===t.tagName[0].toUpperCase()||t.hasAttribute("t-component")));for(const t of n){if(t.childNodes.length)throw new s(`Cannot have ${e} on a component that already has content`);const n=t.getAttribute(e);t.removeAttribute(e);const o=t.ownerDocument.createElement("t");null!=n&&o.setAttribute(e,n),t.appendChild(o)}}}(e);return vn(t,{inPreTag:!1})||{type:0,value:""}}function vn(t,e){return t instanceof Element?function(t,e){if(t.hasAttribute("t-debug"))return t.removeAttribute("t-debug"),{type:12,content:vn(t,e)};if(t.hasAttribute("t-log")){const n=t.getAttribute("t-log");return t.removeAttribute("t-log"),{type:13,expr:n,content:vn(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 s(`"Directive t-foreach should always be used with a t-key!" (expression: t-foreach="${o}" t-as="${r}")`);t.removeAttribute("t-key");const l=t.getAttribute("t-memo")||"";t.removeAttribute("t-memo");const a=vn(t,e);if(!a)return null;const c=!n.includes("t-call"),h=c&&!n.includes(`${r}_first`),u=c&&!n.includes(`${r}_last`),d=c&&!n.includes(`${r}_index`),f=c&&!n.includes(`${r}_value`);return{type:9,collection:o,elem:r,body:a,memo:l,key:i,hasNoFirst:h,hasNoLast:u,hasNoIndex:d,hasNoValue:f}}(t,e)||function(t,e){if(!t.hasAttribute("t-if"))return null;const n=t.getAttribute("t-if");t.removeAttribute("t-if");const o=vn(t,e)||{type:0,value:""};let r=t.nextElementSibling;const s=[];for(;r&&r.hasAttribute("t-elif");){const t=r.getAttribute("t-elif");r.removeAttribute("t-elif");const n=vn(r,e),o=r.nextElementSibling;r.remove(),r=o,n&&s.push({condition:t,content:n})}let i=null;r&&r.hasAttribute("t-else")&&(r.removeAttribute("t-else"),i=vn(r,e),r.remove());return{type:5,condition:n,content:o,tElif:s.length?s:null,tElse:i}}(t,e)||function(t,e){if(!t.hasAttribute("t-portal"))return null;const n=t.getAttribute("t-portal");t.removeAttribute("t-portal");const o=vn(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=vn(t,e),s={type:7,name:n,body:null,context:o};if(r&&2===r.type)return r.content=[s],r;if(r&&11===r.type)return{...r,slots:{default:{content:s,scope:null,on:null,attrs:null}}}}const r=kn(t,e);return{type:7,name:n,body:r.length?r:null,context:o}}(t,e)||function(t){if(!t.hasAttribute("t-call-block"))return null;const e=t.getAttribute("t-call-block");return{type:15,name:e}}(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 s=vn(t,e);if(!s)return o;if(2===s.type)return{...s,ref:r,content:[o]};return o}(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 s=vn(t,e);if(!s)return o;if(2===s.type)return o.body=s.content.length?s.content:null,{...s,ref:r,content:[o]};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=vn(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:vn(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:En(t,e)}}(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 s(`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 l=t.getAttribute("t-slot-scope");t.removeAttribute("t-slot-scope");let a=null,c=null;for(let e of t.getAttributeNames()){const n=t.getAttribute(e);if(e.startsWith("t-")){if(!e.startsWith("t-on-")){const t=Nn.get(e.split("-").slice(0,2).join("-"));throw new s(t||`unsupported directive on Component: ${e}`)}a=a||{},a[e.slice(5)]=n}else c=c||{},c[e]=n}let h=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 s(`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&&r!==n;){if(r.hasAttribute("t-component")||r.tagName[0]===r.tagName[0].toUpperCase()){i=!0;break}r=r.parentElement}if(i||!r)continue;t.removeAttribute("t-set-slot"),t.remove();const l=vn(t,e);let a=null,c=null,u=null;for(let e of t.getAttributeNames()){const n=t.getAttribute(e);"t-slot-scope"!==e?e.startsWith("t-on-")?(a=a||{},a[e.slice(5)]=n):(c=c||{},c[e]=n):u=n}h=h||{},h[o]={content:l,on:a,attrs:c,scope:u}}const r=En(n,e);h=h||{},r&&!h.default&&(h.default={content:r,on:a,attrs:null,scope:l})}return{type:11,name:n,isDynamic:r,dynamicProps:i,props:c,slots:h,on:a}}(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 s(`Invalid tag name: '${n}'`);e=Object.assign({},e),"pre"===n&&(e.inPreTag=!0);let r=!e.nameSpace&&xn.has(n)?"http://www.w3.org/2000/svg":null;const i=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 i=t.getAttribute(o);if("t-on"===o||"t-on-"===o)throw new s("Missing event name with t-on directive");if(o.startsWith("t-on-"))c=c||{},c[o.slice(5)]=i;else if(o.startsWith("t-model")){if(!["input","select","textarea"].includes(n))throw new s("The t-model directive only works with <input>, <textarea> and <select>");let r,l;if(wn.test(i)){const t=i.lastIndexOf(".");r=i.slice(0,t),l=`'${i.slice(t+1)}'`}else{if(!$n.test(i))throw new s(`Invalid t-model expression: "${i}" (it should be assignable)`);{const t=i.lastIndexOf("[");r=i.slice(0,t),l=i.slice(t+1,-1)}}const a=t.getAttribute("type"),c="input"===n,u="select"===n,d=c&&"checkbox"===a,f=c&&"radio"===a,p=o.includes(".trim"),m=p||o.includes(".lazy");h={baseExpr:r,expr:l,targetAttr:d?"checked":"value",specialInitTargetAttr:f?"checked":null,eventType:f?"click":u||m?"change":"input",hasDynamicChildren:!1,shouldTrim:p,shouldNumberize:o.includes(".number")},u&&((e=Object.assign({},e)).tModelInfo=h)}else{if(o.startsWith("block-"))throw new s(`Invalid attribute: '${o}'`);if("xmlns"===o)r=i;else if("t-name"!==o){if(o.startsWith("t-")&&!o.startsWith("t-att"))throw new s(`Unknown QWeb directive: '${o}'`);const t=e.tModelInfo;t&&["t-att-value","t-attf-value"].includes(o)&&(t.hasDynamicChildren=!0),a=a||{},a[o]=i}}}r&&(e.nameSpace=r);const u=kn(t,e);return{type:2,tag:n,dynamicTag:o,attrs:a,on:c,ref:i,content:u,model:h,ns:r}}(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 s=null;t.textContent!==t.innerHTML&&(s=kn(t,e));return{type:6,name:n,value:o,defaultValue:r,body:s}}(t,e)||function(t,e){if("t"!==t.tagName)return null;return En(t,e)}(t,e):function(t,e){if(t.nodeType===Node.TEXT_NODE){let n=t.textContent||"";return e.inPreTag||!yn.test(n)||n.trim()?{type:0,value:n}:null}if(t.nodeType===Node.COMMENT_NODE)return{type:1,value:t.textContent||""};return null}(t,e)}const yn=/[\r\n]/;const wn=/\.[\w_]+\s*$/,$n=/\[[^\[]+\]\s*$/,xn=new Set(["svg","g","path"]);const Nn=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 kn(t,e){const n=[];for(let o of t.childNodes){const t=vn(o,e);t&&(3===t.type?n.push(...t.content):n.push(t))}return n}function En(t,e){const n=kn(t,e);switch(n.length){case 0:return null;case 1:return n[0];default:return{type:3,content:n}}}function An(t,e={}){const n=function(t){if("string"==typeof t)return gn(Me(`<t>${t}</t>`).firstChild);let e=bn.get(t);return e||(e=gn(t.cloneNode(!0)),bn.set(t,e)),e}(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 mn(n,{...e,hasSafeContext:o}).generateCode();try{return new Function("app, bdom, helpers",r)}catch(t){const{name:n}=e,o=new s(`Failed to compile ${n?`template "${n}"`:"anonymous template"}: ${t.message}\n\ngenerated code:\nfunction(app, bdom, helpers) {\n${r}\n}`);throw o.cause=t,o}}class Tn{constructor(){this.tasks=new Set,this.frame=0,this.delayedRenders=[],this.cancelledNodes=new Set,this.processing=!1,this.requestAnimationFrame=Tn.requestAnimationFrame}addFiber(t){this.tasks.add(t.root)}scheduleDestroy(t){this.cancelledNodes.add(t),0===this.frame&&(this.frame=this.requestAnimationFrame((()=>this.processTasks())))}flush(){if(this.delayedRenders.length){let t=this.delayedRenders;this.delayedRenders=[];for(let e of t)e.root&&3!==e.node.status&&e.node.fiber===e&&e.render()}0===this.frame&&(this.frame=this.requestAnimationFrame((()=>this.processTasks())))}processTasks(){if(!this.processing){this.processing=!0,this.frame=0;for(let t of this.cancelledNodes)t._destroy();this.cancelledNodes.clear();for(let t of this.tasks)this.processFiber(t);for(let t of this.tasks)3===t.node.status&&this.tasks.delete(t);this.processing=!1}}processFiber(t){if(t.root!==t)return void this.tasks.delete(t);const e=At.has(t);e&&0!==t.counter?this.tasks.delete(t):3!==t.node.status?0===t.counter&&(e||t.complete(),this.tasks.delete(t)):this.tasks.delete(t)}}Tn.requestAnimationFrame=window.requestAnimationFrame.bind(window);let _n=!1;const Sn=new Set;window.__OWL_DEVTOOLS__||(window.__OWL_DEVTOOLS__={apps:Sn,Fiber:Dt,RootFiber:Lt,toRaw:Ut,reactive:te});class Cn extends We{constructor(t,e={}){super(e),this.scheduler=new Tn,this.subRoots=new Set,this.root=null,this.name=e.name||"",this.Root=t,Sn.add(this),e.test&&(this.dev=!0),this.warnIfNoStaticProps=e.warnIfNoStaticProps||!1,!this.dev||e.test||_n||(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.`),_n=!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){const n=this.createRoot(this.Root,{props:this.props});return this.root=n.node,this.subRoots.delete(n.node),n.mount(t,e)}createRoot(t,e={}){const n=e.props||{},o=this.env;e.env&&(this.env=e.env);const r=function(){let t=ae;return()=>{ae=t}}(),s=this.makeNode(t,n);return r(),e.env&&(this.env=o),this.subRoots.add(s),{node:s,mount:(e,o)=>{Cn.validateTarget(e),this.dev&&Pe(t,n,{__owl__:{app:this}});return this.mountNode(s,e,o)},destroy:()=>{this.subRoots.delete(s),s.destroy(),this.scheduler.processTasks()}}}makeNode(t,e){return new fe(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=Tt.get(t);r||(r=[],Tt.set(t,r)),r.unshift((t=>{throw o||n(t),t}))}));return t.mountComponent(e,n),o}destroy(){if(this.root){for(let t of this.subRoots)t.destroy();this.root.destroy(),this.scheduler.processTasks()}Sn.delete(this)}createComponent(t,e,n,o,r){const i=!e;let l;const a=0===r.length;l=n?(t,e)=>!0:o?function(t,e){for(let n in t)if(t[n]!==e[n])return!0;return Object.keys(t).length!==Object.keys(e).length}:a?(t,e)=>!1:function(t,e){for(let n of r)if(t[n]!==e[n])return!0;return!1};const c=fe.prototype.updateAndRender,h=fe.prototype.initiateRender;return(n,o,r,a,u)=>{let d=r.children,f=d[o];i&&f&&f.component.constructor!==u&&(f=void 0);const p=r.fiber;if(f)(l(f.props,n)||p.deep||f.forceNextRender)&&(f.forceNextRender=!1,c.call(f,n,p));else{if(e){const e=a.constructor.components;if(!e)throw new s(`Cannot find the definition of component "${t}", missing static components key in parent`);if(!(u=e[t]))throw new s(`Cannot find the definition of component "${t}"`);if(!(u.prototype instanceof we))throw new s(`"${t}" is not a Component. It must inherit from the Component class`)}f=new fe(u,n,this,r,o),d[o]=f,h.call(f,new Dt(f,p))}return p.childrenMap[o]=f,f}}handleError(...t){return St(...t)}}Cn.validateTarget=function(t){const e=t&&t.ownerDocument;if(e){const n=e.defaultView.HTMLElement;if(t instanceof n||t instanceof ShadowRoot){if(!e.body.contains(t instanceof n?t:t.host))throw new s("Cannot mount a component on a detached dom node");return}}throw new s("Cannot mount component: the target is not a valid DOM element")},Cn.apps=Sn,Cn.version="2.4.1";function On(t,e){const n=Object.create(t),o=Object.getOwnPropertyDescriptors(e);return Object.freeze(Object.defineProperties(n,o))}function Dn(t){const e=ce();e.childEnv=On(e.childEnv,t)}n.shouldNormalizeDom=!1,n.mainEventHandler=(t,n,o)=>{const{data:r,modifiers:i}=e(t);t=r;let l=!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 l;case"prevent":(t&&e||!t)&&n.preventDefault();continue;case"stop":(t&&e||!t)&&n.stopPropagation(),l=!0;continue}}if(Object.hasOwnProperty.call(t,0)){const e=t[0];if("function"!=typeof e)throw new s(`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 l};const Ln={config:n,mount:Et,patch:function(t,e,n=!1){t.patch(e,n)},remove:function(t,e=!1){e&&t.beforeRemove(),t.remove()},list:vt,multi:j,text:U,toggler:r,createBlock:rt,html:kt,comment:q},Rn={version:Cn.version};We.prototype._compileTemplate=function(t,e){return An(e,{name:t,dev:this.dev,translateFn:this.translateFn,translatableAttributes:this.translatableAttributes})},t.App=Cn,t.Component=we,t.EventBus=k,t.OwlError=s,t.__info__=Rn,t.batched=x,t.blockDom=Ln,t.loadFile=async function(t){const e=await fetch(t);if(!e.ok)throw new s("Error while fetching xml templates");return await e.text()},t.markRaw=Ht,t.markup=function(t){return new E(t)},t.mount=async function(t,e,n={}){return new Cn(t,n).mount(e,n)},t.onError=function(t){const e=ce();let n=Tt.get(e);n||(n=[],Tt.set(e,n)),n.push(t.bind(e.component))},t.onMounted=ge,t.onPatched=ve,t.onRendered=function(t){const e=ce(),n=e.renderFn,o=e.app.dev?be:t=>t;t=o(t.bind(e.component),"onRendered"),e.renderFn=()=>{const e=n();return t(),e}},t.onWillDestroy=function(t){const e=ce(),n=e.app.dev?be:t=>t;e.willDestroy.push(n(t.bind(e.component),"onWillDestroy"))},t.onWillPatch=function(t){const e=ce(),n=e.app.dev?be:t=>t;e.willPatch.unshift(n(t.bind(e.component),"onWillPatch"))},t.onWillRender=function(t){const e=ce(),n=e.renderFn,o=e.app.dev?be:t=>t;t=o(t.bind(e.component),"onWillRender"),e.renderFn=()=>(t(),n())},t.onWillStart=function(t){const e=ce(),n=e.app.dev?be:t=>t;e.willStart.push(n(t.bind(e.component),"onWillStart"))},t.onWillUnmount=ye,t.onWillUpdateProps=function(t){const e=ce(),n=e.app.dev?be:t=>t;e.willUpdateProps.push(n(t.bind(e.component),"onWillUpdateProps"))},t.reactive=te,t.status=function(t){switch(t.__owl__.status){case 0:return"new";case 2:return"cancelled";case 1:return"mounted";case 3:return"destroyed"}},t.toRaw=Ut,t.useChildSubEnv=Dn,t.useComponent=function(){return ae.component},t.useEffect=function(t,e=()=>[NaN]){let n,o;ge((()=>{o=e(),n=t(...o)})),ve((()=>{const r=e();r.some(((t,e)=>t!==o[e]))&&(o=r,n&&n(),n=t(...o))})),ye((()=>n&&n()))},t.useEnv=function(){return ce().component.env},t.useExternalListener=function(t,e,n,o){const r=ce(),s=n.bind(r.component);ge((()=>t.addEventListener(e,s,o))),ye((()=>t.removeEventListener(e,s,o)))},t.useRef=function(t){const e=ce().refs;return{get el(){const n=e[t];return N(n)?n:null}}},t.useState=de,t.useSubEnv=function(t){const e=ce();e.component.env=On(e.component.env,t),Dn(t)},t.validate=function(t,e){let n=Ce(t,e);if(n.length)throw new s("Invalid object: "+n.join(", "))},t.validateType=Oe,t.whenReady=function(t){return new Promise((function(t){"loading"!==document.readyState?t(!0):document.addEventListener("DOMContentLoaded",t,!1)})).then(t||function(){})},t.xml=Ve,Object.defineProperty(t,"__esModule",{value:!0}),Rn.date="2024-10-31T09:42:30.824Z",Rn.hash="b8d09e5",Rn.url="https://github.com/odoo/owl"}(this.owl=this.owl||{});
@@ -375,6 +375,7 @@ declare class Scheduler {
375
375
  frame: number;
376
376
  delayedRenders: Fiber[];
377
377
  cancelledNodes: Set<ComponentNode>;
378
+ processing: boolean;
378
379
  constructor();
379
380
  addFiber(fiber: Fiber): void;
380
381
  scheduleDestroy(node: ComponentNode): void;
@@ -447,10 +448,12 @@ declare namespace xml {
447
448
  interface Env {
448
449
  [key: string]: any;
449
450
  }
450
- interface AppConfig<P, E> extends TemplateSetConfig {
451
- name?: string;
451
+ interface RootConfig<P, E> {
452
452
  props?: P;
453
453
  env?: E;
454
+ }
455
+ interface AppConfig<P, E> extends TemplateSetConfig, RootConfig<P, E> {
456
+ name?: string;
454
457
  test?: boolean;
455
458
  warnIfNoStaticProps?: boolean;
456
459
  }
@@ -465,6 +468,11 @@ declare global {
465
468
  };
466
469
  }
467
470
  }
471
+ interface Root<P extends Props, E> {
472
+ node: ComponentNode<P, E>;
473
+ mount(target: HTMLElement | ShadowRoot, options?: MountOptions): Promise<Component<P, E>>;
474
+ destroy(): void;
475
+ }
468
476
  declare class App<T extends abstract new (...args: any) => any = any, P extends object = any, E = any> extends TemplateSet {
469
477
  static validateTarget: typeof validateTarget;
470
478
  static apps: Set<App<any, any, any>>;
@@ -474,10 +482,12 @@ declare class App<T extends abstract new (...args: any) => any = any, P extends
474
482
  props: P;
475
483
  env: E;
476
484
  scheduler: Scheduler;
485
+ subRoots: Set<ComponentNode>;
477
486
  root: ComponentNode<P, E> | null;
478
487
  warnIfNoStaticProps: boolean;
479
488
  constructor(Root: ComponentConstructor<P, E>, config?: AppConfig<P, E>);
480
489
  mount(target: HTMLElement | ShadowRoot, options?: MountOptions): Promise<Component<P, E> & InstanceType<T>>;
490
+ createRoot<Props extends object, SubEnv = any>(Root: ComponentConstructor<Props, E>, config?: RootConfig<Props, SubEnv>): Root<Props, SubEnv>;
481
491
  makeNode(Component: ComponentConstructor, props: any): ComponentNode;
482
492
  mountNode(node: ComponentNode, target: HTMLElement | ShadowRoot, options?: MountOptions): any;
483
493
  destroy(): void;
@@ -9,10 +9,12 @@ import { toRaw, reactive } from "./reactivity";
9
9
  export interface Env {
10
10
  [key: string]: any;
11
11
  }
12
- export interface AppConfig<P, E> extends TemplateSetConfig {
13
- name?: string;
12
+ export interface RootConfig<P, E> {
14
13
  props?: P;
15
14
  env?: E;
15
+ }
16
+ export interface AppConfig<P, E> extends TemplateSetConfig, RootConfig<P, E> {
17
+ name?: string;
16
18
  test?: boolean;
17
19
  warnIfNoStaticProps?: boolean;
18
20
  }
@@ -28,6 +30,11 @@ declare global {
28
30
  };
29
31
  }
30
32
  }
33
+ interface Root<P extends Props, E> {
34
+ node: ComponentNode<P, E>;
35
+ mount(target: HTMLElement | ShadowRoot, options?: MountOptions): Promise<Component<P, E>>;
36
+ destroy(): void;
37
+ }
31
38
  export declare class App<T extends abstract new (...args: any) => any = any, P extends object = any, E = any> extends TemplateSet {
32
39
  static validateTarget: typeof validateTarget;
33
40
  static apps: Set<App<any, any, any>>;
@@ -37,10 +44,12 @@ export declare class App<T extends abstract new (...args: any) => any = any, P e
37
44
  props: P;
38
45
  env: E;
39
46
  scheduler: Scheduler;
47
+ subRoots: Set<ComponentNode>;
40
48
  root: ComponentNode<P, E> | null;
41
49
  warnIfNoStaticProps: boolean;
42
50
  constructor(Root: ComponentConstructor<P, E>, config?: AppConfig<P, E>);
43
51
  mount(target: HTMLElement | ShadowRoot, options?: MountOptions): Promise<Component<P, E> & InstanceType<T>>;
52
+ createRoot<Props extends object, SubEnv = any>(Root: ComponentConstructor<Props, E>, config?: RootConfig<Props, SubEnv>): Root<Props, SubEnv>;
44
53
  makeNode(Component: ComponentConstructor, props: any): ComponentNode;
45
54
  mountNode(node: ComponentNode, target: HTMLElement | ShadowRoot, options?: MountOptions): any;
46
55
  destroy(): void;
@@ -48,3 +57,4 @@ export declare class App<T extends abstract new (...args: any) => any = any, P e
48
57
  handleError(...args: Parameters<typeof handleError>): void;
49
58
  }
50
59
  export declare function mount<T extends abstract new (...args: any) => any = any, P extends object = any, E = any>(C: T & ComponentConstructor<P, E>, target: HTMLElement, config?: AppConfig<P, E> & MountOptions): Promise<Component<P, E> & InstanceType<T>>;
60
+ export {};
@@ -4,6 +4,7 @@ import { Component, ComponentConstructor, Props } from "./component";
4
4
  import { Fiber, MountFiber, MountOptions } from "./fibers";
5
5
  import { getSubscriptions } from "./reactivity";
6
6
  import { STATUS } from "./status";
7
+ export declare function saveCurrent(): () => void;
7
8
  export declare function getCurrent(): ComponentNode;
8
9
  export declare function useComponent(): Component;
9
10
  /**
@@ -7,6 +7,7 @@ export declare class Scheduler {
7
7
  frame: number;
8
8
  delayedRenders: Fiber[];
9
9
  cancelledNodes: Set<ComponentNode>;
10
+ processing: boolean;
10
11
  constructor();
11
12
  addFiber(fiber: Fiber): void;
12
13
  scheduleDestroy(node: ComponentNode): void;
@@ -1 +1 @@
1
- export declare const version = "2.3.0";
1
+ export declare const version = "2.4.1";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@odoo/owl",
3
- "version": "2.3.0",
3
+ "version": "2.4.1",
4
4
  "description": "Odoo Web Library (OWL)",
5
5
  "main": "dist/owl.cjs.js",
6
6
  "module": "dist/owl.es.js",
@@ -9,7 +9,7 @@
9
9
  "dist"
10
10
  ],
11
11
  "engines": {
12
- "node": ">=12.18.3"
12
+ "node": ">=20.0.0"
13
13
  },
14
14
  "scripts": {
15
15
  "build:bundle": "rollup -c --failAfterWarnings",