{
  "version": 3,
  "sources": ["../../../../node_modules/invariant/browser.js", "../../../../node_modules/gud/index.js", "../../../../node_modules/warning/warning.js", "../../../../node_modules/create-react-context/lib/implementation.js", "../../../../node_modules/create-react-context/lib/index.js", "../../../../node_modules/react-lifecycles-compat/react-lifecycles-compat.cjs.js", "../../../../node_modules/@reach/router/lib/utils.js", "../../../../node_modules/@reach/router/lib/history.js", "../../../../node_modules/@reach/router/index.js", "../../../../node_modules/escape-string-regexp/index.js", "../../../lib.web.layout/default_layout.ts", "../../utils.ts", "../../../lib.shared.model.patch/transform/transform_move_copy_card.ts", "../../../lib.shared.model.patch/transform/transform_copy_board.ts", "../../../lib.shared.model.patch/transform/transform_set_card_archived_ops.ts", "../../../lib.shared.model.patch/transform/index.ts", "../../state/debug_state.ts", "../../../lib.shared.utils/rate_limiter.ts", "../../debug/sensors.ts", "../../state/patch.ts", "../../state/change_board_settings.ts", "../../../lib.shared.utils/file_name.ts", "../../../lib.shared.utils/find_urls.ts", "../../state/model_actions.ts", "../../state/card_state.ts", "../../state/board_state.ts", "../../../lib.web.layout/fixed_width_columns.tsx", "../../../lib.web.layout/snap_scroll.ts", "../../../lib.web.layout/index.ts", "../../state/search_state.ts", "../../../lib.shared.search/_search_query_parser.ts", "../../../lib.shared.search/search_query_parser.ts", "../../../lib.shared.utils/sequential_runner.ts", "../../state/layout_state.ts", "../../state/user_interface_state.ts", "../../state/upload_state.ts", "../../state/export_board_state.ts", "../../state/import_board_state.ts", "../../state/index.ts"],
  "sourcesContent": ["/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n  if (process.env.NODE_ENV !== 'production') {\n    if (format === undefined) {\n      throw new Error('invariant requires an error message argument');\n    }\n  }\n\n  if (!condition) {\n    var error;\n    if (format === undefined) {\n      error = new Error(\n        'Minified exception occurred; use the non-minified dev environment ' +\n        'for the full error message and additional helpful warnings.'\n      );\n    } else {\n      var args = [a, b, c, d, e, f];\n      var argIndex = 0;\n      error = new Error(\n        format.replace(/%s/g, function() { return args[argIndex++]; })\n      );\n      error.name = 'Invariant Violation';\n    }\n\n    error.framesToPop = 1; // we don't care about invariant's own frame\n    throw error;\n  }\n};\n\nmodule.exports = invariant;\n", "// @flow\n'use strict';\n\nvar key = '__global_unique_id__';\n\nmodule.exports = function() {\n  return global[key] = (global[key] || 0) + 1;\n};\n", "/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar __DEV__ = process.env.NODE_ENV !== 'production';\n\nvar warning = function() {};\n\nif (__DEV__) {\n  var printWarning = function printWarning(format, args) {\n    var len = arguments.length;\n    args = new Array(len > 1 ? len - 1 : 0);\n    for (var key = 1; key < len; key++) {\n      args[key - 1] = arguments[key];\n    }\n    var argIndex = 0;\n    var message = 'Warning: ' +\n      format.replace(/%s/g, function() {\n        return args[argIndex++];\n      });\n    if (typeof console !== 'undefined') {\n      console.error(message);\n    }\n    try {\n      // --- Welcome to debugging React ---\n      // This error was thrown as a convenience so that you can use this stack\n      // to find the callsite that caused this warning to fire.\n      throw new Error(message);\n    } catch (x) {}\n  }\n\n  warning = function(condition, format, args) {\n    var len = arguments.length;\n    args = new Array(len > 2 ? len - 2 : 0);\n    for (var key = 2; key < len; key++) {\n      args[key - 2] = arguments[key];\n    }\n    if (format === undefined) {\n      throw new Error(\n          '`warning(condition, format, ...args)` requires a warning ' +\n          'message argument'\n      );\n    }\n    if (!condition) {\n      printWarning.apply(null, [format].concat(args));\n    }\n  };\n}\n\nmodule.exports = warning;\n", "'use strict';\n\nexports.__esModule = true;\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _gud = require('gud');\n\nvar _gud2 = _interopRequireDefault(_gud);\n\nvar _warning = require('warning');\n\nvar _warning2 = _interopRequireDefault(_warning);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar MAX_SIGNED_31_BIT_INT = 1073741823;\n\n// Inlined Object.is polyfill.\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\nfunction objectIs(x, y) {\n  if (x === y) {\n    return x !== 0 || 1 / x === 1 / y;\n  } else {\n    return x !== x && y !== y;\n  }\n}\n\nfunction createEventEmitter(value) {\n  var handlers = [];\n  return {\n    on: function on(handler) {\n      handlers.push(handler);\n    },\n    off: function off(handler) {\n      handlers = handlers.filter(function (h) {\n        return h !== handler;\n      });\n    },\n    get: function get() {\n      return value;\n    },\n    set: function set(newValue, changedBits) {\n      value = newValue;\n      handlers.forEach(function (handler) {\n        return handler(value, changedBits);\n      });\n    }\n  };\n}\n\nfunction onlyChild(children) {\n  return Array.isArray(children) ? children[0] : children;\n}\n\nfunction createReactContext(defaultValue, calculateChangedBits) {\n  var _Provider$childContex, _Consumer$contextType;\n\n  var contextProp = '__create-react-context-' + (0, _gud2.default)() + '__';\n\n  var Provider = function (_Component) {\n    _inherits(Provider, _Component);\n\n    function Provider() {\n      var _temp, _this, _ret;\n\n      _classCallCheck(this, Provider);\n\n      for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n        args[_key] = arguments[_key];\n      }\n\n      return _ret = (_temp = (_this = _possibleConstructorReturn(this, _Component.call.apply(_Component, [this].concat(args))), _this), _this.emitter = createEventEmitter(_this.props.value), _temp), _possibleConstructorReturn(_this, _ret);\n    }\n\n    Provider.prototype.getChildContext = function getChildContext() {\n      var _ref;\n\n      return _ref = {}, _ref[contextProp] = this.emitter, _ref;\n    };\n\n    Provider.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n      if (this.props.value !== nextProps.value) {\n        var oldValue = this.props.value;\n        var newValue = nextProps.value;\n        var changedBits = void 0;\n\n        if (objectIs(oldValue, newValue)) {\n          changedBits = 0; // No change\n        } else {\n          changedBits = typeof calculateChangedBits === 'function' ? calculateChangedBits(oldValue, newValue) : MAX_SIGNED_31_BIT_INT;\n          if (process.env.NODE_ENV !== 'production') {\n            (0, _warning2.default)((changedBits & MAX_SIGNED_31_BIT_INT) === changedBits, 'calculateChangedBits: Expected the return value to be a ' + '31-bit integer. Instead received: %s', changedBits);\n          }\n\n          changedBits |= 0;\n\n          if (changedBits !== 0) {\n            this.emitter.set(nextProps.value, changedBits);\n          }\n        }\n      }\n    };\n\n    Provider.prototype.render = function render() {\n      return this.props.children;\n    };\n\n    return Provider;\n  }(_react.Component);\n\n  Provider.childContextTypes = (_Provider$childContex = {}, _Provider$childContex[contextProp] = _propTypes2.default.object.isRequired, _Provider$childContex);\n\n  var Consumer = function (_Component2) {\n    _inherits(Consumer, _Component2);\n\n    function Consumer() {\n      var _temp2, _this2, _ret2;\n\n      _classCallCheck(this, Consumer);\n\n      for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n        args[_key2] = arguments[_key2];\n      }\n\n      return _ret2 = (_temp2 = (_this2 = _possibleConstructorReturn(this, _Component2.call.apply(_Component2, [this].concat(args))), _this2), _this2.state = {\n        value: _this2.getValue()\n      }, _this2.onUpdate = function (newValue, changedBits) {\n        var observedBits = _this2.observedBits | 0;\n        if ((observedBits & changedBits) !== 0) {\n          _this2.setState({ value: _this2.getValue() });\n        }\n      }, _temp2), _possibleConstructorReturn(_this2, _ret2);\n    }\n\n    Consumer.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n      var observedBits = nextProps.observedBits;\n\n      this.observedBits = observedBits === undefined || observedBits === null ? MAX_SIGNED_31_BIT_INT // Subscribe to all changes by default\n      : observedBits;\n    };\n\n    Consumer.prototype.componentDidMount = function componentDidMount() {\n      if (this.context[contextProp]) {\n        this.context[contextProp].on(this.onUpdate);\n      }\n      var observedBits = this.props.observedBits;\n\n      this.observedBits = observedBits === undefined || observedBits === null ? MAX_SIGNED_31_BIT_INT // Subscribe to all changes by default\n      : observedBits;\n    };\n\n    Consumer.prototype.componentWillUnmount = function componentWillUnmount() {\n      if (this.context[contextProp]) {\n        this.context[contextProp].off(this.onUpdate);\n      }\n    };\n\n    Consumer.prototype.getValue = function getValue() {\n      if (this.context[contextProp]) {\n        return this.context[contextProp].get();\n      } else {\n        return defaultValue;\n      }\n    };\n\n    Consumer.prototype.render = function render() {\n      return onlyChild(this.props.children)(this.state.value);\n    };\n\n    return Consumer;\n  }(_react.Component);\n\n  Consumer.contextTypes = (_Consumer$contextType = {}, _Consumer$contextType[contextProp] = _propTypes2.default.object, _Consumer$contextType);\n\n\n  return {\n    Provider: Provider,\n    Consumer: Consumer\n  };\n}\n\nexports.default = createReactContext;\nmodule.exports = exports['default'];", "'use strict';\n\nexports.__esModule = true;\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _implementation = require('./implementation');\n\nvar _implementation2 = _interopRequireDefault(_implementation);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _react2.default.createContext || _implementation2.default;\nmodule.exports = exports['default'];", "'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nfunction componentWillMount() {\n  // Call this.constructor.gDSFP to support sub-classes.\n  var state = this.constructor.getDerivedStateFromProps(this.props, this.state);\n  if (state !== null && state !== undefined) {\n    this.setState(state);\n  }\n}\n\nfunction componentWillReceiveProps(nextProps) {\n  // Call this.constructor.gDSFP to support sub-classes.\n  // Use the setState() updater to ensure state isn't stale in certain edge cases.\n  function updater(prevState) {\n    var state = this.constructor.getDerivedStateFromProps(nextProps, prevState);\n    return state !== null && state !== undefined ? state : null;\n  }\n  // Binding \"this\" is important for shallow renderer support.\n  this.setState(updater.bind(this));\n}\n\nfunction componentWillUpdate(nextProps, nextState) {\n  try {\n    var prevProps = this.props;\n    var prevState = this.state;\n    this.props = nextProps;\n    this.state = nextState;\n    this.__reactInternalSnapshotFlag = true;\n    this.__reactInternalSnapshot = this.getSnapshotBeforeUpdate(\n      prevProps,\n      prevState\n    );\n  } finally {\n    this.props = prevProps;\n    this.state = prevState;\n  }\n}\n\n// React may warn about cWM/cWRP/cWU methods being deprecated.\n// Add a flag to suppress these warnings for this special case.\ncomponentWillMount.__suppressDeprecationWarning = true;\ncomponentWillReceiveProps.__suppressDeprecationWarning = true;\ncomponentWillUpdate.__suppressDeprecationWarning = true;\n\nfunction polyfill(Component) {\n  var prototype = Component.prototype;\n\n  if (!prototype || !prototype.isReactComponent) {\n    throw new Error('Can only polyfill class components');\n  }\n\n  if (\n    typeof Component.getDerivedStateFromProps !== 'function' &&\n    typeof prototype.getSnapshotBeforeUpdate !== 'function'\n  ) {\n    return Component;\n  }\n\n  // If new component APIs are defined, \"unsafe\" lifecycles won't be called.\n  // Error if any of these lifecycles are present,\n  // Because they would work differently between older and newer (16.3+) versions of React.\n  var foundWillMountName = null;\n  var foundWillReceivePropsName = null;\n  var foundWillUpdateName = null;\n  if (typeof prototype.componentWillMount === 'function') {\n    foundWillMountName = 'componentWillMount';\n  } else if (typeof prototype.UNSAFE_componentWillMount === 'function') {\n    foundWillMountName = 'UNSAFE_componentWillMount';\n  }\n  if (typeof prototype.componentWillReceiveProps === 'function') {\n    foundWillReceivePropsName = 'componentWillReceiveProps';\n  } else if (typeof prototype.UNSAFE_componentWillReceiveProps === 'function') {\n    foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps';\n  }\n  if (typeof prototype.componentWillUpdate === 'function') {\n    foundWillUpdateName = 'componentWillUpdate';\n  } else if (typeof prototype.UNSAFE_componentWillUpdate === 'function') {\n    foundWillUpdateName = 'UNSAFE_componentWillUpdate';\n  }\n  if (\n    foundWillMountName !== null ||\n    foundWillReceivePropsName !== null ||\n    foundWillUpdateName !== null\n  ) {\n    var componentName = Component.displayName || Component.name;\n    var newApiName =\n      typeof Component.getDerivedStateFromProps === 'function'\n        ? 'getDerivedStateFromProps()'\n        : 'getSnapshotBeforeUpdate()';\n\n    throw Error(\n      'Unsafe legacy lifecycles will not be called for components using new component APIs.\\n\\n' +\n        componentName +\n        ' uses ' +\n        newApiName +\n        ' but also contains the following legacy lifecycles:' +\n        (foundWillMountName !== null ? '\\n  ' + foundWillMountName : '') +\n        (foundWillReceivePropsName !== null\n          ? '\\n  ' + foundWillReceivePropsName\n          : '') +\n        (foundWillUpdateName !== null ? '\\n  ' + foundWillUpdateName : '') +\n        '\\n\\nThe above lifecycles should be removed. Learn more about this warning here:\\n' +\n        'https://fb.me/react-async-component-lifecycle-hooks'\n    );\n  }\n\n  // React <= 16.2 does not support static getDerivedStateFromProps.\n  // As a workaround, use cWM and cWRP to invoke the new static lifecycle.\n  // Newer versions of React will ignore these lifecycles if gDSFP exists.\n  if (typeof Component.getDerivedStateFromProps === 'function') {\n    prototype.componentWillMount = componentWillMount;\n    prototype.componentWillReceiveProps = componentWillReceiveProps;\n  }\n\n  // React <= 16.2 does not support getSnapshotBeforeUpdate.\n  // As a workaround, use cWU to invoke the new lifecycle.\n  // Newer versions of React will ignore that lifecycle if gSBU exists.\n  if (typeof prototype.getSnapshotBeforeUpdate === 'function') {\n    if (typeof prototype.componentDidUpdate !== 'function') {\n      throw new Error(\n        'Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype'\n      );\n    }\n\n    prototype.componentWillUpdate = componentWillUpdate;\n\n    var componentDidUpdate = prototype.componentDidUpdate;\n\n    prototype.componentDidUpdate = function componentDidUpdatePolyfill(\n      prevProps,\n      prevState,\n      maybeSnapshot\n    ) {\n      // 16.3+ will not execute our will-update method;\n      // It will pass a snapshot value to did-update though.\n      // Older versions will require our polyfilled will-update value.\n      // We need to handle both cases, but can't just check for the presence of \"maybeSnapshot\",\n      // Because for <= 15.x versions this might be a \"prevContext\" object.\n      // We also can't just check \"__reactInternalSnapshot\",\n      // Because get-snapshot might return a falsy value.\n      // So check for the explicit __reactInternalSnapshotFlag flag to determine behavior.\n      var snapshot = this.__reactInternalSnapshotFlag\n        ? this.__reactInternalSnapshot\n        : maybeSnapshot;\n\n      componentDidUpdate.call(this, prevProps, prevState, snapshot);\n    };\n  }\n\n  return Component;\n}\n\nexports.polyfill = polyfill;\n", "\"use strict\";\n\nexports.__esModule = true;\nexports.shallowCompare = exports.validateRedirect = exports.insertParams = exports.resolve = exports.match = exports.pick = exports.startsWith = undefined;\n\nvar _invariant = require(\"invariant\");\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n////////////////////////////////////////////////////////////////////////////////\n// startsWith(string, search) - Check if `string` starts with `search`\nvar startsWith = function startsWith(string, search) {\n  return string.substr(0, search.length) === search;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// pick(routes, uri)\n//\n// Ranks and picks the best route to match. Each segment gets the highest\n// amount of points, then the type of segment gets an additional amount of\n// points where\n//\n//     static > dynamic > splat > root\n//\n// This way we don't have to worry about the order of our routes, let the\n// computers do it.\n//\n// A route looks like this\n//\n//     { path, default, value }\n//\n// And a returned match looks like:\n//\n//     { route, params, uri }\n//\n// I know, I should use TypeScript not comments for these types.\nvar pick = function pick(routes, uri) {\n  var match = void 0;\n  var default_ = void 0;\n\n  var _uri$split = uri.split(\"?\"),\n      uriPathname = _uri$split[0];\n\n  var uriSegments = segmentize(uriPathname);\n  var isRootUri = uriSegments[0] === \"\";\n  var ranked = rankRoutes(routes);\n\n  for (var i = 0, l = ranked.length; i < l; i++) {\n    var missed = false;\n    var route = ranked[i].route;\n\n    if (route.default) {\n      default_ = {\n        route: route,\n        params: {},\n        uri: uri\n      };\n      continue;\n    }\n\n    var routeSegments = segmentize(route.path);\n    var params = {};\n    var max = Math.max(uriSegments.length, routeSegments.length);\n    var index = 0;\n\n    for (; index < max; index++) {\n      var routeSegment = routeSegments[index];\n      var uriSegment = uriSegments[index];\n\n      if (isSplat(routeSegment)) {\n        // Hit a splat, just grab the rest, and return a match\n        // uri:   /files/documents/work\n        // route: /files/*\n        var param = routeSegment.slice(1) || \"*\";\n        params[param] = uriSegments.slice(index).map(decodeURIComponent).join(\"/\");\n        break;\n      }\n\n      if (uriSegment === undefined) {\n        // URI is shorter than the route, no match\n        // uri:   /users\n        // route: /users/:userId\n        missed = true;\n        break;\n      }\n\n      var dynamicMatch = paramRe.exec(routeSegment);\n\n      if (dynamicMatch && !isRootUri) {\n        var matchIsNotReserved = reservedNames.indexOf(dynamicMatch[1]) === -1;\n        !matchIsNotReserved ? process.env.NODE_ENV !== \"production\" ? (0, _invariant2.default)(false, \"<Router> dynamic segment \\\"\" + dynamicMatch[1] + \"\\\" is a reserved name. Please use a different name in path \\\"\" + route.path + \"\\\".\") : (0, _invariant2.default)(false) : void 0;\n        var value = decodeURIComponent(uriSegment);\n        params[dynamicMatch[1]] = value;\n      } else if (routeSegment !== uriSegment) {\n        // Current segments don't match, not dynamic, not splat, so no match\n        // uri:   /users/123/settings\n        // route: /users/:id/profile\n        missed = true;\n        break;\n      }\n    }\n\n    if (!missed) {\n      match = {\n        route: route,\n        params: params,\n        uri: \"/\" + uriSegments.slice(0, index).join(\"/\")\n      };\n      break;\n    }\n  }\n\n  return match || default_ || null;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// match(path, uri) - Matches just one path to a uri, also lol\nvar match = function match(path, uri) {\n  return pick([{ path: path }], uri);\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// resolve(to, basepath)\n//\n// Resolves URIs as though every path is a directory, no files.  Relative URIs\n// in the browser can feel awkward because not only can you be \"in a directory\"\n// you can be \"at a file\", too. For example\n//\n//     browserSpecResolve('foo', '/bar/') => /bar/foo\n//     browserSpecResolve('foo', '/bar') => /foo\n//\n// But on the command line of a file system, it's not as complicated, you can't\n// `cd` from a file, only directories.  This way, links have to know less about\n// their current path. To go deeper you can do this:\n//\n//     <Link to=\"deeper\"/>\n//     // instead of\n//     <Link to=`{${props.uri}/deeper}`/>\n//\n// Just like `cd`, if you want to go deeper from the command line, you do this:\n//\n//     cd deeper\n//     # not\n//     cd $(pwd)/deeper\n//\n// By treating every path as a directory, linking to relative paths should\n// require less contextual information and (fingers crossed) be more intuitive.\nvar resolve = function resolve(to, base) {\n  // /foo/bar, /baz/qux => /foo/bar\n  if (startsWith(to, \"/\")) {\n    return to;\n  }\n\n  var _to$split = to.split(\"?\"),\n      toPathname = _to$split[0],\n      toQuery = _to$split[1];\n\n  var _base$split = base.split(\"?\"),\n      basePathname = _base$split[0];\n\n  var toSegments = segmentize(toPathname);\n  var baseSegments = segmentize(basePathname);\n\n  // ?a=b, /users?b=c => /users?a=b\n  if (toSegments[0] === \"\") {\n    return addQuery(basePathname, toQuery);\n  }\n\n  // profile, /users/789 => /users/789/profile\n  if (!startsWith(toSegments[0], \".\")) {\n    var pathname = baseSegments.concat(toSegments).join(\"/\");\n    return addQuery((basePathname === \"/\" ? \"\" : \"/\") + pathname, toQuery);\n  }\n\n  // ./         /users/123  =>  /users/123\n  // ../        /users/123  =>  /users\n  // ../..      /users/123  =>  /\n  // ../../one  /a/b/c/d    =>  /a/b/one\n  // .././one   /a/b/c/d    =>  /a/b/c/one\n  var allSegments = baseSegments.concat(toSegments);\n  var segments = [];\n  for (var i = 0, l = allSegments.length; i < l; i++) {\n    var segment = allSegments[i];\n    if (segment === \"..\") segments.pop();else if (segment !== \".\") segments.push(segment);\n  }\n\n  return addQuery(\"/\" + segments.join(\"/\"), toQuery);\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// insertParams(path, params)\n\nvar insertParams = function insertParams(path, params) {\n  var _path$split = path.split(\"?\"),\n      pathBase = _path$split[0],\n      _path$split$ = _path$split[1],\n      query = _path$split$ === undefined ? \"\" : _path$split$;\n\n  var segments = segmentize(pathBase);\n  var constructedPath = \"/\" + segments.map(function (segment) {\n    var match = paramRe.exec(segment);\n    return match ? params[match[1]] : segment;\n  }).join(\"/\");\n  var _params$location = params.location;\n  _params$location = _params$location === undefined ? {} : _params$location;\n  var _params$location$sear = _params$location.search,\n      search = _params$location$sear === undefined ? \"\" : _params$location$sear;\n\n  var searchSplit = search.split(\"?\")[1] || \"\";\n  constructedPath = addQuery(constructedPath, query, searchSplit);\n  return constructedPath;\n};\n\nvar validateRedirect = function validateRedirect(from, to) {\n  var filter = function filter(segment) {\n    return isDynamic(segment);\n  };\n  var fromString = segmentize(from).filter(filter).sort().join(\"/\");\n  var toString = segmentize(to).filter(filter).sort().join(\"/\");\n  return fromString === toString;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Junk\nvar paramRe = /^:(.+)/;\n\nvar SEGMENT_POINTS = 4;\nvar STATIC_POINTS = 3;\nvar DYNAMIC_POINTS = 2;\nvar SPLAT_PENALTY = 1;\nvar ROOT_POINTS = 1;\n\nvar isRootSegment = function isRootSegment(segment) {\n  return segment === \"\";\n};\nvar isDynamic = function isDynamic(segment) {\n  return paramRe.test(segment);\n};\nvar isSplat = function isSplat(segment) {\n  return segment && segment[0] === \"*\";\n};\n\nvar rankRoute = function rankRoute(route, index) {\n  var score = route.default ? 0 : segmentize(route.path).reduce(function (score, segment) {\n    score += SEGMENT_POINTS;\n    if (isRootSegment(segment)) score += ROOT_POINTS;else if (isDynamic(segment)) score += DYNAMIC_POINTS;else if (isSplat(segment)) score -= SEGMENT_POINTS + SPLAT_PENALTY;else score += STATIC_POINTS;\n    return score;\n  }, 0);\n  return { route: route, score: score, index: index };\n};\n\nvar rankRoutes = function rankRoutes(routes) {\n  return routes.map(rankRoute).sort(function (a, b) {\n    return a.score < b.score ? 1 : a.score > b.score ? -1 : a.index - b.index;\n  });\n};\n\nvar segmentize = function segmentize(uri) {\n  return uri\n  // strip starting/ending slashes\n  .replace(/(^\\/+|\\/+$)/g, \"\").split(\"/\");\n};\n\nvar addQuery = function addQuery(pathname) {\n  for (var _len = arguments.length, query = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    query[_key - 1] = arguments[_key];\n  }\n\n  query = query.filter(function (q) {\n    return q && q.length > 0;\n  });\n  return pathname + (query && query.length > 0 ? \"?\" + query.join(\"&\") : \"\");\n};\n\nvar reservedNames = [\"uri\", \"path\"];\n\n/**\n * Shallow compares two objects.\n * @param {Object} obj1 The first object to compare.\n * @param {Object} obj2 The second object to compare.\n */\nvar shallowCompare = function shallowCompare(obj1, obj2) {\n  var obj1Keys = Object.keys(obj1);\n  return obj1Keys.length === Object.keys(obj2).length && obj1Keys.every(function (key) {\n    return obj2.hasOwnProperty(key) && obj1[key] === obj2[key];\n  });\n};\n\n////////////////////////////////////////////////////////////////////////////////\nexports.startsWith = startsWith;\nexports.pick = pick;\nexports.match = match;\nexports.resolve = resolve;\nexports.insertParams = insertParams;\nexports.validateRedirect = validateRedirect;\nexports.shallowCompare = shallowCompare;", "\"use strict\";\n\nexports.__esModule = true;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar getLocation = function getLocation(source) {\n  var _source$location = source.location,\n      search = _source$location.search,\n      hash = _source$location.hash,\n      href = _source$location.href,\n      origin = _source$location.origin,\n      protocol = _source$location.protocol,\n      host = _source$location.host,\n      hostname = _source$location.hostname,\n      port = _source$location.port;\n  var pathname = source.location.pathname;\n\n\n  if (!pathname && href && canUseDOM) {\n    var url = new URL(href);\n    pathname = url.pathname;\n  }\n\n  return {\n    pathname: encodeURI(decodeURI(pathname)),\n    search: search,\n    hash: hash,\n    href: href,\n    origin: origin,\n    protocol: protocol,\n    host: host,\n    hostname: hostname,\n    port: port,\n    state: source.history.state,\n    key: source.history.state && source.history.state.key || \"initial\"\n  };\n};\n\nvar createHistory = function createHistory(source, options) {\n  var listeners = [];\n  var location = getLocation(source);\n  var transitioning = false;\n  var resolveTransition = function resolveTransition() {};\n\n  return {\n    get location() {\n      return location;\n    },\n\n    get transitioning() {\n      return transitioning;\n    },\n\n    _onTransitionComplete: function _onTransitionComplete() {\n      transitioning = false;\n      resolveTransition();\n    },\n    listen: function listen(listener) {\n      listeners.push(listener);\n\n      var popstateListener = function popstateListener() {\n        location = getLocation(source);\n        listener({ location: location, action: \"POP\" });\n      };\n\n      source.addEventListener(\"popstate\", popstateListener);\n\n      return function () {\n        source.removeEventListener(\"popstate\", popstateListener);\n        listeners = listeners.filter(function (fn) {\n          return fn !== listener;\n        });\n      };\n    },\n    navigate: function navigate(to) {\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          state = _ref.state,\n          _ref$replace = _ref.replace,\n          replace = _ref$replace === undefined ? false : _ref$replace;\n\n      if (typeof to === \"number\") {\n        source.history.go(to);\n      } else {\n        state = _extends({}, state, { key: Date.now() + \"\" });\n        // try...catch iOS Safari limits to 100 pushState calls\n        try {\n          if (transitioning || replace) {\n            source.history.replaceState(state, null, to);\n          } else {\n            source.history.pushState(state, null, to);\n          }\n        } catch (e) {\n          source.location[replace ? \"replace\" : \"assign\"](to);\n        }\n      }\n\n      location = getLocation(source);\n      transitioning = true;\n      var transition = new Promise(function (res) {\n        return resolveTransition = res;\n      });\n      listeners.forEach(function (listener) {\n        return listener({ location: location, action: \"PUSH\" });\n      });\n      return transition;\n    }\n  };\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Stores history entries in memory for testing or other platforms like Native\nvar createMemorySource = function createMemorySource() {\n  var initialPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"/\";\n\n  var searchIndex = initialPath.indexOf(\"?\");\n  var initialLocation = {\n    pathname: searchIndex > -1 ? initialPath.substr(0, searchIndex) : initialPath,\n    search: searchIndex > -1 ? initialPath.substr(searchIndex) : \"\"\n  };\n  var index = 0;\n  var stack = [initialLocation];\n  var states = [null];\n\n  return {\n    get location() {\n      return stack[index];\n    },\n    addEventListener: function addEventListener(name, fn) {},\n    removeEventListener: function removeEventListener(name, fn) {},\n\n    history: {\n      get entries() {\n        return stack;\n      },\n      get index() {\n        return index;\n      },\n      get state() {\n        return states[index];\n      },\n      pushState: function pushState(state, _, uri) {\n        var _uri$split = uri.split(\"?\"),\n            pathname = _uri$split[0],\n            _uri$split$ = _uri$split[1],\n            search = _uri$split$ === undefined ? \"\" : _uri$split$;\n\n        index++;\n        stack.push({ pathname: pathname, search: search.length ? \"?\" + search : search });\n        states.push(state);\n      },\n      replaceState: function replaceState(state, _, uri) {\n        var _uri$split2 = uri.split(\"?\"),\n            pathname = _uri$split2[0],\n            _uri$split2$ = _uri$split2[1],\n            search = _uri$split2$ === undefined ? \"\" : _uri$split2$;\n\n        stack[index] = { pathname: pathname, search: search };\n        states[index] = state;\n      },\n      go: function go(to) {\n        var newIndex = index + to;\n\n        if (newIndex < 0 || newIndex > states.length - 1) {\n          return;\n        }\n\n        index = newIndex;\n      }\n    }\n  };\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// global history - uses window.history as the source if available, otherwise a\n// memory history\nvar canUseDOM = !!(typeof window !== \"undefined\" && window.document && window.document.createElement);\nvar getSource = function getSource() {\n  return canUseDOM ? window : createMemorySource();\n};\n\nvar globalHistory = createHistory(getSource());\nvar navigate = globalHistory.navigate;\n\n////////////////////////////////////////////////////////////////////////////////\n\nexports.globalHistory = globalHistory;\nexports.navigate = navigate;\nexports.createHistory = createHistory;\nexports.createMemorySource = createMemorySource;", "\"use strict\";\n\nexports.__esModule = true;\nexports.useMatch = exports.useParams = exports.useNavigate = exports.useLocation = exports.matchPath = exports.globalHistory = exports.redirectTo = exports.navigate = exports.isRedirect = exports.createMemorySource = exports.createHistory = exports.ServerLocation = exports.Router = exports.Redirect = exports.Match = exports.LocationProvider = exports.Location = exports.Link = undefined;\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _react = require(\"react\");\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require(\"prop-types\");\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _invariant = require(\"invariant\");\n\nvar _invariant2 = _interopRequireDefault(_invariant);\n\nvar _createReactContext = require(\"create-react-context\");\n\nvar _createReactContext2 = _interopRequireDefault(_createReactContext);\n\nvar _reactLifecyclesCompat = require(\"react-lifecycles-compat\");\n\nvar _utils = require(\"./lib/utils\");\n\nvar _history = require(\"./lib/history\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /* eslint-disable jsx-a11y/anchor-has-content */\n\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar createNamedContext = function createNamedContext(name, defaultValue) {\n  var Ctx = (0, _createReactContext2.default)(defaultValue);\n  Ctx.displayName = name;\n  return Ctx;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Location Context/Provider\nvar LocationContext = createNamedContext(\"Location\");\n\n// sets up a listener if there isn't one already so apps don't need to be\n// wrapped in some top level provider\nvar Location = function Location(_ref) {\n  var children = _ref.children;\n  return _react2.default.createElement(\n    LocationContext.Consumer,\n    null,\n    function (context) {\n      return context ? children(context) : _react2.default.createElement(\n        LocationProvider,\n        null,\n        children\n      );\n    }\n  );\n};\n\nvar LocationProvider = function (_React$Component) {\n  _inherits(LocationProvider, _React$Component);\n\n  function LocationProvider() {\n    var _temp, _this, _ret;\n\n    _classCallCheck(this, LocationProvider);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.state = {\n      context: _this.getContext(),\n      refs: { unlisten: null }\n    }, _temp), _possibleConstructorReturn(_this, _ret);\n  }\n\n  LocationProvider.prototype.getContext = function getContext() {\n    var _props$history = this.props.history,\n        navigate = _props$history.navigate,\n        location = _props$history.location;\n\n    return { navigate: navigate, location: location };\n  };\n\n  LocationProvider.prototype.componentDidCatch = function componentDidCatch(error, info) {\n    if (isRedirect(error)) {\n      var _navigate = this.props.history.navigate;\n\n      _navigate(error.uri, { replace: true });\n    } else {\n      throw error;\n    }\n  };\n\n  LocationProvider.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n    if (prevState.context.location !== this.state.context.location) {\n      this.props.history._onTransitionComplete();\n    }\n  };\n\n  LocationProvider.prototype.componentDidMount = function componentDidMount() {\n    var _this2 = this;\n\n    var refs = this.state.refs,\n        history = this.props.history;\n\n    history._onTransitionComplete();\n    refs.unlisten = history.listen(function () {\n      Promise.resolve().then(function () {\n        // TODO: replace rAF with react deferred update API when it's ready https://github.com/facebook/react/issues/13306\n        requestAnimationFrame(function () {\n          if (!_this2.unmounted) {\n            _this2.setState(function () {\n              return { context: _this2.getContext() };\n            });\n          }\n        });\n      });\n    });\n  };\n\n  LocationProvider.prototype.componentWillUnmount = function componentWillUnmount() {\n    var refs = this.state.refs;\n\n    this.unmounted = true;\n    refs.unlisten();\n  };\n\n  LocationProvider.prototype.render = function render() {\n    var context = this.state.context,\n        children = this.props.children;\n\n    return _react2.default.createElement(\n      LocationContext.Provider,\n      { value: context },\n      typeof children === \"function\" ? children(context) : children || null\n    );\n  };\n\n  return LocationProvider;\n}(_react2.default.Component);\n\n////////////////////////////////////////////////////////////////////////////////\n\n\nLocationProvider.defaultProps = {\n  history: _history.globalHistory\n};\nprocess.env.NODE_ENV !== \"production\" ? LocationProvider.propTypes = {\n  history: _propTypes2.default.object.isRequired\n} : void 0;\nvar ServerLocation = function ServerLocation(_ref2) {\n  var url = _ref2.url,\n      children = _ref2.children;\n\n  var searchIndex = url.indexOf(\"?\");\n  var searchExists = searchIndex > -1;\n  var pathname = void 0;\n  var search = \"\";\n  var hash = \"\";\n\n  if (searchExists) {\n    pathname = url.substring(0, searchIndex);\n    search = url.substring(searchIndex);\n  } else {\n    pathname = url;\n  }\n\n  return _react2.default.createElement(\n    LocationContext.Provider,\n    {\n      value: {\n        location: {\n          pathname: pathname,\n          search: search,\n          hash: hash\n        },\n        navigate: function navigate() {\n          throw new Error(\"You can't call navigate on the server.\");\n        }\n      }\n    },\n    children\n  );\n};\n////////////////////////////////////////////////////////////////////////////////\n// Sets baseuri and basepath for nested routers and links\nvar BaseContext = createNamedContext(\"Base\", { baseuri: \"/\", basepath: \"/\" });\n\n////////////////////////////////////////////////////////////////////////////////\n// The main event, welcome to the show everybody.\nvar Router = function Router(props) {\n  return _react2.default.createElement(\n    BaseContext.Consumer,\n    null,\n    function (baseContext) {\n      return _react2.default.createElement(\n        Location,\n        null,\n        function (locationContext) {\n          return _react2.default.createElement(RouterImpl, _extends({}, baseContext, locationContext, props));\n        }\n      );\n    }\n  );\n};\n\nvar RouterImpl = function (_React$PureComponent) {\n  _inherits(RouterImpl, _React$PureComponent);\n\n  function RouterImpl() {\n    _classCallCheck(this, RouterImpl);\n\n    return _possibleConstructorReturn(this, _React$PureComponent.apply(this, arguments));\n  }\n\n  RouterImpl.prototype.render = function render() {\n    var _props = this.props,\n        location = _props.location,\n        _navigate2 = _props.navigate,\n        basepath = _props.basepath,\n        primary = _props.primary,\n        children = _props.children,\n        baseuri = _props.baseuri,\n        _props$component = _props.component,\n        component = _props$component === undefined ? \"div\" : _props$component,\n        domProps = _objectWithoutProperties(_props, [\"location\", \"navigate\", \"basepath\", \"primary\", \"children\", \"baseuri\", \"component\"]);\n\n    var routes = _react2.default.Children.toArray(children).reduce(function (array, child) {\n      var routes = createRoute(basepath)(child);\n      return array.concat(routes);\n    }, []);\n    var pathname = location.pathname;\n\n\n    var match = (0, _utils.pick)(routes, pathname);\n\n    if (match) {\n      var params = match.params,\n          uri = match.uri,\n          route = match.route,\n          element = match.route.value;\n\n      // remove the /* from the end for child routes relative paths\n\n      basepath = route.default ? basepath : route.path.replace(/\\*$/, \"\");\n\n      var props = _extends({}, params, {\n        uri: uri,\n        location: location,\n        navigate: function navigate(to, options) {\n          return _navigate2((0, _utils.resolve)(to, uri), options);\n        }\n      });\n\n      var clone = _react2.default.cloneElement(element, props, element.props.children ? _react2.default.createElement(\n        Router,\n        { location: location, primary: primary },\n        element.props.children\n      ) : undefined);\n\n      // using 'div' for < 16.3 support\n      var FocusWrapper = primary ? FocusHandler : component;\n      // don't pass any props to 'div'\n      var wrapperProps = primary ? _extends({ uri: uri, location: location, component: component }, domProps) : domProps;\n\n      return _react2.default.createElement(\n        BaseContext.Provider,\n        { value: { baseuri: uri, basepath: basepath } },\n        _react2.default.createElement(\n          FocusWrapper,\n          wrapperProps,\n          clone\n        )\n      );\n    } else {\n      // Not sure if we want this, would require index routes at every level\n      // warning(\n      //   false,\n      //   `<Router basepath=\"${basepath}\">\\n\\nNothing matched:\\n\\t${\n      //     location.pathname\n      //   }\\n\\nPaths checked: \\n\\t${routes\n      //     .map(route => route.path)\n      //     .join(\n      //       \"\\n\\t\"\n      //     )}\\n\\nTo get rid of this warning, add a default NotFound component as child of Router:\n      //   \\n\\tlet NotFound = () => <div>Not Found!</div>\n      //   \\n\\t<Router>\\n\\t  <NotFound default/>\\n\\t  {/* ... */}\\n\\t</Router>`\n      // );\n      return null;\n    }\n  };\n\n  return RouterImpl;\n}(_react2.default.PureComponent);\n\nRouterImpl.defaultProps = {\n  primary: true\n};\n\n\nvar FocusContext = createNamedContext(\"Focus\");\n\nvar FocusHandler = function FocusHandler(_ref3) {\n  var uri = _ref3.uri,\n      location = _ref3.location,\n      component = _ref3.component,\n      domProps = _objectWithoutProperties(_ref3, [\"uri\", \"location\", \"component\"]);\n\n  return _react2.default.createElement(\n    FocusContext.Consumer,\n    null,\n    function (requestFocus) {\n      return _react2.default.createElement(FocusHandlerImpl, _extends({}, domProps, {\n        component: component,\n        requestFocus: requestFocus,\n        uri: uri,\n        location: location\n      }));\n    }\n  );\n};\n\n// don't focus on initial render\nvar initialRender = true;\nvar focusHandlerCount = 0;\n\nvar FocusHandlerImpl = function (_React$Component2) {\n  _inherits(FocusHandlerImpl, _React$Component2);\n\n  function FocusHandlerImpl() {\n    var _temp2, _this4, _ret2;\n\n    _classCallCheck(this, FocusHandlerImpl);\n\n    for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n\n    return _ret2 = (_temp2 = (_this4 = _possibleConstructorReturn(this, _React$Component2.call.apply(_React$Component2, [this].concat(args))), _this4), _this4.state = {}, _this4.requestFocus = function (node) {\n      if (!_this4.state.shouldFocus && node) {\n        node.focus();\n      }\n    }, _temp2), _possibleConstructorReturn(_this4, _ret2);\n  }\n\n  FocusHandlerImpl.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, prevState) {\n    var initial = prevState.uri == null;\n    if (initial) {\n      return _extends({\n        shouldFocus: true\n      }, nextProps);\n    } else {\n      var myURIChanged = nextProps.uri !== prevState.uri;\n      var navigatedUpToMe = prevState.location.pathname !== nextProps.location.pathname && nextProps.location.pathname === nextProps.uri;\n      return _extends({\n        shouldFocus: myURIChanged || navigatedUpToMe\n      }, nextProps);\n    }\n  };\n\n  FocusHandlerImpl.prototype.componentDidMount = function componentDidMount() {\n    focusHandlerCount++;\n    this.focus();\n  };\n\n  FocusHandlerImpl.prototype.componentWillUnmount = function componentWillUnmount() {\n    focusHandlerCount--;\n    if (focusHandlerCount === 0) {\n      initialRender = true;\n    }\n  };\n\n  FocusHandlerImpl.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n    if (prevProps.location !== this.props.location && this.state.shouldFocus) {\n      this.focus();\n    }\n  };\n\n  FocusHandlerImpl.prototype.focus = function focus() {\n    if (process.env.NODE_ENV === \"test\") {\n      // getting cannot read property focus of null in the tests\n      // and that bit of global `initialRender` state causes problems\n      // should probably figure it out!\n      return;\n    }\n\n    var requestFocus = this.props.requestFocus;\n\n\n    if (requestFocus) {\n      requestFocus(this.node);\n    } else {\n      if (initialRender) {\n        initialRender = false;\n      } else if (this.node) {\n        // React polyfills [autofocus] and it fires earlier than cDM,\n        // so we were stealing focus away, this line prevents that.\n        if (!this.node.contains(document.activeElement)) {\n          this.node.focus();\n        }\n      }\n    }\n  };\n\n  FocusHandlerImpl.prototype.render = function render() {\n    var _this5 = this;\n\n    var _props2 = this.props,\n        children = _props2.children,\n        style = _props2.style,\n        requestFocus = _props2.requestFocus,\n        _props2$component = _props2.component,\n        Comp = _props2$component === undefined ? \"div\" : _props2$component,\n        uri = _props2.uri,\n        location = _props2.location,\n        domProps = _objectWithoutProperties(_props2, [\"children\", \"style\", \"requestFocus\", \"component\", \"uri\", \"location\"]);\n\n    return _react2.default.createElement(\n      Comp,\n      _extends({\n        style: _extends({ outline: \"none\" }, style),\n        tabIndex: \"-1\",\n        ref: function ref(n) {\n          return _this5.node = n;\n        }\n      }, domProps),\n      _react2.default.createElement(\n        FocusContext.Provider,\n        { value: this.requestFocus },\n        this.props.children\n      )\n    );\n  };\n\n  return FocusHandlerImpl;\n}(_react2.default.Component);\n\n(0, _reactLifecyclesCompat.polyfill)(FocusHandlerImpl);\n\nvar k = function k() {};\n\n////////////////////////////////////////////////////////////////////////////////\nvar forwardRef = _react2.default.forwardRef;\n\nif (typeof forwardRef === \"undefined\") {\n  forwardRef = function forwardRef(C) {\n    return C;\n  };\n}\n\nvar Link = forwardRef(function (_ref4, ref) {\n  var innerRef = _ref4.innerRef,\n      props = _objectWithoutProperties(_ref4, [\"innerRef\"]);\n\n  return _react2.default.createElement(\n    BaseContext.Consumer,\n    null,\n    function (_ref5) {\n      var basepath = _ref5.basepath,\n          baseuri = _ref5.baseuri;\n      return _react2.default.createElement(\n        Location,\n        null,\n        function (_ref6) {\n          var location = _ref6.location,\n              navigate = _ref6.navigate;\n\n          var to = props.to,\n              state = props.state,\n              replace = props.replace,\n              _props$getProps = props.getProps,\n              getProps = _props$getProps === undefined ? k : _props$getProps,\n              anchorProps = _objectWithoutProperties(props, [\"to\", \"state\", \"replace\", \"getProps\"]);\n\n          var href = (0, _utils.resolve)(to, baseuri);\n          var encodedHref = encodeURI(href);\n          var isCurrent = location.pathname === encodedHref;\n          var isPartiallyCurrent = (0, _utils.startsWith)(location.pathname, encodedHref);\n\n          return _react2.default.createElement(\"a\", _extends({\n            ref: ref || innerRef,\n            \"aria-current\": isCurrent ? \"page\" : undefined\n          }, anchorProps, getProps({ isCurrent: isCurrent, isPartiallyCurrent: isPartiallyCurrent, href: href, location: location }), {\n            href: href,\n            onClick: function onClick(event) {\n              if (anchorProps.onClick) anchorProps.onClick(event);\n              if (shouldNavigate(event)) {\n                event.preventDefault();\n                var shouldReplace = replace;\n                if (typeof replace !== \"boolean\" && isCurrent) {\n                  var _location$state = _extends({}, location.state),\n                      key = _location$state.key,\n                      restState = _objectWithoutProperties(_location$state, [\"key\"]);\n\n                  shouldReplace = (0, _utils.shallowCompare)(_extends({}, state), restState);\n                }\n                navigate(href, {\n                  state: state,\n                  replace: shouldReplace\n                });\n              }\n            }\n          }));\n        }\n      );\n    }\n  );\n});\n\nLink.displayName = \"Link\";\n\nprocess.env.NODE_ENV !== \"production\" ? Link.propTypes = {\n  to: _propTypes2.default.string.isRequired\n} : void 0;\n\n////////////////////////////////////////////////////////////////////////////////\nfunction RedirectRequest(uri) {\n  this.uri = uri;\n}\n\nvar isRedirect = function isRedirect(o) {\n  return o instanceof RedirectRequest;\n};\n\nvar redirectTo = function redirectTo(to) {\n  throw new RedirectRequest(to);\n};\n\nvar RedirectImpl = function (_React$Component3) {\n  _inherits(RedirectImpl, _React$Component3);\n\n  function RedirectImpl() {\n    _classCallCheck(this, RedirectImpl);\n\n    return _possibleConstructorReturn(this, _React$Component3.apply(this, arguments));\n  }\n\n  // Support React < 16 with this hook\n  RedirectImpl.prototype.componentDidMount = function componentDidMount() {\n    var _props3 = this.props,\n        navigate = _props3.navigate,\n        to = _props3.to,\n        from = _props3.from,\n        _props3$replace = _props3.replace,\n        replace = _props3$replace === undefined ? true : _props3$replace,\n        state = _props3.state,\n        noThrow = _props3.noThrow,\n        baseuri = _props3.baseuri,\n        props = _objectWithoutProperties(_props3, [\"navigate\", \"to\", \"from\", \"replace\", \"state\", \"noThrow\", \"baseuri\"]);\n\n    Promise.resolve().then(function () {\n      var resolvedTo = (0, _utils.resolve)(to, baseuri);\n      navigate((0, _utils.insertParams)(resolvedTo, props), { replace: replace, state: state });\n    });\n  };\n\n  RedirectImpl.prototype.render = function render() {\n    var _props4 = this.props,\n        navigate = _props4.navigate,\n        to = _props4.to,\n        from = _props4.from,\n        replace = _props4.replace,\n        state = _props4.state,\n        noThrow = _props4.noThrow,\n        baseuri = _props4.baseuri,\n        props = _objectWithoutProperties(_props4, [\"navigate\", \"to\", \"from\", \"replace\", \"state\", \"noThrow\", \"baseuri\"]);\n\n    var resolvedTo = (0, _utils.resolve)(to, baseuri);\n    if (!noThrow) redirectTo((0, _utils.insertParams)(resolvedTo, props));\n    return null;\n  };\n\n  return RedirectImpl;\n}(_react2.default.Component);\n\nvar Redirect = function Redirect(props) {\n  return _react2.default.createElement(\n    BaseContext.Consumer,\n    null,\n    function (_ref7) {\n      var baseuri = _ref7.baseuri;\n      return _react2.default.createElement(\n        Location,\n        null,\n        function (locationContext) {\n          return _react2.default.createElement(RedirectImpl, _extends({}, locationContext, { baseuri: baseuri }, props));\n        }\n      );\n    }\n  );\n};\n\nprocess.env.NODE_ENV !== \"production\" ? Redirect.propTypes = {\n  from: _propTypes2.default.string,\n  to: _propTypes2.default.string.isRequired\n} : void 0;\n\n////////////////////////////////////////////////////////////////////////////////\nvar Match = function Match(_ref8) {\n  var path = _ref8.path,\n      children = _ref8.children;\n  return _react2.default.createElement(\n    BaseContext.Consumer,\n    null,\n    function (_ref9) {\n      var baseuri = _ref9.baseuri;\n      return _react2.default.createElement(\n        Location,\n        null,\n        function (_ref10) {\n          var navigate = _ref10.navigate,\n              location = _ref10.location;\n\n          var resolvedPath = (0, _utils.resolve)(path, baseuri);\n          var result = (0, _utils.match)(resolvedPath, location.pathname);\n          return children({\n            navigate: navigate,\n            location: location,\n            match: result ? _extends({}, result.params, {\n              uri: result.uri,\n              path: path\n            }) : null\n          });\n        }\n      );\n    }\n  );\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Hooks\n\nvar useLocation = function useLocation() {\n  var context = (0, _react.useContext)(LocationContext);\n\n  if (!context) {\n    throw new Error(\"useLocation hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n  }\n\n  return context.location;\n};\n\nvar useNavigate = function useNavigate() {\n  var context = (0, _react.useContext)(LocationContext);\n\n  if (!context) {\n    throw new Error(\"useNavigate hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n  }\n\n  return context.navigate;\n};\n\nvar useParams = function useParams() {\n  var context = (0, _react.useContext)(BaseContext);\n\n  if (!context) {\n    throw new Error(\"useParams hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n  }\n\n  var location = useLocation();\n\n  var results = (0, _utils.match)(context.basepath, location.pathname);\n\n  return results ? results.params : null;\n};\n\nvar useMatch = function useMatch(path) {\n  if (!path) {\n    throw new Error(\"useMatch(path: string) requires an argument of a string to match against\");\n  }\n  var context = (0, _react.useContext)(BaseContext);\n\n  if (!context) {\n    throw new Error(\"useMatch hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n  }\n\n  var location = useLocation();\n\n  var resolvedPath = (0, _utils.resolve)(path, context.baseuri);\n  var result = (0, _utils.match)(resolvedPath, location.pathname);\n  return result ? _extends({}, result.params, {\n    uri: result.uri,\n    path: path\n  }) : null;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Junk\nvar stripSlashes = function stripSlashes(str) {\n  return str.replace(/(^\\/+|\\/+$)/g, \"\");\n};\n\nvar createRoute = function createRoute(basepath) {\n  return function (element) {\n    if (!element) {\n      return null;\n    }\n\n    if (element.type === _react2.default.Fragment && element.props.children) {\n      return _react2.default.Children.map(element.props.children, createRoute(basepath));\n    }\n    !(element.props.path || element.props.default || element.type === Redirect) ? process.env.NODE_ENV !== \"production\" ? (0, _invariant2.default)(false, \"<Router>: Children of <Router> must have a `path` or `default` prop, or be a `<Redirect>`. None found on element type `\" + element.type + \"`\") : (0, _invariant2.default)(false) : void 0;\n\n    !!(element.type === Redirect && (!element.props.from || !element.props.to)) ? process.env.NODE_ENV !== \"production\" ? (0, _invariant2.default)(false, \"<Redirect from=\\\"\" + element.props.from + \"\\\" to=\\\"\" + element.props.to + \"\\\"/> requires both \\\"from\\\" and \\\"to\\\" props when inside a <Router>.\") : (0, _invariant2.default)(false) : void 0;\n\n    !!(element.type === Redirect && !(0, _utils.validateRedirect)(element.props.from, element.props.to)) ? process.env.NODE_ENV !== \"production\" ? (0, _invariant2.default)(false, \"<Redirect from=\\\"\" + element.props.from + \" to=\\\"\" + element.props.to + \"\\\"/> has mismatched dynamic segments, ensure both paths have the exact same dynamic segments.\") : (0, _invariant2.default)(false) : void 0;\n\n    if (element.props.default) {\n      return { value: element, default: true };\n    }\n\n    var elementPath = element.type === Redirect ? element.props.from : element.props.path;\n\n    var path = elementPath === \"/\" ? basepath : stripSlashes(basepath) + \"/\" + stripSlashes(elementPath);\n\n    return {\n      value: element,\n      default: element.props.default,\n      path: element.props.children ? stripSlashes(path) + \"/*\" : path\n    };\n  };\n};\n\nvar shouldNavigate = function shouldNavigate(event) {\n  return !event.defaultPrevented && event.button === 0 && !(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n};\n\n////////////////////////////////////////////////////////////////////////\nexports.Link = Link;\nexports.Location = Location;\nexports.LocationProvider = LocationProvider;\nexports.Match = Match;\nexports.Redirect = Redirect;\nexports.Router = Router;\nexports.ServerLocation = ServerLocation;\nexports.createHistory = _history.createHistory;\nexports.createMemorySource = _history.createMemorySource;\nexports.isRedirect = isRedirect;\nexports.navigate = _history.navigate;\nexports.redirectTo = redirectTo;\nexports.globalHistory = _history.globalHistory;\nexports.matchPath = _utils.match;\nexports.useLocation = useLocation;\nexports.useNavigate = useNavigate;\nexports.useParams = useParams;\nexports.useMatch = useMatch;", "'use strict';\n\nmodule.exports = string => {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError('Expected a string');\n\t}\n\n\t// Escape characters with special meaning either inside or outside character sets.\n\t// Use a simple backslash escape when it\u2019s always valid, and a \\unnnn escape when the simpler form would be disallowed by Unicode patterns\u2019 stricter grammar.\n\treturn string\n\t\t.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n\t\t.replace(/-/g, '\\\\x2d');\n};\n", "import type {Layout} from \"./types\"\nimport {running_on_mobile_device, running_on_phone} from \"@cling/lib.web.utils\"\nexport let MIN_COLUMN_WIDTH = 300\nexport let OPTIMUM_COLUMN_WITH = 320\nexport let MAX_COLUMN_WIDTH = 580\nconst use_narrow = running_on_phone()\nexport const INCOMPLETE_COLUMN_VISIBLE_WIDTH = use_narrow ? 8 : 12\nexport const SPACE_BETWEEN_COLUMNS = use_narrow ? 12 : running_on_mobile_device() ? 24 : 34\nexport const LEFT_SPACE = INCOMPLETE_COLUMN_VISIBLE_WIDTH + SPACE_BETWEEN_COLUMNS / 2\nexport const RIGHT_SPACE = LEFT_SPACE\n\nexport function override_default_layout(overrides: {\n    min_column_width: number\n    optimum_column_width: number\n    max_column_width: number\n}) {\n    MIN_COLUMN_WIDTH = overrides.min_column_width\n    MAX_COLUMN_WIDTH = overrides.max_column_width\n    OPTIMUM_COLUMN_WITH = overrides.optimum_column_width\n}\n\nexport function default_layout({\n    view_port_width,\n    min_column_width,\n    max_column_width,\n    num_main_columns,\n    aux_column_shown,\n    inbox_shown,\n}: {\n    view_port_width: number\n    min_column_width: number\n    max_column_width: number\n    num_main_columns: number\n    inbox_shown: boolean\n    aux_column_shown?: boolean\n}): Layout {\n    const n = num_main_columns + (aux_column_shown ? 1 : 0) - (inbox_shown ? 1 : 0)\n    const min_width = min_column_width + SPACE_BETWEEN_COLUMNS\n    const min_total_width = LEFT_SPACE + n * min_width + RIGHT_SPACE\n    const num_fully_visible_columns =\n        min_total_width <= view_port_width\n            ? n\n            : Math.max(0, Math.floor((view_port_width - (LEFT_SPACE + RIGHT_SPACE)) / min_width))\n    let main_column_width: number\n    let aux_column_width = min_column_width + SPACE_BETWEEN_COLUMNS * 2\n    if (view_port_width < min_total_width && num_fully_visible_columns <= 1) {\n        // Edge case: view port is too small to display two columns fully ...\n        if (running_on_mobile_device() && view_port_width < max_column_width) {\n            // Display a single column (fully) if on mobile ...\n            main_column_width = view_port_width - (LEFT_SPACE + RIGHT_SPACE)\n            aux_column_width = view_port_width\n        } else {\n            main_column_width = aux_column_width = min_width\n        }\n    } else {\n        main_column_width = Math.max(\n            min_width,\n            Math.min(\n                max_column_width + SPACE_BETWEEN_COLUMNS,\n                (view_port_width - (LEFT_SPACE + RIGHT_SPACE)) / num_fully_visible_columns,\n            ),\n        )\n    }\n    main_column_width = Math.floor(main_column_width)\n    aux_column_width = Math.floor(aux_column_width)\n    if (min_column_width === MIN_COLUMN_WIDTH) {\n        main_column_width = MIN_COLUMN_WIDTH + SPACE_BETWEEN_COLUMNS\n        aux_column_width = MIN_COLUMN_WIDTH + SPACE_BETWEEN_COLUMNS\n    }\n    const main_total_width = LEFT_SPACE + num_main_columns * main_column_width + RIGHT_SPACE\n    const main_client_width = Math.min(\n        main_total_width,\n        Math.max(0, view_port_width - (aux_column_shown ? aux_column_width : 0)),\n    )\n    const space_between_columns = SPACE_BETWEEN_COLUMNS / 2\n    return {\n        main_layout: {\n            left: LEFT_SPACE,\n            space_between_columns: space_between_columns,\n            client_width: main_client_width,\n            total_width: main_total_width,\n            num_columns: num_main_columns,\n            column_width: main_column_width,\n            inbox_shown: inbox_shown,\n            column_offset: (index) => LEFT_SPACE + main_column_width * index,\n            scroll_left: (index) => main_column_width * index,\n        },\n        aux_layout: {\n            visible: !!aux_column_shown,\n            column_width: aux_column_width,\n        },\n    }\n}\n", "import {board_uid_type, BoardType, BoardUID, CardUID, Card} from \"@cling/lib.shared.model\"\nimport {navigate} from \"@reach/router/index\"\nimport {log} from \"@cling/lib.shared.logging\"\nimport {running_on_mobile_device} from \"@cling/lib.web.utils\"\n\n/**\n * Returns a `Promise` that is only resolved if a `<LocationProvider>` is mounted,\n * so be careful when actually waiting for the `Promise` to resolve.\n */\nexport function goto_dashboard(opts?: {replace?: boolean}): Promise<void> {\n    // The `/` at the end is important when using Cling from the home-screen of an Android\n    // or iOS device. If it is missing, the link will be treated as external which opens the\n    // dashboard in a new tab ...\n    log.info('navigate(\"/c/\")')\n    return new Promise((resolve, reject) => {\n        // See `goto_board` on why we wrap this in a promise ...\n        navigate(\"/c/\", opts)\n            .then(() => setTimeout(resolve))\n            .catch(reject)\n    })\n}\n\n/**\n * Returns a `Promise` that is only resolved if a `<LocationProvider>` is mounted,\n * so be careful when actually waiting for the `Promise` to resolve.\n */\nexport function goto_board({\n    board_uid,\n    highlight_card_uid,\n    replace,\n}: {\n    board_uid: BoardUID\n    highlight_card_uid?: CardUID\n    replace?: boolean\n}): Promise<void> {\n    if (board_uid_type(board_uid) === BoardType.dashboard && !highlight_card_uid) {\n        return goto_dashboard()\n    }\n    const card_uid_part = highlight_card_uid ? `/${highlight_card_uid}` : \"\"\n    const uri = `/c/${board_uid}${card_uid_part}`\n    log.info(`navigate(\"${uri}\")`)\n    // We want the promise returned by this function to resolve once the new board is rendered.\n    // We do not render a newly selected board directly but rather via a MobX reaction. That's why\n    // we use `setTimeout` here ...\n    return new Promise((resolve, reject) => {\n        navigate(uri, replace ? {replace} : undefined)\n            .then(() => setTimeout(resolve))\n            .catch(reject)\n    })\n}\n\n/**\n * Returns a `Promise` that is only resolved if a `<LocationProvider>` is mounted,\n * so be careful when actually waiting for the `Promise` to resolve.\n */\nexport function goto_card(card_uid?: CardUID, opts?: {replace?: boolean}): Promise<void> {\n    const uri = `/c/${card_uid}`\n    log.info(`navigate(\"${uri}\")`)\n    return navigate(uri, opts)\n}\n\nexport function card_deep_link(card: Card) {\n    return `${location.protocol}//${location.hostname}${\n        location.port !== \"\" ? \":\" + location.port : \"\"\n    }/c/${card.board_uid}/${card.uid}`\n}\n\nexport function is_cling_hp(): \"en\" | \"de\" | undefined {\n    return location.pathname.startsWith(\"/de/\")\n        ? \"de\"\n        : location.pathname.startsWith(\"/en/\")\n          ? \"en\"\n          : undefined\n}\n\nexport function with_shortcut(title: string, shortcut?: string) {\n    return (\n        title +\n        (!running_on_mobile_device() && !process.env.F_PUBLIC && shortcut\n            ? `       ${shortcut}`\n            : \"\")\n    )\n}\n", "import {\n    Board,\n    BoardUID,\n    deep_copy,\n    derive_PatchUID,\n    ItemNotFound,\n    MoveCard,\n    PasteCard,\n    Patch,\n    PatchOpContainer,\n    RemoveCard,\n    CopyCard,\n    derive_CardUID,\n    CardChangelogEntry,\n    CardPatchOpType,\n    derive_BlobUID,\n    BlobUIDMapping,\n} from \"@cling/lib.shared.model\"\nimport {assert, assert_never} from \"@cling/lib.shared.utils\"\nimport {InvalidPatchOp} from \"../index\"\n\nexport function move_copy_card_target_board_uids(patch: Patch): BoardUID[] {\n    const result: BoardUID[] = []\n    for (const op_container of patch.ops) {\n        const op = op_container.op\n        if (op instanceof CopyCard || op instanceof MoveCard) {\n            if (op.target_board_uid) {\n                result.push(op.target_board_uid)\n            }\n        }\n    }\n    return result\n}\n\nexport function transform(\n    patches: Array<Patch>,\n    board_factory: (board_uid: BoardUID) => Board,\n): Array<Patch> {\n    const result = []\n    for (const patch of patches) {\n        const result_patch = deep_copy(patch)\n        result_patch.ops = []\n        const more_patches = new Map<BoardUID, Patch>()\n        for (let i = 0; i < patch.ops.length; i++) {\n            const op_container = patch.ops[i]\n            const op = op_container.op\n            if (op instanceof CopyCard || op instanceof MoveCard) {\n                const board = board_factory(patch.board_uid)\n                assert(board, \"Source board not present\")\n                if (op.uid === board.root.uid) {\n                    throw new InvalidPatchOp(op, \"The root card must not be copied/moved\")\n                }\n                if (op.uid === board.inbox.uid) {\n                    throw new InvalidPatchOp(op, \"The inbox card must not be copied/moved\")\n                }\n                const blob_uid_mapping = []\n                // Build up the correct `Remove` and `Paste` operations.\n                let source_card\n                try {\n                    source_card = board.card(op.uid)\n                } catch (error) {\n                    throw new ItemNotFound(board.uid, op.uid, error)\n                }\n                source_card = deep_copy(source_card)\n                source_card.sanitize()\n                if (op instanceof MoveCard) {\n                    result_patch.ops.push(PatchOpContainer.from_op(new RemoveCard({uid: op.uid})))\n                } else if (op instanceof CopyCard) {\n                    // Remove comments and changelog and set new UIDs.\n                    const cards = [source_card].concat(source_card.deep_children)\n                    for (const card of cards) {\n                        card.comments = []\n                        card.changelog = []\n                        card.task = undefined\n                        if (!op.retain_archived_flag) {\n                            card.archived = false\n                        }\n                        card.uid =\n                            op.new_card_uid && card === cards[0]\n                                ? op.new_card_uid\n                                : derive_CardUID(\n                                      card.uid,\n                                      `transform_move_copy_ops:${patch.uid}:${i}`,\n                                  )\n                        // Every card needs a changelog. For the root card (`source_card`)\n                        // there will be a changelog created in `apply_paste`.\n                        if (card !== source_card) {\n                            card.changelog.push(\n                                new CardChangelogEntry({\n                                    date: patch.applied_at,\n                                    account_uid: patch.created_by,\n                                    board_version: board.version + 1,\n                                    patch_op_type: CardPatchOpType.PasteCard,\n                                    extra_src_board_uid:\n                                        op.target_board_uid === board.uid\n                                            ? undefined\n                                            : op.target_board_uid,\n                                }),\n                            )\n                        }\n                        for (const blob of card.blobs) {\n                            const src = blob.uid\n                            blob.uid = derive_BlobUID(\n                                blob.uid,\n                                `transform_move_copy_ops:${patch.uid}:${i}:${src}`,\n                            )\n                            blob_uid_mapping.push(new BlobUIDMapping({src, target: blob.uid}))\n                        }\n                    }\n                } else {\n                    assert_never(op)\n                }\n                const paste_op = new PasteCard({\n                    value: source_card,\n                    target_card_uid: op.target_card_uid,\n                    target_pos: op.target_pos,\n                    into_inbox: !op.target_card_uid,\n                })\n                // Determine where to put the `Paste` operation.\n                const target_board_uid = op.target_board_uid\n                if (target_board_uid && target_board_uid !== board.uid) {\n                    let target_patch = more_patches.get(target_board_uid)\n                    if (!target_patch) {\n                        target_patch = new Patch({\n                            uid: derive_PatchUID(\n                                target_board_uid,\n                                `${patch.uid}transform_move_op${target_board_uid}`,\n                            ),\n                            created_by: patch.created_by,\n                            applied_at: patch.applied_at,\n                            board_uid: target_board_uid,\n                            ops: [],\n                        })\n                        more_patches.set(target_board_uid, target_patch)\n                    }\n                    paste_op.src_board_uid = board.uid\n                    target_patch.ops.push(PatchOpContainer.from_op(paste_op))\n                    target_patch.blob_uid_mapping.push(...blob_uid_mapping)\n                } else {\n                    result_patch.blob_uid_mapping.push(...blob_uid_mapping)\n                    result_patch.ops.push(PatchOpContainer.from_op(paste_op))\n                }\n            } else {\n                result_patch.ops.push(op_container)\n            }\n        }\n        if (result_patch.ops.length) {\n            result.push(result_patch)\n        }\n        result.push(...more_patches.values())\n    }\n    return result\n}\n\nexport default transform\n", "import {\n    AddBoard,\n    AddBoardValue,\n    AddCard,\n    AddCardValue,\n    AddSystemBoard,\n    AddSystemBoardValue,\n    BlobUIDMapping,\n    Board,\n    BoardType,\n    BoardUID,\n    board_uid_type,\n    Column,\n    CopyBoard,\n    CopyCard,\n    deep_copy,\n    derive_BlobUID,\n    derive_CardUID,\n    derive_PatchUID,\n    Patch,\n    PatchOpContainer,\n} from \"@cling/lib.shared.model\"\nimport {assert, assert_never} from \"@cling/lib.shared.utils\"\nimport {InvalidPatchOp} from \"../index\"\n\nexport function copy_board_src_board_uids(patch: Patch): BoardUID[] {\n    return patch.ops.filter((x) => !!x.CopyBoard).map((x) => x.CopyBoard!.src_board_uid)\n}\n\nexport function transform(\n    patches: Array<Patch>,\n    board_factory: (board_uid: BoardUID) => Board,\n): Array<Patch> {\n    const result = []\n    const more_patches = []\n    for (const patch of patches) {\n        const result_patch = deep_copy(patch)\n        result_patch.ops = []\n        for (let i = 0; i < patch.ops.length; i++) {\n            const op_container = patch.ops[i]\n            const op = op_container.op\n            if (op instanceof CopyBoard) {\n                const copy_ops: CopyCard[] = []\n                const board = board_factory(op.src_board_uid)\n                assert(board, \"Source board not present\")\n                const board_style = deep_copy(board.board_style)\n                if (board.board_style.background_image_blob) {\n                    board_style.background_image_blob!.uid = derive_BlobUID(\n                        board_style.background_image_blob!.uid,\n                        `transform_copy_board:${patch.uid}`,\n                    )\n                    result_patch.blob_uid_mapping.push(\n                        new BlobUIDMapping({\n                            src: board.board_style.background_image_blob.uid,\n                            target: board_style.background_image_blob!.uid,\n                        }),\n                    )\n                }\n                const board_type = board_uid_type(patch.board_uid)\n                if (board_type === BoardType.regular) {\n                    result_patch.ops.push(\n                        PatchOpContainer.from_op(\n                            new AddBoard({\n                                value: new AddBoardValue({name: board.name, board_style}),\n                            }),\n                        ),\n                    )\n                } else if (\n                    board_type === BoardType.dashboard ||\n                    board_type === BoardType.clipboard ||\n                    board_type === BoardType.trashcan\n                ) {\n                    result_patch.ops.push(\n                        PatchOpContainer.from_op(\n                            new AddSystemBoard({\n                                value: new AddSystemBoardValue({board_type, board_style}),\n                            }),\n                        ),\n                    )\n                } else if (board_type === BoardType.people) {\n                    throw new InvalidPatchOp(op, \"Cannot copy TO a people board\")\n                } else {\n                    assert_never(board_type)\n                }\n                for (const card of board.inbox.children) {\n                    copy_ops.push(\n                        new CopyCard({\n                            uid: card.uid,\n                            target_pos: 4242424242,\n                            target_board_uid: patch.board_uid,\n                            retain_archived_flag: true,\n                        }),\n                    )\n                }\n                for (const column of board.columns) {\n                    if (column.children.length === 0) {\n                        continue\n                    }\n                    const column_uid = derive_CardUID(\n                        column.uid,\n                        `transform_copy_board:${patch.board_uid}`,\n                    )\n                    result_patch.ops.push(\n                        PatchOpContainer.from_op(\n                            new AddCard({\n                                // This is how we determine the root card uid in `apply_add_board`.\n                                target_card_uid: derive_CardUID(patch.board_uid, \"Root\"),\n                                target_pos: 4242424242,\n                                value: new AddCardValue({uid: column_uid, column: new Column({})}),\n                            }),\n                        ),\n                    )\n                    for (const card of column.children) {\n                        copy_ops.push(\n                            new CopyCard({\n                                uid: card.uid,\n                                target_pos: 4242424242,\n                                target_board_uid: patch.board_uid,\n                                target_card_uid: column_uid,\n                                retain_archived_flag: true,\n                            }),\n                        )\n                    }\n                }\n                more_patches.push(\n                    new Patch({\n                        uid: derive_PatchUID(patch.uid, `transform_copy_board:${patch.board_uid}`),\n                        board_uid: op.src_board_uid,\n                        ops: copy_ops.map(PatchOpContainer.from_op),\n                        applied_at: patch.applied_at,\n                        created_by: patch.created_by,\n                        blob_uid_mapping: [],\n                    }),\n                )\n            } else {\n                result_patch.ops.push(op_container)\n            }\n        }\n        if (result_patch.ops.length) {\n            result.push(result_patch)\n        }\n    }\n    if (more_patches.length) {\n        result.push(...more_patches)\n    }\n    return result\n}\n\nexport default transform\n", "/**\n * Transform a `SetCardArchived` operation to archive all children recursively.\n */\n\nimport {\n    Board,\n    BoardUID,\n    deep_copy,\n    ItemNotFound,\n    Patch,\n    PatchOpContainer,\n    SetCardArchived,\n    traverse_cards,\n} from \"@cling/lib.shared.model\"\nimport {assert} from \"@cling/lib.shared.utils\"\nimport {InvalidPatchOp} from \"../index\"\n\nexport function transform(\n    patches: Array<Patch>,\n    board_factory: (board_uid: BoardUID) => Board,\n): Array<Patch> {\n    const result = []\n    for (const patch of patches) {\n        const result_patch = deep_copy(patch)\n        result.push(result_patch)\n        for (const op_container of patch.ops) {\n            const op = op_container.op\n            if (op instanceof SetCardArchived && op.value === true) {\n                const board = board_factory(patch.board_uid)\n                assert(board, \"Source board not present\")\n                if (op.uid === board.root.uid) {\n                    throw new InvalidPatchOp(op, \"The root card must not be archived\")\n                }\n                if (op.uid === board.inbox.uid) {\n                    throw new InvalidPatchOp(op, \"The inbox card must not be archived\")\n                }\n                let card\n                try {\n                    card = board.card(op.uid)\n                } catch (error) {\n                    throw new ItemNotFound(board.uid, op.uid, error)\n                }\n                traverse_cards(card, (x) => {\n                    if (!x.archived) {\n                        result_patch.ops.push(\n                            PatchOpContainer.from_op(\n                                new SetCardArchived({\n                                    uid: x.uid,\n                                    value: true,\n                                }),\n                            ),\n                        )\n                    }\n                })\n            }\n        }\n    }\n    return result\n}\n\nexport default transform\n", "/**\n * Transform the given patch into one ore more patches.\n */\nimport {\n    move_copy_card_target_board_uids,\n    transform as transform_move_copy_card,\n} from \"./transform_move_copy_card\"\nimport {copy_board_src_board_uids, transform as transform_copy_board} from \"./transform_copy_board\"\nimport {transform as transform_set_archived_ops} from \"./transform_set_card_archived_ops\"\nimport type {Board, BoardUID, Patch} from \"@cling/lib.shared.model\"\nimport {BoardNotFound} from \"../index\"\n\n/**\n * A synchronous way to transform patches that is only suitable in the client.\n */\nexport function transform_patch_client(\n    patch: Patch,\n    board_factory: (board_uid: BoardUID) => Board,\n): Patch[] {\n    // Note: The order in which the transform functions are applied is important ...\n    let patches = transform_set_archived_ops([patch], board_factory)\n    patches = transform_copy_board(patches, board_factory)\n    patches = transform_move_copy_card(patches, board_factory)\n    patches = flatten_patches(patches)\n    return patches\n}\n\nexport async function transform_patch_server(\n    patch: Patch,\n    board_factory: (board_uid: BoardUID) => Promise<Board>,\n): Promise<Patch[]> {\n    const boards = new Map<BoardUID, Board>()\n    const board_uids = new Set<BoardUID>(\n        move_copy_card_target_board_uids(patch).concat(copy_board_src_board_uids(patch)),\n    )\n    if (!patch.will_create_new_board) {\n        board_uids.add(patch.board_uid)\n    }\n    for (const board_uid of board_uids) {\n        boards.set(board_uid, await board_factory(board_uid))\n    }\n    const sync_board_factory = (board_uid: BoardUID) => {\n        const board = boards.get(board_uid)\n        if (!board) {\n            throw new BoardNotFound(board_uid)\n        }\n        return board\n    }\n    let patches = transform_set_archived_ops([patch], sync_board_factory)\n    patches = transform_copy_board(patches, sync_board_factory)\n    patches = transform_move_copy_card(patches, sync_board_factory)\n    patches = flatten_patches(patches)\n    return patches\n}\n\n/**\n * Flatten patches so that there is only one patch per board.\n */\nfunction flatten_patches(patches: Patch[]) {\n    const flattened_patches: Patch[] = []\n    for (const patch of patches) {\n        const p = flattened_patches.find((x) => x.board_uid === patch.board_uid)\n        if (p) {\n            p.ops.push(...patch.ops)\n            p.blob_uid_mapping.push(...patch.blob_uid_mapping)\n            continue\n        }\n        flattened_patches.push(patch)\n    }\n    return flattened_patches\n}\n", "import {observable, runInAction, makeObservable} from \"mobx\"\nimport {register_log_event_reporter} from \"@cling/lib.shared.debug\"\n\nclass DebugState {\n    offline = false\n    num_errors = 0\n    errors_and_log_history?: string = undefined\n\n    constructor() {\n        makeObservable(this, {\n            offline: observable,\n            num_errors: observable,\n            errors_and_log_history: observable,\n        })\n    }\n}\n\nexport let debug_state: DebugState\n\nexport function init() {\n    debug_state = new DebugState()\n    let first_error_and_log_history: undefined | string\n    register_log_event_reporter({\n        report: async (message: string, severity: \"info\" | \"warn\" | \"error\") => {\n            if (severity === \"error\") {\n                const log_history = cling.log_history()\n                // Remove the last line from `log_history` if it already contains `message` ...\n                if (log_history.length && log_history[log_history.length - 1].includes(message)) {\n                    log_history.pop()\n                }\n                if (first_error_and_log_history) {\n                    // Remove all lines from `log_history` which are already\n                    // present in `first_error_and_log_history` ...\n                    while (\n                        log_history.length &&\n                        first_error_and_log_history.includes(log_history[0])\n                    ) {\n                        log_history.shift()\n                    }\n                }\n                runInAction(() => {\n                    debug_state.num_errors += 1\n                    const error_and_log_history = log_history.length\n                        ? message + \"\\n\\n\" + [...log_history].reverse().join(\"\\n\")\n                        : message\n                    if (!first_error_and_log_history) {\n                        first_error_and_log_history = error_and_log_history\n                        debug_state.errors_and_log_history = error_and_log_history\n                    } else if (log_history.length) {\n                        debug_state.errors_and_log_history =\n                            error_and_log_history + \"\\n\\n.\\n.\\n.\\n\\n\" + first_error_and_log_history\n                    } else {\n                        debug_state.errors_and_log_history =\n                            error_and_log_history + \"\\n\\n\" + first_error_and_log_history\n                    }\n                })\n            }\n        },\n    })\n}\n", "import {assert, assert_never} from \"./index\"\n\nexport class RateLimiter {\n    public readonly max_calls: number\n    public readonly per_milliseconds: number\n    private t0 = 0\n    private num_calls_since_t0 = 0\n\n    constructor({\n        max_calls,\n        per,\n    }: {\n        max_calls: number\n        per: [number, \"milliseconds\" | \"seconds\" | \"minutes\" | \"hours\"]\n    }) {\n        assert(max_calls > 0, () => `Invalid max_calls: ${max_calls}`)\n        assert(per.length === 2, () => `Invalid per: ${JSON.stringify(per)}`)\n        assert(per[0] > 0, () => `Invalid per[0]: ${per[0]}`)\n        this.max_calls = max_calls\n        const [period_value, period_unit] = per\n        this.per_milliseconds =\n            period_unit === \"milliseconds\"\n                ? period_value\n                : period_unit === \"seconds\"\n                  ? period_value * 1000\n                  : period_unit === \"minutes\"\n                    ? period_value * 60 * 1000\n                    : period_unit === \"hours\"\n                      ? period_value * 60 * 60 * 1000\n                      : assert_never(period_unit)\n    }\n\n    /**\n     * Calls the given function `fn` with either `true` or `false`.\n     */\n    run<T>(fn: (within_limit: boolean) => T) {\n        const now = Date.now()\n        const n = this.num_calls_since_t0\n        if (n && now - this.t0 < this.per_milliseconds) {\n            if (n >= this.max_calls) {\n                return fn(false)\n            }\n            this.num_calls_since_t0 += 1\n        } else {\n            this.t0 = now\n            this.num_calls_since_t0 = 1\n        }\n        return fn(true)\n    }\n}\n", "import {runInAction} from \"mobx\"\nimport type {Board, BoardUID, PatchUID} from \"@cling/lib.shared.model\"\nimport {report_info} from \"@cling/lib.shared.debug\"\nimport {debug_state} from \"../state/debug_state\"\nimport {RateLimiter} from \"@cling/lib.shared.utils/rate_limiter\"\n\nexport class Sensors {\n    private expecting_board?: boolean\n    private expecting_board_since?: number\n    private expecting_board_uid?: BoardUID\n    private current_board?: Board\n    private readonly expecting_patches = new Map<PatchUID, number>()\n    private report_limiter = new RateLimiter({max_calls: 1, per: [5, \"minutes\"]})\n    private network_state?: \"online\" | \"offline\"\n    private network_state_changed_at?: number\n\n    set_network_state(network_state: \"online\" | \"offline\") {\n        if (this.network_state !== network_state) {\n            this.network_state = network_state\n            this.network_state_changed_at = Date.now()\n        }\n    }\n\n    expect_board_will_be_shown(board_uid?: BoardUID) {\n        if (!board_uid) {\n            // We just expect, that a board will be shown ...\n            if (!this.current_board) {\n                this.expecting_board = true\n                this.expecting_board_since = Date.now()\n            }\n            return\n        }\n        if (this.current_board?.uid === board_uid) {\n            return\n        }\n        // We expect, that the board with the given `board_uid` will be shown ...\n        this.expecting_board = true\n        this.expecting_board_uid = board_uid\n        if (!this.expecting_board_since) {\n            this.expecting_board_since = Date.now()\n        }\n    }\n\n    board_shown(board: Board) {\n        this.current_board = board\n        if (this.expecting_board) {\n            this.expecting_board = false\n            if (this.expecting_board_uid) {\n                if (this.expecting_board_uid !== board.uid) {\n                    this.report(\"Unexpected board shown\", {\n                        shown: board.uid,\n                        expected: this.expecting_board_uid,\n                    })\n                }\n                this.expecting_board_uid = undefined\n            }\n            this.expecting_board_since = undefined\n        }\n    }\n\n    expect_patch_will_be_published(patch_uid: PatchUID) {\n        this.expecting_patches.set(patch_uid, Date.now())\n    }\n\n    patch_published(patch_uid: PatchUID) {\n        this.expecting_patches.delete(patch_uid)\n    }\n\n    validate() {\n        const now = Date.now()\n        if (this.expecting_board) {\n            if (now - this.expecting_board_since! > 10000) {\n                if (this.expecting_board_uid) {\n                    this.report(\"Board not shown within 10 seconds\", {\n                        expected: this.expecting_board_uid,\n                    })\n                } else {\n                    this.report(\"No board shown within 10 seconds\")\n                }\n                // Prevent that `this.report(...)` will be called again\n                // for the currently expected board ...\n                this.expecting_board = false\n                this.expecting_board_since = undefined\n                this.expecting_board_uid = undefined\n            }\n        }\n        for (const [patch_uid, t] of this.expecting_patches.entries()) {\n            if (\n                now - t > 10000 &&\n                this.network_state === \"online\" &&\n                now - this.network_state_changed_at! > 10000\n            ) {\n                this.report(\"Patch not published within 10 seconds\", {patch_uid})\n                // Prevent that `this.report(...)` will be called again for this patch ...\n                this.expecting_patches.delete(patch_uid)\n                // Stop iterating over remaining patches ...\n                break\n            }\n        }\n        if (debug_state) {\n            if (this.network_state === \"offline\" && now - this.network_state_changed_at! > 10000) {\n                runInAction(() => (debug_state.offline = true))\n            } else if (this.network_state === \"online\" && debug_state.offline) {\n                runInAction(() => (debug_state.offline = false))\n            }\n        }\n    }\n\n    private report(message: string, extra?: {[key: string]: any}) {\n        this.report_limiter.run((within_limit) => {\n            if (within_limit) {\n                report_info(message, extra)\n            }\n        })\n    }\n}\n\nexport const sensors = new Sensors()\n", "import {observable, runInAction} from \"mobx\"\nimport {\n    Board,\n    BoardUID,\n    ClingErrorCode,\n    create_PatchUID,\n    Patch,\n    PatchOp,\n    PatchOpContainer,\n    to_buffer,\n    to_uint8array,\n    PatchUID,\n    RemoveOp,\n    BlobUID,\n    BlobUIDMapping,\n} from \"@cling/lib.shared.model\"\nimport {log} from \"@cling/lib.shared.logging\"\nimport {report_error} from \"@cling/lib.shared.debug\"\nimport {assert, class_name, not_null} from \"@cling/lib.shared.utils\"\nimport * as MDC from \"@cling/lib.web.mdc\"\nimport {i18n} from \"@cling/lib.web.i18n\"\nimport {transform_patch_client} from \"@cling/lib.shared.model.patch/transform\"\nimport {board_resource, CurrentUser} from \"@cling/lib.web.resources\"\nimport apply_patch from \"@cling/lib.shared.model.patch/apply\"\nimport {sensors} from \"../debug/sensors\"\nimport {LimitExceeded, LIMIT_PATCH_OPS, LIMIT_SOFT_BOARD_SIZE} from \"@cling/lib.shared.limits\"\n\nlet current_user: CurrentUser\nlet publish_patch: (args: {\n    patch_uid: PatchUID\n    board_uids: BoardUID[]\n    patch: Patch\n    transformed_patches: Patch[]\n    patch_pb: Uint8Array\n    transformed_patches_pb: Uint8Array[]\n}) => void\n\nconst board_sizes = observable.map<BoardUID, number>()\n\nexport function init(current_user_: CurrentUser, publish_patch_: typeof publish_patch) {\n    current_user = current_user_\n    publish_patch = publish_patch_\n}\n\nexport function set_board_size(board_uid: BoardUID, value: number) {\n    runInAction(() => {\n        board_sizes.set(board_uid, value)\n    })\n}\n\nexport function show_snackbar_if_board_size_soft_limit_is_exceeded(board_uid: BoardUID): boolean {\n    if (!LIMIT_SOFT_BOARD_SIZE.test(board_sizes.get(board_uid) ?? 0)) {\n        MDC.Snackbar.show_message(i18n.the_board_is_too_big)\n        report_error(new LimitExceeded(LIMIT_SOFT_BOARD_SIZE, board_sizes.get(board_uid) ?? 0))\n        return true\n    }\n    return false\n}\n\nexport function new_Patch(\n    board_uid: BoardUID,\n    changes: PatchOp | Array<PatchOp>,\n    opts?: {blob_uid_mapping?: Map<BlobUID, BlobUID>},\n) {\n    const ops: Array<PatchOp> = Array.isArray(changes) ? changes : [changes]\n    const blob_uid_mapping = opts?.blob_uid_mapping\n        ? [...opts.blob_uid_mapping.entries()].map(\n              ([src, target]) => new BlobUIDMapping({src, target}),\n          )\n        : []\n    return new Patch({\n        uid: create_PatchUID(),\n        created_by: current_user.account.uid,\n        applied_at: new Date(Date.now()),\n        board_uid,\n        ops: ops.map(PatchOpContainer.from_op),\n        blob_uid_mapping,\n    })\n}\n\nexport function optimistic_update(\n    board_uid: BoardUID,\n    update: Patch | PatchOp | Array<PatchOp>,\n    {\n        is_local_change,\n        blob_uid_mapping,\n    }: {is_local_change?: boolean; blob_uid_mapping?: Map<BlobUID, BlobUID>} = {\n        is_local_change: false,\n    },\n): void {\n    let patch: Patch\n    if (update instanceof Patch) {\n        patch = update\n        patch.applied_at = new Date(Date.now())\n    } else {\n        patch = new_Patch(board_uid, update, {blob_uid_mapping})\n    }\n    LIMIT_PATCH_OPS.check(patch.ops.length)\n    const patch_pb = to_buffer(patch)\n    log.debug(`${is_local_change ? \"Local change\" : \"Optimistic update\"} ${patch.uid} ...\"`, {\n        patch,\n    })\n    let patch_applied = false\n    return runInAction(() => {\n        const transformed_patches = transform_patch_client(patch, (uid) =>\n            not_null(board_resource.read(uid)),\n        )\n        for (const transformed_patch of transformed_patches) {\n            if (!transformed_patch.ops.every((x) => x.op instanceof RemoveOp)) {\n                if (\n                    show_snackbar_if_board_size_soft_limit_is_exceeded(transformed_patch.board_uid)\n                ) {\n                    return\n                }\n            }\n        }\n        try {\n            if (is_local_change) {\n                assert(transformed_patches.length === 1, \"Unexpected local change\")\n                board_resource.apply_local_change(patch)\n                patch_applied = true\n            } else {\n                const transformed_patches_pb = transformed_patches.map(to_buffer)\n                _apply_patches(patch, transformed_patches)\n                patch_applied = true\n                publish_patch({\n                    patch,\n                    transformed_patches,\n                    patch_uid: patch.uid,\n                    board_uids: transformed_patches.map((x) => x.board_uid),\n                    patch_pb,\n                    transformed_patches_pb,\n                })\n                sensors.expect_patch_will_be_published(patch.uid)\n            }\n        } catch (error) {\n            const warn_only =\n                error.cling_error_code === ClingErrorCode.validate_board_card_on_wrong_board\n            if (warn_only) {\n                MDC.Snackbar.show_message(\n                    i18n.cling_error_code_msg(\n                        error.cling_error_code,\n                        i18n.sorry_something_went_wrong,\n                    ),\n                )\n            } else {\n                if (process.env.NODE_ENV === \"test\") {\n                    throw error\n                }\n                const m = !patch_applied\n                    ? \"Failed to apply patch\"\n                    : is_local_change\n                      ? \"Failed to save local change\"\n                      : \"Failed to publish patch\"\n                report_error(m, error)\n                MDC.Snackbar.show_message(i18n.sorry_something_went_wrong, i18n.reload_page, () =>\n                    reload(m + \", user choose to reload page\"),\n                )\n            }\n        }\n    })\n}\n\nfunction _apply_patches(source_patch: Patch, transformed_patches: Array<Patch>): void {\n    const added_boards: Array<Board> = []\n    const patched_boards: Array<Board> = []\n    try {\n        for (const patch of transformed_patches) {\n            const {board_uid} = patch\n            assert(\n                !added_boards.some((b) => b.uid === board_uid),\n                \"Invalid transformed_patches: there should be exactly one patch per board_uid\",\n            )\n            assert(\n                !patched_boards.some((b) => b.uid === board_uid),\n                \"Invalid transformed_patches: there should be exactly one patch per board_uid\",\n            )\n            const patch_description =\n                `patch ${patch.uid} [${patch.ops.slice(0, 5).map((x) => class_name(x.op))}` +\n                `${patch.ops.length > 5 ? \", ...\" : \"\"}]`\n            let board_before: Board | \"added\"\n            let board_before_version: number\n            if (patch.will_create_new_board) {\n                board_before = \"added\"\n                board_before_version = 0\n                log.debug(`Applying ${patch_description} ...`)\n            } else {\n                board_before = not_null(board_resource.read(board_uid))\n                patched_boards.push(board_before)\n                board_before_version = board_before.version\n                log.debug(\n                    `Applying ${patch_description}` +\n                        ` to board ${board_before.uid} (version: ${board_before_version} => ${\n                            board_before_version + 1\n                        }) ...`,\n                )\n            }\n            const board_after = apply_patch(patch, board_before)\n            if (board_before === \"added\") {\n                assert(board_after instanceof Board, `Invalid patch: \"added\" => \"${board_after}\"`)\n                assert((board_after as Board).uid === board_uid, `board_after.uid !== board_uid`)\n                assert(\n                    (board_after as Board).version === 1,\n                    `Added board has unexpected version: ${(board_after as Board).version}`,\n                )\n                added_boards.push(board_after as Board)\n            } else if (board_after !== \"removed\") {\n                assert(board_after === board_before, `board_after !== board_before`)\n                assert(board_after.uid === board_uid, `board_after.uid !== board_uid`)\n                assert(\n                    board_after.version === board_before_version + 1,\n                    `Unexpected version change: ${board_before_version} => ${board_after.version}`,\n                )\n            }\n        }\n    } catch (error) {\n        const source_patch_desc =\n            `patch [${class_name(source_patch.ops[0]?.op)}` +\n            `${source_patch.ops.length > 1 ? \", ...\" : \"\"}]`\n        report_error(\n            `Applying ${source_patch_desc} failed -- resetting all patched boards ...`,\n            error,\n        )\n        patched_boards.forEach((board) => board_resource.discard_cache_entry(board.uid))\n        throw error\n    }\n    if (added_boards.length > 0) {\n        board_resource.add_directly_to_cache(added_boards.map(to_uint8array))\n    }\n}\n\nexport function __test_only__clear_board_sizes() {\n    board_sizes.clear()\n}\n", "import {\n    Board,\n    Patch,\n    Blob,\n    PatchOpContainer,\n    SetBoardName,\n    SetBoardBoardStyle,\n    BoardStyle,\n    BlobUIDMapping,\n} from \"@cling/lib.shared.model\"\nimport {runInAction} from \"mobx\"\nimport {board_resource} from \"@cling/lib.web.resources\"\nimport {new_Patch, optimistic_update} from \"./patch\"\nimport {assert} from \"@cling/lib.shared.utils\"\n\nexport class ChangeBoardSettings {\n    patch: Patch\n    final_background_image_blob?: Blob\n    old_settings: {\n        name: string\n        background_image_url: string\n        background_color: string\n        background_image_blob?: Blob\n    }\n\n    constructor(board: Board, op: SetBoardName | SetBoardBoardStyle) {\n        this.old_settings = {\n            name: board.name,\n            background_image_url: board.board_style.background_image_url,\n            background_color: board.board_style.background_color,\n            background_image_blob: board.board_style.background_image_blob,\n        }\n        this.patch = new_Patch(board.uid, op)\n    }\n\n    set_name_locally(value: string) {\n        const {patch} = this\n        const poc = patch.ops.find((x) => x.SetBoardName as any)\n        if (!value) {\n            value = this.old_settings.name\n        }\n        if (poc) {\n            poc.SetBoardName!.value = value\n        } else {\n            patch.ops.push(PatchOpContainer.from_op(new SetBoardName({value})))\n        }\n        optimistic_update(patch.board_uid, patch, {is_local_change: true})\n    }\n\n    set_board_style({\n        background_image_blob,\n        copied_from,\n        color,\n        is_pattern,\n    }: {\n        background_image_blob: Blob\n        copied_from?: Blob\n        color?: string\n        is_pattern: boolean\n    }) {\n        const {patch} = this\n        const op = this.board_style_patch_op()\n        this.final_background_image_blob = background_image_blob\n        // We \"cheat\" here by using `copied_from` as the background image blob.\n        op.value.background_image_blob = copied_from || background_image_blob\n        op.value.background_image_url = \"\"\n        if (color) {\n            op.value.background_color = color\n        }\n        op.value.background_is_pattern = is_pattern\n        optimistic_update(patch.board_uid, patch, {is_local_change: true})\n    }\n\n    publish_changes() {\n        const {patch, old_settings} = this\n        const changes = [] as Array<PatchOpContainer>\n        for (const poc of patch.ops) {\n            const {SetBoardName: set_name, SetBoardBoardStyle: set_board_style} = poc\n            if (\n                (set_name && set_name.value !== old_settings.name) ||\n                (set_board_style &&\n                    set_board_style.value.background_image_url !==\n                        old_settings.background_image_url) ||\n                (set_board_style &&\n                    set_board_style.value.background_image_blob !==\n                        old_settings.background_image_blob) ||\n                (set_board_style &&\n                    set_board_style.value.background_color !== old_settings.background_color)\n            ) {\n                changes.push(poc)\n            }\n            if (set_board_style?.value.background_image_blob) {\n                assert(this.final_background_image_blob)\n                if (\n                    this.final_background_image_blob.uid !==\n                    set_board_style.value.background_image_blob.uid\n                ) {\n                    patch.blob_uid_mapping = [\n                        new BlobUIDMapping({\n                            src: set_board_style.value.background_image_blob.uid,\n                            target: this.final_background_image_blob!.uid,\n                        }),\n                    ]\n                }\n                set_board_style.value.background_image_blob = this.final_background_image_blob!\n            }\n        }\n        runInAction(() => {\n            board_resource.remove_local_change(patch.board_uid)\n            if (changes.length) {\n                this.patch.ops = changes\n                optimistic_update(patch.board_uid, patch)\n            }\n        })\n    }\n\n    private board_style_patch_op(): SetBoardBoardStyle {\n        const {patch} = this\n        let op = patch.ops.find((x) => x.SetBoardBoardStyle as any)\n        if (!op) {\n            op = new PatchOpContainer({\n                SetBoardBoardStyle: new SetBoardBoardStyle({value: new BoardStyle({})}),\n            })\n            patch.ops.push(op)\n        }\n        return op.SetBoardBoardStyle!\n    }\n}\n", "/* eslint-disable no-control-regex */\n// Based on https://github.com/parshap/node-sanitize-filename/blob/master/index.js\n\nconst illegalRe = /[/?<>\\\\:*\"'|]/g // ... Note: We allow the double quote character in file names!\nconst controlRe = /[\\x00-\\x1f\\x80-\\x9f]/g\nconst unicodeRe =\n    // eslint-disable-next-line no-misleading-character-class\n    /[\\u0378\\u0379\\u037F-\\u0383\\u038B\\u038D\\u03A2\\u0528-\\u0530\\u0557\\u0558\\u0560\\u0588\\u058B-\\u058E\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EF\\u05F5-\\u0605\\u061C\\u061D\\u06DD\\u070E\\u070F\\u074B\\u074C\\u07B2-\\u07BF\\u07FB-\\u07FF\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F-\\u089F\\u08A1\\u08AD-\\u08E3\\u08FF\\u0978\\u0980\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FC-\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A76-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B55\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0C00\\u0C04\\u0C0D\\u0C11\\u0C29\\u0C34\\u0C3A-\\u0C3C\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5A-\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C77\\u0C80\\u0C81\\u0C84\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDD\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0D01\\u0D04\\u0D0D\\u0D11\\u0D3B\\u0D3C\\u0D45\\u0D49\\u0D4F-\\u0D56\\u0D58-\\u0D5F\\u0D64\\u0D65\\u0D76-\\u0D78\\u0D80\\u0D81\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E86\\u0E89\\u0E8B\\u0E8C\\u0E8E-\\u0E93\\u0E98\\u0EA0\\u0EA4\\u0EA6\\u0EA8\\u0EA9\\u0EAC\\u0EBA\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F5-\\u13FF\\u169D-\\u169F\\u16F1-\\u16FF\\u170D\\u1715-\\u171F\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u180F\\u181A-\\u181F\\u1878-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191D-\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE-\\u1AFF\\u1B4C-\\u1B4F\\u1B7D-\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C80-\\u1CBF\\u1CC8-\\u1CCF\\u1CF7-\\u1CFF\\u1DE7-\\u1DFB\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20BB-\\u20CF\\u20F1-\\u20FF\\u218A-\\u218F\\u23F4-\\u23FF\\u2427-\\u243F\\u244B-\\u245F\\u2700\\u2B4D-\\u2B4F\\u2B5A-\\u2BFF\\u2C2F\\u2C5F\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E3C-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u312E-\\u3130\\u318F\\u31BB-\\u31BF\\u31E4-\\u31EF\\u321F\\u32FF\\u4DB6-\\u4DBF\\u9FCD-\\u9FFF\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA698-\\uA69E\\uA6F8-\\uA6FF\\uA78F\\uA794-\\uA79F\\uA7AB-\\uA7F7\\uA82C-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C5-\\uA8CD\\uA8DA-\\uA8DF\\uA8FC-\\uA8FF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9E0-\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAA7C-\\uAA7F\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F-\\uABBF\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uF8FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC2-\\uFBD2\\uFD40-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFE\\uFDFF\\uFE1A-\\uFE1F\\uFE27-\\uFE2F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD-\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFFB\\uFFFE\\uFFFF]/g\nconst reservedRe = /^\\.+$/\nconst windowsReservedRe = /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\\..*)?$/i\nconst windowsTrailingRe = /[. ]+$/\n\n/**\n * Removes characters in strings that are illegal/unsafe for filenames.\n *\n * Illegal Characters on Various Operating Systems\n * / ? < > \\ : * | \"\n * https://kb.acronis.com/content/39790\n *\n * Unicode Control codes\n * C0 0x00-0x1f & C1 (0x80-0x9f)\n * http://en.wikipedia.org/wiki/C0_and_C1_control_codes\n *\n * Unicode non-printable codes\n *\n * Reserved filenames on Unix-based systems (\".\", \"..\")\n * Reserved filenames in Windows (\"CON\", \"PRN\", \"AUX\", \"NUL\", \"COM1\",\n * \"COM2\", \"COM3\", \"COM4\", \"COM5\", \"COM6\", \"COM7\", \"COM8\", \"COM9\",\n * \"LPT1\", \"LPT2\", \"LPT3\", \"LPT4\", \"LPT5\", \"LPT6\", \"LPT7\", \"LPT8\", and\n * \"LPT9\") case-insensitively and with or without filename extensions.\n *\n * Capped at 255 characters in length.\n *\n * Note: Might return the empty string `\"\"`, which is not a valid file name!\n */\nexport function sanitize_file_name(s: string) {\n    try {\n        s = s.normalize()\n    } catch {\n        // We want to be on the safe side, so replace all non-ascii characters.\n        s = s.replace(/[^\\x00-\\x7F]/g, \"\")\n    }\n    s = s\n        .trim()\n        .replace(illegalRe, \"\")\n        .replace(unicodeRe, \"\")\n        .replace(controlRe, \"\")\n        .replace(reservedRe, \"\")\n        .replace(windowsReservedRe, \"\")\n        .replace(windowsTrailingRe, \"\")\n    if (s.length > 255) {\n        // Try to keep the file name extension.\n        const i = s.lastIndexOf(\".\")\n        if (i >= 0) {\n            const extension = s.substring(i)\n            // Heuristic: If `extension` is longer than 20 characters,\n            //            it is probably not a file name extension.\n            if (extension.length > 20) {\n                s = s.substring(0, 255)\n            } else {\n                s = s.substring(0, 255 - extension.length) + extension\n            }\n        } else {\n            s = s.substring(0, 255)\n        }\n    }\n    return s\n}\n\nexport function is_valid_file_name(s: string): boolean {\n    if (!s) {\n        return false\n    }\n    try {\n        s = s.normalize()\n    } catch {\n        // Ignored\n    }\n    return s === sanitize_file_name(s)\n}\n", "import {URL as NodeURL} from \"url\"\n// This is shared code, so we have do some tricks to make it work in Node and the browser.\nlet URL_: typeof NodeURL\nif (typeof NodeURL !== \"undefined\") {\n    URL_ = NodeURL\n} else {\n    URL_ = (global as any).URL\n}\n\nexport function find_urls(s: string): Array<[number, number]> {\n    const result: Array<[number, number]> = []\n    let i = 0\n    for (;;) {\n        const m = /http(s)?:\\/\\/[^\\s<]+/.exec(s)\n        if (!m) {\n            break\n        }\n        const j = m.index\n        let candidate = m[0]\n        let n = candidate.length\n        while (n && !is_valid_URL(candidate)) {\n            candidate = candidate.substr(0, --n)\n        }\n        if (n) {\n            // Ignore last character if it is probably punctuation ...\n            if (/[.?,]/.test(candidate.charAt(n - 1))) {\n                candidate = candidate.substr(0, --n)\n            }\n            // Special handling for \")\" character: Truncate URL at first \")\" character\n            // for which there is no preceding \"(\" character in `candidate` ...\n            let open_parentheses = 0\n            for (let k = 0; k < n; ++k) {\n                const c = candidate.charAt(k)\n                if (c === \"(\") {\n                    ++open_parentheses\n                } else if (c === \")\") {\n                    if (!open_parentheses) {\n                        n = k\n                    } else {\n                        --open_parentheses\n                    }\n                }\n            }\n            result.push([i + j, n])\n        } else {\n            // Skip bad candidate ...\n            n = 1\n        }\n        s = s.substr(j + n)\n        i += j + n\n    }\n    return result\n}\n\nfunction is_valid_URL(s: string) {\n    try {\n        return decodeURIComponent(new URL_(s).hostname).length > 1\n    } catch {\n        return false\n    }\n}\n", "import {\n    AccessLevel,\n    AccountUID,\n    AddBoard,\n    AddBoardValue,\n    AddCard,\n    AddCardValue,\n    AddComment,\n    AddCommentValue,\n    AddBoardInviteValue,\n    AddPeopleBoard,\n    AddPeopleBoardValue,\n    Blob,\n    Board,\n    BoardStyle,\n    BoardType,\n    BoardUID,\n    Card,\n    CardColor,\n    CardUID,\n    Column,\n    Comment,\n    CopyCard,\n    create_CardUID,\n    create_CommentUID,\n    create_BoardInviteUID,\n    create_PatchUID,\n    CustomAddBoardInvite,\n    CustomAddTask,\n    CustomRemoveBoardACL,\n    CustomRemoveComment,\n    CustomRemoveTask,\n    CustomSetBoardACLAccessLevel,\n    CustomSetBoardOwner,\n    derive_clipboard_uid,\n    derive_people_board_uid,\n    derive_trashcan_uid,\n    EngagementType,\n    File,\n    FileCard as FileCardModel,\n    BoardInvite,\n    Link,\n    LinkCard as LinkCardModel,\n    LinkStyle,\n    MoveCard,\n    Note,\n    NoteCard as NoteCardModel,\n    Patch,\n    PatchAccountBoardSettings,\n    PatchAccountSettings,\n    PatchFullAccountRequest,\n    PatchOp,\n    PatchOpContainer,\n    PrincipalUID,\n    RemoveBoard,\n    RemoveCard,\n    RemoveBoardInvite,\n    SetBoardBoardStyle,\n    SetBoardName,\n    SetCardArchived,\n    SetCardColor,\n    SetCardFileBlob,\n    SetCardFileDisplay,\n    SetCardFileFileName,\n    SetCardFileTitle,\n    SetCardLinkStyle,\n    SetCardLinkTitle,\n    SetCardLinkURL,\n    SetCardNoteSafeHtml,\n    SetCardNoteTitle,\n    SetTaskAssignee,\n    SetTaskDate,\n    SetTaskStatus,\n    TaskStatus,\n    title_images_board_uid,\n    BlobUID,\n    SetCardFilePreviewImageBlob,\n    CopyBoard,\n    SetBoardIndexedBySearchEngines,\n    CustomAddBoardACL,\n    CLING_PUBLIC,\n    ImageCardDisplay,\n    ImageCardDisplayKind,\n    background_images_board_uid,\n    create_BlobUID,\n    FileCard,\n} from \"@cling/lib.shared.model\"\nimport {i18n} from \"@cling/lib.web.i18n\"\nimport {assert, not_null} from \"@cling/lib.shared.utils\"\nimport {action, runInAction} from \"mobx\"\nimport {Snackbar} from \"@cling/lib.web.mdc/snackbar\"\nimport type {InsertPos} from \"./types\"\nimport {report_user_engagement} from \"@cling/lib.web.analytics\"\nimport {ChangeBoardSettings} from \"./change_board_settings\"\nimport {board_info_resource, board_resource, CurrentUser} from \"@cling/lib.web.resources\"\nimport {report_error} from \"@cling/lib.shared.debug\"\nimport {log} from \"@cling/lib.shared.logging\"\nimport {\n    Limit,\n    LIMIT_HTML,\n    LIMIT_PATCH_OPS,\n    LIMIT_SMALL_TEXT,\n    LIMIT_URL,\n} from \"@cling/lib.shared.limits\"\nimport {is_valid_file_name} from \"@cling/lib.shared.utils/file_name\"\nimport {goto_dashboard} from \"../utils\"\nimport {new_Patch, optimistic_update} from \"./patch\"\nimport {board_quota_limits} from \"@cling/lib.shared.model/quota\"\nimport {call_function} from \"@cling/lib.shared.faas\"\nimport {promp_state} from \"../dialogs/prompt\"\nimport {find_urls} from \"@cling/lib.shared.utils/find_urls\"\nimport escape_string_regexp from \"escape-string-regexp\"\nimport type {UserInterfaceState} from \"./user_interface_state\"\n\nlet local_change:\n    | {\n          change_board_settings: ChangeBoardSettings\n          add_card?: never\n      }\n    | {\n          add_card: Patch\n          change_board_settings?: never\n      }\n    | undefined\n\nlet current_user: CurrentUser\nlet ui_state: UserInterfaceState\nlet ui_actions: ReturnType<typeof ui_state.actions>\n\nexport function init(args: {\n    current_user: CurrentUser\n    ui_state: UserInterfaceState\n    ui_actions: ReturnType<typeof ui_state.actions>\n}) {\n    current_user = args.current_user\n    ui_state = args.ui_state\n    ui_actions = args.ui_actions\n}\n\nconst model_actions = {\n    async add_board(board_uid: BoardUID, name: string) {\n        const [board_style, src_blob_uid] = await random_board_style()\n        optimistic_update(\n            board_uid,\n            new AddBoard({value: new AddBoardValue({name, board_style})}),\n            {\n                blob_uid_mapping: new Map([[src_blob_uid, board_style.background_image_blob!.uid]]),\n            },\n        )\n        report_user_engagement(EngagementType.add_board)\n    },\n\n    async add_people_board_if_needed(share_with: AccountUID): Promise<BoardUID> {\n        const board_uid = derive_people_board_uid(current_user.account.uid, share_with)\n        if (\n            board_info_resource\n                .read_all()\n                .some((x) => x.board_type === BoardType.people && x.acl.all.includes(share_with))\n        ) {\n            // Ok, there is already a people board with that user.\n            return board_uid\n        }\n        const [board_style, src_blob_uid] = await random_board_style()\n        optimistic_update(\n            board_uid,\n            new AddPeopleBoard({\n                value: new AddPeopleBoardValue({board_style, account_uid: share_with}),\n            }),\n            {blob_uid_mapping: new Map([[src_blob_uid, board_style.background_image_blob!.uid]])},\n        )\n        report_user_engagement(EngagementType.add_board)\n        return board_uid\n    },\n\n    copy_board({\n        src_board_uid,\n        new_board_uid,\n        name,\n    }: {\n        src_board_uid: BoardUID\n        new_board_uid: BoardUID\n        name: string\n    }) {\n        optimistic_update(new_board_uid, [\n            new CopyBoard({src_board_uid}),\n            new SetBoardName({value: name}),\n        ])\n        report_user_engagement(EngagementType.add_board)\n    },\n\n    rename_board_locally(board: Board, value: string) {\n        if (local_change && !local_change.change_board_settings) {\n            discard_local_change()\n        }\n        if (local_change?.change_board_settings) {\n            assert(\n                board.uid === local_change.change_board_settings.patch.board_uid,\n                \"BoardUID mismatch\",\n            )\n            local_change.change_board_settings.set_name_locally(value)\n        } else if (value) {\n            local_change = {\n                change_board_settings: new ChangeBoardSettings(board, new SetBoardName({value})),\n            }\n        }\n    },\n\n    set_board_style_locally({\n        board,\n        background_image_blob,\n        copied_from,\n        color,\n        is_pattern,\n    }: {\n        board: Board\n        background_image_blob: Blob\n        copied_from?: Blob\n        color?: string\n        is_pattern: boolean\n    }) {\n        if (local_change && !local_change.change_board_settings) {\n            discard_local_change()\n        }\n        if (local_change?.change_board_settings) {\n            assert(\n                board.uid === local_change.change_board_settings.patch.board_uid,\n                \"BoardUID mismatch\",\n            )\n            local_change.change_board_settings.set_board_style({\n                background_image_blob,\n                copied_from,\n                color,\n                is_pattern,\n            })\n        } else if (background_image_blob) {\n            local_change = {\n                change_board_settings: new ChangeBoardSettings(\n                    board,\n                    new SetBoardBoardStyle({\n                        value: new BoardStyle({}),\n                    }),\n                ),\n            }\n            local_change.change_board_settings.set_board_style({\n                background_image_blob,\n                copied_from,\n                color,\n                is_pattern,\n            })\n        }\n    },\n\n    publish_changed_board_settings() {\n        if (local_change?.change_board_settings) {\n            try {\n                local_change.change_board_settings.publish_changes()\n            } finally {\n                discard_local_change()\n            }\n        }\n    },\n\n    discard_changed_board_settings() {\n        if (local_change?.change_board_settings) {\n            discard_local_change()\n        }\n    },\n\n    add_invite(\n        board: Board,\n        invited:\n            | {email: string; principal_uid?: never}\n            | {email?: never; principal_uid: PrincipalUID},\n        access_level: AccessLevel,\n    ) {\n        optimistic_update(\n            board.uid,\n            new CustomAddBoardInvite({\n                value: new AddBoardInviteValue({\n                    uid: create_BoardInviteUID(),\n                    email: invited.email,\n                    principal_uid: invited.principal_uid,\n                    access_level,\n                }),\n            }),\n        )\n        report_user_engagement(EngagementType.share_board)\n    },\n\n    revoke_invite(board: Board, invite: BoardInvite) {\n        optimistic_update(board.uid, new RemoveBoardInvite({uid: invite.uid}))\n    },\n\n    remove_acl_entry(board: {uid: BoardUID}, principal_uid: PrincipalUID) {\n        const do_it = () => {\n            optimistic_update(board.uid, new CustomRemoveBoardACL({value: principal_uid}))\n        }\n        if (principal_uid === current_user.account.uid) {\n            promp_state.show_prompt({\n                title: i18n.leave_this_board,\n                content: i18n.you_will_no_longer_be_able_to_access_this_shared_board,\n                button_label_accept: i18n.leave_board,\n                button_label_cancel: i18n.cancel,\n                desktop_focus: \"cancel\",\n                onAccept: () => {\n                    ui_actions.close_dialog()\n                    // Note: Order is important here: We need to call `goto_dashboard()`\n                    // first, because otherwise the `BoardPage` would try to render with\n                    // the board, which is no longer accessible.\n                    goto_dashboard().then(do_it).catch(report_error)\n                },\n            })\n        } else {\n            do_it()\n        }\n    },\n\n    change_access_level(board: Board, principal_uid: PrincipalUID, access_level: AccessLevel) {\n        optimistic_update(\n            board.uid,\n            new CustomSetBoardACLAccessLevel({principal_uid, access_level}),\n        )\n    },\n\n    change_owner(board: Board, account_uid: AccountUID) {\n        promp_state.show_prompt({\n            title: i18n.change_ownership,\n            content: i18n.only_a_single_person_can_be_the_owner,\n            button_label_accept: i18n.change_ownership,\n            button_label_cancel: i18n.cancel,\n            desktop_focus: \"accept\",\n            onAccept: () => {\n                optimistic_update(board.uid, new CustomSetBoardOwner({account_uid}))\n            },\n        })\n    },\n\n    remove_board(board: {uid: BoardUID; board_type: BoardType}) {\n        assert(board.board_type === BoardType.regular, \"Only regular boards can be removed\")\n        promp_state.show_prompt({\n            title: i18n.remove_this_board,\n            content: i18n.you_can_either_archive_this_board_or_remove_it_permanently,\n            button_label_accept: i18n.archive,\n            button_label_cancel: i18n.cancel,\n            desktop_focus: \"cancel\",\n            more_buttons: [\n                {\n                    label: i18n.remove_permanently,\n                    \"data-test-id\": \"remove_board_permanently\",\n                    onClick: () => {\n                        promp_state.show_prompt({\n                            title: i18n.permanently_remove_this_board,\n                            content: i18n.this_cannot_be_undone,\n                            button_label_accept: i18n.remove_permanently,\n                            button_label_cancel: i18n.cancel,\n                            desktop_focus: \"cancel\",\n                            onAccept: () => {\n                                goto_dashboard({replace: true})\n                                    .then(() => {\n                                        optimistic_update(board.uid, new RemoveBoard({}))\n                                    })\n                                    .catch(report_error)\n                            },\n                        })\n                    },\n                },\n            ],\n            onAccept: () => {\n                goto_dashboard({replace: true})\n                    .then(() => model_actions.archive_board(board))\n                    .catch(report_error)\n            },\n        })\n    },\n\n    empty_trashcan() {\n        promp_state.show_prompt({\n            title: i18n.permanently_remove_all_cards_in_trashcan,\n            button_label_accept: i18n.empty_trashcan,\n            button_label_cancel: i18n.cancel,\n            desktop_focus: \"cancel\",\n            onAccept: () => {\n                const {trashcan} = board_resource\n                if (trashcan.inbox.children.length === 0) {\n                    return\n                }\n                const remove = trashcan.inbox.children.slice(0)\n                while (remove.length > 0) {\n                    optimistic_update(\n                        trashcan.uid,\n                        remove\n                            .splice(0, LIMIT_PATCH_OPS.upper_bound)\n                            .map((x) => new RemoveCard({uid: x.uid})),\n                    )\n                }\n            },\n        })\n    },\n\n    remove_comment(board: Board, comment: Comment) {\n        promp_state.show_prompt({\n            title: i18n.remove_comment,\n            content: i18n.removing_a_comment,\n            button_label_accept: i18n.remove_permanently,\n            button_label_cancel: i18n.cancel,\n            desktop_focus: \"cancel\",\n            onAccept: () => {\n                optimistic_update(board.uid, new CustomRemoveComment({uid: comment.uid}))\n            },\n        })\n    },\n\n    remove_card(board: Board, card: Card) {\n        if (board.board_type === BoardType.trashcan) {\n            promp_state.show_prompt({\n                title: i18n.permanently_remove_this_card,\n                button_label_accept: i18n.remove_permanently,\n                button_label_cancel: i18n.cancel,\n                desktop_focus: \"cancel\",\n                onAccept: () => {\n                    optimistic_update(board.uid, new RemoveCard({uid: card.uid}))\n                },\n            })\n        } else {\n            const move_card = () => {\n                const parent = card.parent\n                const undo_op = new MoveCard({\n                    uid: card.uid,\n                    target_board_uid: board.uid,\n                    target_card_uid: parent.uid,\n                    target_pos: parent.children.findIndex((x) => x === card),\n                })\n                const trashcan_uid = derive_trashcan_uid(current_user.account.uid)\n                optimistic_update(\n                    board.uid,\n                    new MoveCard({\n                        uid: card.uid,\n                        target_board_uid: trashcan_uid,\n                    }),\n                )\n                Snackbar.show_message(\n                    i18n.moved_cards_to_trashcan(1 + card.num_deep_children),\n                    i18n.undo,\n                    () => {\n                        optimistic_update(trashcan_uid, undo_op)\n                    },\n                )\n            }\n            if (ui_state.search_state.has_hidden_deep_children(card)) {\n                promp_state.show_prompt({\n                    title: i18n.this_card_contains_hidden_cards,\n                    button_label_accept: i18n.remove_anyway,\n                    button_label_cancel: i18n.cancel,\n                    desktop_focus: \"cancel\",\n                    content: i18n.some_cards_are_not_shown(() => {\n                        ui_actions.show_archived(true).catch(report_error)\n                    }),\n                    onAccept: move_card,\n                })\n            } else {\n                move_card()\n            }\n        }\n    },\n\n    toggle_card_archived(board: Board, card: Card) {\n        const {archived} = card\n        const ops: PatchOp[] = [\n            new SetCardArchived({\n                uid: card.uid,\n                value: !archived,\n            }),\n        ]\n        if (archived) {\n            if (card.parent.archived) {\n                report_error(\"Cannot unarchive a card if the containing card is archived\")\n                Snackbar.show_message(i18n.sorry_something_went_wrong)\n                return\n            }\n        }\n        const undo_ops: PatchOp[] = []\n        if (!archived) {\n            // Undo-action that unarchives the card itself as well as all children currently not\n            // archived.\n            undo_ops.push(\n                new SetCardArchived({\n                    uid: card.uid,\n                    value: false,\n                }),\n            )\n            undo_ops.push(\n                ...card.deep_children\n                    .filter((x) => !x.archived)\n                    .map((x) => {\n                        return new SetCardArchived({uid: x.uid, value: false})\n                    }),\n            )\n        }\n        optimistic_update(board.uid, ops)\n        if (undo_ops.length) {\n            Snackbar.show_message(i18n.card_archived, i18n.undo, () => {\n                optimistic_update(board.uid, undo_ops)\n            })\n        }\n    },\n\n    update_task_if_needed({\n        board,\n        card,\n        assignee,\n        date,\n        status,\n        force_create,\n    }: {\n        board: Board\n        card: Card\n        assignee: AccountUID | undefined\n        date: Date | undefined\n        status: TaskStatus\n        force_create?: boolean\n    }) {\n        const {task} = card\n        const ops = []\n        if ((!task && assignee) || (task && assignee !== task.assignee)) {\n            ops.push(\n                new SetTaskAssignee({\n                    uid: card.uid,\n                    value: assignee,\n                }),\n            )\n        }\n        if ((!task && date) || (task && date !== task.date)) {\n            ops.push(\n                new SetTaskDate({\n                    uid: card.uid,\n                    value: date,\n                }),\n            )\n        }\n        if ((!task && status !== TaskStatus.task_open) || (task && status !== task.status)) {\n            ops.push(\n                new SetTaskStatus({\n                    uid: card.uid,\n                    value: status,\n                }),\n            )\n        }\n        if (ops.length || (!task && force_create)) {\n            ops.unshift(new CustomAddTask({uid: card.uid}))\n            optimistic_update(board.uid, ops)\n            if (!task) {\n                report_user_engagement(EngagementType.add_task)\n            } else {\n                report_user_engagement(EngagementType.edit_task)\n            }\n        }\n    },\n\n    remove_task(board: Board, card: Card) {\n        const {task} = card\n        if (!task) {\n            return\n        }\n        optimistic_update(board.uid, new CustomRemoveTask({uid: card.uid}))\n    },\n\n    cut_card(board: Board, card: Card) {\n        const {clipboard} = board_resource\n        const parent = card.parent\n        const undo_op = new MoveCard({\n            uid: card.uid,\n            target_board_uid: board.uid,\n            target_card_uid: parent.uid,\n            target_pos: parent.children.findIndex((x) => x === card),\n        })\n        const clipboard_uid = derive_clipboard_uid(current_user.account.uid)\n        optimistic_update(\n            board.uid,\n            new MoveCard({\n                uid: card.uid,\n                target_pos: 0,\n                target_board_uid: clipboard.uid,\n                target_card_uid: clipboard.inbox.uid,\n            }),\n        )\n        Snackbar.show_message(\n            i18n.moved_cards_to_clipboard(1 + card.num_deep_children),\n            i18n.undo,\n            () => {\n                optimistic_update(clipboard_uid, undo_op)\n            },\n        )\n    },\n\n    copy_card(board: Board, card: Card) {\n        const {clipboard} = board_resource\n        optimistic_update(\n            board.uid,\n            new CopyCard({\n                uid: card.uid,\n                target_pos: 0,\n                target_board_uid: clipboard.uid,\n                target_card_uid: clipboard.inbox.uid,\n            }),\n        )\n        Snackbar.show_message(i18n.copied_cards_to_clipboard(1 + card.num_deep_children))\n    },\n\n    send_to_board({board, card, target_board}: {board: Board; card: Card; target_board: Board}) {\n        const parent = card.parent\n        const undo_op = new MoveCard({\n            uid: card.uid,\n            target_board_uid: board.uid,\n            target_card_uid: parent.uid,\n            target_pos: parent.children.findIndex((x) => x === card),\n        })\n        report_user_engagement(EngagementType.move_card)\n        optimistic_update(\n            board.uid,\n            new MoveCard({\n                uid: card.uid,\n                target_pos: 0,\n                target_board_uid: target_board.uid,\n            }),\n        )\n        Snackbar.show_message(i18n.moved_cards(1 + card.deep_children.length), i18n.undo, () => {\n            optimistic_update(target_board.uid, undo_op)\n        })\n    },\n\n    /**\n     * If `insert_pos.target_card_uid` refers to the root, a new column is added (or reused) first.\n     */\n    paste_card(board: Board, insert_pos: InsertPos) {\n        const {clipboard} = board_resource\n        const visible_clipboard_children = ui_state.search_state.visible_children(clipboard.inbox)\n        if (visible_clipboard_children.length === 0) {\n            // Nothing to paste.\n            return\n        }\n        const card_in_clipboard = visible_clipboard_children[0]\n        if (board.card(insert_pos.target_card_uid).root) {\n            const {column_uid, column_patch_op} = add_or_reuse_column_locally(\n                board,\n                insert_pos.target_pos,\n            )\n            if (column_patch_op) {\n                optimistic_update(board.uid, column_patch_op)\n            }\n            insert_pos.target_card_uid = column_uid\n            insert_pos.target_pos = 0\n        }\n        report_user_engagement(EngagementType.move_card)\n        optimistic_update(\n            clipboard.uid,\n            new MoveCard({\n                uid: card_in_clipboard.uid,\n                target_pos: insert_pos.target_pos,\n                target_board_uid: board.uid,\n                target_card_uid: insert_pos.target_card_uid,\n            }),\n        )\n    },\n\n    on_note_editor_closed(\n        board: Board,\n        card_copy_before: NoteCardModel,\n        values: {\n            title: string\n            safe_html: string\n            new_color?: CardColor\n        },\n    ) {\n        const uid = card_copy_before.uid\n        const {title, safe_html, new_color} = values\n        const is_valid_change =\n            is_within_limit(title, LIMIT_SMALL_TEXT) && is_within_limit(safe_html, LIMIT_HTML)\n        const urls = find_urls(safe_html).map(([i, n]) => safe_html.substring(i, i + n))\n        runInAction(() => {\n            if (local_change?.add_card) {\n                const patch = local_change.add_card\n                assert(patch.board_uid === board.uid, \"BoardUID mismatch\")\n                try {\n                    const add_card_value = patch.ops[patch.ops.length - 1].AddCard!.value\n                    if (typeof new_color !== \"undefined\") {\n                        patch.ops.push(\n                            PatchOpContainer.from_op(\n                                new SetCardColor({uid: add_card_value.uid, value: new_color}),\n                            ),\n                        )\n                    }\n                    if (!is_valid_change) {\n                        return\n                    }\n                    if (\n                        urls.length === 1 &&\n                        safe_html.match(`^<p>\\\\s*${escape_string_regexp(urls[0])}\\\\s*</p>$`)\n                    ) {\n                        // Oh, this is just a link card!\n                        runInAction(() => {\n                            discard_local_change()\n                            add_card_value.note = undefined\n                            add_card_value.link = new Link({url: urls[0], title})\n                            optimistic_update(board.uid, patch)\n                        })\n                        report_user_engagement(EngagementType.add_card)\n                        return\n                    }\n                    if (title || safe_html) {\n                        runInAction(() => {\n                            discard_local_change()\n                            const note = not_null(add_card_value.note)\n                            const card = board.card(uid) as NoteCardModel\n                            card.note.title = note.title = title || \"\"\n                            card.note.safe_html = note.safe_html = safe_html || \"\"\n                            card.color = new_color || CardColor.no_color\n                            optimistic_update(board.uid, patch)\n                        })\n                        report_user_engagement(EngagementType.add_card)\n                    }\n                } finally {\n                    discard_local_change()\n                }\n            } else if (is_valid_change) {\n                const ops = []\n                if (card_copy_before.note.title !== title) {\n                    ops.push(new SetCardNoteTitle({uid, value: title}))\n                }\n                if (card_copy_before.note.safe_html !== safe_html) {\n                    ops.push(new SetCardNoteSafeHtml({uid, value: safe_html}))\n                }\n                if (typeof new_color !== \"undefined\" && card_copy_before.color !== new_color) {\n                    ops.push(new SetCardColor({uid, value: new_color}))\n                }\n                if (ops.length) {\n                    report_user_engagement(EngagementType.edit_card)\n                    optimistic_update(board.uid, ops)\n                }\n            }\n            return false\n        })\n    },\n\n    on_link_editor_closed(\n        board: Board,\n        card_copy_before: LinkCardModel,\n        values: {title: string; url: string; new_color?: CardColor; style?: LinkStyle},\n    ) {\n        const uid = card_copy_before.uid\n        const {title, url, new_color, style} = values\n        const is_valid_change =\n            is_within_limit(title, LIMIT_SMALL_TEXT) && is_within_limit(url, LIMIT_URL)\n        runInAction(() => {\n            if (local_change?.add_card) {\n                const patch = local_change.add_card\n                assert(patch.board_uid === board.uid, \"BoardUID mismatch\")\n                try {\n                    const add_card_value = patch.ops[patch.ops.length - 1].AddCard!.value\n                    if ((title || url) && is_valid_change) {\n                        if (typeof new_color !== \"undefined\") {\n                            patch.ops.push(\n                                PatchOpContainer.from_op(\n                                    new SetCardColor({uid: add_card_value.uid, value: new_color}),\n                                ),\n                            )\n                        }\n                        if (style) {\n                            patch.ops.push(\n                                PatchOpContainer.from_op(\n                                    new SetCardLinkStyle({uid: add_card_value.uid, value: style}),\n                                ),\n                            )\n                        }\n                        runInAction(() => {\n                            discard_local_change()\n                            const link = not_null(add_card_value.link)\n                            const card = board.card(uid) as LinkCardModel\n                            card.link.url = link.url = url\n                            card.link.title = link.title = title\n                            card.color = new_color || CardColor.no_color\n                            optimistic_update(board.uid, patch)\n                        })\n                        report_user_engagement(EngagementType.add_card)\n                    }\n                } finally {\n                    discard_local_change()\n                }\n            } else if (is_valid_change) {\n                const ops: Array<PatchOp> = []\n                if (card_copy_before.link.title !== title) {\n                    ops.push(new SetCardLinkTitle({uid, value: title}))\n                }\n                if (url && card_copy_before.link.url !== url) {\n                    ops.push(new SetCardLinkURL({uid, value: url}))\n                }\n                if (typeof new_color !== \"undefined\" && card_copy_before.color !== new_color) {\n                    ops.push(new SetCardColor({uid, value: new_color}))\n                }\n                if (style) {\n                    ops.push(new SetCardLinkStyle({uid, value: style}))\n                }\n                if (ops.length) {\n                    report_user_engagement(EngagementType.edit_card)\n                    optimistic_update(board.uid, ops)\n                }\n            }\n        })\n    },\n\n    on_file_editor_closed(\n        board: Board,\n        card_copy_before: FileCardModel,\n        values: {\n            file_name: string\n            title: string\n            new_color?: CardColor\n            display?: ImageCardDisplay\n            new_blob?: Blob\n            src_blob_uid?: BlobUID\n            preview_image_blob: Blob | undefined\n        },\n    ) {\n        const uid = card_copy_before.uid\n        const {file_name, new_color, display, title, new_blob, src_blob_uid, preview_image_blob} =\n            values\n        const is_valid_change =\n            is_valid_file_name(file_name) &&\n            is_within_limit(file_name, LIMIT_SMALL_TEXT) &&\n            is_within_limit(title, LIMIT_SMALL_TEXT)\n        if (is_valid_change) {\n            const ops: Array<PatchOp> = []\n            const blob_uid_mapping = new Map<BlobUID, BlobUID>()\n            if (new_blob) {\n                if (src_blob_uid) {\n                    blob_uid_mapping.set(src_blob_uid, new_blob.uid)\n                }\n                ops.push(new SetCardFileBlob({uid, value: new_blob}))\n            }\n            if (preview_image_blob?.uid !== card_copy_before.file.preview_image_blob?.uid) {\n                ops.push(new SetCardFilePreviewImageBlob({uid, value: preview_image_blob}))\n            }\n            if (card_copy_before.file.file_name !== file_name) {\n                ops.push(new SetCardFileFileName({uid, value: file_name}))\n            }\n            if (card_copy_before.file.title !== title) {\n                ops.push(new SetCardFileTitle({uid, value: title}))\n            }\n            if (typeof new_color !== \"undefined\" && card_copy_before.color !== new_color) {\n                ops.push(new SetCardColor({uid, value: new_color}))\n            }\n            if (typeof display !== \"undefined\") {\n                ops.push(new SetCardFileDisplay({uid, value: display}))\n            }\n            if (ops.length) {\n                report_user_engagement(EngagementType.edit_card)\n                optimistic_update(board.uid, ops, {blob_uid_mapping})\n            }\n        }\n    },\n\n    on_title_editor_closed(\n        board: Board,\n        {\n            image_card_uid,\n            display,\n            new_color,\n            title,\n        }: {\n            new_color?: CardColor\n            display: ImageCardDisplay\n            image_card_uid: CardUID\n            title: string\n        },\n    ): CardUID | undefined {\n        assert(local_change?.add_card, \"Title editor only works with newly added cards\")\n        const patch = local_change.add_card\n        assert(patch.board_uid === board.uid, \"BoardUID mismatch\")\n        try {\n            const new_card_uid = create_CardUID()\n            runInAction(() => {\n                const add_card = patch.ops.pop()\n                discard_local_change()\n                // Remove the last `AddCard` which is for the actual card to be added. We don't\n                // use that card but instead copy an existing card from the\n                // `title_image_board`.\n                if (patch.ops.length > 0) {\n                    // This will add a column if needed.\n                    optimistic_update(board.uid, patch)\n                }\n                optimistic_update(\n                    title_images_board_uid,\n                    new CopyCard({\n                        uid: image_card_uid,\n                        target_board_uid: board.uid,\n                        new_card_uid,\n                        target_card_uid: add_card?.AddCard?.target_card_uid,\n                        target_pos: add_card?.AddCard?.target_pos,\n                    }),\n                )\n                const ops: PatchOp[] = []\n                ops.push(new SetCardFileTitle({uid: new_card_uid, value: title.trim()}))\n                if (new_color) {\n                    ops.push(new SetCardColor({uid: new_card_uid, value: new_color}))\n                }\n                if (display) {\n                    assert(display.kind === ImageCardDisplayKind.cinema, \"Invalid display kind\")\n                    ops.push(new SetCardFileDisplay({uid: new_card_uid, value: display}))\n                }\n                if (ops.length > 0) {\n                    optimistic_update(board.uid, ops)\n                }\n            })\n            report_user_engagement(EngagementType.add_card)\n            return new_card_uid\n        } finally {\n            discard_local_change()\n        }\n    },\n\n    add_comment(board: Board, card: Card, safe_html: string) {\n        report_user_engagement(EngagementType.add_comment)\n        optimistic_update(\n            board.uid,\n            new AddComment({\n                value: new AddCommentValue({uid: create_CommentUID(), note: new Note({safe_html})}),\n                target_card_uid: card.uid,\n                // We want comments to always be appended to the end.\n                target_pos: 4242424242,\n            }),\n        )\n    },\n\n    add_card_locally(\n        board: Board,\n        insert_pos: InsertPos,\n        value: {note: Note} | {link: Link},\n    ): CardUID | \"quota_exceeded\" {\n        discard_local_change()\n        if (\n            board_resource.board_quota_usage.num_cards >=\n            board_quota_limits(current_user.account_attributes).num_cards\n        ) {\n            ui_actions.open_quota_limit_exceeded_dialog()\n            return \"quota_exceeded\"\n        }\n        const card_uid = create_CardUID()\n        const ops = []\n        if (board.card(insert_pos.target_card_uid).root) {\n            // Ok, we are trying to add a new column.\n            const {column_patch_op, column_uid} = add_or_reuse_column_locally(\n                board,\n                insert_pos.target_pos,\n            )\n            if (column_patch_op) {\n                ops.push(column_patch_op)\n            }\n            insert_pos = {target_pos: 0, target_card_uid: column_uid}\n        }\n        ops.push(\n            new AddCard({\n                ...insert_pos,\n                value: new AddCardValue({\n                    uid: card_uid,\n                    ...value,\n                }),\n            }),\n        )\n        local_change = {add_card: new_Patch(board.uid, ops)}\n        optimistic_update(board.uid, local_change.add_card, {is_local_change: true})\n        return card_uid\n    },\n\n    discard_locally_added_card_if_present() {\n        if (local_change?.add_card) {\n            discard_local_change()\n        }\n    },\n\n    is_locally_added_card(card_uid: CardUID) {\n        const add_card_value =\n            local_change?.add_card?.ops[local_change.add_card.ops.length - 1].AddCard?.value\n        return add_card_value?.uid === card_uid\n    },\n\n    insert_pos_provider_of_locally_added_card(): () => InsertPos {\n        const add_card = not_null(\n            local_change?.add_card?.ops.find((x) => x.AddCard)?.AddCard,\n            \"No card is currently being added\",\n        )\n        return () => ({target_card_uid: add_card.target_card_uid!, target_pos: add_card.target_pos})\n    },\n\n    add_file_card(\n        board: Board,\n        insert_pos: InsertPos,\n        file: File,\n        card_color?: CardColor,\n    ): CardUID | undefined {\n        let target_card\n        try {\n            target_card = board.card(insert_pos.target_card_uid)\n        } catch {\n            // Target card has been removed from board.\n            log.debug(\"Target card not found - ignoring `add_file_card`\", {\n                target_card_uid: insert_pos.target_card_uid,\n            })\n            return\n        }\n        const card_uid = create_CardUID()\n        const ops = []\n        if (target_card.root) {\n            // Ok, we are trying to add a new column.\n            const {column_patch_op, column_uid} = add_or_reuse_column_locally(\n                board,\n                insert_pos.target_pos,\n            )\n            if (column_patch_op) {\n                ops.push(column_patch_op)\n            }\n            insert_pos = {target_pos: 0, target_card_uid: column_uid}\n        }\n        ops.push(\n            new AddCard({\n                ...insert_pos,\n                value: new AddCardValue({uid: card_uid, file}),\n            }),\n        )\n        if (card_color) {\n            ops.push(new SetCardColor({uid: card_uid, value: card_color}))\n        }\n        optimistic_update(board.uid, ops)\n        report_user_engagement(EngagementType.add_card)\n        return card_uid\n    },\n\n    increase_indent_if_possible(\n        board: Board,\n        card: Card,\n        parent_visible_children: ReadonlyArray<Card>,\n    ) {\n        const pos = parent_visible_children.findIndex((x) => x.uid === card.uid)\n        if (!pos) {\n            return false\n        }\n        const prev_card = parent_visible_children[pos - 1]\n        optimistic_update(\n            board.uid,\n            new MoveCard({\n                uid: card.uid,\n                target_card_uid: prev_card.uid,\n                target_pos: prev_card.children.length,\n            }),\n        )\n        report_user_engagement(EngagementType.move_card)\n        return true\n    },\n\n    decrease_indent_if_possible(board: Board, card: Card) {\n        const parent = card.parent\n        if (parent.column || parent.inbox) {\n            return false\n        }\n        const grandparent = parent.parent as Card\n        const following_siblings = parent.children.slice(card.parent_pos + 1)\n        optimistic_update(\n            board.uid,\n            [\n                new MoveCard({\n                    uid: card.uid,\n                    target_card_uid: grandparent.uid,\n                    target_pos: parent.parent_pos + 1,\n                }),\n            ].concat(\n                following_siblings.map(\n                    (x, i) =>\n                        new MoveCard({\n                            uid: x.uid,\n                            target_card_uid: card.uid,\n                            target_pos: card.children.length + i,\n                        }),\n                ),\n            ),\n        )\n        report_user_engagement(EngagementType.move_card)\n        return true\n    },\n\n    set_board_indexed_by_search_engines(board: Board, value: boolean) {\n        optimistic_update(board.uid, new SetBoardIndexedBySearchEngines({value}))\n    },\n\n    make_board_public(board: Board) {\n        optimistic_update(\n            board.uid,\n            new CustomAddBoardACL({principal_uid: CLING_PUBLIC, access_level: AccessLevel.read}),\n        )\n    },\n\n    make_board_not_public(board: Board) {\n        if (!board.acl.is_public) {\n            return\n        }\n        optimistic_update(board.uid, [new CustomRemoveBoardACL({value: CLING_PUBLIC})])\n    },\n\n    async archive_board(board: {uid: BoardUID}) {\n        try {\n            await call_function(\n                new PatchFullAccountRequest({\n                    patch_uid: create_PatchUID(),\n                    patch_account_settings: new PatchAccountSettings({\n                        board_settings: [\n                            new PatchAccountBoardSettings({\n                                board_uid: board.uid,\n                                set_archived: true,\n                            }),\n                        ],\n                    }),\n                }),\n            )\n        } catch (error) {\n            report_error(\"Failed to archive board\", {error, board_uid: board.uid})\n            Snackbar.show_message(i18n.sorry_something_went_wrong)\n            return\n        }\n        Snackbar.show_message(i18n.board_archived)\n    },\n\n    async unarchive_board(board: {uid: BoardUID}) {\n        try {\n            await call_function(\n                new PatchFullAccountRequest({\n                    patch_uid: create_PatchUID(),\n                    patch_account_settings: new PatchAccountSettings({\n                        board_settings: [\n                            new PatchAccountBoardSettings({\n                                board_uid: board.uid,\n                                clear_archived: true,\n                            }),\n                        ],\n                    }),\n                }),\n            )\n        } catch (error) {\n            report_error(\"Failed to unarchive board\", {error, board_uid: board.uid})\n            Snackbar.show_message(i18n.sorry_something_went_wrong)\n            return\n        }\n        Snackbar.show_message(i18n.board_restored)\n    },\n}\n\nfor (const [fn_name, fn] of Object.entries(model_actions)) {\n    ;(model_actions as any)[fn_name] = action((...args: Array<any>) => {\n        log.debug(\"model_actions.\" + fn_name, {args})\n        Snackbar.clear()\n        // eslint-disable-next-line prefer-spread\n        return (fn as any).apply(null, args)\n    })\n}\n\n/**\n * Add a column at the given position or - if there is already a completely empty column -\n * return that.\n */\nfunction add_or_reuse_column_locally(\n    board: Board,\n    target_pos: number,\n): {column_uid: CardUID; column_patch_op?: AddCard} {\n    const column =\n        target_pos >= board.root.children.length ? undefined : board.root.children[target_pos]\n    if (column?.column && column?.children.length === 0) {\n        return {column_uid: column.uid}\n    }\n    const uid = create_CardUID()\n    return {\n        column_uid: uid,\n        column_patch_op: new AddCard({\n            value: new AddCardValue({uid, column: new Column({})}),\n            target_pos,\n            target_card_uid: board.root.uid,\n        }),\n    }\n}\n\nfunction is_within_limit(s: string | null | undefined, limit: Limit) {\n    return !s || s.length <= limit.upper_bound\n}\n\nfunction discard_local_change() {\n    if (local_change?.change_board_settings) {\n        board_resource.remove_local_change(local_change.change_board_settings.patch.board_uid)\n    } else if (local_change?.add_card) {\n        board_resource.remove_local_change(local_change.add_card.board_uid)\n    }\n    local_change = undefined\n}\n\nexport function __testonly_local_change() {\n    return local_change\n}\n\nexport function __testonly_reset_local_change() {\n    discard_local_change()\n}\n\nexport async function random_board_style(): Promise<[BoardStyle, src_blob_uid: BlobUID]> {\n    // These colors are taken from `stock_image_chooser.tsx` and should work well\n    // with all background images.\n    const colors = [\n        \"#fcd34d\",\n        \"#fb923c\",\n        \"#c94a53\",\n        \"#ec4899\",\n        \"#a855f7\",\n        \"#5292c1\",\n        \"#22d3ee\",\n        \"#5fa97e\",\n        \"#9ca3af\",\n    ]\n    const background_board = await board_resource.wait_for_sync(background_images_board_uid)\n    const cards = current_user.account_attributes.has_pro_features\n        ? background_board.regular_cards.filter((x) => !!x.file)\n        : background_board.regular_cards.filter((x) => x.file?.title.includes(\"free\"))\n    const card = cards[Math.floor(Math.random() * cards.length)] as FileCard\n    const background_color = card.file.title.includes(\"multicolor\")\n        ? colors[Math.floor(Math.random() * colors.length)]\n        : \"#9ca3af\"\n    const background_image_blob = new Blob({\n        ...card.file.blob,\n        uid: create_BlobUID(),\n    })\n    return [new BoardStyle({background_image_blob, background_color}), card.file.blob.uid]\n}\n\nexport default model_actions\n", "import {observable, makeObservable} from \"mobx\"\nimport type {CardUID} from \"@cling/lib.shared.model\"\n\nexport type CardView = \"\" | \"editor\" | \"lightbox\"\n\nexport class CardState {\n    readonly card_uid: CardUID\n    view: CardView = \"\"\n    editor_opts?: {\n        dim?: {width: number; height: number}\n        pos?: {left: number; top: number}\n        special_editor?: \"title\" | \"audio\" | \"video\" | \"photo\"\n    }\n    content_collapsed? = false\n    children_collapsed? = false\n    card_menus_shown = false\n    comments_shown = false\n    private _focus_comment_editor_once = false\n\n    get focus_comment_editor_once(): boolean {\n        const result = this._focus_comment_editor_once\n        if (result) {\n            // Side effect: Because the comment editor should be focused only once,\n            // we reset `this._focus_comment_editor_once` here ...\n            this._focus_comment_editor_once = false\n        }\n        return result\n    }\n\n    set focus_comment_editor_once(value: boolean) {\n        this._focus_comment_editor_once = value\n    }\n\n    constructor(card_uid: CardUID) {\n        makeObservable(this, {\n            view: observable,\n            content_collapsed: observable,\n            children_collapsed: observable,\n            card_menus_shown: observable,\n            comments_shown: observable,\n        })\n\n        this.card_uid = card_uid\n    }\n}\n", "import {observable, makeObservable} from \"mobx\"\nimport type {BoardUID} from \"@cling/lib.shared.model\"\nimport {OPTIMUM_COLUMN_WITH} from \"@cling/lib.web.layout/default_layout\"\n\nexport class BoardState {\n    readonly board_uid: BoardUID\n    editing_board_name = false\n    toggle_collapse_expand_all = false\n    min_column_width = OPTIMUM_COLUMN_WITH\n\n    constructor(board_uid: BoardUID) {\n        makeObservable(this, {\n            editing_board_name: observable,\n            toggle_collapse_expand_all: observable,\n            min_column_width: observable,\n        })\n\n        this.board_uid = board_uid\n    }\n}\n", "import * as React from \"react\"\nimport {running_on_mobile_device, running_on_ios} from \"@cling/lib.web.utils\"\nimport type {Layout} from \"./types\"\nimport {SnapScroll} from \"./snap_scroll\"\nimport {with_perfect_scrollbar as _with_perfect_scrollbar, classNames} from \"@cling/lib.web.utils\"\nimport {observer} from \"mobx-react\"\nimport {runInAction} from \"mobx\"\nimport {assert} from \"@cling/lib.shared.utils\"\n\ninterface Props {\n    layout: Layout\n    on_view_port_width_change: (width: number) => void\n    on_first_visible_column_change: (column_index: number) => void\n    first_visible_column_index: number\n    /* Each child is rendered as one main column. */\n    children: any\n    /* What to render before each column. */\n    before_children?: any[]\n    before_children_class_name?: string\n    /* What to render after each column. */\n    after_children?: any[]\n    after_children_class_name?: string\n    /**\n     * The aux column (if `aux_column_children` is given)\n     * will be shown ``fixed`` at one side of the view port.\n     */\n    aux_column_children?: React.ReactNode\n    aux_column_props?: {title: any; className?: string; more_props?: any}\n    backdrop?: () => any\n    on_vert_scroll: (value: number, prev_value: number) => void\n    on_snap: () => void\n    prevent_scroll_x: (e?: Event) => boolean\n    centered?: boolean\n}\n\n/**\n * A layout based upon the actual width and height of the parent element.\n * This component should be embedded in an element which dimensions only depend\n * on the size of the view port.\n */\nexport const FixedWidthColumns = observer(\n    ({\n        aux_column_children,\n        aux_column_props,\n        centered,\n        backdrop,\n        before_children,\n        before_children_class_name,\n        after_children,\n        after_children_class_name,\n        children,\n        layout,\n        on_first_visible_column_change,\n        first_visible_column_index,\n        on_view_port_width_change,\n        on_vert_scroll,\n        on_snap,\n        prevent_scroll_x,\n    }: Props) => {\n        const [view_port_width, set_view_port_width] = React.useState(0)\n        const on_snap_cb = React.useCallback(\n            (column_index: number) => {\n                runInAction(() => {\n                    on_first_visible_column_change(column_index)\n                    on_snap?.()\n                })\n            },\n            [on_first_visible_column_change, on_snap],\n        )\n        const snap_scroll = React.useRef(new SnapScroll(layout, prevent_scroll_x, on_snap_cb))\n        const size_div = React.useRef<HTMLDivElement>()\n        const main_columns_elm = React.useRef<HTMLDivElement>()\n        const resize_timeout = React.useRef<any>()\n        React.useEffect(() => {\n            setTimeout(() => requestAnimationFrame(() => on_resize()))\n        })\n        React.useEffect(() => {\n            snap_scroll.current.update_layout(layout, first_visible_column_index)\n        }, [layout, first_visible_column_index])\n        const on_resize = React.useCallback(\n            (update_immediately?: \"update_immediately\") => {\n                if (!size_div.current) {\n                    return\n                }\n                const size = size_div.current.getBoundingClientRect()\n                // We need to provoke a re-render in tests.\n                const w = process.env.NODE_ENV === \"test\" ? 600 : size.width\n                if (w !== view_port_width) {\n                    clearTimeout(resize_timeout.current)\n                    const update_view_port_width = () => {\n                        on_view_port_width_change(w)\n                        set_view_port_width(w)\n                    }\n                    if (\n                        process.env.NODE_ENV === \"test\" ||\n                        update_immediately === \"update_immediately\"\n                    ) {\n                        update_view_port_width()\n                    } else {\n                        resize_timeout.current = setTimeout(update_view_port_width, 10)\n                    }\n                }\n            },\n            [on_view_port_width_change, view_port_width],\n        )\n        const resize_observer = React.useMemo<\n            | {\n                  disconnect: () => void\n                  observe: (elm: any) => void\n                  unobserve: (elm: any) => void\n              }\n            | undefined\n        >(\n            () =>\n                \"ResizeObserver\" in window\n                    ? new (window as any).ResizeObserver(() => {\n                          on_resize()\n                      })\n                    : undefined,\n            [on_resize],\n        )\n\n        React.useEffect(() => {\n            const listener = () => on_resize(\"update_immediately\")\n            window.addEventListener(\"resize\", listener)\n            return () => {\n                window.removeEventListener(\"resize\", listener)\n                resize_observer?.disconnect()\n            }\n        }, [on_resize, resize_observer])\n        const update_size_div_ref = React.useCallback(\n            (elm: HTMLDivElement) => {\n                if (elm) {\n                    size_div.current = elm\n                    resize_observer?.observe(elm)\n                    on_resize()\n                } else {\n                    resize_observer?.unobserve(size_div.current)\n                    size_div.current = undefined\n                }\n            },\n            [on_resize, resize_observer],\n        )\n        const update_main_columns_ref = React.useCallback(\n            (elm: HTMLDivElement) => {\n                main_columns_elm.current = elm\n                if (elm) {\n                    snap_scroll.current.mount(elm, layout, first_visible_column_index)\n                } else {\n                    snap_scroll.current.unmount()\n                }\n            },\n            [layout, first_visible_column_index],\n        )\n        const slide_aux_in = React.useCallback((elm: ReactRef<HTMLDivElement>) => {\n            if (elm && elm.parentElement) {\n                const style = elm.parentElement.style\n                requestAnimationFrame(() => {\n                    style.transform = \"translateX(0)\"\n                })\n            }\n        }, [])\n        const slide_aux_out = React.useCallback(\n            (elm: ReactRef<HTMLDivElement>) => {\n                if (elm && elm.parentElement) {\n                    const style = elm.parentElement.style\n                    requestAnimationFrame(() => {\n                        style.transform = `translateX(-${layout.aux_layout.column_width}px)`\n                    })\n                }\n            },\n            [layout],\n        )\n        if (!view_port_width) {\n            return <div className=\"fwc__container\" ref={update_size_div_ref} />\n        }\n        const {main_layout, aux_layout} = layout\n        function before_child(idx: number) {\n            if (!before_children?.[idx]) {\n                return null\n            }\n            return (\n                <div\n                    className={before_children_class_name}\n                    style={{\n                        position: \"absolute\",\n                        transform: `translateX(${main_layout.column_offset(idx)}px)`,\n                    }}\n                >\n                    {before_children[idx]}\n                </div>\n            )\n        }\n        function after_child(idx: number) {\n            if (!after_children?.[idx]) {\n                return null\n            }\n            return (\n                <div\n                    className={after_children_class_name}\n                    style={{\n                        position: \"absolute\",\n                        transform: `translateX(${main_layout.column_offset(idx + 1)}px)`,\n                    }}\n                >\n                    {after_children[idx]}\n                </div>\n            )\n        }\n        const main_columns_left = centered\n            ? Math.max(0, (view_port_width - layout.main_layout.client_width) / 2)\n            : running_on_mobile_device()\n              ? 0\n              : aux_layout.visible\n                ? aux_layout.column_width\n                : 0\n        const num_children = React.Children.count(children)\n        const right_space =\n            view_port_width -\n            (layout.main_layout.column_offset(num_children - 1) -\n                main_layout.scroll_left(first_visible_column_index - 1))\n        let right_spacer: any\n        if (right_space) {\n            // Spacer needed for correct horizontal scrolling.\n            right_spacer = (\n                <div\n                    className=\"fwc__spacer\"\n                    style={{\n                        left: layout.main_layout.column_offset(num_children),\n                        width: `${right_space}px`,\n                    }}\n                >\n                    {backdrop && backdrop()}\n                </div>\n            )\n        }\n        const main_columns_horizontal_scroll_container = (\n            <div\n                ref={update_main_columns_ref}\n                className={classNames(\"fwc__main-columns dnd--scroll-horizontally\", {\n                    \"fwc__main-columns--hidden\":\n                        running_on_mobile_device() && !main_layout.client_width,\n                })}\n                data-test-id={\"FixedWidthColumns_main\"}\n                style={{width: `${main_layout.client_width}px`, left: `${main_columns_left}px`}}\n            >\n                <div className=\"fwc__spacer\" style={{width: main_layout.left}}>\n                    {backdrop && backdrop()}\n                </div>\n                {React.Children.map(children, (child: any, idx: number) => (\n                    <>\n                        {before_child(idx)}\n                        <MainColumn\n                            key={child.key}\n                            style={{\n                                width: `${main_layout.column_width}px`,\n                                padding: `0 ${main_layout.space_between_columns}px`,\n                                transform: `translateX(${main_layout.column_offset(idx)}px)`,\n                            }}\n                            backdrop={backdrop}\n                            on_vert_scroll={on_vert_scroll}\n                        >\n                            {child}\n                        </MainColumn>\n                        {after_child(idx)}\n                    </>\n                ))}\n                {right_spacer}\n            </div>\n        )\n        // Note: We always render the `<div class=\"fwc__aux-column--outer\">` element\n        //       to support CSS animations ...\n        const aux_column_horizontal_scroll_container = (\n            <div\n                className=\"fwc__aux-column--outer\"\n                style={{\n                    width: `${Math.min(view_port_width, aux_layout.column_width)}px`,\n                    transform: `translateX(${aux_layout.visible ? -aux_layout.column_width : 0}px`,\n                    visibility: aux_layout.visible ? \"visible\" : \"hidden\",\n                }}\n            >\n                {aux_layout.visible &&\n                    manage_scrolling(\n                        on_vert_scroll,\n                        with_perfect_scrollbar(\n                            \"vertical\",\n                            <div\n                                {...aux_column_props?.more_props}\n                                id={\"dnd__aux-column\" /* ... needed by drag & drop */}\n                                className={classNames(\n                                    \"fwc__aux-column--inner dnd__column dnd--scroll-vertically\",\n                                    aux_column_props?.className,\n                                )}\n                                style={{width: `${aux_layout.column_width}px`}}\n                                ref={slide_aux_in}\n                            >\n                                {aux_column_props?.title}\n                                {backdrop && backdrop()}\n                                {aux_column_children}\n                            </div>,\n                        ),\n                    )}\n                {!aux_layout.visible && <div ref={slide_aux_out} />}\n            </div>\n        )\n        return (\n            <div ref={update_size_div_ref} className=\"fwc__container\">\n                {main_columns_horizontal_scroll_container}\n                {aux_column_horizontal_scroll_container}\n            </div>\n        )\n    },\n)\n\nexport const MainColumn = ({\n    style,\n    backdrop,\n    on_vert_scroll,\n    children,\n}: {\n    style: any\n    backdrop?: () => any\n    on_vert_scroll: (value: number, last_value: number) => void\n    children: any\n}) =>\n    manage_scrolling(\n        on_vert_scroll,\n        with_perfect_scrollbar(\n            \"vertical\",\n            <div\n                className=\"fwc__main-column dnd__column dnd--scroll-vertically\"\n                style={style}\n                data-test-id=\"MainColumn\"\n            >\n                {backdrop && backdrop()}\n                {children}\n            </div>,\n        ),\n    )\n\nfunction manage_scrolling(\n    on_vert_scroll: (value: number, last_value: number) => void,\n    div: React.ReactElement<React.HTMLProps<HTMLDivElement>>,\n) {\n    const {ref} = div as any\n    let last_scroll_top: number\n    return React.cloneElement(div, {\n        ref: (elm: ReactRef<HTMLElement>) => {\n            if (ref) {\n                ref(elm)\n            }\n            if (elm) {\n                last_scroll_top = elm.scrollTop\n                if (!running_on_ios()) {\n                    return\n                }\n                // Here comes a very convoluted way to fix a bug with IOS's rubber band\n                // scrolling. See https://stackoverflow.com/a/51733026 ...\n                let last_touch_y: number\n                elm.addEventListener(\"touchstart\", (e: TouchEvent) => {\n                    last_touch_y = e.touches[0].clientY\n                })\n                elm.addEventListener(\"touchmove\", (e: TouchEvent) => {\n                    const touch_y = e.touches[0].clientY\n                    const scrollTop = elm.scrollTop\n                    const direction = last_touch_y - touch_y < 0 ? \"up\" : \"down\"\n                    if (\n                        (scrollTop <= 0 && direction === \"up\") ||\n                        (scrollTop >= elm.scrollHeight - elm.getBoundingClientRect().height &&\n                            direction === \"down\")\n                    ) {\n                        e.preventDefault()\n                    }\n                    last_touch_y = touch_y\n                })\n            }\n        },\n        onScroll: (e: React.UIEvent) => {\n            const target = e.target as HTMLElement\n            on_vert_scroll(target.scrollTop, last_scroll_top)\n            last_scroll_top = target.scrollTop\n        },\n    })\n}\n\nfunction with_perfect_scrollbar(\n    dir: \"horizontal\" | \"vertical\",\n    div: React.ReactElement<React.HTMLProps<HTMLDivElement>>,\n) {\n    return _with_perfect_scrollbar(div, {\n        dir,\n        hide_until_active: true,\n        handlers:\n            dir === \"horizontal\"\n                ? [\n                      // Note: We exclude the keyboard handler, because it does not\n                      //       work well together with `SnapScrollDesktop` ...\n                      \"click-rail\",\n                      \"drag-thumb\",\n                      \"wheel\",\n                      \"touch\",\n                  ]\n                : undefined,\n    })\n}\n\nexport function fixed_width_column_index($elm: HTMLElement): number | \"aux-column\" | undefined {\n    const $col = $elm.closest(\".fwc__main-column\")\n    if (!$col) {\n        if ($elm.closest(\".fwc__aux-column--outer\")) {\n            return \"aux-column\"\n        }\n        return undefined\n    }\n    const $fwc = $col.closest(\".fwc__main-columns\")\n    assert(\n        $fwc,\n        \"HTML structure is invalid. Expecting all `.fwc_main-column` to reside under a `.fwc_main-columns`\",\n    )\n    return [...$fwc.querySelectorAll(\".fwc__main-column\").values()].indexOf($col)\n}\n", "import {not_null} from \"@cling/lib.shared.utils\"\nimport type {Layout} from \"./types\"\nimport {reaction} from \"mobx\"\nimport {cancel_event} from \"@cling/lib.web.utils\"\nimport {running_on_mobile_device} from \"@cling/lib.web.utils\"\n\n/** Start visible scrolling after the user dragged that much. */\nconst START_SCROLL_THRESHOLD = 30\n/** Let the user scroll that much behind the boundaries to create a \"rubber-band effect\". */\nconst RUBBER_BAND_WIDTH = 50\nconst SWIPE_MIN_DISTANCE = 50\nconst SWIPE_MIN_VELOCITY = 0.2\nconst SWIPE_MAX_OFF_PATH = 100\n\nexport class SnapScroll {\n    elm?: HTMLElement\n    translate_x = 0\n    private enabled = true\n    private touch_state?: {\n        t0: number\n        touch_x0: number\n        touch_y0: number\n        translate_x0: number\n        vertical_scroll?: true\n        horizontal_scroll?: true\n        touch_x: number\n        touch_y: number\n    }\n    private dispose_prevent_scroll_x_reaction?: () => void\n    private first_visible_column_index = 0\n\n    constructor(\n        private layout: Layout,\n        private prevent_scroll_x: (e?: Event) => boolean,\n        private on_snap: (index_of_first_visible_column: number) => void,\n    ) {}\n\n    mount(elm: HTMLDivElement, layout: Layout, first_visible_column_index: number) {\n        this.elm = elm\n        this.layout = layout\n        this.first_visible_column_index = first_visible_column_index\n        this._scroll_to(\n            this.layout.main_layout.scroll_left(this.first_visible_column_index),\n            \"skip_animation\",\n        )\n        if (running_on_mobile_device()) {\n            addEventListener(\"touchstart\", this._on_touch_start)\n            addEventListener(\"touchmove\", this._on_touch_move)\n            addEventListener(\"touchend\", this._on_touch_end)\n        } else {\n            this.elm.addEventListener(\"wheel\", this._wheel_listener)\n            addEventListener(\"keydown\", this._arrow_key_listener)\n        }\n        elm.parentElement?.addEventListener(\"scroll\", this._on_scroll)\n        this.dispose_prevent_scroll_x_reaction = reaction(\n            () => this.prevent_scroll_x(),\n            (prevent_scroll) => {\n                if (prevent_scroll) {\n                    this.touch_state = undefined\n                }\n            },\n            {name: \"snap_scroll.ts - prevent_scroll_x\"},\n        )\n    }\n\n    unmount() {\n        this.dispose_prevent_scroll_x_reaction?.()\n        removeEventListener(\"touchstart\", this._on_touch_start)\n        removeEventListener(\"touchmove\", this._on_touch_move)\n        removeEventListener(\"touchend\", this._on_touch_end)\n        removeEventListener(\"keydown\", this._arrow_key_listener)\n        this.elm?.parentElement?.removeEventListener(\"scroll\", this._on_scroll)\n        this.elm?.removeEventListener(\"wheel\", this._wheel_listener)\n    }\n\n    force_update() {\n        this._scroll_to(this.layout.main_layout.scroll_left(this.first_visible_column_index))\n    }\n\n    update_layout(layout: Layout, first_visible_column_index: number) {\n        this.layout = layout\n        this.first_visible_column_index = first_visible_column_index\n        if (!this.elm) {\n            return\n        }\n        this.force_update()\n    }\n\n    enable(): void {\n        this.enabled = true\n        this.force_update()\n    }\n\n    disable(): void {\n        this.enabled = false\n    }\n\n    scroll_left = () => {\n        const i = this.first_visible_column_index\n        if (i > 0) {\n            this.scroll_to_column(i - 1)\n        }\n    }\n\n    scroll_right = () => {\n        const {main_layout} = this.layout\n        const i = this.first_visible_column_index\n        if (i === 0 && main_layout.inbox_shown) {\n            // Always allow to scroll to column index 1 - this blends out the inbox ...\n            this.scroll_to_column(1, {force: true})\n        } else {\n            const num_visible_columns = Math.floor(\n                main_layout.client_width / main_layout.column_width,\n            )\n            if (i < main_layout.num_columns - num_visible_columns) {\n                this.scroll_to_column(i + num_visible_columns)\n            }\n        }\n    }\n\n    scroll_to_column(i: number, opts: {force?: boolean} = {}) {\n        const {main_layout} = this.layout\n        if (i <= this.first_visible_column_index || opts.force) {\n            if (this._scroll_to(main_layout.scroll_left(i))) {\n                this.on_snap(i)\n            }\n        } else {\n            // Only scroll so far that the desired column is fully visible ...\n            const x_right = main_layout.scroll_left(i + 1)\n            i = this.first_visible_column_index\n            while (main_layout.scroll_left(i) + main_layout.client_width < x_right) {\n                i += 1\n            }\n            if (this._scroll_to(main_layout.scroll_left(i))) {\n                this.on_snap(i)\n            }\n        }\n    }\n\n    _arrow_key_listener = (e: KeyboardEvent) => {\n        if (\n            !this.elm ||\n            !this.elm.children ||\n            e.shiftKey ||\n            e.altKey ||\n            e.ctrlKey ||\n            e.metaKey ||\n            this.prevent_scroll_x(e) ||\n            !this.enabled\n        ) {\n            return\n        }\n        if (e.key === \"ArrowLeft\" || e.keyCode === 37) {\n            this.scroll_left()\n        } else if (e.key === \"ArrowRight\" || e.keyCode === 39) {\n            this.scroll_right()\n        }\n    }\n\n    private _wheel_last_dx = 0\n    private _wheel_last_scroll_ts = 0\n    private _wheel_last_event_ts = 0\n    _wheel_listener = (e: WheelEvent) => {\n        // All in all it is very tricky to get consistent wheel-scroll-behaviour across all\n        // devices (mouse wheel left and right, trackpads, Apple's Magic Mouse, etc.).\n        // We scroll only if the last scroll via this listener is more than 350ms ago (roughly the\n        // time the animation needs to finish) AND one of the following conditions are met:\n        // - The new deltaX is larger (absolute) than the last one. This indicates that the user\n        //   has started to scroll again. Note: Trackpads usually ease in and out meaning that\n        //   for one swipe we first get increasing deltaX values and then a long tail of\n        //   decreasing deltaX.\n        // - The direction has changed.\n        // Furthermore we reset the last deltaX if there has not been a wheel-event for at least\n        // 200ms.\n        if (!this.elm || !this.elm.children || this.prevent_scroll_x(e) || !this.enabled) {\n            return\n        }\n        cancel_event(e)\n        if (Math.abs(e.deltaY) != 0) {\n            // Don't scroll if the user (accidentally) scrolled vertically, too ...\n            return\n        }\n        const ts = Date.now()\n        if (ts - this._wheel_last_event_ts > 200) {\n            // This is a special case for mouse-wheel-scrolling - there is always a single event\n            // with the same value, so we have to figure out if the user initiated a new scroll ...\n            this._wheel_last_dx = 0\n        }\n        this._wheel_last_event_ts = ts\n        const dx = e.deltaX\n        const ldx = this._wheel_last_dx\n        const lsts = this._wheel_last_scroll_ts\n        this._wheel_last_dx = dx\n        if (ts - lsts < 350) {\n            // The last scrolling has not finished yet ...\n            return\n        }\n        if ((dx > 0 && ldx < 0) || (dx < 0 && ldx > 0) || Math.abs(dx) > Math.abs(ldx)) {\n            // Direction changed or a new scroll has been started ...\n            if (dx > 0) {\n                this.scroll_right()\n            } else {\n                this.scroll_left()\n            }\n            this._wheel_last_scroll_ts = ts\n        }\n    }\n\n    /**\n     * Horizontal scrolling is completely ignored.\n     */\n    _on_scroll = (e: any) => {\n        e.target.scrollLeft = 0\n    }\n\n    _on_touch_start = (e: TouchEvent) => {\n        if (this.prevent_scroll_x(e) || e.touches.length > 1) {\n            return\n        }\n        const {clientX: touch_x0, clientY: touch_y0} = e.touches[0]\n        this.touch_state = {\n            t0: performance.now(),\n            touch_x0,\n            touch_y0,\n            translate_x0: this.translate_x,\n            touch_x: touch_x0,\n            touch_y: touch_y0,\n        }\n    }\n\n    _on_touch_move = (e: TouchEvent) => {\n        if (this.prevent_scroll_x(e) || e.touches.length > 1 || e.changedTouches.length !== 1) {\n            return\n        }\n        const {touch_state} = this\n        if (!touch_state || touch_state.vertical_scroll) {\n            return\n        }\n        const touch = e.changedTouches[0]\n        const x = touch.clientX\n        const y = touch.clientY\n        touch_state.touch_x = x\n        touch_state.touch_y = y\n        if (!touch_state.horizontal_scroll) {\n            const dx = Math.abs(x - touch_state.touch_x0)\n            const dy = Math.abs(y - touch_state.touch_y0)\n            if (dx > START_SCROLL_THRESHOLD && dx >= dy) {\n                touch_state.horizontal_scroll = true\n            } else {\n                if (dy > START_SCROLL_THRESHOLD) {\n                    touch_state.vertical_scroll = true\n                }\n                return\n            }\n        }\n        let new_x = touch_state.translate_x0 + x - touch_state.touch_x0\n        if (new_x > touch_state.translate_x0) {\n            new_x -= START_SCROLL_THRESHOLD\n        } else {\n            new_x += START_SCROLL_THRESHOLD\n        }\n        this._live_scroll(new_x)\n    }\n\n    _on_touch_end = (e: TouchEvent) => {\n        if (this.prevent_scroll_x(e) || e.touches.length > 1 || e.changedTouches.length !== 1) {\n            return\n        }\n        const {touch_state} = this\n        const snap_options: any = {}\n        if (touch_state) {\n            this.touch_state = undefined\n            const ady = Math.abs(touch_state.touch_y - touch_state.touch_y0)\n            if (touch_state.horizontal_scroll) {\n                const dx = touch_state.touch_x - touch_state.touch_x0\n                const adx = Math.abs(dx)\n                const dt = performance.now() - touch_state.t0\n                if (\n                    adx >= SWIPE_MIN_DISTANCE &&\n                    adx / dt >= SWIPE_MIN_VELOCITY &&\n                    ady < SWIPE_MAX_OFF_PATH\n                ) {\n                    // Swipe gesture detected!\n                    snap_options[dx < 0 ? \"swipe_left\" : \"swipe_right\"] = true\n                }\n            }\n        }\n        // Always snap in the end, because the user might have scrolled vertically with a slight\n        // touch of horizontal scroll. If we didn't snap here, the screen would stay between\n        // two columns ...\n        this._snap(snap_options)\n    }\n\n    _live_scroll(translate_x: number) {\n        // Don't let the user scroll too far left or too far right ...\n        const {main_layout} = this.layout\n        const max = 0 - (main_layout.scroll_left(main_layout.num_columns - 1) + RUBBER_BAND_WIDTH)\n        translate_x = Math.min(RUBBER_BAND_WIDTH, Math.max(max, translate_x))\n        if (this.translate_x !== translate_x) {\n            not_null(this.elm).style.transform = `translateX(${this.translate_x}px)`\n            this.translate_x = translate_x\n            not_null(this.elm).style.transition = \"none\"\n        }\n    }\n\n    _snap = ({swipe_left, swipe_right}: {swipe_left?: true; swipe_right?: true} = {}) => {\n        if (!this.elm || !this.enabled) {\n            return\n        }\n        const {main_layout} = this.layout\n        // Find column with smallest scroll delta ...\n        const scroll_left = 0 - this.translate_x\n        let best_index = 0\n        if (scroll_left > 0) {\n            let best_delta = scroll_left\n            for (let i = 1; i < main_layout.num_columns; ++i) {\n                const delta = Math.abs(main_layout.scroll_left(i) - scroll_left)\n                if (delta > best_delta) {\n                    break\n                }\n                best_index = i\n                best_delta = delta\n            }\n        }\n        if (swipe_right && main_layout.scroll_left(best_index) > scroll_left && best_index > 0) {\n            --best_index\n        }\n        if (\n            swipe_left &&\n            main_layout.scroll_left(best_index) < scroll_left &&\n            best_index < main_layout.num_columns - 1 &&\n            main_layout.scroll_left(best_index) < main_layout.scroll_left(best_index + 1)\n        ) {\n            ++best_index\n        }\n        this._scroll_to(main_layout.scroll_left(best_index))\n        this.on_snap(best_index)\n    }\n\n    _scroll_to(scroll_left: number, skip_animation?: \"skip_animation\"): boolean {\n        if (-this.translate_x === scroll_left) {\n            return false\n        }\n        this.translate_x = 0 - scroll_left\n        if (skip_animation) {\n            not_null(this.elm).style.transition = \"none\"\n        } else {\n            not_null(this.elm).style.transition = \"\"\n        }\n        not_null(this.elm).style.transform = `translateX(${this.translate_x}px)`\n        return true\n    }\n}\n", "export {FixedWidthColumns} from \"./fixed_width_columns\"\nexport {\n    default_layout,\n    MIN_COLUMN_WIDTH,\n    MAX_COLUMN_WIDTH,\n    SPACE_BETWEEN_COLUMNS,\n} from \"./default_layout\"\n\ninterface BackgroundStyle {\n    background?: any\n    backgroundAttachment?: any\n    backgroundBlendMode?: any\n    backgroundColor?: any\n    backgroundComposite?: any\n    backgroundImage?: any\n    backgroundOrigin?: any\n    backgroundPosition?: any\n    backgroundRepeat?: any\n    backgroundSize?: any\n}\n\n/**\n * Return the style necessary to display the background for the given image and color.\n */\nexport function background_style({\n    url,\n    color,\n    is_pattern,\n}: {\n    url: string\n    color: string\n    is_pattern: boolean\n}): BackgroundStyle {\n    if (!color) {\n        color = \"#333\"\n    }\n    // TODO: Remove the deprecated check for old patterns.\n    const is_background_pattern =\n        is_pattern || url.startsWith(\"https://storage.googleapis.com/cling_backgrounds/patterns/\")\n    return {\n        backgroundImage: url ? `url(${url})` : \"\",\n        backgroundColor: color,\n        backgroundSize: is_background_pattern ? \"\" : \"cover\",\n        backgroundRepeat: is_background_pattern ? \"repeat\" : \"no-repeat\",\n        backgroundPosition: \"center\",\n    }\n}\n", "import * as React from \"react\"\nimport {action, observable, computed, makeObservable, runInAction} from \"mobx\"\nimport type {InvalidSearchQuery, SearchQuery} from \"@cling/lib.shared.search\"\nimport {\n    AccountUID,\n    Board,\n    BoardUID,\n    Card,\n    CardUID,\n    Comment,\n    CommentUID,\n    traverse_cards,\n} from \"@cling/lib.shared.model\"\nimport type {Match, SearchableTextField} from \"@cling/lib.shared.search/board_search\"\nimport {log} from \"@cling/lib.shared.logging\"\nimport {parse} from \"@cling/lib.shared.search/search_query_parser\"\nimport {escape_html, fast_string_hash, flatten, assert_never} from \"@cling/lib.shared.utils\"\nimport {report_error} from \"@cling/lib.shared.debug\"\nimport {board_resource, board_info_resource} from \"@cling/lib.web.resources\"\nimport type {CardState} from \"./card_state\"\nimport {SequentialRunner} from \"@cling/lib.shared.utils/sequential_runner\"\n\nexport type CallSearchResult = {matches: Match[]; indexed_board_uids: BoardUID[]}\nexport type CallSearch = (query: SearchQuery) => Promise<CallSearchResult>\n\ntype Group = {key: string; group: Board | Date; cards: {card: Card; board: Board}[]}\n\ntype SearchBoxOptions = {\n    hide_search_tasks?: boolean\n    hide_search_open_tasks?: boolean\n    hide_search_task_date?: boolean\n    hide_order_by?: boolean\n}\n\nexport class SearchState {\n    private _search_box_open = false\n    private query: SearchQuery | InvalidSearchQuery | undefined = undefined\n    private matches = new Map<CardUID | CommentUID, Match[]>()\n    /** Each card that matches itself *or* any of its comments along with the very first match. */\n    private cards_first_match = new Map<CardUID, Match>()\n    /** The value signals whether the card has visible comments. */\n    private visible_card_uids = new Map<CardUID, boolean>()\n    private last_search = new Date(1970, 1, 1)\n    private archived_cards_visible = false\n    private _all_boards = false\n    private query_string = \"\"\n    private _modify_query_string: ((query: string) => string) | undefined = undefined\n    private prev_card_states: CardState[] | undefined\n    private sequence = new SequentialRunner(\"SearchState.sequence\")\n    private _all_boards_sorted_uids?: BoardUID[] = undefined\n    private _search_box_options: SearchBoxOptions = {}\n\n    constructor(\n        private readonly swap_card_states: (new_card_states: CardState[]) => CardState[],\n        readonly call_search: CallSearch,\n        private readonly highlighted_card_uid: () => CardUID | undefined,\n        private readonly is_forced_match: (card_uid: Card) => boolean,\n        private readonly current_user_uid: () => AccountUID,\n    ) {\n        makeObservable<\n            SearchState,\n            | \"_search_box_open\"\n            | \"query\"\n            | \"matches\"\n            | \"cards_first_match\"\n            | \"visible_card_uids\"\n            | \"last_search\"\n            | \"archived_cards_visible\"\n            | \"_all_boards\"\n            | \"on_successful_query\"\n            | \"on_invalid_query\"\n            | \"_modify_query_string\"\n            | \"_search_box_options\"\n        >(this, {\n            _search_box_open: observable,\n            query: observable,\n            matches: observable.shallow,\n            cards_first_match: observable.shallow,\n            visible_card_uids: observable,\n            last_search: observable,\n            archived_cards_visible: observable,\n            _all_boards: observable,\n            end_search: action.bound,\n            search: action.bound,\n            open_search_box: action.bound,\n            toggle_search_box: action.bound,\n            num_matching_cards: computed,\n            is_query_active: computed,\n            on_successful_query: action.bound,\n            on_invalid_query: action.bound,\n            _modify_query_string: observable,\n            _search_box_options: observable,\n        })\n    }\n\n    set modify_query_string(f: ((query: string) => string) | undefined) {\n        runInAction(() => (this._modify_query_string = f))\n    }\n\n    set search_box_options(options: SearchBoxOptions) {\n        runInAction(() => (this._search_box_options = options))\n    }\n\n    get search_box_options() {\n        return this._search_box_options\n    }\n\n    /**\n     * Normally `end_search` is synchronous. But if `this.modify_query_string` is set and produces\n     * a non-empty query string when called with an empty string, a search is actually run.\n     * Use `callback` if you really want to wait until that search is done. This should be only\n     * necessary in tests.\n     */\n    end_search(opts: {reset?: boolean; callback?: (error?: any) => void} = {}) {\n        if (opts.reset) {\n            this.search_box_options = {}\n            this.modify_query_string = undefined\n        }\n        this._search_box_open = false\n        this.query_string = \"\"\n        this._all_boards_sorted_uids = undefined\n        if (this._modify_query_string) {\n            this.search(\"\")\n                .then(() => opts.callback?.())\n                .catch((error) => {\n                    opts.callback?.(error)\n                    report_error(error)\n                })\n        } else {\n            this.on_successful_query({\n                query: {field_expressions: [], invalid: false},\n                matches: new Map<CardUID | CommentUID, Match[]>(),\n                archived_cards_visible: false,\n                visible_card_uids: new Map<CardUID, boolean>(),\n                update_last_search_on_success: false,\n            })\n        }\n    }\n\n    search(query_string: string): Promise<void> {\n        this.query_string = query_string.trim()\n        this._all_boards_sorted_uids = undefined\n        return this.run_search(this.query_string, {update_last_search_on_success: true})\n    }\n\n    /**\n     * Boolean parameters are ignored only if they are `undefined` or `null`.\n     */\n    async expand_search(args: {search_my_tasks?: boolean}): Promise<void> {\n        if (args.search_my_tasks) {\n            if (!this.is_searching_my_tasks) {\n                await this.search(`${this.query_string} task.assignee:me`)\n            }\n        } else if (args.search_my_tasks === false) {\n            if (this.is_searching_my_tasks) {\n                // TODO: This is not complete. There could be other ways like\n                //       `task.assignee:(... OR me). We should have a way to convert\n                //       a `SearchQuery` back to a string.\n                await this.search(this.query_string.replace(/task\\.assignee:me/g, \"\"))\n            }\n        }\n    }\n\n    /**\n     * Re-run the search query without changing `this.last_search` so that `this.filter_visible`\n     * can still include cards modified after the last change of the query string.\n     */\n    refresh_search(): Promise<void> {\n        return this.run_search(this.query_string, {update_last_search_on_success: false})\n    }\n\n    get is_searching_my_tasks(): boolean {\n        if (!this.query || this.query.invalid) {\n            return false\n        }\n        return this.query.field_expressions.some(\n            (x) =>\n                x.field === \"task.assignee\" &&\n                !x.not &&\n                (x.term.includes(\"me\") || x.term.includes(this.current_user_uid())),\n        )\n    }\n\n    get archived_cards_shown(): boolean {\n        return this.archived_cards_visible\n    }\n\n    open_search_box() {\n        this._search_box_open = true\n    }\n\n    toggle_search_box() {\n        if (this.search_box_open) {\n            this.end_search()\n        } else {\n            this.open_search_box()\n        }\n    }\n\n    get search_box_open(): boolean {\n        return this._search_box_open\n    }\n\n    /**\n     * This is a little helper when you need to highlight some element outside an actual match.\n     */\n    highlight_all(s: string): React.ReactElement {\n        return React.createElement(\"mark\", null, s)\n    }\n\n    highlight_match(\n        content: Card | Comment,\n        field: SearchableTextField,\n        matches: Match[],\n        text?: string,\n    ): string {\n        let s = text ?? ((content.kind as any)[field] as string)\n        if (field !== \"safe_html\") {\n            s = escape_html(s)\n        }\n        if (!s || !matches || matches.length === 0) {\n            return s\n        }\n        const hash = fast_string_hash(s)\n        // We compare the `hash` below to the `text_hash` in the matches to ensure,\n        // that we only highlight matches, if `s` is the same string for which the\n        // `text_indices` were calculated.\n        const indices = flatten(\n            flatten(\n                matches.map((x) =>\n                    x.text_matches.filter((y) => y.field === field && y.text_hash === hash),\n                ),\n            ).map((x) => x.text_indices),\n        )\n        if (indices.length === 0) {\n            return s\n        }\n        // Sort and merge indices.\n        indices.sort((a, b) => a[0] - b[0])\n        let i = 0\n        while (i < indices.length) {\n            const a = indices[i]\n            const b = indices[i + 1]\n            if (b && b[0] <= a[1]) {\n                indices.splice(i, 2, [a[0], b[1]])\n            } else {\n                i += 1\n            }\n        }\n        i = 0\n        for (let [start, end] of indices) {\n            start += i * \"<mark></mark>\".length\n            end += i * \"<mark></mark>\".length + 1\n            s =\n                s.substring(0, start) +\n                \"<mark>\" +\n                s.substring(start, end) +\n                \"</mark>\" +\n                s.substring(end, s.length)\n            i += 1\n        }\n        return s\n    }\n\n    search_matches(content: Card | Comment): Match[] {\n        return this.matches.get(content.uid) || []\n    }\n\n    has_matching_comments(card: Card) {\n        if (this.is_search_narrowing_down) {\n            return !!this.visible_card_uids.get(card.uid)\n        }\n        return false\n    }\n\n    matches_directly(card: Card): boolean {\n        return this.cards_first_match.has(card.uid) || this.is_forced_match(card)\n    }\n\n    visible_children(card: Card): ReadonlyArray<Card> {\n        if (this.all_boards) {\n            return []\n        }\n        if (this.matches_directly(card)) {\n            return card.children.filter(this.is_archived_and_visible)\n        }\n        return this.filter_visible(card.children)\n    }\n\n    private is_archived_and_visible = (card: Card) => this.archived_cards_visible || !card.archived\n\n    has_visible_children(card: Card): boolean {\n        if (this.all_boards) {\n            return false\n        }\n        const cards = card.children\n        return cards.length > 0 && this.has_visible(cards)\n    }\n\n    has_hidden_deep_children(card: Card): boolean {\n        if (this.all_boards) {\n            return false\n        }\n        const deep_children = card.deep_children\n        return deep_children.length !== this.filter_visible(deep_children).length\n    }\n\n    is_a_card_visible(board: Board): boolean {\n        for (const column of board.columns) {\n            if (this.has_visible([column])) {\n                return true\n            }\n        }\n        return false\n    }\n\n    get all_boards(): boolean {\n        return this._all_boards\n    }\n\n    get order(): undefined | {field: \"task.date\" | \"modified.at\"; dir: \"ASC\" | \"DESC\"} {\n        return this.query?.invalid ? undefined : this.query?.order\n    }\n\n    /**\n     * If `all_boards` is `true` this will return the order in which boards should be displayed if\n     * no further sort order is given.\n     *\n     * The order is determined once and new boards that arrive while the current search is active\n     * will not be considered.\n     */\n    private get all_boards_sorted_uids(): BoardUID[] {\n        if (this._all_boards_sorted_uids) {\n            return this._all_boards_sorted_uids\n        }\n        this._all_boards_sorted_uids = board_info_resource\n            .read_all()\n            .sort(\n                (a, b) =>\n                    b.last_change.date.getTime() - a.last_change.date.getTime() ||\n                    a.uid.localeCompare(b.uid),\n            )\n            .map((x) => x.uid)\n        return this._all_boards_sorted_uids\n    }\n\n    /**\n     * Return the order and grouping that should be rendered.\n     */\n    get groups(): Group[] {\n        const res = []\n        const boards = new Map(\n            this.all_boards_sorted_uids\n                .map((x) => board_resource.read(x) as Board)\n                .filter((x) => !!x)\n                .map((x) => [x.uid, x]),\n        )\n        if (!this.order) {\n            for (const board of boards.values()) {\n                const cards = board.regular_cards\n                    .filter((x) => this.cards_first_match.has(x.uid))\n                    .map((x) => ({card: x, board}))\n                if (cards.length > 0) {\n                    res.push({key: board.uid, group: board, cards})\n                }\n            }\n        } else if (this.order.field === \"task.date\" || this.order.field === \"modified.at\") {\n            const cards_map = new Map<CardUID, {card: Card; board: Board; date: number}>()\n            for (const match of this.cards_first_match.values()) {\n                if (cards_map.has(match.card_uid as CardUID)) {\n                    continue\n                }\n                let board = boards.get(match.board_uid)\n                if (!board) {\n                    continue\n                }\n                let card = board.card(match.card_uid, \"dont_throw\")\n                if (!card) {\n                    // The card might have been moved.\n                    for (const x of boards.values()) {\n                        card = x.card(match.card_uid, \"dont_throw\")\n                        board = x\n                        if (card) {\n                            break\n                        }\n                    }\n                }\n                if (!card) {\n                    // Ok, somehow we don't find the card.\n                    continue\n                }\n                cards_map.set(match.card_uid, {\n                    card,\n                    board,\n                    date: match.order_value,\n                })\n            }\n            const cards = [...cards_map.values()]\n            let cur_group_date_str = \"\"\n            let cur_group_date = new Date(0)\n            let cur_group: {card: Card; board: Board}[] = []\n            const safe_date = (millis: number) => {\n                const d = new Date(millis)\n                return isNaN(d.getTime()) ? new Date(0) : d\n            }\n            const date_to_str = (date: Date) => {\n                let s = `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, \"0\")}`\n                if (Math.abs(Date.now() - date.getTime()) < 30 * 1000 * 60 * 60 * 24) {\n                    s += `-${date.getDate().toString().padStart(2, \"0\")}`\n                }\n                return s\n            }\n            for (let i = 0; i < cards.length; i++) {\n                const x = cards[i]\n                if (date_to_str(safe_date(x.date)) !== cur_group_date_str) {\n                    if (cur_group.length > 0) {\n                        res.push({\n                            key: cur_group_date_str,\n                            group: cur_group_date,\n                            cards: cur_group,\n                        })\n                    }\n                    cur_group = []\n                    cur_group_date = safe_date(x.date)\n                    cur_group_date_str = date_to_str(cur_group_date)\n                }\n                cur_group.push({card: x.card, board: x.board})\n            }\n            if (cur_group.length > 0) {\n                res.push({\n                    key: cur_group_date_str,\n                    group: cur_group_date,\n                    cards: cur_group,\n                })\n            }\n        } else {\n            throw assert_never(this.order.field)\n        }\n        return res\n    }\n\n    /**\n     * Return `true` if a non-empty query that actually narrows down the number of cards visibe has\n     * been answered by the server.\n     */\n    get is_search_narrowing_down(): boolean {\n        if (!this.query || this.query.invalid) {\n            return false\n        }\n        if (this.all_boards) {\n            return true\n        }\n        const expressions_but_board = this.query.field_expressions.filter(\n            (x) => !(x.field === \"board.uid\" && !x.not && x.term !== \"all\"),\n        )\n        if (\n            expressions_but_board.length === 1 &&\n            expressions_but_board[0].field === \"archived\" &&\n            expressions_but_board[0].term === \"show\"\n        ) {\n            return false\n        }\n        return expressions_but_board.length > 0\n    }\n\n    /**\n     * @return -1 if there is no search active\n     */\n    get num_matching_cards() {\n        if (!this.is_query_active) {\n            return -1\n        }\n        if (this.all_boards) {\n            return this.cards_first_match.size\n        }\n        return [...this.cards_first_match.values()].reduce((sum) => {\n            return sum + 1\n        }, 0)\n    }\n\n    /**\n     * This determines what's currently visible to the user.\n     */\n    private filter_visible<T extends Card>(cards: ReadonlyArray<T>): ReadonlyArray<T> {\n        if (!this.query || this.query.invalid || this.all_boards) {\n            return []\n        }\n        // Shortcut: There is no query active.\n        if (!this.is_query_active) {\n            const hl_card_uid = this.highlighted_card_uid()\n            if (hl_card_uid) {\n                return cards.filter(\n                    (x) =>\n                        !x.archived ||\n                        hl_card_uid === x.uid ||\n                        x.deep_children.some((y) => y.uid === hl_card_uid),\n                )\n            }\n            return cards.filter((x) => !x.archived)\n        }\n        return cards.filter(\n            (x) =>\n                (this.visible_card_uids.has(x.uid) ||\n                    x.last_change.date.getTime() > this.last_search.getTime()) &&\n                this.is_archived_and_visible(x),\n        )\n    }\n\n    /**\n     * This determines what's currently visible to the user.\n     */\n    private has_visible<T extends Card>(cards: ReadonlyArray<T>): boolean {\n        if (!this.query || this.query.invalid || this.all_boards) {\n            return false\n        }\n        // Shortcut: There is no query active.\n        if (!this.is_query_active) {\n            const hl_card_uid = this.highlighted_card_uid()\n            if (hl_card_uid) {\n                return cards.some(\n                    (x) =>\n                        !x.archived ||\n                        hl_card_uid === x.uid ||\n                        x.deep_children.some((y) => y.uid === hl_card_uid),\n                )\n            }\n            return cards.some((x) => !x.archived)\n        }\n        return cards.some(\n            (x) =>\n                (this.visible_card_uids.has(x.uid) ||\n                    x.last_change.date.getTime() > this.last_search.getTime()) &&\n                this.is_archived_and_visible(x),\n        )\n    }\n\n    get is_query_active() {\n        if (!this.query) {\n            return false\n        } else if (this.query.invalid) {\n            // Yes, an invalid query still (technically) is an active query.\n            return true\n        } else if (this.all_boards) {\n            return true\n        } else if (this.query.field_expressions.length > 0) {\n            return true\n        } else {\n            return false\n        }\n    }\n\n    private on_successful_query(args: {\n        query: SearchQuery\n        matches: Map<CardUID | CommentUID, Match[]>\n        archived_cards_visible: boolean\n        visible_card_uids: Map<CardUID, boolean>\n        update_last_search_on_success: boolean\n    }) {\n        this.query = args.query\n        this._all_boards =\n            !this.query.invalid &&\n            this.query.field_expressions.length > 0 &&\n            !this.query.field_expressions.some(\n                (x) => x.field === \"board.uid\" && x.term !== \"all\" && !x.not,\n            )\n        this.matches = args.matches\n        this.cards_first_match = new Map()\n        // It is important that we only add the first match to the result to preserve the order\n        // of entries in the map.\n        // A simple `new Map([...args.matches.values()].map(x => [..., ...])` wouldn't do.\n        for (const x of args.matches.values()) {\n            if (!this.cards_first_match.has(x[0].card_uid)) {\n                this.cards_first_match.set(x[0].card_uid, x[0])\n            }\n        }\n        this.archived_cards_visible = args.archived_cards_visible\n        const all_boards = !args.query.invalid && this._all_boards\n        if (all_boards) {\n            this.swap_card_states([])\n        }\n        this.visible_card_uids = args.visible_card_uids\n        if (all_boards && !this.prev_card_states) {\n            this.prev_card_states = this.swap_card_states([])\n        }\n        if (all_boards && this.prev_card_states) {\n            this.swap_card_states(this.prev_card_states)\n            this.prev_card_states = undefined\n        }\n        if (args.update_last_search_on_success) {\n            this.last_search = new Date()\n        }\n    }\n\n    private on_invalid_query(query: InvalidSearchQuery) {\n        this.query = query\n        this.matches.clear()\n        this.cards_first_match.clear()\n        this.visible_card_uids.clear()\n        this.last_search = new Date()\n        if (this.prev_card_states) {\n            this.swap_card_states(this.prev_card_states)\n            this.prev_card_states = undefined\n        }\n    }\n\n    private async run_search(query_string: string, opts: {update_last_search_on_success: boolean}) {\n        if (this._modify_query_string) {\n            query_string = this._modify_query_string(query_string)\n        }\n        if (!query_string) {\n            // Shortcut: No actual query given -> nothing to do.\n            // We report no actual results back, because in `filter_visible` we have special\n            // handling if the query is empty.\n            this.on_successful_query({\n                query: {field_expressions: [], invalid: false},\n                matches: new Map<CardUID | CommentUID, Match[]>(),\n                archived_cards_visible: false,\n                visible_card_uids: new Map<CardUID, boolean>(),\n                update_last_search_on_success: false,\n            })\n            return Promise.resolve()\n        }\n        run_search_retries = 0\n        try {\n            return await this.sequence.enqueue(query_string, async () => {\n                try {\n                    await run_search({\n                        query_string: query_string,\n                        on_invalid_query: this.on_invalid_query,\n                        on_successful_query: (args_2: {\n                            query: SearchQuery\n                            matches: Map<CardUID | CommentUID, Match[]>\n                            archived_cards_visible: boolean\n                            visible_card_uids: Map<CardUID, boolean>\n                        }) => this.on_successful_query({...args_2, ...opts}),\n                        call_search: this.call_search,\n                    })\n                } catch (error) {\n                    report_error(error)\n                }\n            })\n        } catch (message) {\n            return report_error(message)\n        }\n    }\n}\n\nlet run_search_retries = 0\n\nasync function run_search({\n    query_string,\n    on_invalid_query,\n    on_successful_query,\n    call_search,\n}: {\n    query_string: string\n    on_invalid_query: (query: InvalidSearchQuery) => void\n    on_successful_query: (args: {\n        query: SearchQuery\n        matches: Map<CardUID | CommentUID, Match[]>\n        archived_cards_visible: boolean\n        visible_card_uids: Map<CardUID, boolean>\n    }) => void\n    call_search: CallSearch\n}) {\n    const t0 = Date.now()\n    const query = parse(query_string)\n    if (query.invalid) {\n        log.debug(\"Search query is invalid\", {query})\n        on_invalid_query(query)\n        return\n    }\n    const final_query = JSON.parse(JSON.stringify(query)) as SearchQuery\n    const res = await call_search(final_query)\n    const {matches} = res\n    const required_board_uids = flatten(\n        final_query.field_expressions\n            .filter((x) => x.field === \"board.uid\" && !x.not && x.term !== \"all\")\n            .map((x) => x.term as BoardUID[]),\n    )\n    const indexed_board_uids = new Set(res.indexed_board_uids)\n    if (!required_board_uids.every((x) => indexed_board_uids.has(x))) {\n        run_search_retries += 1\n        if (run_search_retries > 50) {\n            report_error(\"Some required boards are still not synced/indexed - giving up\")\n        } else {\n            setTimeout(\n                () =>\n                    run_search({\n                        on_invalid_query,\n                        on_successful_query,\n                        query_string,\n                        call_search,\n                    }),\n                587,\n            )\n            return\n        }\n    }\n    const computed_matches = new Map<CardUID | CommentUID, Match[]>()\n    for (const x of matches) {\n        let m = x.comment_uid\n            ? computed_matches.get(x.comment_uid)\n            : computed_matches.get(x.card_uid)\n        if (!m) {\n            m = []\n            computed_matches.set(x.comment_uid || x.card_uid, m)\n        }\n        m.push(x)\n    }\n    const board_uids = [...new Set(matches.map((x) => x.board_uid))]\n    const archived_cards_visible = final_query.field_expressions.some(\n        (x) => x.field === \"archived\" && [\"yes\", \"show\"].includes(x.term) && !x.not,\n    )\n    const visible_card_uids = await compute_visible_card_uids(\n        board_uids,\n        computed_matches,\n        archived_cards_visible,\n    )\n    on_successful_query({\n        query,\n        visible_card_uids,\n        matches: computed_matches,\n        archived_cards_visible,\n    })\n    log.debug(\"Got search result\", {num_matching_cards: matches.length, duration: Date.now() - t0})\n}\n\n/**\n * Find visible cards.\n * The values of the result-map indicate whether the card has visible comments.\n */\nasync function compute_visible_card_uids(\n    board_uids: BoardUID[],\n    computed_matches: Map<CardUID | CommentUID, Match[]>,\n    archived_cards_visible: boolean,\n): Promise<Map<CardUID, boolean>> {\n    const result = new Map<CardUID, boolean>()\n    const visible_parents = new Set<CardUID>()\n    for (const board_uid of board_uids) {\n        const board = board_resource.read(board_uid)\n        if (!board) {\n            // The board will become available eventually and the search should be run again.\n            continue\n        }\n        const matches = (x: Card, has_matching_comment: boolean) => {\n            if (computed_matches.has(x.uid) || has_matching_comment) {\n                if (!x.archived || archived_cards_visible) {\n                    return true\n                }\n            }\n            return false\n        }\n        traverse_cards(board.root, (x) => {\n            const has_matching_comment = x.comments.some((y) => computed_matches.has(y.uid))\n            if (\n                matches(x, has_matching_comment) ||\n                x.find_parent((y) => y.is_regular_card && result.has(y.uid))\n            ) {\n                if (!x.archived || archived_cards_visible) {\n                    result.set(x.uid, has_matching_comment)\n                }\n                let parent = x.parent\n                while (!parent.root) {\n                    if ((!x.archived || archived_cards_visible) && !result.has(parent.uid)) {\n                        visible_parents.add(parent.uid)\n                    }\n                    parent = parent.parent\n                }\n            }\n        })\n    }\n    visible_parents.forEach((x) => {\n        if (!result.has(x)) {\n            result.set(x, false)\n        }\n    })\n    return result\n}\n", "// @ts-nocheck\n// eslint-disable\nimport * as model from \"@cling/lib.shared.model\"\nlet module = {}\n// @generated by Peggy 4.0.2.\n//\n// https://peggyjs.org/\n\n;(\"use strict\")\n\nfunction peg$subclass(child, parent) {\n    function C() {\n        this.constructor = child\n    }\n    C.prototype = parent.prototype\n    child.prototype = new C()\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n    var self = Error.call(this, message)\n    // istanbul ignore next Check is a necessary evil to support older environments\n    if (Object.setPrototypeOf) {\n        Object.setPrototypeOf(self, peg$SyntaxError.prototype)\n    }\n    self.expected = expected\n    self.found = found\n    self.location = location\n    self.name = \"SyntaxError\"\n    return self\n}\n\npeg$subclass(peg$SyntaxError, Error)\n\nfunction peg$padEnd(str, targetLength, padString) {\n    padString = padString || \" \"\n    if (str.length > targetLength) {\n        return str\n    }\n    targetLength -= str.length\n    padString += padString.repeat(targetLength)\n    return str + padString.slice(0, targetLength)\n}\n\npeg$SyntaxError.prototype.format = function (sources) {\n    var str = \"Error: \" + this.message\n    if (this.location) {\n        var src = null\n        var k\n        for (k = 0; k < sources.length; k++) {\n            if (sources[k].source === this.location.source) {\n                src = sources[k].text.split(/\\r\\n|\\n|\\r/g)\n                break\n            }\n        }\n        var s = this.location.start\n        var offset_s =\n            this.location.source && typeof this.location.source.offset === \"function\"\n                ? this.location.source.offset(s)\n                : s\n        var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column\n        if (src) {\n            var e = this.location.end\n            var filler = peg$padEnd(\"\", offset_s.line.toString().length, \" \")\n            var line = src[s.line - 1]\n            var last = s.line === e.line ? e.column : line.length + 1\n            var hatLen = last - s.column || 1\n            str +=\n                \"\\n --> \" +\n                loc +\n                \"\\n\" +\n                filler +\n                \" |\\n\" +\n                offset_s.line +\n                \" | \" +\n                line +\n                \"\\n\" +\n                filler +\n                \" | \" +\n                peg$padEnd(\"\", s.column - 1, \" \") +\n                peg$padEnd(\"\", hatLen, \"^\")\n        } else {\n            str += \"\\n at \" + loc\n        }\n    }\n    return str\n}\n\npeg$SyntaxError.buildMessage = function (expected, found) {\n    var DESCRIBE_EXPECTATION_FNS = {\n        literal: function (expectation) {\n            return '\"' + literalEscape(expectation.text) + '\"'\n        },\n\n        class: function (expectation) {\n            var escapedParts = expectation.parts.map(function (part) {\n                return Array.isArray(part)\n                    ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n                    : classEscape(part)\n            })\n\n            return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\"\n        },\n\n        any: function () {\n            return \"any character\"\n        },\n\n        end: function () {\n            return \"end of input\"\n        },\n\n        other: function (expectation) {\n            return expectation.description\n        },\n    }\n\n    function hex(ch) {\n        return ch.charCodeAt(0).toString(16).toUpperCase()\n    }\n\n    function literalEscape(s) {\n        return s\n            .replace(/\\\\/g, \"\\\\\\\\\")\n            .replace(/\"/g, '\\\\\"')\n            .replace(/\\0/g, \"\\\\0\")\n            .replace(/\\t/g, \"\\\\t\")\n            .replace(/\\n/g, \"\\\\n\")\n            .replace(/\\r/g, \"\\\\r\")\n            .replace(/[\\x00-\\x0F]/g, function (ch) {\n                return \"\\\\x0\" + hex(ch)\n            })\n            .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function (ch) {\n                return \"\\\\x\" + hex(ch)\n            })\n    }\n\n    function classEscape(s) {\n        return s\n            .replace(/\\\\/g, \"\\\\\\\\\")\n            .replace(/\\]/g, \"\\\\]\")\n            .replace(/\\^/g, \"\\\\^\")\n            .replace(/-/g, \"\\\\-\")\n            .replace(/\\0/g, \"\\\\0\")\n            .replace(/\\t/g, \"\\\\t\")\n            .replace(/\\n/g, \"\\\\n\")\n            .replace(/\\r/g, \"\\\\r\")\n            .replace(/[\\x00-\\x0F]/g, function (ch) {\n                return \"\\\\x0\" + hex(ch)\n            })\n            .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function (ch) {\n                return \"\\\\x\" + hex(ch)\n            })\n    }\n\n    function describeExpectation(expectation) {\n        return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation)\n    }\n\n    function describeExpected(expected) {\n        var descriptions = expected.map(describeExpectation)\n        var i, j\n\n        descriptions.sort()\n\n        if (descriptions.length > 0) {\n            for (i = 1, j = 1; i < descriptions.length; i++) {\n                if (descriptions[i - 1] !== descriptions[i]) {\n                    descriptions[j] = descriptions[i]\n                    j++\n                }\n            }\n            descriptions.length = j\n        }\n\n        switch (descriptions.length) {\n            case 1:\n                return descriptions[0]\n\n            case 2:\n                return descriptions[0] + \" or \" + descriptions[1]\n\n            default:\n                return (\n                    descriptions.slice(0, -1).join(\", \") +\n                    \", or \" +\n                    descriptions[descriptions.length - 1]\n                )\n        }\n    }\n\n    function describeFound(found) {\n        return found ? '\"' + literalEscape(found) + '\"' : \"end of input\"\n    }\n\n    return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\"\n}\n\nfunction peg$parse(input, options) {\n    options = options !== undefined ? options : {}\n\n    var peg$FAILED = {}\n    var peg$source = options.grammarSource\n\n    var peg$startRuleFunctions = {start: peg$parsestart}\n    var peg$startRuleFunction = peg$parsestart\n\n    var peg$c0 = \"ORDER\"\n    var peg$c1 = \"BY\"\n    var peg$c2 = \"modified.at\"\n    var peg$c3 = \"task.date\"\n    var peg$c4 = \"ASC\"\n    var peg$c5 = \"DESC\"\n    var peg$c6 = \"NOT\"\n    var peg$c7 = \"task\"\n    var peg$c8 = \":\"\n    var peg$c9 = \"yes\"\n    var peg$c10 = \"no\"\n    var peg$c11 = \"archived\"\n    var peg$c12 = \"show\"\n    var peg$c13 = \"task.status\"\n    var peg$c14 = \"open\"\n    var peg$c15 = \"done\"\n    var peg$c16 = \"card.kind\"\n    var peg$c17 = \"note\"\n    var peg$c18 = \"link\"\n    var peg$c19 = \"file\"\n    var peg$c20 = \"card.color\"\n    var peg$c21 = \"card.created.by\"\n    var peg$c22 = \"card.modified.by\"\n    var peg$c23 = \"task.assignee\"\n    var peg$c24 = \"task.created.by\"\n    var peg$c25 = \"task.modified.by\"\n    var peg$c26 = \"[\"\n    var peg$c27 = \"TO\"\n    var peg$c28 = \"]\"\n    var peg$c29 = \"card.uid\"\n    var peg$c30 = \"comment.uid\"\n    var peg$c31 = \"board.uid\"\n    var peg$c32 = \":all\"\n    var peg$c33 = \"board.owner\"\n    var peg$c34 = \"board.acl.all\"\n    var peg$c35 = \"OR\"\n    var peg$c36 = \"(\"\n    var peg$c37 = \")\"\n    var peg$c38 = '\"'\n    var peg$c39 = \"-\"\n    var peg$c40 = \"T\"\n    var peg$c41 = \".\"\n\n    var peg$r0 = /^[^: \\t\\r\\n\\f{}()\"+\\/\\^~[\\]]/\n    var peg$r1 = /^[^\"]/\n    var peg$r2 = /^[+-Z]/\n    var peg$r3 = /^[0-9]/\n    var peg$r4 = /^[ \\t\\r\\n\\f]/\n\n    var peg$e0 = peg$literalExpectation(\"ORDER\", false)\n    var peg$e1 = peg$literalExpectation(\"BY\", false)\n    var peg$e2 = peg$literalExpectation(\"modified.at\", false)\n    var peg$e3 = peg$literalExpectation(\"task.date\", false)\n    var peg$e4 = peg$literalExpectation(\"ASC\", false)\n    var peg$e5 = peg$literalExpectation(\"DESC\", false)\n    var peg$e6 = peg$literalExpectation(\"NOT\", false)\n    var peg$e7 = peg$literalExpectation(\"task\", false)\n    var peg$e8 = peg$literalExpectation(\":\", false)\n    var peg$e9 = peg$literalExpectation(\"yes\", false)\n    var peg$e10 = peg$literalExpectation(\"no\", false)\n    var peg$e11 = peg$literalExpectation(\"archived\", false)\n    var peg$e12 = peg$literalExpectation(\"show\", false)\n    var peg$e13 = peg$literalExpectation(\"task.status\", false)\n    var peg$e14 = peg$literalExpectation(\"open\", false)\n    var peg$e15 = peg$literalExpectation(\"done\", false)\n    var peg$e16 = peg$literalExpectation(\"card.kind\", false)\n    var peg$e17 = peg$literalExpectation(\"note\", false)\n    var peg$e18 = peg$literalExpectation(\"link\", false)\n    var peg$e19 = peg$literalExpectation(\"file\", false)\n    var peg$e20 = peg$literalExpectation(\"card.color\", false)\n    var peg$e21 = peg$literalExpectation(\"card.created.by\", false)\n    var peg$e22 = peg$literalExpectation(\"card.modified.by\", false)\n    var peg$e23 = peg$literalExpectation(\"task.assignee\", false)\n    var peg$e24 = peg$literalExpectation(\"task.created.by\", false)\n    var peg$e25 = peg$literalExpectation(\"task.modified.by\", false)\n    var peg$e26 = peg$literalExpectation(\"[\", false)\n    var peg$e27 = peg$literalExpectation(\"TO\", false)\n    var peg$e28 = peg$literalExpectation(\"]\", false)\n    var peg$e29 = peg$anyExpectation()\n    var peg$e30 = peg$literalExpectation(\"card.uid\", false)\n    var peg$e31 = peg$literalExpectation(\"comment.uid\", false)\n    var peg$e32 = peg$literalExpectation(\"board.uid\", false)\n    var peg$e33 = peg$literalExpectation(\":all\", false)\n    var peg$e34 = peg$literalExpectation(\"board.owner\", false)\n    var peg$e35 = peg$literalExpectation(\"board.acl.all\", false)\n    var peg$e36 = peg$classExpectation(\n        [\":\", \" \", \"\\t\", \"\\r\", \"\\n\", \"\\f\", \"{\", \"}\", \"(\", \")\", '\"', \"+\", \"/\", \"^\", \"~\", \"[\", \"]\"],\n        true,\n        false,\n    )\n    var peg$e37 = peg$literalExpectation(\"OR\", false)\n    var peg$e38 = peg$literalExpectation(\"(\", false)\n    var peg$e39 = peg$literalExpectation(\")\", false)\n    var peg$e40 = peg$literalExpectation('\"', false)\n    var peg$e41 = peg$classExpectation(['\"'], true, false)\n    var peg$e42 = peg$literalExpectation(\"-\", false)\n    var peg$e43 = peg$literalExpectation(\"T\", false)\n    var peg$e44 = peg$literalExpectation(\".\", false)\n    var peg$e45 = peg$classExpectation([[\"+\", \"Z\"]], false, false)\n    var peg$e46 = peg$classExpectation([[\"0\", \"9\"]], false, false)\n    var peg$e47 = peg$otherExpectation(\"whitespace\")\n    var peg$e48 = peg$classExpectation([\" \", \"\\t\", \"\\r\", \"\\n\", \"\\f\"], false, false)\n\n    var peg$f0 = function (field_expressions, order) {\n        if (order) {\n            return {\n                field_expressions,\n                order,\n            }\n        }\n        return {\n            field_expressions,\n        }\n    }\n    var peg$f1 = function (field, dir) {\n        return {\n            field,\n            dir: dir || \"ASC\",\n        }\n    }\n    var peg$f2 = function (not, field_exp) {\n        if (not === \"NOT\") {\n            field_exp.not = true\n        }\n        return field_exp\n    }\n    var peg$f3 = function (field, term) {\n        if (term !== \"yes\" && term !== \"no\") {\n            throw value_error(field, term, location())\n        }\n        return {\n            field,\n            term,\n        }\n    }\n    var peg$f4 = function (field, term) {\n        if (term !== \"yes\" && term !== \"no\" && term !== \"show\") {\n            throw value_error(field, term, location())\n        }\n        return {\n            field,\n            term,\n        }\n    }\n    var peg$f5 = function (field, term) {\n        if (term !== \"open\" && term !== \"done\") {\n            throw value_error(field, term, location())\n        }\n        return {\n            field,\n            term: term === \"open\" ? model.TaskStatus.task_open : model.TaskStatus.task_done,\n        }\n    }\n    var peg$f6 = function (field, term) {\n        if (![\"note\", \"link\", \"file\"].includes(term)) {\n            throw value_error(field, term, location())\n        }\n        return {\n            field,\n            term,\n        }\n    }\n    var peg$f7 = function (field, term) {\n        if (term === \"no_color\") {\n            throw value_error(field, term, location())\n        }\n        if (term === \"no\") {\n            term = \"no_color\"\n        }\n        if (term === \"yes\") {\n            return {\n                field,\n                term: \"yes\",\n            }\n        }\n        if (isNaN(model.CardColor[term] as any)) {\n            throw value_error(field, term, location())\n        }\n        return {\n            field,\n            term: model.CardColor[term],\n        }\n    }\n    var peg$f8 = function (field, term) {\n        return {\n            field,\n            term,\n        }\n    }\n    var peg$f9 = function (field, left_closed, from, to, right_closed) {\n        const from_t = Date.parse(from)\n        if (isNaN(from_t)) {\n            throw value_error(field, from, location())\n        }\n        const to_t = Date.parse(to)\n        if (isNaN(to_t)) {\n            throw value_error(field, to, location())\n        }\n        return {\n            field,\n            term: {\n                from: from_t,\n                to: to_t,\n                // We use the mathematical notion of open and closed intervals:\n                // https://en.wikipedia.org/wiki/Interval_(mathematics)\n                range:\n                    left_closed && right_closed\n                        ? \"closed\"\n                        : left_closed\n                          ? \"left_closed\"\n                          : right_closed\n                            ? \"right_closed\"\n                            : \"open\",\n            },\n        }\n    }\n    var peg$f10 = function (field, invalid_value) {\n        throw value_error(field, invalid_value.join(\"\"), location())\n    }\n    var peg$f11 = function (field, left_closed, from, to, right_closed) {\n        const from_t = Date.parse(from)\n        if (isNaN(from_t)) {\n            throw value_error(field, from, location())\n        }\n        const to_t = Date.parse(to)\n        if (isNaN(to_t)) {\n            throw value_error(field, to, location())\n        }\n        return {\n            field,\n            term: {\n                from: from_t,\n                to: to_t,\n                // We use the mathematical notion of open and closed intervals:\n                // https://en.wikipedia.org/wiki/Interval_(mathematics)\n                range:\n                    left_closed && right_closed\n                        ? \"closed\"\n                        : left_closed\n                          ? \"left_closed\"\n                          : right_closed\n                            ? \"right_closed\"\n                            : \"open\",\n            },\n        }\n    }\n    var peg$f12 = function (field, invalid_value) {\n        throw value_error(field, invalid_value.join(\"\"), location())\n    }\n    var peg$f13 = function (field, term_list) {\n        if (!Array.isArray(term_list)) {\n            term_list = [term_list]\n        }\n        for (const term of term_list) {\n            if (!model.is_CardUID(term)) {\n                throw value_error(field, term, location())\n            }\n        }\n        return {\n            field,\n            term: term_list,\n        }\n    }\n    var peg$f14 = function (field, term_list) {\n        if (!Array.isArray(term_list)) {\n            term_list = [term_list]\n        }\n        for (const term of term_list) {\n            if (!model.is_CommentUID(term)) {\n                throw value_error(field, term, location())\n            }\n        }\n        return {\n            field,\n            term: term_list,\n        }\n    }\n    var peg$f15 = function (field) {\n        return {\n            field,\n            term: \"all\",\n        }\n    }\n    var peg$f16 = function (field, term_list) {\n        if (!Array.isArray(term_list)) {\n            term_list = [term_list]\n        }\n        for (const term of term_list) {\n            if (!model.is_BoardUID(term)) {\n                throw value_error(field, term, location())\n            }\n        }\n        return {\n            field,\n            term: term_list,\n        }\n    }\n    var peg$f17 = function (field, term_list) {\n        if (!Array.isArray(term_list)) {\n            term_list = [term_list]\n        }\n        return {\n            field,\n            term: term_list,\n        }\n    }\n    var peg$f18 = function (field, term_list) {\n        if (!Array.isArray(term_list)) {\n            term_list = [term_list]\n        }\n        return {\n            field,\n            term: term_list,\n        }\n    }\n    var peg$f19 = function (field) {\n        throw unknown_field_error(field, location())\n    }\n    var peg$f20 = function (term) {\n        return {\n            field: null,\n            term: term,\n            quoted: false,\n        }\n    }\n    var peg$f21 = function (term) {\n        return {\n            field: null,\n            term: term,\n            quoted: true,\n        }\n    }\n    var peg$f22 = function (term) {\n        return term\n    }\n    var peg$f23 = function (term) {\n        return term.join(\"\")\n    }\n    var peg$f24 = function (term) {\n        return term\n    }\n    var peg$f25 = function (term, term_list) {\n        return [term].concat(term_list)\n    }\n    var peg$f26 = function (term) {\n        return term.join(\"\")\n    }\n    var peg$f27 = function () {\n        return text()\n    }\n    var peg$currPos = options.peg$currPos | 0\n    var peg$savedPos = peg$currPos\n    var peg$posDetailsCache = [{line: 1, column: 1}]\n    var peg$maxFailPos = peg$currPos\n    var peg$maxFailExpected = options.peg$maxFailExpected || []\n    var peg$silentFails = options.peg$silentFails | 0\n\n    var peg$result\n\n    if (options.startRule) {\n        if (!(options.startRule in peg$startRuleFunctions)) {\n            throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + '\".')\n        }\n\n        peg$startRuleFunction = peg$startRuleFunctions[options.startRule]\n    }\n\n    function text() {\n        return input.substring(peg$savedPos, peg$currPos)\n    }\n\n    function offset() {\n        return peg$savedPos\n    }\n\n    function range() {\n        return {\n            source: peg$source,\n            start: peg$savedPos,\n            end: peg$currPos,\n        }\n    }\n\n    function location() {\n        return peg$computeLocation(peg$savedPos, peg$currPos)\n    }\n\n    function expected(description, location) {\n        location =\n            location !== undefined ? location : peg$computeLocation(peg$savedPos, peg$currPos)\n\n        throw peg$buildStructuredError(\n            [peg$otherExpectation(description)],\n            input.substring(peg$savedPos, peg$currPos),\n            location,\n        )\n    }\n\n    function error(message, location) {\n        location =\n            location !== undefined ? location : peg$computeLocation(peg$savedPos, peg$currPos)\n\n        throw peg$buildSimpleError(message, location)\n    }\n\n    function peg$literalExpectation(text, ignoreCase) {\n        return {type: \"literal\", text: text, ignoreCase: ignoreCase}\n    }\n\n    function peg$classExpectation(parts, inverted, ignoreCase) {\n        return {type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase}\n    }\n\n    function peg$anyExpectation() {\n        return {type: \"any\"}\n    }\n\n    function peg$endExpectation() {\n        return {type: \"end\"}\n    }\n\n    function peg$otherExpectation(description) {\n        return {type: \"other\", description: description}\n    }\n\n    function peg$computePosDetails(pos) {\n        var details = peg$posDetailsCache[pos]\n        var p\n\n        if (details) {\n            return details\n        } else {\n            if (pos >= peg$posDetailsCache.length) {\n                p = peg$posDetailsCache.length - 1\n            } else {\n                p = pos\n                while (!peg$posDetailsCache[--p]) {}\n            }\n\n            details = peg$posDetailsCache[p]\n            details = {\n                line: details.line,\n                column: details.column,\n            }\n\n            while (p < pos) {\n                if (input.charCodeAt(p) === 10) {\n                    details.line++\n                    details.column = 1\n                } else {\n                    details.column++\n                }\n\n                p++\n            }\n\n            peg$posDetailsCache[pos] = details\n\n            return details\n        }\n    }\n\n    function peg$computeLocation(startPos, endPos, offset) {\n        var startPosDetails = peg$computePosDetails(startPos)\n        var endPosDetails = peg$computePosDetails(endPos)\n\n        var res = {\n            source: peg$source,\n            start: {\n                offset: startPos,\n                line: startPosDetails.line,\n                column: startPosDetails.column,\n            },\n            end: {\n                offset: endPos,\n                line: endPosDetails.line,\n                column: endPosDetails.column,\n            },\n        }\n        if (offset && peg$source && typeof peg$source.offset === \"function\") {\n            res.start = peg$source.offset(res.start)\n            res.end = peg$source.offset(res.end)\n        }\n        return res\n    }\n\n    function peg$fail(expected) {\n        if (peg$currPos < peg$maxFailPos) {\n            return\n        }\n\n        if (peg$currPos > peg$maxFailPos) {\n            peg$maxFailPos = peg$currPos\n            peg$maxFailExpected = []\n        }\n\n        peg$maxFailExpected.push(expected)\n    }\n\n    function peg$buildSimpleError(message, location) {\n        return new peg$SyntaxError(message, null, null, location)\n    }\n\n    function peg$buildStructuredError(expected, found, location) {\n        return new peg$SyntaxError(\n            peg$SyntaxError.buildMessage(expected, found),\n            expected,\n            found,\n            location,\n        )\n    }\n\n    function peg$parsestart() {\n        var s0, s1, s2, s3\n\n        s0 = peg$currPos\n        s1 = []\n        s2 = peg$parse_()\n        while (s2 !== peg$FAILED) {\n            s1.push(s2)\n            s2 = peg$parse_()\n        }\n        s2 = []\n        s3 = peg$parsefield_exp_top()\n        while (s3 !== peg$FAILED) {\n            s2.push(s3)\n            s3 = peg$parsefield_exp_top()\n        }\n        s3 = peg$parseorder()\n        if (s3 === peg$FAILED) {\n            s3 = null\n        }\n        peg$savedPos = s0\n        s0 = peg$f0(s2, s3)\n\n        return s0\n    }\n\n    function peg$parseorder() {\n        var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9\n\n        s0 = peg$currPos\n        if (input.substr(peg$currPos, 5) === peg$c0) {\n            s1 = peg$c0\n            peg$currPos += 5\n        } else {\n            s1 = peg$FAILED\n            if (peg$silentFails === 0) {\n                peg$fail(peg$e0)\n            }\n        }\n        if (s1 !== peg$FAILED) {\n            s2 = []\n            s3 = peg$parse_()\n            while (s3 !== peg$FAILED) {\n                s2.push(s3)\n                s3 = peg$parse_()\n            }\n            if (input.substr(peg$currPos, 2) === peg$c1) {\n                s3 = peg$c1\n                peg$currPos += 2\n            } else {\n                s3 = peg$FAILED\n                if (peg$silentFails === 0) {\n                    peg$fail(peg$e1)\n                }\n            }\n            if (s3 !== peg$FAILED) {\n                s4 = []\n                s5 = peg$parse_()\n                while (s5 !== peg$FAILED) {\n                    s4.push(s5)\n                    s5 = peg$parse_()\n                }\n                if (input.substr(peg$currPos, 11) === peg$c2) {\n                    s5 = peg$c2\n                    peg$currPos += 11\n                } else {\n                    s5 = peg$FAILED\n                    if (peg$silentFails === 0) {\n                        peg$fail(peg$e2)\n                    }\n                }\n                if (s5 === peg$FAILED) {\n                    if (input.substr(peg$currPos, 9) === peg$c3) {\n                        s5 = peg$c3\n                        peg$currPos += 9\n                    } else {\n                        s5 = peg$FAILED\n                        if (peg$silentFails === 0) {\n                            peg$fail(peg$e3)\n                        }\n                    }\n                }\n                if (s5 !== peg$FAILED) {\n                    s6 = []\n                    s7 = peg$parse_()\n                    while (s7 !== peg$FAILED) {\n                        s6.push(s7)\n                        s7 = peg$parse_()\n                    }\n                    if (input.substr(peg$currPos, 3) === peg$c4) {\n                        s7 = peg$c4\n                        peg$currPos += 3\n                    } else {\n                        s7 = peg$FAILED\n                        if (peg$silentFails === 0) {\n                            peg$fail(peg$e4)\n                        }\n                    }\n                    if (s7 === peg$FAILED) {\n                        if (input.substr(peg$currPos, 4) === peg$c5) {\n                            s7 = peg$c5\n                            peg$currPos += 4\n                        } else {\n                            s7 = peg$FAILED\n                            if (peg$silentFails === 0) {\n                                peg$fail(peg$e5)\n                            }\n                        }\n                    }\n                    if (s7 === peg$FAILED) {\n                        s7 = null\n                    }\n                    s8 = []\n                    s9 = peg$parse_()\n                    while (s9 !== peg$FAILED) {\n                        s8.push(s9)\n                        s9 = peg$parse_()\n                    }\n                    peg$savedPos = s0\n                    s0 = peg$f1(s5, s7)\n                } else {\n                    peg$currPos = s0\n                    s0 = peg$FAILED\n                }\n            } else {\n                peg$currPos = s0\n                s0 = peg$FAILED\n            }\n        } else {\n            peg$currPos = s0\n            s0 = peg$FAILED\n        }\n\n        return s0\n    }\n\n    function peg$parsefield_exp_top() {\n        var s0, s1, s2, s3, s4, s5, s6\n\n        s0 = peg$currPos\n        s1 = peg$currPos\n        peg$silentFails++\n        if (input.substr(peg$currPos, 5) === peg$c0) {\n            s2 = peg$c0\n            peg$currPos += 5\n        } else {\n            s2 = peg$FAILED\n            if (peg$silentFails === 0) {\n                peg$fail(peg$e0)\n            }\n        }\n        peg$silentFails--\n        if (s2 === peg$FAILED) {\n            s1 = undefined\n        } else {\n            peg$currPos = s1\n            s1 = peg$FAILED\n        }\n        if (s1 !== peg$FAILED) {\n            if (input.substr(peg$currPos, 3) === peg$c6) {\n                s2 = peg$c6\n                peg$currPos += 3\n            } else {\n                s2 = peg$FAILED\n                if (peg$silentFails === 0) {\n                    peg$fail(peg$e6)\n                }\n            }\n            if (s2 === peg$FAILED) {\n                s2 = null\n            }\n            s3 = []\n            s4 = peg$parse_()\n            while (s4 !== peg$FAILED) {\n                s3.push(s4)\n                s4 = peg$parse_()\n            }\n            s4 = peg$parsefield_exp()\n            if (s4 !== peg$FAILED) {\n                s5 = []\n                s6 = peg$parse_()\n                while (s6 !== peg$FAILED) {\n                    s5.push(s6)\n                    s6 = peg$parse_()\n                }\n                peg$savedPos = s0\n                s0 = peg$f2(s2, s4)\n            } else {\n                peg$currPos = s0\n                s0 = peg$FAILED\n            }\n        } else {\n            peg$currPos = s0\n            s0 = peg$FAILED\n        }\n\n        return s0\n    }\n\n    function peg$parsefield_exp() {\n        var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9\n\n        s0 = peg$currPos\n        if (input.substr(peg$currPos, 4) === peg$c7) {\n            s1 = peg$c7\n            peg$currPos += 4\n        } else {\n            s1 = peg$FAILED\n            if (peg$silentFails === 0) {\n                peg$fail(peg$e7)\n            }\n        }\n        if (s1 !== peg$FAILED) {\n            if (input.charCodeAt(peg$currPos) === 58) {\n                s2 = peg$c8\n                peg$currPos++\n            } else {\n                s2 = peg$FAILED\n                if (peg$silentFails === 0) {\n                    peg$fail(peg$e8)\n                }\n            }\n            if (s2 !== peg$FAILED) {\n                if (input.substr(peg$currPos, 3) === peg$c9) {\n                    s3 = peg$c9\n                    peg$currPos += 3\n                } else {\n                    s3 = peg$FAILED\n                    if (peg$silentFails === 0) {\n                        peg$fail(peg$e9)\n                    }\n                }\n                if (s3 === peg$FAILED) {\n                    if (input.substr(peg$currPos, 2) === peg$c10) {\n                        s3 = peg$c10\n                        peg$currPos += 2\n                    } else {\n                        s3 = peg$FAILED\n                        if (peg$silentFails === 0) {\n                            peg$fail(peg$e10)\n                        }\n                    }\n                    if (s3 === peg$FAILED) {\n                        s3 = peg$parseterm()\n                    }\n                }\n                if (s3 !== peg$FAILED) {\n                    peg$savedPos = s0\n                    s0 = peg$f3(s1, s3)\n                } else {\n                    peg$currPos = s0\n                    s0 = peg$FAILED\n                }\n            } else {\n                peg$currPos = s0\n                s0 = peg$FAILED\n            }\n        } else {\n            peg$currPos = s0\n            s0 = peg$FAILED\n        }\n        if (s0 === peg$FAILED) {\n            s0 = peg$currPos\n            if (input.substr(peg$currPos, 8) === peg$c11) {\n                s1 = peg$c11\n                peg$currPos += 8\n            } else {\n                s1 = peg$FAILED\n                if (peg$silentFails === 0) {\n                    peg$fail(peg$e11)\n                }\n            }\n            if (s1 !== peg$FAILED) {\n                if (input.charCodeAt(peg$currPos) === 58) {\n                    s2 = peg$c8\n                    peg$currPos++\n                } else {\n                    s2 = peg$FAILED\n                    if (peg$silentFails === 0) {\n                        peg$fail(peg$e8)\n                    }\n                }\n                if (s2 !== peg$FAILED) {\n                    if (input.substr(peg$currPos, 3) === peg$c9) {\n                        s3 = peg$c9\n                        peg$currPos += 3\n                    } else {\n                        s3 = peg$FAILED\n                        if (peg$silentFails === 0) {\n                            peg$fail(peg$e9)\n                        }\n                    }\n                    if (s3 === peg$FAILED) {\n                        if (input.substr(peg$currPos, 2) === peg$c10) {\n                            s3 = peg$c10\n                            peg$currPos += 2\n                        } else {\n                            s3 = peg$FAILED\n                            if (peg$silentFails === 0) {\n                                peg$fail(peg$e10)\n                            }\n                        }\n                        if (s3 === peg$FAILED) {\n                            if (input.substr(peg$currPos, 4) === peg$c12) {\n                                s3 = peg$c12\n                                peg$currPos += 4\n                            } else {\n                                s3 = peg$FAILED\n                                if (peg$silentFails === 0) {\n                                    peg$fail(peg$e12)\n                                }\n                            }\n                            if (s3 === peg$FAILED) {\n                                s3 = peg$parseterm()\n                            }\n                        }\n                    }\n                    if (s3 !== peg$FAILED) {\n                        peg$savedPos = s0\n                        s0 = peg$f4(s1, s3)\n                    } else {\n                        peg$currPos = s0\n                        s0 = peg$FAILED\n                    }\n                } else {\n                    peg$currPos = s0\n                    s0 = peg$FAILED\n                }\n            } else {\n                peg$currPos = s0\n                s0 = peg$FAILED\n            }\n            if (s0 === peg$FAILED) {\n                s0 = peg$currPos\n                if (input.substr(peg$currPos, 11) === peg$c13) {\n                    s1 = peg$c13\n                    peg$currPos += 11\n                } else {\n                    s1 = peg$FAILED\n                    if (peg$silentFails === 0) {\n                        peg$fail(peg$e13)\n                    }\n                }\n                if (s1 !== peg$FAILED) {\n                    if (input.charCodeAt(peg$currPos) === 58) {\n                        s2 = peg$c8\n                        peg$currPos++\n                    } else {\n                        s2 = peg$FAILED\n                        if (peg$silentFails === 0) {\n                            peg$fail(peg$e8)\n                        }\n                    }\n                    if (s2 !== peg$FAILED) {\n                        if (input.substr(peg$currPos, 4) === peg$c14) {\n                            s3 = peg$c14\n                            peg$currPos += 4\n                        } else {\n                            s3 = peg$FAILED\n                            if (peg$silentFails === 0) {\n                                peg$fail(peg$e14)\n                            }\n                        }\n                        if (s3 === peg$FAILED) {\n                            if (input.substr(peg$currPos, 4) === peg$c15) {\n                                s3 = peg$c15\n                                peg$currPos += 4\n                            } else {\n                                s3 = peg$FAILED\n                                if (peg$silentFails === 0) {\n                                    peg$fail(peg$e15)\n                                }\n                            }\n                            if (s3 === peg$FAILED) {\n                                s3 = peg$parseterm()\n                            }\n                        }\n                        if (s3 !== peg$FAILED) {\n                            peg$savedPos = s0\n                            s0 = peg$f5(s1, s3)\n                        } else {\n                            peg$currPos = s0\n                            s0 = peg$FAILED\n                        }\n                    } else {\n                        peg$currPos = s0\n                        s0 = peg$FAILED\n                    }\n                } else {\n                    peg$currPos = s0\n                    s0 = peg$FAILED\n                }\n                if (s0 === peg$FAILED) {\n                    s0 = peg$currPos\n                    if (input.substr(peg$currPos, 9) === peg$c16) {\n                        s1 = peg$c16\n                        peg$currPos += 9\n                    } else {\n                        s1 = peg$FAILED\n                        if (peg$silentFails === 0) {\n                            peg$fail(peg$e16)\n                        }\n                    }\n                    if (s1 !== peg$FAILED) {\n                        if (input.charCodeAt(peg$currPos) === 58) {\n                            s2 = peg$c8\n                            peg$currPos++\n                        } else {\n                            s2 = peg$FAILED\n                            if (peg$silentFails === 0) {\n                                peg$fail(peg$e8)\n                            }\n                        }\n                        if (s2 !== peg$FAILED) {\n                            if (input.substr(peg$currPos, 4) === peg$c17) {\n                                s3 = peg$c17\n                                peg$currPos += 4\n                            } else {\n                                s3 = peg$FAILED\n                                if (peg$silentFails === 0) {\n                                    peg$fail(peg$e17)\n                                }\n                            }\n                            if (s3 === peg$FAILED) {\n                                if (input.substr(peg$currPos, 4) === peg$c18) {\n                                    s3 = peg$c18\n                                    peg$currPos += 4\n                                } else {\n                                    s3 = peg$FAILED\n                                    if (peg$silentFails === 0) {\n                                        peg$fail(peg$e18)\n                                    }\n                                }\n                                if (s3 === peg$FAILED) {\n                                    if (input.substr(peg$currPos, 4) === peg$c19) {\n                                        s3 = peg$c19\n                                        peg$currPos += 4\n                                    } else {\n                                        s3 = peg$FAILED\n                                        if (peg$silentFails === 0) {\n                                            peg$fail(peg$e19)\n                                        }\n                                    }\n                                    if (s3 === peg$FAILED) {\n                                        s3 = peg$parseterm()\n                                    }\n                                }\n                            }\n                            if (s3 !== peg$FAILED) {\n                                peg$savedPos = s0\n                                s0 = peg$f6(s1, s3)\n                            } else {\n                                peg$currPos = s0\n                                s0 = peg$FAILED\n                            }\n                        } else {\n                            peg$currPos = s0\n                            s0 = peg$FAILED\n                        }\n                    } else {\n                        peg$currPos = s0\n                        s0 = peg$FAILED\n                    }\n                    if (s0 === peg$FAILED) {\n                        s0 = peg$currPos\n                        if (input.substr(peg$currPos, 10) === peg$c20) {\n                            s1 = peg$c20\n                            peg$currPos += 10\n                        } else {\n                            s1 = peg$FAILED\n                            if (peg$silentFails === 0) {\n                                peg$fail(peg$e20)\n                            }\n                        }\n                        if (s1 !== peg$FAILED) {\n                            if (input.charCodeAt(peg$currPos) === 58) {\n                                s2 = peg$c8\n                                peg$currPos++\n                            } else {\n                                s2 = peg$FAILED\n                                if (peg$silentFails === 0) {\n                                    peg$fail(peg$e8)\n                                }\n                            }\n                            if (s2 !== peg$FAILED) {\n                                s3 = peg$parseterm()\n                                if (s3 !== peg$FAILED) {\n                                    peg$savedPos = s0\n                                    s0 = peg$f7(s1, s3)\n                                } else {\n                                    peg$currPos = s0\n                                    s0 = peg$FAILED\n                                }\n                            } else {\n                                peg$currPos = s0\n                                s0 = peg$FAILED\n                            }\n                        } else {\n                            peg$currPos = s0\n                            s0 = peg$FAILED\n                        }\n                        if (s0 === peg$FAILED) {\n                            s0 = peg$currPos\n                            if (input.substr(peg$currPos, 15) === peg$c21) {\n                                s1 = peg$c21\n                                peg$currPos += 15\n                            } else {\n                                s1 = peg$FAILED\n                                if (peg$silentFails === 0) {\n                                    peg$fail(peg$e21)\n                                }\n                            }\n                            if (s1 === peg$FAILED) {\n                                if (input.substr(peg$currPos, 16) === peg$c22) {\n                                    s1 = peg$c22\n                                    peg$currPos += 16\n                                } else {\n                                    s1 = peg$FAILED\n                                    if (peg$silentFails === 0) {\n                                        peg$fail(peg$e22)\n                                    }\n                                }\n                                if (s1 === peg$FAILED) {\n                                    if (input.substr(peg$currPos, 13) === peg$c23) {\n                                        s1 = peg$c23\n                                        peg$currPos += 13\n                                    } else {\n                                        s1 = peg$FAILED\n                                        if (peg$silentFails === 0) {\n                                            peg$fail(peg$e23)\n                                        }\n                                    }\n                                    if (s1 === peg$FAILED) {\n                                        if (input.substr(peg$currPos, 15) === peg$c24) {\n                                            s1 = peg$c24\n                                            peg$currPos += 15\n                                        } else {\n                                            s1 = peg$FAILED\n                                            if (peg$silentFails === 0) {\n                                                peg$fail(peg$e24)\n                                            }\n                                        }\n                                        if (s1 === peg$FAILED) {\n                                            if (input.substr(peg$currPos, 16) === peg$c25) {\n                                                s1 = peg$c25\n                                                peg$currPos += 16\n                                            } else {\n                                                s1 = peg$FAILED\n                                                if (peg$silentFails === 0) {\n                                                    peg$fail(peg$e25)\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                            if (s1 !== peg$FAILED) {\n                                if (input.charCodeAt(peg$currPos) === 58) {\n                                    s2 = peg$c8\n                                    peg$currPos++\n                                } else {\n                                    s2 = peg$FAILED\n                                    if (peg$silentFails === 0) {\n                                        peg$fail(peg$e8)\n                                    }\n                                }\n                                if (s2 !== peg$FAILED) {\n                                    s3 = peg$parseterm()\n                                    if (s3 !== peg$FAILED) {\n                                        peg$savedPos = s0\n                                        s0 = peg$f8(s1, s3)\n                                    } else {\n                                        peg$currPos = s0\n                                        s0 = peg$FAILED\n                                    }\n                                } else {\n                                    peg$currPos = s0\n                                    s0 = peg$FAILED\n                                }\n                            } else {\n                                peg$currPos = s0\n                                s0 = peg$FAILED\n                            }\n                            if (s0 === peg$FAILED) {\n                                s0 = peg$currPos\n                                if (input.substr(peg$currPos, 11) === peg$c2) {\n                                    s1 = peg$c2\n                                    peg$currPos += 11\n                                } else {\n                                    s1 = peg$FAILED\n                                    if (peg$silentFails === 0) {\n                                        peg$fail(peg$e2)\n                                    }\n                                }\n                                if (s1 !== peg$FAILED) {\n                                    if (input.charCodeAt(peg$currPos) === 58) {\n                                        s2 = peg$c8\n                                        peg$currPos++\n                                    } else {\n                                        s2 = peg$FAILED\n                                        if (peg$silentFails === 0) {\n                                            peg$fail(peg$e8)\n                                        }\n                                    }\n                                    if (s2 !== peg$FAILED) {\n                                        if (input.charCodeAt(peg$currPos) === 91) {\n                                            s3 = peg$c26\n                                            peg$currPos++\n                                        } else {\n                                            s3 = peg$FAILED\n                                            if (peg$silentFails === 0) {\n                                                peg$fail(peg$e26)\n                                            }\n                                        }\n                                        if (s3 === peg$FAILED) {\n                                            s3 = null\n                                        }\n                                        s4 = peg$parseiso8601_string()\n                                        if (s4 !== peg$FAILED) {\n                                            s5 = []\n                                            s6 = peg$parse_()\n                                            while (s6 !== peg$FAILED) {\n                                                s5.push(s6)\n                                                s6 = peg$parse_()\n                                            }\n                                            if (input.substr(peg$currPos, 2) === peg$c27) {\n                                                s6 = peg$c27\n                                                peg$currPos += 2\n                                            } else {\n                                                s6 = peg$FAILED\n                                                if (peg$silentFails === 0) {\n                                                    peg$fail(peg$e27)\n                                                }\n                                            }\n                                            if (s6 !== peg$FAILED) {\n                                                s7 = []\n                                                s8 = peg$parse_()\n                                                while (s8 !== peg$FAILED) {\n                                                    s7.push(s8)\n                                                    s8 = peg$parse_()\n                                                }\n                                                s8 = peg$parseiso8601_string()\n                                                if (s8 !== peg$FAILED) {\n                                                    if (input.charCodeAt(peg$currPos) === 93) {\n                                                        s9 = peg$c28\n                                                        peg$currPos++\n                                                    } else {\n                                                        s9 = peg$FAILED\n                                                        if (peg$silentFails === 0) {\n                                                            peg$fail(peg$e28)\n                                                        }\n                                                    }\n                                                    if (s9 === peg$FAILED) {\n                                                        s9 = null\n                                                    }\n                                                    peg$savedPos = s0\n                                                    s0 = peg$f9(s1, s3, s4, s8, s9)\n                                                } else {\n                                                    peg$currPos = s0\n                                                    s0 = peg$FAILED\n                                                }\n                                            } else {\n                                                peg$currPos = s0\n                                                s0 = peg$FAILED\n                                            }\n                                        } else {\n                                            peg$currPos = s0\n                                            s0 = peg$FAILED\n                                        }\n                                    } else {\n                                        peg$currPos = s0\n                                        s0 = peg$FAILED\n                                    }\n                                } else {\n                                    peg$currPos = s0\n                                    s0 = peg$FAILED\n                                }\n                                if (s0 === peg$FAILED) {\n                                    s0 = peg$currPos\n                                    if (input.substr(peg$currPos, 11) === peg$c2) {\n                                        s1 = peg$c2\n                                        peg$currPos += 11\n                                    } else {\n                                        s1 = peg$FAILED\n                                        if (peg$silentFails === 0) {\n                                            peg$fail(peg$e2)\n                                        }\n                                    }\n                                    if (s1 !== peg$FAILED) {\n                                        if (input.charCodeAt(peg$currPos) === 58) {\n                                            s2 = peg$c8\n                                            peg$currPos++\n                                        } else {\n                                            s2 = peg$FAILED\n                                            if (peg$silentFails === 0) {\n                                                peg$fail(peg$e8)\n                                            }\n                                        }\n                                        if (s2 !== peg$FAILED) {\n                                            s3 = []\n                                            if (input.length > peg$currPos) {\n                                                s4 = input.charAt(peg$currPos)\n                                                peg$currPos++\n                                            } else {\n                                                s4 = peg$FAILED\n                                                if (peg$silentFails === 0) {\n                                                    peg$fail(peg$e29)\n                                                }\n                                            }\n                                            while (s4 !== peg$FAILED) {\n                                                s3.push(s4)\n                                                if (input.length > peg$currPos) {\n                                                    s4 = input.charAt(peg$currPos)\n                                                    peg$currPos++\n                                                } else {\n                                                    s4 = peg$FAILED\n                                                    if (peg$silentFails === 0) {\n                                                        peg$fail(peg$e29)\n                                                    }\n                                                }\n                                            }\n                                            peg$savedPos = s0\n                                            s0 = peg$f10(s1, s3)\n                                        } else {\n                                            peg$currPos = s0\n                                            s0 = peg$FAILED\n                                        }\n                                    } else {\n                                        peg$currPos = s0\n                                        s0 = peg$FAILED\n                                    }\n                                    if (s0 === peg$FAILED) {\n                                        s0 = peg$currPos\n                                        if (input.substr(peg$currPos, 9) === peg$c3) {\n                                            s1 = peg$c3\n                                            peg$currPos += 9\n                                        } else {\n                                            s1 = peg$FAILED\n                                            if (peg$silentFails === 0) {\n                                                peg$fail(peg$e3)\n                                            }\n                                        }\n                                        if (s1 !== peg$FAILED) {\n                                            if (input.charCodeAt(peg$currPos) === 58) {\n                                                s2 = peg$c8\n                                                peg$currPos++\n                                            } else {\n                                                s2 = peg$FAILED\n                                                if (peg$silentFails === 0) {\n                                                    peg$fail(peg$e8)\n                                                }\n                                            }\n                                            if (s2 !== peg$FAILED) {\n                                                if (input.charCodeAt(peg$currPos) === 91) {\n                                                    s3 = peg$c26\n                                                    peg$currPos++\n                                                } else {\n                                                    s3 = peg$FAILED\n                                                    if (peg$silentFails === 0) {\n                                                        peg$fail(peg$e26)\n                                                    }\n                                                }\n                                                if (s3 === peg$FAILED) {\n                                                    s3 = null\n                                                }\n                                                s4 = peg$parseiso8601_string()\n                                                if (s4 !== peg$FAILED) {\n                                                    s5 = []\n                                                    s6 = peg$parse_()\n                                                    while (s6 !== peg$FAILED) {\n                                                        s5.push(s6)\n                                                        s6 = peg$parse_()\n                                                    }\n                                                    if (input.substr(peg$currPos, 2) === peg$c27) {\n                                                        s6 = peg$c27\n                                                        peg$currPos += 2\n                                                    } else {\n                                                        s6 = peg$FAILED\n                                                        if (peg$silentFails === 0) {\n                                                            peg$fail(peg$e27)\n                                                        }\n                                                    }\n                                                    if (s6 !== peg$FAILED) {\n                                                        s7 = []\n                                                        s8 = peg$parse_()\n                                                        while (s8 !== peg$FAILED) {\n                                                            s7.push(s8)\n                                                            s8 = peg$parse_()\n                                                        }\n                                                        s8 = peg$parseiso8601_string()\n                                                        if (s8 !== peg$FAILED) {\n                                                            if (\n                                                                input.charCodeAt(peg$currPos) === 93\n                                                            ) {\n                                                                s9 = peg$c28\n                                                                peg$currPos++\n                                                            } else {\n                                                                s9 = peg$FAILED\n                                                                if (peg$silentFails === 0) {\n                                                                    peg$fail(peg$e28)\n                                                                }\n                                                            }\n                                                            if (s9 === peg$FAILED) {\n                                                                s9 = null\n                                                            }\n                                                            peg$savedPos = s0\n                                                            s0 = peg$f11(s1, s3, s4, s8, s9)\n                                                        } else {\n                                                            peg$currPos = s0\n                                                            s0 = peg$FAILED\n                                                        }\n                                                    } else {\n                                                        peg$currPos = s0\n                                                        s0 = peg$FAILED\n                                                    }\n                                                } else {\n                                                    peg$currPos = s0\n                                                    s0 = peg$FAILED\n                                                }\n                                            } else {\n                                                peg$currPos = s0\n                                                s0 = peg$FAILED\n                                            }\n                                        } else {\n                                            peg$currPos = s0\n                                            s0 = peg$FAILED\n                                        }\n                                        if (s0 === peg$FAILED) {\n                                            s0 = peg$currPos\n                                            if (input.substr(peg$currPos, 9) === peg$c3) {\n                                                s1 = peg$c3\n                                                peg$currPos += 9\n                                            } else {\n                                                s1 = peg$FAILED\n                                                if (peg$silentFails === 0) {\n                                                    peg$fail(peg$e3)\n                                                }\n                                            }\n                                            if (s1 !== peg$FAILED) {\n                                                if (input.charCodeAt(peg$currPos) === 58) {\n                                                    s2 = peg$c8\n                                                    peg$currPos++\n                                                } else {\n                                                    s2 = peg$FAILED\n                                                    if (peg$silentFails === 0) {\n                                                        peg$fail(peg$e8)\n                                                    }\n                                                }\n                                                if (s2 !== peg$FAILED) {\n                                                    s3 = []\n                                                    if (input.length > peg$currPos) {\n                                                        s4 = input.charAt(peg$currPos)\n                                                        peg$currPos++\n                                                    } else {\n                                                        s4 = peg$FAILED\n                                                        if (peg$silentFails === 0) {\n                                                            peg$fail(peg$e29)\n                                                        }\n                                                    }\n                                                    while (s4 !== peg$FAILED) {\n                                                        s3.push(s4)\n                                                        if (input.length > peg$currPos) {\n                                                            s4 = input.charAt(peg$currPos)\n                                                            peg$currPos++\n                                                        } else {\n                                                            s4 = peg$FAILED\n                                                            if (peg$silentFails === 0) {\n                                                                peg$fail(peg$e29)\n                                                            }\n                                                        }\n                                                    }\n                                                    peg$savedPos = s0\n                                                    s0 = peg$f12(s1, s3)\n                                                } else {\n                                                    peg$currPos = s0\n                                                    s0 = peg$FAILED\n                                                }\n                                            } else {\n                                                peg$currPos = s0\n                                                s0 = peg$FAILED\n                                            }\n                                            if (s0 === peg$FAILED) {\n                                                s0 = peg$currPos\n                                                if (input.substr(peg$currPos, 8) === peg$c29) {\n                                                    s1 = peg$c29\n                                                    peg$currPos += 8\n                                                } else {\n                                                    s1 = peg$FAILED\n                                                    if (peg$silentFails === 0) {\n                                                        peg$fail(peg$e30)\n                                                    }\n                                                }\n                                                if (s1 !== peg$FAILED) {\n                                                    if (input.charCodeAt(peg$currPos) === 58) {\n                                                        s2 = peg$c8\n                                                        peg$currPos++\n                                                    } else {\n                                                        s2 = peg$FAILED\n                                                        if (peg$silentFails === 0) {\n                                                            peg$fail(peg$e8)\n                                                        }\n                                                    }\n                                                    if (s2 !== peg$FAILED) {\n                                                        s3 = peg$parseterm_list()\n                                                        if (s3 === peg$FAILED) {\n                                                            s3 = peg$parseterm()\n                                                        }\n                                                        if (s3 !== peg$FAILED) {\n                                                            peg$savedPos = s0\n                                                            s0 = peg$f13(s1, s3)\n                                                        } else {\n                                                            peg$currPos = s0\n                                                            s0 = peg$FAILED\n                                                        }\n                                                    } else {\n                                                        peg$currPos = s0\n                                                        s0 = peg$FAILED\n                                                    }\n                                                } else {\n                                                    peg$currPos = s0\n                                                    s0 = peg$FAILED\n                                                }\n                                                if (s0 === peg$FAILED) {\n                                                    s0 = peg$currPos\n                                                    if (input.substr(peg$currPos, 11) === peg$c30) {\n                                                        s1 = peg$c30\n                                                        peg$currPos += 11\n                                                    } else {\n                                                        s1 = peg$FAILED\n                                                        if (peg$silentFails === 0) {\n                                                            peg$fail(peg$e31)\n                                                        }\n                                                    }\n                                                    if (s1 !== peg$FAILED) {\n                                                        if (input.charCodeAt(peg$currPos) === 58) {\n                                                            s2 = peg$c8\n                                                            peg$currPos++\n                                                        } else {\n                                                            s2 = peg$FAILED\n                                                            if (peg$silentFails === 0) {\n                                                                peg$fail(peg$e8)\n                                                            }\n                                                        }\n                                                        if (s2 !== peg$FAILED) {\n                                                            s3 = peg$parseterm_list()\n                                                            if (s3 === peg$FAILED) {\n                                                                s3 = peg$parseterm()\n                                                            }\n                                                            if (s3 !== peg$FAILED) {\n                                                                peg$savedPos = s0\n                                                                s0 = peg$f14(s1, s3)\n                                                            } else {\n                                                                peg$currPos = s0\n                                                                s0 = peg$FAILED\n                                                            }\n                                                        } else {\n                                                            peg$currPos = s0\n                                                            s0 = peg$FAILED\n                                                        }\n                                                    } else {\n                                                        peg$currPos = s0\n                                                        s0 = peg$FAILED\n                                                    }\n                                                    if (s0 === peg$FAILED) {\n                                                        s0 = peg$currPos\n                                                        if (\n                                                            input.substr(peg$currPos, 9) === peg$c31\n                                                        ) {\n                                                            s1 = peg$c31\n                                                            peg$currPos += 9\n                                                        } else {\n                                                            s1 = peg$FAILED\n                                                            if (peg$silentFails === 0) {\n                                                                peg$fail(peg$e32)\n                                                            }\n                                                        }\n                                                        if (s1 !== peg$FAILED) {\n                                                            if (\n                                                                input.substr(peg$currPos, 4) ===\n                                                                peg$c32\n                                                            ) {\n                                                                s2 = peg$c32\n                                                                peg$currPos += 4\n                                                            } else {\n                                                                s2 = peg$FAILED\n                                                                if (peg$silentFails === 0) {\n                                                                    peg$fail(peg$e33)\n                                                                }\n                                                            }\n                                                            if (s2 !== peg$FAILED) {\n                                                                peg$savedPos = s0\n                                                                s0 = peg$f15(s1)\n                                                            } else {\n                                                                peg$currPos = s0\n                                                                s0 = peg$FAILED\n                                                            }\n                                                        } else {\n                                                            peg$currPos = s0\n                                                            s0 = peg$FAILED\n                                                        }\n                                                        if (s0 === peg$FAILED) {\n                                                            s0 = peg$currPos\n                                                            if (\n                                                                input.substr(peg$currPos, 9) ===\n                                                                peg$c31\n                                                            ) {\n                                                                s1 = peg$c31\n                                                                peg$currPos += 9\n                                                            } else {\n                                                                s1 = peg$FAILED\n                                                                if (peg$silentFails === 0) {\n                                                                    peg$fail(peg$e32)\n                                                                }\n                                                            }\n                                                            if (s1 !== peg$FAILED) {\n                                                                if (\n                                                                    input.charCodeAt(\n                                                                        peg$currPos,\n                                                                    ) === 58\n                                                                ) {\n                                                                    s2 = peg$c8\n                                                                    peg$currPos++\n                                                                } else {\n                                                                    s2 = peg$FAILED\n                                                                    if (peg$silentFails === 0) {\n                                                                        peg$fail(peg$e8)\n                                                                    }\n                                                                }\n                                                                if (s2 !== peg$FAILED) {\n                                                                    s3 = peg$parseterm_list()\n                                                                    if (s3 === peg$FAILED) {\n                                                                        s3 = peg$parseterm()\n                                                                    }\n                                                                    if (s3 !== peg$FAILED) {\n                                                                        peg$savedPos = s0\n                                                                        s0 = peg$f16(s1, s3)\n                                                                    } else {\n                                                                        peg$currPos = s0\n                                                                        s0 = peg$FAILED\n                                                                    }\n                                                                } else {\n                                                                    peg$currPos = s0\n                                                                    s0 = peg$FAILED\n                                                                }\n                                                            } else {\n                                                                peg$currPos = s0\n                                                                s0 = peg$FAILED\n                                                            }\n                                                            if (s0 === peg$FAILED) {\n                                                                s0 = peg$currPos\n                                                                if (\n                                                                    input.substr(\n                                                                        peg$currPos,\n                                                                        11,\n                                                                    ) === peg$c33\n                                                                ) {\n                                                                    s1 = peg$c33\n                                                                    peg$currPos += 11\n                                                                } else {\n                                                                    s1 = peg$FAILED\n                                                                    if (peg$silentFails === 0) {\n                                                                        peg$fail(peg$e34)\n                                                                    }\n                                                                }\n                                                                if (s1 !== peg$FAILED) {\n                                                                    if (\n                                                                        input.charCodeAt(\n                                                                            peg$currPos,\n                                                                        ) === 58\n                                                                    ) {\n                                                                        s2 = peg$c8\n                                                                        peg$currPos++\n                                                                    } else {\n                                                                        s2 = peg$FAILED\n                                                                        if (peg$silentFails === 0) {\n                                                                            peg$fail(peg$e8)\n                                                                        }\n                                                                    }\n                                                                    if (s2 !== peg$FAILED) {\n                                                                        s3 = peg$parseterm_list()\n                                                                        if (s3 === peg$FAILED) {\n                                                                            s3 = peg$parseterm()\n                                                                        }\n                                                                        if (s3 !== peg$FAILED) {\n                                                                            peg$savedPos = s0\n                                                                            s0 = peg$f17(s1, s3)\n                                                                        } else {\n                                                                            peg$currPos = s0\n                                                                            s0 = peg$FAILED\n                                                                        }\n                                                                    } else {\n                                                                        peg$currPos = s0\n                                                                        s0 = peg$FAILED\n                                                                    }\n                                                                } else {\n                                                                    peg$currPos = s0\n                                                                    s0 = peg$FAILED\n                                                                }\n                                                                if (s0 === peg$FAILED) {\n                                                                    s0 = peg$currPos\n                                                                    if (\n                                                                        input.substr(\n                                                                            peg$currPos,\n                                                                            13,\n                                                                        ) === peg$c34\n                                                                    ) {\n                                                                        s1 = peg$c34\n                                                                        peg$currPos += 13\n                                                                    } else {\n                                                                        s1 = peg$FAILED\n                                                                        if (peg$silentFails === 0) {\n                                                                            peg$fail(peg$e35)\n                                                                        }\n                                                                    }\n                                                                    if (s1 !== peg$FAILED) {\n                                                                        if (\n                                                                            input.charCodeAt(\n                                                                                peg$currPos,\n                                                                            ) === 58\n                                                                        ) {\n                                                                            s2 = peg$c8\n                                                                            peg$currPos++\n                                                                        } else {\n                                                                            s2 = peg$FAILED\n                                                                            if (\n                                                                                peg$silentFails ===\n                                                                                0\n                                                                            ) {\n                                                                                peg$fail(peg$e8)\n                                                                            }\n                                                                        }\n                                                                        if (s2 !== peg$FAILED) {\n                                                                            s3 =\n                                                                                peg$parseterm_list()\n                                                                            if (s3 === peg$FAILED) {\n                                                                                s3 = peg$parseterm()\n                                                                            }\n                                                                            if (s3 !== peg$FAILED) {\n                                                                                peg$savedPos = s0\n                                                                                s0 = peg$f18(s1, s3)\n                                                                            } else {\n                                                                                peg$currPos = s0\n                                                                                s0 = peg$FAILED\n                                                                            }\n                                                                        } else {\n                                                                            peg$currPos = s0\n                                                                            s0 = peg$FAILED\n                                                                        }\n                                                                    } else {\n                                                                        peg$currPos = s0\n                                                                        s0 = peg$FAILED\n                                                                    }\n                                                                    if (s0 === peg$FAILED) {\n                                                                        s0 = peg$currPos\n                                                                        s1 =\n                                                                            peg$parseunquoted_term()\n                                                                        if (s1 !== peg$FAILED) {\n                                                                            if (\n                                                                                input.charCodeAt(\n                                                                                    peg$currPos,\n                                                                                ) === 58\n                                                                            ) {\n                                                                                s2 = peg$c8\n                                                                                peg$currPos++\n                                                                            } else {\n                                                                                s2 = peg$FAILED\n                                                                                if (\n                                                                                    peg$silentFails ===\n                                                                                    0\n                                                                                ) {\n                                                                                    peg$fail(peg$e8)\n                                                                                }\n                                                                            }\n                                                                            if (s2 !== peg$FAILED) {\n                                                                                peg$savedPos = s0\n                                                                                s0 = peg$f19(s1)\n                                                                            } else {\n                                                                                peg$currPos = s0\n                                                                                s0 = peg$FAILED\n                                                                            }\n                                                                        } else {\n                                                                            peg$currPos = s0\n                                                                            s0 = peg$FAILED\n                                                                        }\n                                                                        if (s0 === peg$FAILED) {\n                                                                            s0 = peg$currPos\n                                                                            s1 =\n                                                                                peg$parseunquoted_term()\n                                                                            if (s1 !== peg$FAILED) {\n                                                                                peg$savedPos = s0\n                                                                                s1 = peg$f20(s1)\n                                                                            }\n                                                                            s0 = s1\n                                                                            if (s0 === peg$FAILED) {\n                                                                                s0 = peg$currPos\n                                                                                s1 =\n                                                                                    peg$parsequoted_term()\n                                                                                if (\n                                                                                    s1 !==\n                                                                                    peg$FAILED\n                                                                                ) {\n                                                                                    peg$savedPos =\n                                                                                        s0\n                                                                                    s1 = peg$f21(s1)\n                                                                                }\n                                                                                s0 = s1\n                                                                            }\n                                                                        }\n                                                                    }\n                                                                }\n                                                            }\n                                                        }\n                                                    }\n                                                }\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n        return s0\n    }\n\n    function peg$parseterm() {\n        var s0, s1\n\n        s0 = peg$currPos\n        s1 = peg$parsequoted_term()\n        if (s1 === peg$FAILED) {\n            s1 = peg$parseunquoted_term()\n        }\n        if (s1 !== peg$FAILED) {\n            peg$savedPos = s0\n            s1 = peg$f22(s1)\n        }\n        s0 = s1\n\n        return s0\n    }\n\n    function peg$parseunquoted_term() {\n        var s0, s1, s2\n\n        s0 = peg$currPos\n        s1 = []\n        s2 = peg$parseterm_char()\n        if (s2 !== peg$FAILED) {\n            while (s2 !== peg$FAILED) {\n                s1.push(s2)\n                s2 = peg$parseterm_char()\n            }\n        } else {\n            s1 = peg$FAILED\n        }\n        if (s1 !== peg$FAILED) {\n            peg$savedPos = s0\n            s1 = peg$f23(s1)\n        }\n        s0 = s1\n\n        return s0\n    }\n\n    function peg$parseterm_char() {\n        var s0\n\n        s0 = input.charAt(peg$currPos)\n        if (peg$r0.test(s0)) {\n            peg$currPos++\n        } else {\n            s0 = peg$FAILED\n            if (peg$silentFails === 0) {\n                peg$fail(peg$e36)\n            }\n        }\n\n        return s0\n    }\n\n    function peg$parseor_term() {\n        var s0, s1, s2, s3, s4\n\n        s0 = peg$currPos\n        s1 = []\n        s2 = peg$parse_()\n        while (s2 !== peg$FAILED) {\n            s1.push(s2)\n            s2 = peg$parse_()\n        }\n        if (input.substr(peg$currPos, 2) === peg$c35) {\n            s2 = peg$c35\n            peg$currPos += 2\n        } else {\n            s2 = peg$FAILED\n            if (peg$silentFails === 0) {\n                peg$fail(peg$e37)\n            }\n        }\n        if (s2 !== peg$FAILED) {\n            s3 = []\n            s4 = peg$parse_()\n            while (s4 !== peg$FAILED) {\n                s3.push(s4)\n                s4 = peg$parse_()\n            }\n            s4 = peg$parseterm()\n            if (s4 !== peg$FAILED) {\n                peg$savedPos = s0\n                s0 = peg$f24(s4)\n            } else {\n                peg$currPos = s0\n                s0 = peg$FAILED\n            }\n        } else {\n            peg$currPos = s0\n            s0 = peg$FAILED\n        }\n\n        return s0\n    }\n\n    function peg$parseterm_list() {\n        var s0, s1, s2, s3, s4\n\n        s0 = peg$currPos\n        if (input.charCodeAt(peg$currPos) === 40) {\n            s1 = peg$c36\n            peg$currPos++\n        } else {\n            s1 = peg$FAILED\n            if (peg$silentFails === 0) {\n                peg$fail(peg$e38)\n            }\n        }\n        if (s1 !== peg$FAILED) {\n            s2 = peg$parseterm()\n            if (s2 !== peg$FAILED) {\n                s3 = []\n                s4 = peg$parseor_term()\n                while (s4 !== peg$FAILED) {\n                    s3.push(s4)\n                    s4 = peg$parseor_term()\n                }\n                if (input.charCodeAt(peg$currPos) === 41) {\n                    s4 = peg$c37\n                    peg$currPos++\n                } else {\n                    s4 = peg$FAILED\n                    if (peg$silentFails === 0) {\n                        peg$fail(peg$e39)\n                    }\n                }\n                if (s4 !== peg$FAILED) {\n                    peg$savedPos = s0\n                    s0 = peg$f25(s2, s3)\n                } else {\n                    peg$currPos = s0\n                    s0 = peg$FAILED\n                }\n            } else {\n                peg$currPos = s0\n                s0 = peg$FAILED\n            }\n        } else {\n            peg$currPos = s0\n            s0 = peg$FAILED\n        }\n\n        return s0\n    }\n\n    function peg$parsequoted_term() {\n        var s0, s1, s2, s3\n\n        s0 = peg$currPos\n        if (input.charCodeAt(peg$currPos) === 34) {\n            s1 = peg$c38\n            peg$currPos++\n        } else {\n            s1 = peg$FAILED\n            if (peg$silentFails === 0) {\n                peg$fail(peg$e40)\n            }\n        }\n        if (s1 !== peg$FAILED) {\n            s2 = []\n            s3 = input.charAt(peg$currPos)\n            if (peg$r1.test(s3)) {\n                peg$currPos++\n            } else {\n                s3 = peg$FAILED\n                if (peg$silentFails === 0) {\n                    peg$fail(peg$e41)\n                }\n            }\n            if (s3 !== peg$FAILED) {\n                while (s3 !== peg$FAILED) {\n                    s2.push(s3)\n                    s3 = input.charAt(peg$currPos)\n                    if (peg$r1.test(s3)) {\n                        peg$currPos++\n                    } else {\n                        s3 = peg$FAILED\n                        if (peg$silentFails === 0) {\n                            peg$fail(peg$e41)\n                        }\n                    }\n                }\n            } else {\n                s2 = peg$FAILED\n            }\n            if (s2 !== peg$FAILED) {\n                if (input.charCodeAt(peg$currPos) === 34) {\n                    s3 = peg$c38\n                    peg$currPos++\n                } else {\n                    s3 = peg$FAILED\n                    if (peg$silentFails === 0) {\n                        peg$fail(peg$e40)\n                    }\n                }\n                if (s3 !== peg$FAILED) {\n                    peg$savedPos = s0\n                    s0 = peg$f26(s2)\n                } else {\n                    peg$currPos = s0\n                    s0 = peg$FAILED\n                }\n            } else {\n                peg$currPos = s0\n                s0 = peg$FAILED\n            }\n        } else {\n            peg$currPos = s0\n            s0 = peg$FAILED\n        }\n\n        return s0\n    }\n\n    function peg$parseiso8601_string() {\n        var s0,\n            s1,\n            s2,\n            s3,\n            s4,\n            s5,\n            s6,\n            s7,\n            s8,\n            s9,\n            s10,\n            s11,\n            s12,\n            s13,\n            s14,\n            s15,\n            s16,\n            s17,\n            s18,\n            s19,\n            s20,\n            s21,\n            s22,\n            s23,\n            s24,\n            s25,\n            s26,\n            s27\n\n        s0 = peg$currPos\n        s1 = peg$parseD()\n        if (s1 !== peg$FAILED) {\n            s2 = peg$parseD()\n            if (s2 !== peg$FAILED) {\n                s3 = peg$parseD()\n                if (s3 !== peg$FAILED) {\n                    s4 = peg$parseD()\n                    if (s4 !== peg$FAILED) {\n                        if (input.charCodeAt(peg$currPos) === 45) {\n                            s5 = peg$c39\n                            peg$currPos++\n                        } else {\n                            s5 = peg$FAILED\n                            if (peg$silentFails === 0) {\n                                peg$fail(peg$e42)\n                            }\n                        }\n                        if (s5 !== peg$FAILED) {\n                            s6 = peg$parseD()\n                            if (s6 !== peg$FAILED) {\n                                s7 = peg$parseD()\n                                if (s7 !== peg$FAILED) {\n                                    if (input.charCodeAt(peg$currPos) === 45) {\n                                        s8 = peg$c39\n                                        peg$currPos++\n                                    } else {\n                                        s8 = peg$FAILED\n                                        if (peg$silentFails === 0) {\n                                            peg$fail(peg$e42)\n                                        }\n                                    }\n                                    if (s8 !== peg$FAILED) {\n                                        s9 = peg$parseD()\n                                        if (s9 !== peg$FAILED) {\n                                            s10 = peg$parseD()\n                                            if (s10 !== peg$FAILED) {\n                                                if (input.charCodeAt(peg$currPos) === 84) {\n                                                    s11 = peg$c40\n                                                    peg$currPos++\n                                                } else {\n                                                    s11 = peg$FAILED\n                                                    if (peg$silentFails === 0) {\n                                                        peg$fail(peg$e43)\n                                                    }\n                                                }\n                                                if (s11 !== peg$FAILED) {\n                                                    s12 = peg$parseD()\n                                                    if (s12 !== peg$FAILED) {\n                                                        s13 = peg$parseD()\n                                                        if (s13 !== peg$FAILED) {\n                                                            if (\n                                                                input.charCodeAt(peg$currPos) === 58\n                                                            ) {\n                                                                s14 = peg$c8\n                                                                peg$currPos++\n                                                            } else {\n                                                                s14 = peg$FAILED\n                                                                if (peg$silentFails === 0) {\n                                                                    peg$fail(peg$e8)\n                                                                }\n                                                            }\n                                                            if (s14 !== peg$FAILED) {\n                                                                s15 = peg$parseD()\n                                                                if (s15 !== peg$FAILED) {\n                                                                    s16 = peg$parseD()\n                                                                    if (s16 !== peg$FAILED) {\n                                                                        if (\n                                                                            input.charCodeAt(\n                                                                                peg$currPos,\n                                                                            ) === 58\n                                                                        ) {\n                                                                            s17 = peg$c8\n                                                                            peg$currPos++\n                                                                        } else {\n                                                                            s17 = peg$FAILED\n                                                                            if (\n                                                                                peg$silentFails ===\n                                                                                0\n                                                                            ) {\n                                                                                peg$fail(peg$e8)\n                                                                            }\n                                                                        }\n                                                                        if (s17 !== peg$FAILED) {\n                                                                            s18 = peg$parseD()\n                                                                            if (\n                                                                                s18 !== peg$FAILED\n                                                                            ) {\n                                                                                s19 = peg$parseD()\n                                                                                if (\n                                                                                    s19 !==\n                                                                                    peg$FAILED\n                                                                                ) {\n                                                                                    s20 =\n                                                                                        peg$currPos\n                                                                                    if (\n                                                                                        input.charCodeAt(\n                                                                                            peg$currPos,\n                                                                                        ) === 46\n                                                                                    ) {\n                                                                                        s21 =\n                                                                                            peg$c41\n                                                                                        peg$currPos++\n                                                                                    } else {\n                                                                                        s21 =\n                                                                                            peg$FAILED\n                                                                                        if (\n                                                                                            peg$silentFails ===\n                                                                                            0\n                                                                                        ) {\n                                                                                            peg$fail(\n                                                                                                peg$e44,\n                                                                                            )\n                                                                                        }\n                                                                                    }\n                                                                                    if (\n                                                                                        s21 !==\n                                                                                        peg$FAILED\n                                                                                    ) {\n                                                                                        s22 =\n                                                                                            peg$parseD()\n                                                                                        if (\n                                                                                            s22 !==\n                                                                                            peg$FAILED\n                                                                                        ) {\n                                                                                            s23 =\n                                                                                                peg$parseD()\n                                                                                            if (\n                                                                                                s23 !==\n                                                                                                peg$FAILED\n                                                                                            ) {\n                                                                                                s24 =\n                                                                                                    peg$parseD()\n                                                                                                if (\n                                                                                                    s24 !==\n                                                                                                    peg$FAILED\n                                                                                                ) {\n                                                                                                    s21 =\n                                                                                                        [\n                                                                                                            s21,\n                                                                                                            s22,\n                                                                                                            s23,\n                                                                                                            s24,\n                                                                                                        ]\n                                                                                                    s20 =\n                                                                                                        s21\n                                                                                                } else {\n                                                                                                    peg$currPos =\n                                                                                                        s20\n                                                                                                    s20 =\n                                                                                                        peg$FAILED\n                                                                                                }\n                                                                                            } else {\n                                                                                                peg$currPos =\n                                                                                                    s20\n                                                                                                s20 =\n                                                                                                    peg$FAILED\n                                                                                            }\n                                                                                        } else {\n                                                                                            peg$currPos =\n                                                                                                s20\n                                                                                            s20 =\n                                                                                                peg$FAILED\n                                                                                        }\n                                                                                    } else {\n                                                                                        peg$currPos =\n                                                                                            s20\n                                                                                        s20 =\n                                                                                            peg$FAILED\n                                                                                    }\n                                                                                    if (\n                                                                                        s20 ===\n                                                                                        peg$FAILED\n                                                                                    ) {\n                                                                                        s20 = null\n                                                                                    }\n                                                                                    s21 =\n                                                                                        input.charAt(\n                                                                                            peg$currPos,\n                                                                                        )\n                                                                                    if (\n                                                                                        peg$r2.test(\n                                                                                            s21,\n                                                                                        )\n                                                                                    ) {\n                                                                                        peg$currPos++\n                                                                                    } else {\n                                                                                        s21 =\n                                                                                            peg$FAILED\n                                                                                        if (\n                                                                                            peg$silentFails ===\n                                                                                            0\n                                                                                        ) {\n                                                                                            peg$fail(\n                                                                                                peg$e45,\n                                                                                            )\n                                                                                        }\n                                                                                    }\n                                                                                    if (\n                                                                                        s21 !==\n                                                                                        peg$FAILED\n                                                                                    ) {\n                                                                                        s22 =\n                                                                                            peg$currPos\n                                                                                        s23 =\n                                                                                            peg$parseD()\n                                                                                        if (\n                                                                                            s23 !==\n                                                                                            peg$FAILED\n                                                                                        ) {\n                                                                                            s24 =\n                                                                                                peg$parseD()\n                                                                                            if (\n                                                                                                s24 !==\n                                                                                                peg$FAILED\n                                                                                            ) {\n                                                                                                if (\n                                                                                                    input.charCodeAt(\n                                                                                                        peg$currPos,\n                                                                                                    ) ===\n                                                                                                    58\n                                                                                                ) {\n                                                                                                    s25 =\n                                                                                                        peg$c8\n                                                                                                    peg$currPos++\n                                                                                                } else {\n                                                                                                    s25 =\n                                                                                                        peg$FAILED\n                                                                                                    if (\n                                                                                                        peg$silentFails ===\n                                                                                                        0\n                                                                                                    ) {\n                                                                                                        peg$fail(\n                                                                                                            peg$e8,\n                                                                                                        )\n                                                                                                    }\n                                                                                                }\n                                                                                                if (\n                                                                                                    s25 !==\n                                                                                                    peg$FAILED\n                                                                                                ) {\n                                                                                                    s26 =\n                                                                                                        peg$parseD()\n                                                                                                    if (\n                                                                                                        s26 !==\n                                                                                                        peg$FAILED\n                                                                                                    ) {\n                                                                                                        s27 =\n                                                                                                            peg$parseD()\n                                                                                                        if (\n                                                                                                            s27 !==\n                                                                                                            peg$FAILED\n                                                                                                        ) {\n                                                                                                            s23 =\n                                                                                                                [\n                                                                                                                    s23,\n                                                                                                                    s24,\n                                                                                                                    s25,\n                                                                                                                    s26,\n                                                                                                                    s27,\n                                                                                                                ]\n                                                                                                            s22 =\n                                                                                                                s23\n                                                                                                        } else {\n                                                                                                            peg$currPos =\n                                                                                                                s22\n                                                                                                            s22 =\n                                                                                                                peg$FAILED\n                                                                                                        }\n                                                                                                    } else {\n                                                                                                        peg$currPos =\n                                                                                                            s22\n                                                                                                        s22 =\n                                                                                                            peg$FAILED\n                                                                                                    }\n                                                                                                } else {\n                                                                                                    peg$currPos =\n                                                                                                        s22\n                                                                                                    s22 =\n                                                                                                        peg$FAILED\n                                                                                                }\n                                                                                            } else {\n                                                                                                peg$currPos =\n                                                                                                    s22\n                                                                                                s22 =\n                                                                                                    peg$FAILED\n                                                                                            }\n                                                                                        } else {\n                                                                                            peg$currPos =\n                                                                                                s22\n                                                                                            s22 =\n                                                                                                peg$FAILED\n                                                                                        }\n                                                                                        if (\n                                                                                            s22 ===\n                                                                                            peg$FAILED\n                                                                                        ) {\n                                                                                            s22 =\n                                                                                                null\n                                                                                        }\n                                                                                        peg$savedPos =\n                                                                                            s0\n                                                                                        s0 =\n                                                                                            peg$f27()\n                                                                                    } else {\n                                                                                        peg$currPos =\n                                                                                            s0\n                                                                                        s0 =\n                                                                                            peg$FAILED\n                                                                                    }\n                                                                                } else {\n                                                                                    peg$currPos = s0\n                                                                                    s0 = peg$FAILED\n                                                                                }\n                                                                            } else {\n                                                                                peg$currPos = s0\n                                                                                s0 = peg$FAILED\n                                                                            }\n                                                                        } else {\n                                                                            peg$currPos = s0\n                                                                            s0 = peg$FAILED\n                                                                        }\n                                                                    } else {\n                                                                        peg$currPos = s0\n                                                                        s0 = peg$FAILED\n                                                                    }\n                                                                } else {\n                                                                    peg$currPos = s0\n                                                                    s0 = peg$FAILED\n                                                                }\n                                                            } else {\n                                                                peg$currPos = s0\n                                                                s0 = peg$FAILED\n                                                            }\n                                                        } else {\n                                                            peg$currPos = s0\n                                                            s0 = peg$FAILED\n                                                        }\n                                                    } else {\n                                                        peg$currPos = s0\n                                                        s0 = peg$FAILED\n                                                    }\n                                                } else {\n                                                    peg$currPos = s0\n                                                    s0 = peg$FAILED\n                                                }\n                                            } else {\n                                                peg$currPos = s0\n                                                s0 = peg$FAILED\n                                            }\n                                        } else {\n                                            peg$currPos = s0\n                                            s0 = peg$FAILED\n                                        }\n                                    } else {\n                                        peg$currPos = s0\n                                        s0 = peg$FAILED\n                                    }\n                                } else {\n                                    peg$currPos = s0\n                                    s0 = peg$FAILED\n                                }\n                            } else {\n                                peg$currPos = s0\n                                s0 = peg$FAILED\n                            }\n                        } else {\n                            peg$currPos = s0\n                            s0 = peg$FAILED\n                        }\n                    } else {\n                        peg$currPos = s0\n                        s0 = peg$FAILED\n                    }\n                } else {\n                    peg$currPos = s0\n                    s0 = peg$FAILED\n                }\n            } else {\n                peg$currPos = s0\n                s0 = peg$FAILED\n            }\n        } else {\n            peg$currPos = s0\n            s0 = peg$FAILED\n        }\n\n        return s0\n    }\n\n    function peg$parseD() {\n        var s0\n\n        s0 = input.charAt(peg$currPos)\n        if (peg$r3.test(s0)) {\n            peg$currPos++\n        } else {\n            s0 = peg$FAILED\n            if (peg$silentFails === 0) {\n                peg$fail(peg$e46)\n            }\n        }\n\n        return s0\n    }\n\n    function peg$parse_() {\n        var s0, s1\n\n        peg$silentFails++\n        s0 = []\n        s1 = input.charAt(peg$currPos)\n        if (peg$r4.test(s1)) {\n            peg$currPos++\n        } else {\n            s1 = peg$FAILED\n            if (peg$silentFails === 0) {\n                peg$fail(peg$e48)\n            }\n        }\n        if (s1 !== peg$FAILED) {\n            while (s1 !== peg$FAILED) {\n                s0.push(s1)\n                s1 = input.charAt(peg$currPos)\n                if (peg$r4.test(s1)) {\n                    peg$currPos++\n                } else {\n                    s1 = peg$FAILED\n                    if (peg$silentFails === 0) {\n                        peg$fail(peg$e48)\n                    }\n                }\n            }\n        } else {\n            s0 = peg$FAILED\n        }\n        peg$silentFails--\n        if (s0 === peg$FAILED) {\n            s1 = peg$FAILED\n            if (peg$silentFails === 0) {\n                peg$fail(peg$e47)\n            }\n        }\n\n        return s0\n    }\n\n    function peg$parseEOF() {\n        var s0, s1\n\n        s0 = peg$currPos\n        peg$silentFails++\n        if (input.length > peg$currPos) {\n            s1 = input.charAt(peg$currPos)\n            peg$currPos++\n        } else {\n            s1 = peg$FAILED\n            if (peg$silentFails === 0) {\n                peg$fail(peg$e29)\n            }\n        }\n        peg$silentFails--\n        if (s1 === peg$FAILED) {\n            s0 = undefined\n        } else {\n            peg$currPos = s0\n            s0 = peg$FAILED\n        }\n\n        return s0\n    }\n\n    function value_error(field, value, location) {\n        const e = new SyntaxError(\n            `Invalid value \\`${value}\\` for field \\`${field}\\``,\n            [],\n            value,\n            location,\n        )\n        ;(e as any).invalid_field = field\n        ;(e as any).invalid_value = value\n        return e\n    }\n\n    function unknown_field_error(field, location) {\n        const e = new SyntaxError(`Unknown field \\`${field}\\``, [], field, location)\n        ;(e as any).unknown_field = field\n        return e\n    }\n\n    peg$result = peg$startRuleFunction()\n\n    if (options.peg$library) {\n        return /** @type {any} */ {\n            peg$result,\n            peg$currPos,\n            peg$FAILED,\n            peg$maxFailExpected,\n            peg$maxFailPos,\n        }\n    }\n    if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n        return peg$result\n    } else {\n        if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n            peg$fail(peg$endExpectation())\n        }\n\n        throw peg$buildStructuredError(\n            peg$maxFailExpected,\n            peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n            peg$maxFailPos < input.length\n                ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n                : peg$computeLocation(peg$maxFailPos, peg$maxFailPos),\n        )\n    }\n}\n\nmodule.exports = {\n    StartRules: [\"start\"],\n    SyntaxError: peg$SyntaxError,\n    parse: peg$parse,\n}\n\nexport const parse = peg$parse\n", "import {parse as _parse} from \"./_search_query_parser\"\nimport type {SearchQuery, InvalidSearchQuery} from \"./types\"\n\nexport function parse(query: string): SearchQuery | InvalidSearchQuery {\n    try {\n        return _parse(query, {}) as any\n    } catch (error) {\n        if (error.unknown_field) {\n            return {\n                invalid: \"unknown_field\",\n                field: error.unknown_field,\n            }\n        }\n        if (error.invalid_field) {\n            return {\n                invalid: \"invalid_field_value\",\n                field: error.invalid_field,\n                value: error.invalid_value,\n            }\n        }\n        return {\n            invalid: \"syntax\",\n            message: error.message,\n        }\n    }\n}\n\n/**\n * Same as `parse` but throws an error if the query is invalid.\n */\nexport function parse_strict(query: string): SearchQuery {\n    const res = parse(query)\n    if (res.invalid) {\n        throw new Error(`Search is invalid: ${JSON.stringify(res)}`)\n    }\n    return res\n}\n", "import {ControllablePromise, new_ControllablePromise} from \"./index\"\n\ntype Task<T> = () => T | Promise<T>\n\ntype Queue = ReadonlyArray<{\n    name: Readonly<string>\n    enqueued_at: Readonly<number>\n}>\n\n/**\n * Use an instance of this class, if you want that several\n * asynchronous functions are executed in sequential order.\n */\nexport class SequentialRunner {\n    private _queue_promise: Promise<any> = Promise.resolve()\n    private _queue: Array<{\n        name: string\n        enqueued_at: number\n        task: Task<any>\n        promise: ControllablePromise<any>\n    }> = []\n    private _canceled = false\n    private _current_task_promise: any\n    private _on_task_starts: (name: string, time_in_queue: number, queue: Queue) => void = () => {\n        // Do nothing.\n    }\n    private _on_task_done: (\n        name: string,\n        time_in_queue: number,\n        duration: number,\n        success: boolean,\n        queue: Queue,\n    ) => void = () => {\n        // Do nothing.\n    }\n\n    constructor(public readonly name: string) {}\n\n    set on_task_starts(listener: (task_name: string, time_in_queue: number, queue: Queue) => void) {\n        this._on_task_starts = listener\n    }\n\n    set on_task_done(\n        listener: (\n            task_name: string,\n            time_in_queue: number,\n            duration: number,\n            success: boolean,\n            queue: Queue,\n        ) => void,\n    ) {\n        this._on_task_done = listener\n    }\n\n    enqueue<T>(task: Task<T>): Promise<T>\n    enqueue<T>(name: string, task: Task<T>, opts?: {prepend?: boolean}): Promise<T>\n    enqueue<T>(\n        task_or_name: string | Task<T>,\n        task?: Task<T>,\n        opts: {prepend?: boolean} = {},\n    ): Promise<T> {\n        if (this._canceled) {\n            throw new Error(`${this.name || \"SequentialRunner\"} canceled`)\n        }\n        let name\n        if (typeof task_or_name === \"string\") {\n            name = task_or_name\n        } else {\n            name = \"Unnamed task\"\n            task = task_or_name\n        }\n        const promise = new_ControllablePromise<T>()\n        const queue_item = {\n            name,\n            enqueued_at: Date.now(),\n            task: task!,\n            promise,\n        }\n        if (opts.prepend) {\n            this._queue.unshift(queue_item)\n        } else {\n            this._queue.push(queue_item)\n        }\n        this._queue_promise = this._queue_promise.then(this.run_next)\n        return promise\n    }\n\n    cancel() {\n        this._canceled = true\n        for (const {promise} of this._queue) {\n            promise.reject(new Error(`${this.name || \"SequentialRunner\"} canceled`))\n        }\n        this._queue = []\n        if (\n            this._current_task_promise &&\n            typeof (this._current_task_promise as any).cancel === \"function\"\n        ) {\n            ;(this._current_task_promise as any).cancel()\n        }\n    }\n\n    run_next = async () => {\n        if (this._queue.length === 0) {\n            return\n        }\n        const {task, promise, name, enqueued_at} = this._queue.shift()!\n        if (this._canceled) {\n            promise.reject(new Error(`${this.name || \"SequentialRunner\"} canceled`))\n            return\n        }\n        const time_in_queue = Date.now() - enqueued_at\n        this._on_task_starts(name, time_in_queue, this._queue)\n        const start_time = Date.now()\n        let success = false\n        try {\n            const result = await (this._current_task_promise = task())\n            success = true\n            promise.resolve(result)\n        } catch (error) {\n            promise.reject(error)\n        } finally {\n            const duration = Date.now() - start_time\n            this._current_task_promise = undefined\n            this._on_task_done(name, time_in_queue, duration, success, this._queue)\n        }\n    }\n}\n", "import {action, computed, observable, runInAction, makeObservable} from \"mobx\"\nimport type {Layout} from \"@cling/lib.web.layout/types\"\nimport {MAX_COLUMN_WIDTH, default_layout} from \"@cling/lib.web.layout\"\nimport {fixed_width_column_index} from \"@cling/lib.web.layout/fixed_width_columns\"\n\nexport class LayoutState {\n    max_column_width = MAX_COLUMN_WIDTH\n    private _view_port_width = 0\n    private _first_visible_column_index = 0\n    private _min_column_width: () => number\n    private _num_main_columns: () => number\n    private _aux_column_shown: () => boolean\n    private _inbox_shown: () => boolean\n    private frozen_layout?: Layout = undefined\n\n    constructor({\n        min_column_width,\n        num_main_columns,\n        aux_column_shown,\n        inbox_shown,\n    }: {\n        min_column_width: () => number\n        num_main_columns: () => number\n        aux_column_shown: () => boolean\n        inbox_shown: () => boolean\n    }) {\n        this._min_column_width = min_column_width\n        this._num_main_columns = num_main_columns\n        this._aux_column_shown = aux_column_shown\n        this._inbox_shown = inbox_shown\n        makeObservable<\n            LayoutState,\n            \"_view_port_width\" | \"_first_visible_column_index\" | \"frozen_layout\"\n        >(this, {\n            max_column_width: observable,\n            _view_port_width: observable,\n            _first_visible_column_index: observable,\n            frozen_layout: observable.ref,\n            layout: computed,\n            freeze_layout: action.bound,\n            unfreeze_layout: action.bound,\n        })\n    }\n\n    get view_port_width() {\n        return this._view_port_width\n    }\n\n    get first_visible_column_index() {\n        return this._first_visible_column_index\n    }\n\n    scroll_all_columns_to_top() {\n        document.querySelectorAll(\".fwc__main-column\").forEach(($x) => ($x.scrollTop = 0))\n    }\n\n    scroll_to_column(index: number) {\n        runInAction(() => {\n            const max_index = this._num_main_columns() - 1\n            index = Math.max(0, Math.min(index, max_index))\n            if (index !== this._first_visible_column_index) {\n                this._first_visible_column_index = index\n            }\n        })\n    }\n\n    scroll_to_natural_first_column() {\n        this.scroll_to_column(this._inbox_shown() ? 1 : 0)\n    }\n\n    scroll_column_into_view(index: number): void\n    scroll_column_into_view(elm: HTMLElement): void\n    scroll_column_into_view(index_or_elm: number | HTMLElement): void {\n        if (typeof index_or_elm === \"number\") {\n            if (this.is_column_fully_visible(index_or_elm)) {\n                return\n            }\n            runInAction(() => {\n                const incr = index_or_elm < this.first_visible_column_index ? -1 : 1\n                while (!this.is_column_fully_visible(index_or_elm)) {\n                    this._first_visible_column_index += incr\n                }\n            })\n            return\n        }\n        const index = fixed_width_column_index(index_or_elm)\n        if (typeof index === \"number\") {\n            this.scroll_column_into_view(index)\n        }\n    }\n\n    is_column_fully_visible(column: number) {\n        const {_first_visible_column_index, _view_port_width, layout} = this\n        if (column === _first_visible_column_index) {\n            // Edge case: If there seems to be no column fully visible\n            // (small screen w/ large columns) we mark at least the column at\n            // `first_visible_column_index` as fully visible ...\n            return true\n        }\n        const x_left =\n            layout.main_layout.left + layout.main_layout.column_offset(_first_visible_column_index)\n        const x_right =\n            x_left +\n            _view_port_width -\n            (layout.aux_layout.visible ? layout.aux_layout.column_width : 0)\n        const left = layout.main_layout.column_offset(column)\n        const right = left + layout.main_layout.column_width\n        return left >= x_left && left <= x_right && right >= x_left && right <= x_right\n    }\n\n    update_view_port_width(w: number) {\n        runInAction(() => (this._view_port_width = w))\n    }\n\n    get layout(): Layout {\n        if (this.frozen_layout) {\n            return this.frozen_layout\n        }\n        const layout = default_layout({\n            view_port_width: this._view_port_width,\n            min_column_width: this._min_column_width(),\n            max_column_width: this.max_column_width,\n            num_main_columns: this._num_main_columns(),\n            aux_column_shown: this._aux_column_shown(),\n            inbox_shown: this._inbox_shown(),\n        })\n        if (this._first_visible_column_index >= layout.main_layout.num_columns) {\n            setTimeout(() => {\n                if (\n                    this._first_visible_column_index === 1 &&\n                    layout.main_layout.num_columns === 1 &&\n                    layout.main_layout.inbox_shown\n                ) {\n                    // Special case for an empty board with the inbox shown.\n                    return\n                }\n                if (this._first_visible_column_index >= layout.main_layout.num_columns) {\n                    this.scroll_to_column(layout.main_layout.num_columns - 1)\n                }\n            })\n        }\n        return layout\n    }\n\n    get all_columns_fully_visible() {\n        return this.layout.main_layout.total_width <= this.view_port_width\n    }\n\n    freeze_layout() {\n        if (this.frozen_layout) {\n            return\n        }\n        this.frozen_layout = this.layout\n    }\n\n    unfreeze_layout() {\n        this.frozen_layout = undefined\n    }\n}\n", "import {action, computed, observable, reaction, runInAction, makeObservable} from \"mobx\"\nimport {report_error} from \"@cling/lib.shared.debug\"\nimport {\n    as_language,\n    Board,\n    BoardInfo,\n    BoardLastSeen,\n    BoardUID,\n    Card as CardModel,\n    Card,\n    CardUID,\n    ColumnCard,\n    Comment,\n    EngagementType,\n    InboxCard,\n    is_image,\n    QueryBoardVersionRequest,\n    QueryBoardVersionResponse,\n    traverse_cards,\n    CardColor,\n    derive_clipboard_uid,\n    derive_trashcan_uid,\n    is_CardUID,\n    BlobUID,\n    ImageCardDisplayKind,\n} from \"@cling/lib.shared.model\"\nimport {CardState} from \"./card_state\"\nimport {BoardState} from \"./board_state\"\nimport {assert, assert_never} from \"@cling/lib.shared.utils\"\nimport {default_layout, MAX_COLUMN_WIDTH, MIN_COLUMN_WIDTH} from \"@cling/lib.web.layout\"\nimport {\n    board_info_resource,\n    board_resource,\n    CardPermissions,\n    CurrentUser,\n} from \"@cling/lib.web.resources\"\nimport {log} from \"@cling/lib.shared.logging\"\nimport {running_on_mobile_device, scraped_by_search_bot} from \"@cling/lib.web.utils\"\nimport {CallSearch, SearchState} from \"./search_state\"\nimport {LayoutState} from \"./layout_state\"\nimport {OPTIMUM_COLUMN_WITH} from \"@cling/lib.web.layout/default_layout\"\nimport {board_quota_limits} from \"@cling/lib.shared.model/quota\"\nimport {call_function} from \"@cling/lib.shared.faas\"\nimport {report_user_engagement} from \"@cling/lib.web.analytics\"\nimport {is_cling_hp} from \"../utils\"\nimport {show_snackbar_if_board_size_soft_limit_is_exceeded} from \"./patch\"\nimport {Snackbar} from \"@cling/lib.web.mdc\"\n\nfunction nop() {\n    /* Do nothing. */\n}\n\ninterface TaskEditDialogProps {\n    board: Board\n    card: Card\n}\n\ntype DialogType =\n    | \"none\"\n    | \"new_board\"\n    | \"copy_board\"\n    | \"start_conversation\"\n    | \"board_settings\"\n    | \"share_board\"\n    | \"task_editor\"\n    | \"send_to_board\"\n    | \"checkout\"\n    | \"account_settings\"\n    | \"quota_limit_exceeded_dialog\"\n    | \"import_data\"\n    | \"diagnostics\"\n    | \"teams\"\n    | \"report_abuse\"\n\nexport class UserInterfaceState {\n    readonly search_state: SearchState\n    readonly layout_state: LayoutState\n    let_user_select_where_to_add_a_card: \"add\" | \"paste\" | false = false\n    editing_board_name = false\n    task_edit_dialog_props?: TaskEditDialogProps = undefined\n    send_to_board_dialog_props?: {board: Board; card: Card} = undefined\n    pro_feature_teaser_dialog_props?: {description: any} = undefined\n    report_abuse_dialog_props?: {card?: Card; board: Board} = undefined\n    /** The currently mounted `CardEditor` instance. */\n    card_editor:\n        | {\n              set_new_color: (color: CardColor) => void\n              is_valid: boolean\n              is_changed(): boolean\n              save(): void\n              cancel(): void\n          }\n        | undefined = undefined\n    app_bar_enabled = true\n    prevent_touch_scroll_x = false\n    fully_rendered_cards = new Map<CardUID, true>()\n    highlighted_card_state?: {card_uid: CardUID; already_scrolled_into_view: boolean} = undefined\n    desktop_board_chooser_state: \"boards\" | \"people\" | \"hidden\" = \"hidden\"\n    desktop_board_chooser_focus_search = false\n    show_new_version_available = false\n    toast_shown = false\n    main_view: \"columns\" | \"calendar\" = \"columns\"\n    preferred_currency: \"USD\" | \"EUR\" = \"USD\"\n    /**\n     * Forcefully disable card-menus.\n     */\n    card_menus_disabled = false\n    /**\n     * Hides any temporally visible <NewElm> component,\n     * closes any open dialog, editor or lightbox.\n     */\n    reset: () => void = nop\n    private _app_bar_shown = true\n    /** The UID of the currently displayed board. */\n    private __current_board_uid?: BoardUID = undefined\n    /** The state of the currently displayed board. */\n    private __current_board_state?: BoardState = undefined\n    private readonly _board_states = new Map<BoardUID, BoardState>()\n    private readonly _board_last_seen = new Map<BoardUID, Date>()\n    private readonly _card_states = new Map<CardUID, CardState>()\n    private _image_cache_thrash_indexes = new Map<BlobUID, number>()\n    private _aux_column: \"\" | \"clipboard\" | \"trashcan\" = \"\"\n    private _dialog: DialogType = \"none\"\n    private _card_menus_shown_for?: Card\n    private _global_backdrop?: () => void = undefined\n    private _currently_edited_card_uid?: CardUID = undefined\n    private _dispose_rerun_search_on_board_change_reaction: () => void = nop\n    private __current_board_display_version: number | \"latest\" = \"latest\"\n    private _current_version_board: Board | undefined = undefined\n    private current_user: CurrentUser\n    private pause_board_sync?: (board_uid: BoardUID | undefined) => void\n\n    constructor({\n        board_last_seen,\n        current_user,\n        call_search,\n        pause_board_sync,\n    }: {\n        board_last_seen: Array<BoardLastSeen>\n        current_user: CurrentUser\n        call_search: CallSearch\n        pause_board_sync?: (board_uid: BoardUID | undefined) => void\n    }) {\n        this.current_user = current_user\n        this.pause_board_sync = pause_board_sync\n        if (\n            !running_on_mobile_device() &&\n            !current_user.account_settings.auto_close_board_chooser\n        ) {\n            this.desktop_board_chooser_state = \"boards\"\n        }\n        this.search_state = new SearchState(\n            (new_card_states) => {\n                const prev = [...this._card_states.values()]\n                runInAction(() => {\n                    this._card_states.clear()\n                    new_card_states.forEach((x) => this._card_states.set(x.card_uid, x))\n                })\n                return prev\n            },\n            call_search,\n            () => this.highlighted_card_state?.card_uid,\n            this.editing_card.bind(this),\n            () => this.current_user.account.uid,\n        )\n        this.layout_state = new LayoutState({\n            num_main_columns: () => {\n                const {board, display_version} = this.current_board\n                if (!board || !display_version) {\n                    return 0\n                }\n                const visible_columns = this.visible_columns(board)\n                let num_columns = visible_columns.length\n                if (num_columns === 1 && visible_columns[0].inbox) {\n                    // On empty board we need to add a pseudo column so that the inbox remains scrolled out\n                    // of view.\n                    const card_permissions = current_user.card_permissions(\n                        board,\n                        display_version,\n                        board.root,\n                    )\n                    if (board.is_dashboard_or_user_board && card_permissions.can_add_card) {\n                        num_columns += 1\n                    }\n                }\n                return num_columns\n            },\n            min_column_width: () => this.min_column_width,\n            aux_column_shown: () => !!this.aux_board,\n            // Only show inbox if it is not empty, the user can add cards, we are not on trashcan\n            // or clipboard and we are not scraped.\n            inbox_shown: () =>\n                !!this.current_board.board &&\n                !scraped_by_search_bot() &&\n                (this.current_board.board?.acl.can_edit(this.current_user.account_attributes) ||\n                    this.search_state.has_visible_children(this.current_board.board!.inbox)) &&\n                this.current_board.board?.is_dashboard_or_user_board,\n        })\n        board_last_seen.forEach((x) => this._board_last_seen.set(x.board_uid, x.seen.date))\n        reaction(\n            () => this.current_user.account_analytics.board_last_seen,\n            (new_board_last_seen) => {\n                this.merge_board_last_seen(new_board_last_seen)\n            },\n            {name: \"user_interface_state.ts - board_last_seen\"},\n        )\n        makeObservable<\n            UserInterfaceState,\n            | \"_app_bar_shown\"\n            | \"__current_board_uid\"\n            | \"__current_board_state\"\n            | \"_board_states\"\n            | \"_board_last_seen\"\n            | \"_card_states\"\n            | \"_aux_column\"\n            | \"_dialog\"\n            | \"_global_backdrop\"\n            | \"__current_board_display_version\"\n            | \"_current_version_board\"\n            | \"_image_cache_thrash_indexes\"\n        >(this, {\n            search_state: observable,\n            layout_state: observable,\n            let_user_select_where_to_add_a_card: observable,\n            editing_board_name: observable,\n            task_edit_dialog_props: observable,\n            send_to_board_dialog_props: observable,\n            pro_feature_teaser_dialog_props: observable.shallow,\n            report_abuse_dialog_props: observable,\n            card_editor: observable.ref,\n            app_bar_enabled: observable,\n            prevent_touch_scroll_x: observable,\n            fully_rendered_cards: observable,\n            highlighted_card_state: observable,\n            desktop_board_chooser_state: observable,\n            desktop_board_chooser_focus_search: observable,\n            show_new_version_available: observable,\n            toast_shown: observable,\n            main_view: observable,\n            _app_bar_shown: observable,\n            __current_board_uid: observable,\n            __current_board_state: observable,\n            _board_states: observable.shallow,\n            _board_last_seen: observable.shallow,\n            _card_states: observable.shallow,\n            _aux_column: observable,\n            _dialog: observable,\n            _global_backdrop: observable,\n            __current_board_display_version: observable,\n            _current_version_board: observable,\n            num_changed_user_boards: computed,\n            highlighted_card: computed,\n            highlighted_card_column_and_positions: computed,\n            preferred_currency: observable,\n            _image_cache_thrash_indexes: observable.shallow,\n        })\n    }\n\n    set_current_board_uid(\n        board_uid: BoardUID | undefined,\n        display_version: number | \"latest\",\n        cb?: () => void,\n    ): boolean {\n        return runInAction(() => {\n            if (\n                board_uid === this.__current_board_uid &&\n                display_version === this.__current_board_display_version\n            ) {\n                return false\n            }\n            if (board_uid === undefined) {\n                this.__current_board_display_version = display_version\n                this.__current_board_uid = undefined\n                return true\n            }\n            const reset_state = () => {\n                this._aux_column = \"\"\n                this.search_state.end_search()\n                // Re-run search if the the relevant boards change.\n                this._dispose_rerun_search_on_board_change_reaction()\n                this._dispose_rerun_search_on_board_change_reaction = reaction(\n                    () => {\n                        if (!this.search_state.is_query_active) {\n                            return {skip: true}\n                        }\n                        if (this.search_state.all_boards) {\n                            return {\n                                all: board_info_resource.read_all().map((x) => [x.uid, x.version]),\n                            }\n                        }\n                        return {\n                            board_version: this.current_board?.board?.version,\n                            clipboard_version: board_resource.clipboard.version,\n                            trashcan_version: board_resource.trashcan.version,\n                        }\n                    },\n                    async ({skip}) => {\n                        if (skip) {\n                            return\n                        }\n                        this.search_state.refresh_search().catch(report_error)\n                    },\n                    {name: \"rerun_search_on_board_change\"},\n                )\n                this.app_bar_shown = true\n            }\n            if (this.__current_board_uid !== board_uid) {\n                this.__current_board_uid = board_uid\n                let board_state = this._board_states.get(board_uid)\n                if (!board_state) {\n                    board_state = new BoardState(board_uid)\n                    this._board_states.set(board_uid, board_state)\n                }\n                this.__current_board_state = board_state\n            }\n            if (display_version !== \"latest\") {\n                call_function(\n                    new QueryBoardVersionRequest({\n                        board_uid,\n                        version: display_version,\n                    }),\n                    QueryBoardVersionResponse,\n                )\n                    .then((res) => {\n                        log.debug(\"Board version loaded\", {\n                            board_uid: res.board.uid,\n                            version: res.board.version,\n                        })\n                        runInAction(() => {\n                            this._current_version_board = res.board\n                            this.__current_board_display_version = res.board.version\n                            reset_state()\n                        })\n                        cb?.()\n                    })\n                    .catch((error) => {\n                        runInAction(() => {\n                            this.set_current_board_uid(this.__current_board_uid!, \"latest\")\n                        })\n                        report_error(\n                            \"Failed to fetch board version -- jumping back to `latest`\",\n                            error,\n                        )\n                    })\n            } else {\n                this.__current_board_display_version = \"latest\"\n                reset_state()\n                this.fully_rendered_cards.clear()\n                cb?.()\n            }\n            return true\n        })\n    }\n\n    /**\n     * The UID of the currently displayed board.\n     */\n    get current_board_uid(): BoardUID | undefined {\n        return this.__current_board_uid\n    }\n\n    /**\n     * The currently displayed board.\n     */\n    get current_board(): {board?: Board; display_version: number | \"latest\"} {\n        const {__current_board_uid} = this\n        if (__current_board_uid) {\n            const board = board_resource.read(__current_board_uid)\n            if (!board) {\n                return {board: undefined, display_version: \"latest\"}\n            }\n            if (\n                this.__current_board_display_version !== \"latest\" &&\n                this.current_user.board_permissions(board, \"latest\").can_view_history\n            ) {\n                return {\n                    board: this._current_version_board,\n                    display_version: this.__current_board_display_version,\n                }\n            }\n            return {board, display_version: \"latest\"}\n        }\n        return {board: undefined, display_version: \"latest\"}\n    }\n\n    /**\n     * The board, to which the right column belongs (or `undefined` if either\n     * the board was not fetched yet or the right column is not shown).\n     */\n    get aux_board(): Board | undefined {\n        return this._aux_column === \"clipboard\"\n            ? board_resource.clipboard\n            : this._aux_column === \"trashcan\"\n              ? board_resource.trashcan\n              : undefined\n    }\n\n    actions() {\n        /**\n         * The given function `f` represents the actual action and must return\n         * another function, which reverts all UI state changes again.\n         */\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n        const resettable_action = <T extends Function>(f: T): T => {\n            // eslint-disable-next-line @typescript-eslint/no-this-alias\n            const this_ = this\n            return action(function (...args: any[]) {\n                this_.reset()\n                const reset = f.apply(this_, args)\n                this_.reset = () => {\n                    reset()\n                    this_.reset = nop\n                }\n            }) as any\n        }\n        let hide_card_menus_timeout: any\n        const actions = {\n            show_global_backdrop: action((on_click: () => void) => {\n                this._global_backdrop = on_click\n            }),\n            hide_global_backdrop: action(() => {\n                this._global_backdrop = undefined\n            }),\n            show_card_menus: action((item: Card) => {\n                if (this._card_menus_shown_for) {\n                    this.card_state(this._card_menus_shown_for).card_menus_shown = false\n                }\n                if (this.card_menus_disabled || is_cling_hp()) {\n                    this._card_menus_shown_for = undefined\n                    return\n                }\n                this._card_menus_shown_for = item\n                const state = this.card_state(item)\n                state.card_menus_shown = true\n                if (running_on_mobile_device()) {\n                    actions.show_global_backdrop(actions.hide_card_menus)\n                } else {\n                    clearTimeout(hide_card_menus_timeout)\n                    hide_card_menus_timeout = setTimeout(() => actions.hide_card_menus(), 30000)\n                }\n            }),\n            hide_card_menus: action(() => {\n                if (!this._card_menus_shown_for) {\n                    return\n                }\n                if (running_on_mobile_device()) {\n                    actions.hide_global_backdrop()\n                }\n                this.card_state(this._card_menus_shown_for).card_menus_shown = false\n                this._card_menus_shown_for = undefined\n            }),\n            disable_card_menus: action(() => {\n                actions.hide_card_menus()\n                this.card_menus_disabled = true\n            }),\n            enable_card_menus: action(() => {\n                this.card_menus_disabled = false\n            }),\n            open_comments: action((card: Card | CardUID) => {\n                const card_state = this.card_state(card)\n                card_state.comments_shown = true\n                card_state.focus_comment_editor_once = true\n            }),\n            hide_comments: action((card: Card) => {\n                const card_state = this.card_state(card)\n                card_state.comments_shown = false\n            }),\n            hide_all_comments: action(() => {\n                for (const state of [...this._card_states.values()]) {\n                    if (state.comments_shown) {\n                        state.comments_shown = false\n                    }\n                }\n            }),\n            start_editing_card: action(\n                (\n                    board_uid: BoardUID,\n                    card_uid: CardUID,\n                    opts?: {\n                        pos?: {left: number; top: number}\n                        special_editor?: \"title\" | \"audio\" | \"video\" | \"photo\"\n                    },\n                ) => {\n                    Snackbar.clear()\n                    actions.stop_editing_card({cancel: true})\n                    if (show_snackbar_if_board_size_soft_limit_is_exceeded(board_uid)) {\n                        return\n                    }\n                    this.pause_board_sync?.(board_uid)\n                    actions.disable_card_menus()\n                    this.prevent_touch_scroll_x = true\n                    const card_state = this.card_state(card_uid)\n                    card_state.view = \"editor\"\n                    const card_rect = document\n                        .querySelector(`[data-card-uid=\"${card_uid}\"] .card__content`)\n                        ?.getBoundingClientRect()\n                    const dim = {width: card_rect?.width || 0, height: card_rect?.height || 0}\n                    card_state.editor_opts = {...opts, dim}\n                    this._currently_edited_card_uid = card_uid\n                    if (running_on_mobile_device()) {\n                        this.app_bar_shown = false\n                        this.app_bar_enabled = false\n                    }\n                    actions.show_global_backdrop(actions.stop_editing_card)\n                },\n            ),\n            stop_editing_card: action((opts: {cancel?: boolean} = {}) => {\n                actions.enable_card_menus()\n                actions.hide_global_backdrop()\n                this.prevent_touch_scroll_x = false\n                if (this.card_editor) {\n                    if (opts.cancel) {\n                        this.card_editor.cancel()\n                    } else {\n                        this.card_editor.save()\n                    }\n                    this.card_editor = undefined\n                }\n                if (this._currently_edited_card_uid) {\n                    const state = this.card_state(this._currently_edited_card_uid)\n                    state.view = \"\"\n                    state.editor_opts = undefined\n                    this._currently_edited_card_uid = undefined\n                }\n                if (running_on_mobile_device()) {\n                    this.app_bar_enabled = true\n                    this.app_bar_shown = true\n                }\n                this.pause_board_sync?.(undefined)\n            }),\n            start_adding_pasting_new_card: action((what: \"add\" | \"paste\") => {\n                Snackbar.clear()\n                this.let_user_select_where_to_add_a_card = what\n                actions.disable_card_menus()\n                actions.show_global_backdrop(actions.stop_adding_pasting_new_card)\n            }),\n            stop_adding_pasting_new_card: action(() => {\n                this.let_user_select_where_to_add_a_card = false\n                actions.enable_card_menus()\n                actions.hide_global_backdrop()\n            }),\n            open_lightbox: resettable_action((card: Card) => {\n                Snackbar.clear()\n                report_user_engagement(EngagementType.view_media)\n                const card_state = this.card_state(card)\n                card_state.view = \"lightbox\"\n                return () => {\n                    card_state.view = \"\"\n                }\n            }),\n            close_lightbox: action(() => {\n                this.reset()\n            }),\n            toggle_clipboard_shown: action(() => {\n                assert(!running_on_mobile_device(), \"Cannot toggle clipboard on mobile\")\n                this._aux_column = this._aux_column === \"clipboard\" ? \"\" : \"clipboard\"\n            }),\n            toggle_trashcan_shown: action(() => {\n                assert(!running_on_mobile_device(), \"Cannot toggle trashcan on mobile\")\n                this._aux_column = this._aux_column === \"trashcan\" ? \"\" : \"trashcan\"\n            }),\n            toggle_desktop_board_chooser: action(\n                (\n                    state: \"boards\" | \"people\" | \"hidden\",\n                    {focus_search}: {focus_search?: boolean} = {},\n                ) => {\n                    this.desktop_board_chooser_state = state\n                    if (focus_search) {\n                        this.desktop_board_chooser_focus_search = true\n                    }\n                },\n            ),\n            layout_zoom_in: action(() => {\n                this._current_board_state.min_column_width = this.zoom_layout(20)\n            }),\n            layout_zoom_out: action(() => {\n                this._current_board_state.min_column_width = this.zoom_layout(-20)\n            }),\n            close_aux_column: action(() => {\n                this._aux_column = \"\"\n            }),\n            open_website_page: (\n                which:\n                    | \"detail/cling-meet\"\n                    | \"detail/version-history\"\n                    | \"detail/organizations-and-teams\"\n                    | \"detail/teamwork\"\n                    | \"pricing\",\n            ) => {\n                const lang = as_language(this.current_user.account.locale) === \"de\" ? \"de\" : \"en\"\n                window.open(`/${lang}/${which}.html?in_app=1`)\n            },\n            show_task_edit_dialog: resettable_action((props: TaskEditDialogProps) => {\n                this.task_edit_dialog_props = {...props}\n                this.dialog = \"task_editor\"\n                return () => {\n                    this.dialog = \"none\"\n                    this.task_edit_dialog_props = undefined\n                }\n            }),\n            open_send_to_board_dialog: resettable_action((props: {board: Board; card: Card}) => {\n                this.send_to_board_dialog_props = {...props}\n                this.dialog = \"send_to_board\"\n                return () => {\n                    this.dialog = \"none\"\n                    this.send_to_board_dialog_props = undefined\n                }\n            }),\n            open_start_conversation_dialog: resettable_action(() => {\n                Snackbar.clear()\n                if (\n                    board_resource.board_quota_usage.num_boards >=\n                    board_quota_limits(this.current_user.account_attributes).num_boards\n                ) {\n                    actions.open_quota_limit_exceeded_dialog()\n                    return () => (this.dialog = \"none\")\n                }\n                this.dialog = \"start_conversation\"\n                return () => {\n                    this.dialog = \"none\"\n                }\n            }),\n            open_add_board_dialog: resettable_action(() => {\n                Snackbar.clear()\n                if (\n                    board_resource.board_quota_usage.num_boards >=\n                    board_quota_limits(this.current_user.account_attributes).num_boards\n                ) {\n                    actions.open_quota_limit_exceeded_dialog()\n                    return () => (this.dialog = \"none\")\n                }\n                this.dialog = \"new_board\"\n                return () => {\n                    this.dialog = \"none\"\n                }\n            }),\n            open_copy_board_dialog: resettable_action(() => {\n                Snackbar.clear()\n                this.dialog = \"copy_board\"\n                return () => {\n                    this.dialog = \"none\"\n                }\n            }),\n            open_report_abuse_dialog: resettable_action((board: Board, card?: Card) => {\n                Snackbar.clear()\n                this.report_abuse_dialog_props = {board, card}\n                this.dialog = \"report_abuse\"\n                return () => {\n                    this.dialog = \"none\"\n                }\n            }),\n            open_board_settings_dialog: resettable_action(() => {\n                this.dialog = \"board_settings\"\n                return () => {\n                    this.dialog = \"none\"\n                }\n            }),\n            open_share_board_dialog: resettable_action(() => {\n                this.dialog = \"share_board\"\n                return () => {\n                    this.dialog = \"none\"\n                }\n            }),\n            open_import_data_dialog: resettable_action(() => {\n                this.dialog = \"import_data\"\n                return () => {\n                    this.dialog = \"none\"\n                }\n            }),\n            open_checkout_dialog: resettable_action(() => {\n                Snackbar.clear()\n                this.dialog = \"checkout\"\n                return () => {\n                    this.dialog = \"none\"\n                }\n            }),\n            open_quota_limit_exceeded_dialog: resettable_action(() => {\n                Snackbar.clear()\n                this.dialog = \"quota_limit_exceeded_dialog\"\n                return () => {\n                    this.dialog = \"none\"\n                }\n            }),\n            open_pro_feature_teaser_dialog: action((props: {description: any}) => {\n                this.pro_feature_teaser_dialog_props = props\n            }),\n            close_pro_feature_teaser_dialog: action(() => {\n                this.pro_feature_teaser_dialog_props = undefined\n            }),\n            open_teams_dialog: resettable_action(() => {\n                this.dialog = \"teams\"\n                return () => {\n                    this.dialog = \"none\"\n                }\n            }),\n            open_account_settings_dialog: resettable_action(() => {\n                this.dialog = \"account_settings\"\n                return () => {\n                    this.dialog = \"none\"\n                }\n            }),\n            open_diagnostics_dialog: resettable_action(() => {\n                this.dialog = \"diagnostics\"\n                return () => {\n                    this.dialog = \"none\"\n                }\n            }),\n            close_dialog: action(() => {\n                this.reset()\n                this.dialog = \"none\"\n            }),\n            update_board_last_seen: action((board_uid: BoardUID, date: Date) => {\n                const cur = this.board_last_seen(board_uid)\n                if (!cur || cur.getTime() < date.getTime()) {\n                    this._board_last_seen.set(board_uid, date)\n                }\n            }),\n            toggle_content_collapsed: action((card: Card) => {\n                const state = this.card_state(card.uid)\n                const value = !state.content_collapsed\n                if (value && !this.is_content_collapsible(card)) {\n                    return\n                }\n                state.content_collapsed = value\n                if (value) {\n                    state.comments_shown = false\n                } else if (\n                    !this.search_state.has_visible_children(card) &&\n                    state.children_collapsed\n                ) {\n                    // If there are no visible children, we should definitely expand it\n                    // fully - see https://cling.com/c/c6DLXmkdYW0mu8SHE3LIcJJ ...\n                    state.children_collapsed = false\n                }\n            }),\n            toggle_children_collapsed: action((card: Card) => {\n                const state = this.card_state(card.uid)\n                const value = !state.children_collapsed\n                if (value && card.children.length === 0) {\n                    return\n                }\n                state.children_collapsed = value\n                if (value) {\n                    state.comments_shown = false\n                }\n            }),\n            toggle_fully_collapsed: action((card: Card) => {\n                const state = this.card_state(card.uid)\n                const value = !(state.content_collapsed || state.children_collapsed)\n                state.content_collapsed = value ? this.is_content_collapsible(card) : false\n                state.children_collapsed = value\n                if (value) {\n                    state.comments_shown = false\n                }\n                traverse_cards(card, (x) => {\n                    // We optimize here and only create new card states if necessary ...\n                    const collapse_children = value ? x.children.length > 0 : false\n                    const collapse_content = value ? this.is_content_collapsible(x) : false\n                    const child_state = this.card_state(x)\n                    if (collapse_children) {\n                        child_state.children_collapsed = true\n                    } else if (this._card_states.has(x.uid)) {\n                        child_state.children_collapsed = false\n                    }\n                    if (collapse_content) {\n                        child_state.content_collapsed = true\n                    } else if (this._card_states.has(x.uid)) {\n                        child_state.content_collapsed = false\n                    }\n                    if (value) {\n                        child_state.comments_shown = false\n                    }\n                })\n            }),\n            toggle_collapse_expand_all: action(() => {\n                actions.hide_card_menus()\n                const new_state = !this._current_board_state.toggle_collapse_expand_all\n                this._current_board_state.toggle_collapse_expand_all = new_state\n                const current_board = this.current_board.board\n                if (!current_board) {\n                    return\n                }\n                const boards = [current_board]\n                if (!process.env.F_PUBLIC) {\n                    boards.push(board_resource.clipboard, board_resource.trashcan)\n                }\n                for (const b of boards) {\n                    for (const x of b.regular_cards) {\n                        // We optimize here and only create new card states if necessary ...\n                        const collapse_content = new_state && this.is_content_collapsible(x)\n                        const child_state = this.card_state(x)\n                        if (collapse_content) {\n                            child_state.content_collapsed = true\n                        } else if (this._card_states.has(x.uid)) {\n                            child_state.content_collapsed = false\n                        }\n                        const collapse_children = new_state && x.children.length > 0\n                        if (collapse_children) {\n                            child_state.children_collapsed = true\n                        } else if (this._card_states.has(x.uid)) {\n                            child_state.children_collapsed = false\n                        }\n                        if (new_state) {\n                            child_state.comments_shown = false\n                        }\n                    }\n                }\n                this.layout_state.scroll_all_columns_to_top()\n            }),\n            fully_expand_all: action(() => {\n                actions.hide_card_menus()\n                this._current_board_state.toggle_collapse_expand_all = false\n                const current_board = this.current_board.board\n                if (!current_board) {\n                    return\n                }\n                const boards = [current_board]\n                if (!process.env.F_PUBLIC) {\n                    boards.push(board_resource.clipboard, board_resource.trashcan)\n                }\n                for (const b of boards) {\n                    for (const card of b.regular_cards) {\n                        const state = this._card_states.get(card.uid)\n                        if (state) {\n                            state.children_collapsed = false\n                            state.content_collapsed = false\n                        }\n                    }\n                }\n            }),\n            highlight_card: action((card_uid?: CardUID) => {\n                if (card_uid && this.main_view === \"calendar\") {\n                    actions.toggle_calendar()\n                }\n                if (!card_uid) {\n                    this.highlighted_card_state = undefined\n                } else {\n                    this.highlighted_card_state = {card_uid, already_scrolled_into_view: false}\n                }\n            }),\n            toggle_calendar: action(() => {\n                this.search_state.end_search({reset: true})\n                this.main_view = this.main_view === \"calendar\" ? \"columns\" : \"calendar\"\n            }),\n            show_archived: action(async (b: boolean) => {\n                let query = \"\"\n                if (b) {\n                    const board_uids = [this.current_board_uid]\n                    if (this.clipboard_shown) {\n                        board_uids.push(derive_clipboard_uid(this.current_user.account.uid))\n                    }\n                    if (this.trashcan_shown) {\n                        board_uids.push(derive_trashcan_uid(this.current_user.account.uid))\n                    }\n                    query = `archived:show board.uid:(${board_uids.join(\" OR \")})`\n                } else if (this.main_view === \"calendar\" && !this.search_state.all_boards) {\n                    query = `board.uid:${this.current_board_uid}`\n                }\n                return this.search_state.search(query)\n            }),\n        }\n        for (const [fn_name, fn] of Object.entries(actions)) {\n            // Prevent log spam.\n            if (\n                fn_name === \"show_card_menus\" ||\n                fn_name === \"hide_card_menus\" ||\n                fn_name === \"disable_card_menus\" ||\n                fn_name === \"enable_card_menus\"\n            ) {\n                continue\n            }\n            ;(actions as any)[fn_name] = (...args: Array<any>) => {\n                log.debug(`ui_actions.${fn_name}`)\n                return (fn as any).apply(this, args)\n            }\n        }\n        return actions\n    }\n\n    get active_card(): Card | undefined {\n        return this._card_menus_shown_for\n    }\n\n    get global_backdrop(): (() => void) | undefined {\n        return this._global_backdrop\n    }\n\n    get app_bar_shown() {\n        return this._app_bar_shown\n    }\n\n    set app_bar_shown(b: boolean) {\n        if (this.app_bar_enabled) {\n            this._app_bar_shown = b\n        }\n    }\n\n    set dialog(x: DialogType) {\n        this.prevent_touch_scroll_x = x !== \"none\"\n        this._dialog = x\n    }\n\n    get dialog(): DialogType {\n        return this._dialog\n    }\n\n    is_content_collapsed(card: Card): boolean {\n        return !!this._card_states.get(card.uid)?.content_collapsed\n    }\n\n    is_children_collapsed(card: Card): boolean {\n        return !!this._card_states.get(card.uid)?.children_collapsed\n    }\n\n    /**\n     * Link cards, file cards (except image cards) and note cards\n     * with very little text should not be collapsed.\n     */\n    is_content_collapsible(card: Card) {\n        if (card.link) {\n            return card.link.style.display.kind === ImageCardDisplayKind.cinema\n        } else if (card.file) {\n            return (\n                is_image(card.file.blob) && card.file.display.kind === ImageCardDisplayKind.cinema\n            )\n        }\n        const {note} = card\n        if (!note) {\n            return false\n        }\n        if (!note.safe_html && (note.title || \"\").length <= 50) {\n            return false\n        }\n        if (!note.title) {\n            const safe_html = note.safe_html || \"\"\n            if (safe_html.length > 200) {\n                // Shortcut - we don't need to look at markup this big ...\n                return true\n            }\n            const all_tags: string[] = safe_html.toLowerCase().match(/<[^/]*?>/g) || []\n            const tags = all_tags.filter(\n                (x) => x !== \"<i>\" && x !== \"<b>\" && x !== \"<em>\" && x !== \"<code>\" && x !== \"<s>\",\n            )\n            const num_p_tags = tags.filter((x) => x === \"<p>\").length\n            if (num_p_tags > 1) {\n                return true\n            }\n            // Calculate the \"pure\" characters (i.e. leaving out all markup) ...\n            const all_closing_tags: string[] = safe_html.toLowerCase().match(/<\\/.*?>/g) || []\n            const markup_length =\n                all_tags.reduce((sum, x) => sum + x.length, 0) +\n                all_closing_tags.reduce((sum, x) => sum + x.length, 0)\n            if (num_p_tags === 1 && tags.length === 1) {\n                // A short paragraph should not be collapsible ...\n                return safe_html.length > markup_length + 60\n            }\n            if (\n                tags[0] === '<ul role=\"listbox\">' &&\n                tags[1].startsWith(\"<li\") &&\n                tags.length === 2\n            ) {\n                // A single, short checklist item should not be collapsible ...\n                return safe_html.length > markup_length + 50\n            }\n            if (\n                (tags[0] === \"<ul>\" || tags[0] === \"<ol>\") &&\n                tags[1] === \"<li>\" &&\n                tags.length === 2\n            ) {\n                // A single, short list item should not be collapsible ...\n                return safe_html.length > markup_length + 50\n            }\n            return true\n        }\n        return true\n    }\n\n    get toggle_collapse_expand_all() {\n        return this._current_board_state.toggle_collapse_expand_all\n    }\n\n    get min_column_width(): number {\n        return this._current_board_state.min_column_width\n    }\n\n    get trashcan_shown(): boolean {\n        return this._aux_column === \"trashcan\"\n    }\n\n    get clipboard_shown(): boolean {\n        return this._aux_column === \"clipboard\"\n    }\n\n    board_last_seen(board_uid: BoardUID): Date | undefined {\n        return this._board_last_seen.get(board_uid)\n    }\n\n    private merge_board_last_seen(board_last_seen: BoardLastSeen[]) {\n        runInAction(() => {\n            for (const {board_uid, seen} of board_last_seen) {\n                if (board_uid === this.current_board_uid) {\n                    // We don't want to interrupt the current flow of the user by updating `last-seen`\n                    // while the user is currently on the board ...\n                    continue\n                }\n                const cur = this.board_last_seen(board_uid)\n                if (!cur || cur.getTime() < seen.date.getTime()) {\n                    this._board_last_seen.set(board_uid, seen.date)\n                }\n            }\n        })\n    }\n\n    /**\n     * Public boards are excluded.\n     */\n    get num_changed_user_boards(): number {\n        return board_info_resource\n            .read_all()\n            .filter((x) => x.is_user_board && this.is_new_or_changed(x) && !x.acl.is_public).length\n    }\n\n    get column_width(): number {\n        return this.layout_state.layout.main_layout.column_width\n    }\n\n    card_menus_shown(card: Card | CardUID): boolean {\n        return !!this._card_states.get(is_CardUID(card) ? card : card.uid)?.card_menus_shown\n    }\n\n    editing_card(card: Card): boolean {\n        return this._card_states.get(card.uid)?.view === \"editor\"\n    }\n\n    edit_start_pos(card: Card): undefined | {left: number; top: number} {\n        return this._card_states.get(card.uid)?.editor_opts?.pos\n    }\n\n    edit_start_dim(card: Card): undefined | {width: number; height: number} {\n        return this._card_states.get(card.uid)?.editor_opts?.dim\n    }\n\n    special_editor(card: Card): undefined | \"title\" | \"audio\" | \"video\" | \"photo\" {\n        return this._card_states.get(card.uid)?.editor_opts?.special_editor\n    }\n\n    comments_shown(card: Card): boolean {\n        return !!this._card_states.get(card.uid)?.comments_shown\n    }\n\n    lightbox_shown(card?: Card): boolean {\n        if (card) {\n            return this._card_states.get(card.uid)?.view === \"lightbox\"\n        }\n        for (const x of this._card_states.values()) {\n            if (x.view === \"lightbox\") {\n                return true\n            }\n        }\n        return false\n    }\n\n    /**\n     * Paste is enabled if the clipboard's inbox card has unarchived items.\n     * Furthermore permission to add cards or boards must be granted depending on the\n     * first element in the clipboard.\n     */\n    paste_disabled(permissions: CardPermissions) {\n        if (process.env.F_PUBLIC) {\n            return true\n        }\n        let clipboard\n        try {\n            clipboard = board_resource.clipboard\n        } catch {\n            // The clipboard is currently not available ...\n            return true\n        }\n        const children = this.search_state.visible_children(clipboard.inbox)\n        if (children.length === 0) {\n            return true\n        }\n        return !permissions.can_add_card\n    }\n\n    /**\n     * Return all visible columns. A column is visible if any of its children matches the current\n     * search. On desktop devices the inbox is always omitted. On mobile devices it is included\n     * (as first column) when it is currently opened.\n     */\n    visible_columns(board: Board): ReadonlyArray<ColumnCard | InboxCard> {\n        let columns = [...board.columns] as Array<ColumnCard | InboxCard>\n        columns = columns.filter((x) => this.search_state.has_visible_children(x))\n        if (\n            (!process.env.F_PUBLIC &&\n                !this.search_state.is_search_narrowing_down &&\n                this.current_board.board!.acl.can_edit(this.current_user.account_attributes)) ||\n            this.search_state.has_visible_children(this.current_board.board!.inbox) ||\n            this.search_state.has_visible_children(board.inbox) ||\n            !board.is_dashboard_or_user_board\n        ) {\n            if (!scraped_by_search_bot()) {\n                columns.unshift(board.inbox)\n            }\n        }\n        return columns\n    }\n\n    is_new_or_changed(content: Card | Comment | BoardInfo): false | \"self\" | \"children\" {\n        const user = this.current_user.account.uid\n        if (content instanceof BoardInfo) {\n            const board_uid = content.uid\n            const board_ref_last_seen = this.board_last_seen(board_uid)\n            const board_info = content\n            if (!board_info || !board_info.last_important_change || board_info.is_system_board) {\n                return false\n            }\n            if (this.current_user.account_settings.board_setting(board_uid)?.archived) {\n                return false\n            }\n            if (!board_ref_last_seen) {\n                if (board_info.last_important_change.account_uid === user) {\n                    // The user has never seen the board, but the last important change is by her.\n                    // That means either the user has created the board and never went to it or\n                    // the user was the last one to change the board (possibly in another session)\n                    // and in that case we assume that there is nothing new or changed to be\n                    // seen for the user ...\n                    return false\n                }\n                return \"self\"\n            }\n            const last_important_change_at = board_info.last_important_change.date.getTime()\n            const last_important_change_by = board_info.last_important_change.account_uid\n            const last_seen = board_ref_last_seen.getTime()\n            // TODO If the user opens a board with changes by others adds a change themselves\n            //      and then reloads, the board should be marked as changed in the board-menu\n            //      and the user sees the changes on the board - the latter is already the case.\n            if (last_important_change_at > last_seen && last_important_change_by !== user) {\n                return \"self\"\n            }\n            return false\n        }\n        const board_last_seen = this.board_last_seen(content.parent.board_uid)\n        if (!board_last_seen) {\n            return false\n        }\n        const time = board_last_seen.getTime()\n        const last_change = content.last_important_change\n        if (last_change && last_change.date.getTime() > time && last_change.account_uid !== user) {\n            return \"self\"\n        }\n        if (content instanceof Comment) {\n            return false\n        } else if (content instanceof Card) {\n            for (const x of content.comments) {\n                const is_new_or_changed = this.is_new_or_changed(x)\n                if (is_new_or_changed) {\n                    return \"children\"\n                }\n            }\n            for (const x of this.search_state.visible_children(content)) {\n                const is_new_or_changed = this.is_new_or_changed(x)\n                if (is_new_or_changed) {\n                    return \"children\"\n                }\n            }\n            return false\n        } else {\n            throw assert_never(content)\n        }\n    }\n\n    should_focus_comment_editor_once(card: Card): boolean {\n        return !!this._card_states.get(card.uid)?.focus_comment_editor_once\n    }\n\n    get highlighted_card(): Card | undefined {\n        if (!this.highlighted_card_state) {\n            return undefined\n        }\n        try {\n            return this.current_board.board?.card(this.highlighted_card_state.card_uid)\n        } catch {\n            return undefined\n        }\n    }\n\n    /**\n     * Find the column (or inbox) the highlighted card belongs to as well as every `x.parent_pos`\n     * of each ancestor from top (the column) to bottom (the highlighted card).\n     */\n    get highlighted_card_column_and_positions(): undefined | [CardModel, number[]] {\n        const target = this.highlighted_card\n        if (!target) {\n            return undefined\n        }\n        const positions: number[] = [target.parent_pos]\n        const col = target.find_parent((x) => {\n            positions.unshift(x.parent_pos)\n            return !!x.inbox || !!x.column\n        })\n        return [col!, positions]\n    }\n\n    get is_layout_zoom_in_enabled() {\n        return (\n            this.layout_state.layout.main_layout.column_width < MAX_COLUMN_WIDTH &&\n            this.zoom_layout(1) !== this.min_column_width\n        )\n    }\n\n    get is_layout_zoom_out_enabled() {\n        return (\n            this.layout_state.layout.main_layout.column_width > MIN_COLUMN_WIDTH &&\n            this.zoom_layout(-1) !== this.min_column_width\n        )\n    }\n\n    get is_card_editor_open() {\n        return !!this.card_editor\n    }\n\n    image_cache_thrash_index(blob_uid: BlobUID): number {\n        const i = this._image_cache_thrash_indexes.get(blob_uid)\n        if (!i) {\n            runInAction(() => {\n                this._image_cache_thrash_indexes.set(blob_uid, 0)\n            })\n            return this._image_cache_thrash_indexes.get(blob_uid)!\n        }\n        return i\n    }\n\n    inc_image_cache_thrash_index(blob_uid: BlobUID) {\n        runInAction(() => {\n            const i = this.image_cache_thrash_index(blob_uid)\n            this._image_cache_thrash_indexes.set(blob_uid, i + 1)\n        })\n    }\n\n    private card_state(card_or_card_uid: Card | CardUID): CardState {\n        const card_uid = (card_or_card_uid as Card).uid || (card_or_card_uid as CardUID)\n        let card_state = this._card_states.get(card_uid)\n        if (!card_state) {\n            card_state = new CardState(card_uid)\n            this._card_states.set(card_uid, card_state)\n        }\n        return card_state\n    }\n\n    private get _current_board_state(): BoardState {\n        if (!this.__current_board_state) {\n            throw new Error()\n        }\n        return this.__current_board_state\n    }\n\n    private zoom_layout(incr: number) {\n        const cur_layout = this.layout_state.layout\n        const calc = (min_column_width: number) => {\n            return default_layout({\n                view_port_width: this.layout_state.view_port_width,\n                min_column_width: min_column_width,\n                max_column_width: MAX_COLUMN_WIDTH,\n                num_main_columns: cur_layout.main_layout.num_columns,\n                aux_column_shown: cur_layout.aux_layout.visible,\n                inbox_shown: cur_layout.main_layout.inbox_shown,\n            })\n        }\n        let new_min_width = this.min_column_width\n        if (\n            (this.min_column_width === MIN_COLUMN_WIDTH && incr > 0) ||\n            (this.min_column_width === MAX_COLUMN_WIDTH && incr < 0)\n        ) {\n            new_min_width = OPTIMUM_COLUMN_WITH\n        } else if (incr > 0) {\n            new_min_width = MAX_COLUMN_WIDTH\n        } else if (incr < 0) {\n            new_min_width = MIN_COLUMN_WIDTH\n        }\n        const new_layout = calc(new_min_width)\n        if (new_layout.main_layout.column_width !== cur_layout.main_layout.column_width) {\n            // Only zoom if it would actually change the layout ...\n            return new_min_width\n        }\n        return this.min_column_width\n    }\n}\n", "import {action, observable, makeObservable} from \"mobx\"\nimport {nop} from \"@cling/lib.shared.utils\"\n\nexport class UploadState {\n    num_files_total = 0\n    num_files_uploaded = 0\n    num_bytes_total = 0\n    num_bytes_uploaded_of_uploaded_files = 0\n    num_bytes_uploaded_of_uploading_file = 0\n    name_of_uploading_file?: string = undefined\n    cancel_uploads: () => void = nop\n\n    constructor() {\n        makeObservable(this, {\n            num_files_total: observable,\n            num_files_uploaded: observable,\n            num_bytes_total: observable,\n            num_bytes_uploaded_of_uploaded_files: observable,\n            num_bytes_uploaded_of_uploading_file: observable,\n            name_of_uploading_file: observable,\n            uploads_pending: action,\n            file_upload_starts: action,\n            file_upload_progress: action,\n            file_upload_done: action,\n        })\n    }\n\n    uploads_pending({\n        num_files_total,\n        num_bytes_total,\n        cancel_uploads,\n    }: {\n        num_files_total: number\n        num_bytes_total: number\n        cancel_uploads: () => void\n    }) {\n        this.num_files_total = num_files_total\n        this.num_bytes_total = num_bytes_total\n        this.cancel_uploads = action(() => {\n            this.reset()\n            cancel_uploads()\n        })\n    }\n\n    file_upload_starts(file_name: string) {\n        this.name_of_uploading_file = file_name\n    }\n\n    file_upload_progress(num_bytes_uploaded: number) {\n        this.num_bytes_uploaded_of_uploading_file = num_bytes_uploaded\n    }\n\n    file_upload_done(file_size: number, on_all_uploads_done?: () => void) {\n        this.num_files_uploaded += 1\n        if (this.num_files_uploaded < this.num_files_total) {\n            this.num_bytes_uploaded_of_uploaded_files += file_size\n            this.num_bytes_uploaded_of_uploading_file = 0\n        } else {\n            this.reset()\n            on_all_uploads_done?.()\n        }\n    }\n\n    private reset() {\n        this.num_files_total = 0\n        this.num_files_uploaded = 0\n        this.num_bytes_total = 0\n        this.num_bytes_uploaded_of_uploaded_files = 0\n        this.num_bytes_uploaded_of_uploading_file = 0\n        this.name_of_uploading_file = undefined\n        this.cancel_uploads = nop\n    }\n}\n", "import {\n    BoardUID,\n    ExportBoardRequest,\n    ExportBoardResponse,\n    JobStatus,\n    QueryExportBoardJobRequest,\n    QueryExportBoardJobResponse,\n} from \"@cling/lib.shared.model\"\nimport {action, observable, runInAction, makeObservable} from \"mobx\"\nimport {call_function} from \"@cling/lib.shared.faas\"\nimport {assert} from \"@cling/lib.shared.utils\"\n\nexport class ExportBoardState {\n    job_status?: JobStatus = undefined\n    download_url?: string = undefined\n    progress_value = 0\n    progress_max = 0\n    progress_interval: any\n    private job_id?: string = undefined\n    private timeout_id: any\n\n    start_export = async (board_uid: BoardUID) => {\n        assert(!this.export_pending, \"There is already an export in progress\")\n        this.reset()\n        this.progress_interval = setInterval(this.inc_fake_progress, 100)\n        this.job_status = JobStatus.job_pending\n        this.job_id = (\n            await call_function(new ExportBoardRequest({board_uid}), ExportBoardResponse)\n        ).job_id\n        clearTimeout(this.timeout_id)\n        this.timeout_id = setTimeout(this.update, 773)\n    }\n\n    constructor() {\n        makeObservable(this, {\n            job_status: observable,\n            download_url: observable,\n            progress_value: observable,\n            progress_max: observable,\n            start_export: action,\n            inc_fake_progress: action,\n            cancel: action,\n            close: action,\n            reset: action,\n        })\n    }\n\n    get export_pending() {\n        return !!this.job_status\n    }\n\n    inc_fake_progress = () => {\n        this.progress_value += (this.progress_max - this.progress_value) / 80\n    }\n\n    /**\n     * This will not cancel the export on the server - we have no means for that.\n     */\n    cancel = () => {\n        this.reset()\n    }\n\n    close = () => {\n        this.reset()\n    }\n\n    reset() {\n        clearTimeout(this.timeout_id)\n        clearInterval(this.progress_interval)\n        this.progress_value = 0\n        this.progress_max = 100\n        this.job_status = undefined\n        this.download_url = undefined\n    }\n\n    update = async () => {\n        if (!this.job_id) {\n            return\n        }\n        try {\n            const {job} = await call_function(\n                new QueryExportBoardJobRequest({\n                    job_id: this.job_id,\n                }),\n                QueryExportBoardJobResponse,\n            )\n            runInAction(() => {\n                this.job_status = job.status\n                this.download_url = job.download_url\n            })\n        } finally {\n            if (\n                this.job_status === JobStatus.job_pending ||\n                this.job_status === JobStatus.job_running\n            ) {\n                this.timeout_id = setTimeout(this.update, 733)\n            } else {\n                runInAction(() => {\n                    this.progress_value = this.progress_max\n                })\n            }\n        }\n    }\n}\n", "import {action, observable, runInAction, makeObservable} from \"mobx\"\nimport {call_function} from \"@cling/lib.shared.faas\"\nimport {\n    BoardUID,\n    ImportBoardRequest,\n    ImportBoardResponse,\n    JobStatus,\n    QueryImportBoardJobRequest,\n    QueryImportBoardJobResponse,\n} from \"@cling/lib.shared.model\"\nimport {not_null} from \"@cling/lib.shared.utils\"\nimport {report_error} from \"@cling/lib.shared.debug\"\n\nexport class ImportBoardState {\n    job_status?: JobStatus = undefined\n    board_uid?: BoardUID = undefined\n    private upload_id?: string = undefined\n    private job_id?: string = undefined\n    private timeout_id: any\n\n    start_import = async (upload_id: string) => {\n        this.job_status = JobStatus.job_pending\n        this.board_uid = undefined\n        this.upload_id = upload_id\n        this.job_id = (\n            await call_function(\n                new ImportBoardRequest({temp_upload_id: upload_id}),\n                ImportBoardResponse,\n            )\n        ).job_id\n        clearTimeout(this.timeout_id)\n        this.timeout_id = setTimeout(this.update, 773)\n    }\n\n    retry_import = () => {\n        this.start_import(not_null(this.upload_id)).catch(report_error)\n    }\n\n    close_toast = () => {\n        clearTimeout(this.timeout_id)\n        this.job_status = undefined\n    }\n\n    private update = async () => {\n        if (!this.job_id) {\n            return\n        }\n        try {\n            const {job} = await call_function(\n                new QueryImportBoardJobRequest({\n                    job_id: this.job_id,\n                }),\n                QueryImportBoardJobResponse,\n            )\n            if (this.job_status !== job.status) {\n                runInAction(() => {\n                    this.job_status = job.status\n                })\n            }\n            if (this.board_uid !== job.board_uid) {\n                this.board_uid = job.board_uid\n            }\n        } finally {\n            if (\n                this.job_status === JobStatus.job_pending ||\n                this.job_status === JobStatus.job_running\n            ) {\n                this.timeout_id = setTimeout(this.update, 733)\n            }\n        }\n    }\n\n    constructor() {\n        makeObservable(this, {\n            job_status: observable,\n            start_import: action,\n            retry_import: action,\n            close_toast: action,\n        })\n    }\n}\n", "import {UserInterfaceState} from \"./user_interface_state\"\nimport {UploadState} from \"./upload_state\"\nimport {ExportBoardState} from \"./export_board_state\"\nimport {ImportBoardState} from \"./import_board_state\"\nimport type {CurrentUser} from \"@cling/lib.web.resources\"\nimport {init as init_debug_state} from \"./debug_state\"\nimport {init as init_patch} from \"./patch\"\nimport {init as init_model_actions} from \"./model_actions\"\nimport type {CallSearch} from \"./search_state\"\nimport model_actions from \"./model_actions\"\nimport type {BoardUID, Patch, PatchUID} from \"@cling/lib.shared.model\"\n\nexport function init({\n    current_user: _current_user,\n    call_search,\n    publish_patch,\n    pause_board_sync,\n}: {\n    current_user: CurrentUser\n    call_search: CallSearch\n    publish_patch: (args: {\n        patch: Patch\n        transformed_patches: Patch[]\n        patch_uid: PatchUID\n        board_uids: BoardUID[]\n        patch_pb: Uint8Array\n        transformed_patches_pb: Uint8Array[]\n    }) => void\n    pause_board_sync?: (board_uid: BoardUID | undefined) => void\n}): UserInterfaceState {\n    current_user = _current_user\n    ui_state = new UserInterfaceState({\n        board_last_seen: current_user.account_analytics.board_last_seen,\n        current_user,\n        call_search,\n        pause_board_sync,\n    })\n    ui_actions = ui_state.actions()\n    upload_state = new UploadState()\n    export_board_state = new ExportBoardState()\n    import_board_state = new ImportBoardState()\n    Object.assign(cling, {\n        current_user,\n        ui_state,\n        upload_state,\n        export_board_state,\n        import_board_state,\n        model_actions,\n    })\n    init_debug_state()\n    init_patch(current_user, publish_patch)\n    init_model_actions({current_user, ui_state, ui_actions})\n    return ui_state\n}\n\nexport let current_user: CurrentUser\nexport let ui_state: UserInterfaceState\nexport let ui_actions: ReturnType<typeof ui_state.actions>\nexport let upload_state: UploadState\nexport let export_board_state: ExportBoardState\nexport let import_board_state: ImportBoardState\n"],
  "mappings": "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",
  "names": ["require_browser", "__commonJSMin", "exports", "module", "invariant", "__name", "condition", "format", "a", "b", "c", "d", "e", "error", "args", "argIndex", "require_gud", "__commonJSMin", "exports", "module", "key", "require_warning", "__commonJSMin", "exports", "module", "__DEV__", "warning", "__name", "printWarning", "format", "args", "len", "key", "argIndex", "message", "condition", "require_implementation", "__commonJSMin", "exports", "module", "_react", "_react2", "_interopRequireDefault", "_propTypes", "_propTypes2", "_gud", "_gud2", "_warning", "_warning2", "obj", "__name", "_classCallCheck", "instance", "Constructor", "_possibleConstructorReturn", "self", "call", "_inherits", "subClass", "superClass", "MAX_SIGNED_31_BIT_INT", "objectIs", "x", "y", "createEventEmitter", "value", "handlers", "handler", "h", "newValue", "changedBits", "onlyChild", "children", "createReactContext", "defaultValue", "calculateChangedBits", "_Provider$childContex", "_Consumer$contextType", "contextProp", "Provider", "_Component", "_temp", "_this", "_ret", "_len", "args", "_key", "_ref", "nextProps", "oldValue", "Consumer", "_Component2", "_temp2", "_this2", "_ret2", "_len2", "_key2", "observedBits", "require_lib", "__commonJSMin", "exports", "module", "_react", "_react2", "_interopRequireDefault", "_implementation", "_implementation2", "obj", "__name", "require_react_lifecycles_compat_cjs", "__commonJSMin", "exports", "componentWillMount", "state", "__name", "componentWillReceiveProps", "nextProps", "updater", "prevState", "componentWillUpdate", "nextState", "prevProps", "polyfill", "Component", "prototype", "foundWillMountName", "foundWillReceivePropsName", "foundWillUpdateName", "componentName", "newApiName", "componentDidUpdate", "maybeSnapshot", "snapshot", "require_utils", "__commonJSMin", "exports", "_invariant", "_invariant2", "_interopRequireDefault", "obj", "__name", "startsWith", "string", "search", "pick", "routes", "uri", "match", "default_", "_uri$split", "uriPathname", "uriSegments", "segmentize", "isRootUri", "ranked", "rankRoutes", "i", "l", "missed", "route", "routeSegments", "params", "max", "index", "routeSegment", "uriSegment", "isSplat", "param", "dynamicMatch", "paramRe", "matchIsNotReserved", "reservedNames", "value", "path", "resolve", "to", "base", "_to$split", "toPathname", "toQuery", "_base$split", "basePathname", "toSegments", "baseSegments", "addQuery", "pathname", "allSegments", "segments", "segment", "insertParams", "_path$split", "pathBase", "_path$split$", "query", "constructedPath", "_params$location", "_params$location$sear", "searchSplit", "validateRedirect", "from", "filter", "isDynamic", "fromString", "toString", "SEGMENT_POINTS", "STATIC_POINTS", "DYNAMIC_POINTS", "SPLAT_PENALTY", "ROOT_POINTS", "isRootSegment", "rankRoute", "score", "a", "b", "_len", "_key", "q", "shallowCompare", "obj1", "obj2", "obj1Keys", "key", "require_history", "__commonJSMin", "exports", "_extends", "target", "i", "source", "key", "getLocation", "__name", "_source$location", "search", "hash", "href", "origin", "protocol", "host", "hostname", "port", "pathname", "canUseDOM", "url", "createHistory", "options", "listeners", "location", "transitioning", "resolveTransition", "listener", "popstateListener", "fn", "to", "_ref", "state", "_ref$replace", "replace", "transition", "res", "createMemorySource", "initialPath", "searchIndex", "initialLocation", "index", "stack", "states", "name", "_", "uri", "_uri$split", "_uri$split$", "_uri$split2", "_uri$split2$", "newIndex", "getSource", "globalHistory", "navigate", "require_router", "__commonJSMin", "exports", "_extends", "target", "i", "source", "key", "_react", "_react2", "_interopRequireDefault", "_propTypes", "_propTypes2", "_invariant", "_invariant2", "_createReactContext", "_createReactContext2", "_reactLifecyclesCompat", "_utils", "_history", "obj", "__name", "_objectWithoutProperties", "keys", "_classCallCheck", "instance", "Constructor", "_possibleConstructorReturn", "self", "call", "_inherits", "subClass", "superClass", "createNamedContext", "name", "defaultValue", "Ctx", "LocationContext", "Location", "_ref", "children", "context", "LocationProvider", "_React$Component", "_temp", "_this", "_ret", "_len", "args", "_key", "_props$history", "navigate", "location", "error", "info", "isRedirect", "_navigate", "prevProps", "prevState", "_this2", "refs", "history", "ServerLocation", "_ref2", "url", "searchIndex", "searchExists", "pathname", "search", "hash", "BaseContext", "Router", "props", "baseContext", "locationContext", "RouterImpl", "_React$PureComponent", "_props", "_navigate2", "basepath", "primary", "baseuri", "_props$component", "component", "domProps", "routes", "array", "child", "createRoute", "match", "params", "uri", "route", "element", "to", "options", "clone", "FocusWrapper", "FocusHandler", "wrapperProps", "FocusContext", "_ref3", "requestFocus", "FocusHandlerImpl", "initialRender", "focusHandlerCount", "_React$Component2", "_temp2", "_this4", "_ret2", "_len2", "_key2", "node", "nextProps", "initial", "myURIChanged", "navigatedUpToMe", "_this5", "_props2", "style", "_props2$component", "Comp", "n", "k", "forwardRef", "C", "Link", "_ref4", "ref", "innerRef", "_ref5", "_ref6", "state", "replace", "_props$getProps", "getProps", "anchorProps", "href", "encodedHref", "isCurrent", "isPartiallyCurrent", "event", "shouldNavigate", "shouldReplace", "_location$state", "restState", "RedirectRequest", "o", "redirectTo", "RedirectImpl", "_React$Component3", "_props3", "from", "_props3$replace", "noThrow", "resolvedTo", "_props4", "Redirect", "_ref7", "Match", "_ref8", "path", "_ref9", "_ref10", "resolvedPath", "result", "useLocation", "useNavigate", "useParams", "results", "useMatch", "stripSlashes", "str", "elementPath", "require_escape_string_regexp", "__commonJSMin", "exports", "module", "string", "MIN_COLUMN_WIDTH", "OPTIMUM_COLUMN_WITH", "MAX_COLUMN_WIDTH", "use_narrow", "running_on_phone", "INCOMPLETE_COLUMN_VISIBLE_WIDTH", "SPACE_BETWEEN_COLUMNS", "running_on_mobile_device", "LEFT_SPACE", "RIGHT_SPACE", "override_default_layout", "overrides", "__name", "default_layout", "view_port_width", "min_column_width", "max_column_width", "num_main_columns", "aux_column_shown", "inbox_shown", "n", "min_width", "min_total_width", "num_fully_visible_columns", "main_column_width", "aux_column_width", "main_total_width", "main_client_width", "space_between_columns", "index", "import_router", "goto_dashboard", "opts", "log", "resolve", "reject", "__name", "goto_board", "board_uid", "highlight_card_uid", "replace", "board_uid_type", "card_uid_part", "uri", "card_deep_link", "card", "__name", "is_cling_hp", "with_shortcut", "title", "shortcut", "running_on_mobile_device", "transform", "patches", "board_factory", "result", "patch", "result_patch", "deep_copy", "more_patches", "i", "op_container", "op", "CopyCard", "MoveCard", "board", "assert", "InvalidPatchOp", "blob_uid_mapping", "source_card", "error", "ItemNotFound", "PatchOpContainer", "RemoveCard", "cards", "card", "derive_CardUID", "CardChangelogEntry", "blob", "src", "derive_BlobUID", "BlobUIDMapping", "assert_never", "paste_op", "PasteCard", "target_board_uid", "target_patch", "Patch", "derive_PatchUID", "__name", "transform", "patches", "board_factory", "result", "more_patches", "patch", "result_patch", "deep_copy", "i", "op_container", "op", "CopyBoard", "copy_ops", "board", "assert", "board_style", "derive_BlobUID", "BlobUIDMapping", "board_type", "board_uid_type", "PatchOpContainer", "AddBoard", "AddBoardValue", "AddSystemBoard", "AddSystemBoardValue", "InvalidPatchOp", "assert_never", "card", "CopyCard", "column", "column_uid", "derive_CardUID", "AddCard", "AddCardValue", "Column", "Patch", "derive_PatchUID", "__name", "transform", "patches", "board_factory", "result", "patch", "result_patch", "deep_copy", "op_container", "op", "SetCardArchived", "board", "assert", "InvalidPatchOp", "card", "error", "ItemNotFound", "traverse_cards", "x", "PatchOpContainer", "__name", "transform_patch_client", "patch", "board_factory", "patches", "transform", "flatten_patches", "__name", "flatten_patches", "patches", "flattened_patches", "patch", "p", "x", "__name", "_DebugState", "__publicField", "makeObservable", "observable", "__name", "DebugState", "debug_state", "init", "first_error_and_log_history", "register_log_event_reporter", "message", "severity", "log_history", "runInAction", "error_and_log_history", "_RateLimiter", "max_calls", "per", "__publicField", "assert", "period_value", "period_unit", "assert_never", "fn", "now", "n", "__name", "RateLimiter", "_Sensors", "__publicField", "RateLimiter", "network_state", "board_uid", "board", "patch_uid", "now", "t", "debug_state", "runInAction", "message", "extra", "within_limit", "report_info", "__name", "Sensors", "sensors", "current_user", "publish_patch", "board_sizes", "observable", "init", "current_user_", "publish_patch_", "__name", "show_snackbar_if_board_size_soft_limit_is_exceeded", "board_uid", "LIMIT_SOFT_BOARD_SIZE", "board_sizes", "Snackbar", "i18n", "report_error", "LimitExceeded", "__name", "new_Patch", "changes", "opts", "ops", "blob_uid_mapping", "src", "target", "BlobUIDMapping", "Patch", "create_PatchUID", "current_user", "PatchOpContainer", "optimistic_update", "update", "is_local_change", "patch", "LIMIT_PATCH_OPS", "patch_pb", "to_buffer", "log", "patch_applied", "runInAction", "transformed_patches", "transform_patch_client", "uid", "not_null", "board_resource", "transformed_patch", "x", "RemoveOp", "assert", "transformed_patches_pb", "_apply_patches", "publish_patch", "sensors", "error", "m", "source_patch", "added_boards", "patched_boards", "b", "patch_description", "class_name", "board_before", "board_before_version", "board_after", "apply_patch", "Board", "source_patch_desc", "board", "to_uint8array", "_ChangeBoardSettings", "board", "op", "__publicField", "new_Patch", "value", "patch", "poc", "x", "PatchOpContainer", "SetBoardName", "optimistic_update", "background_image_blob", "copied_from", "color", "is_pattern", "old_settings", "changes", "set_name", "set_board_style", "assert", "BlobUIDMapping", "runInAction", "board_resource", "SetBoardBoardStyle", "BoardStyle", "__name", "ChangeBoardSettings", "illegalRe", "controlRe", "unicodeRe", "reservedRe", "windowsReservedRe", "windowsTrailingRe", "sanitize_file_name", "s", "i", "extension", "__name", "is_valid_file_name", "URL_", "find_urls", "s", "result", "i", "m", "j", "candidate", "n", "is_valid_URL", "open_parentheses", "k", "__name", "import_escape_string_regexp", "local_change", "current_user", "ui_state", "ui_actions", "init", "args", "__name", "model_actions", "board_uid", "name", "board_style", "src_blob_uid", "random_board_style", "optimistic_update", "AddBoard", "AddBoardValue", "report_user_engagement", "share_with", "derive_people_board_uid", "board_info_resource", "x", "AddPeopleBoard", "AddPeopleBoardValue", "src_board_uid", "new_board_uid", "CopyBoard", "SetBoardName", "board", "value", "discard_local_change", "assert", "ChangeBoardSettings", "background_image_blob", "copied_from", "color", "is_pattern", "SetBoardBoardStyle", "BoardStyle", "invited", "access_level", "CustomAddBoardInvite", "AddBoardInviteValue", "create_BoardInviteUID", "invite", "RemoveBoardInvite", "principal_uid", "do_it", "CustomRemoveBoardACL", "promp_state", "i18n", "goto_dashboard", "report_error", "CustomSetBoardACLAccessLevel", "account_uid", "CustomSetBoardOwner", "RemoveBoard", "trashcan", "board_resource", "remove", "LIMIT_PATCH_OPS", "RemoveCard", "comment", "CustomRemoveComment", "card", "move_card", "parent", "undo_op", "MoveCard", "trashcan_uid", "derive_trashcan_uid", "Snackbar", "archived", "ops", "SetCardArchived", "undo_ops", "assignee", "date", "status", "force_create", "task", "SetTaskAssignee", "SetTaskDate", "SetTaskStatus", "CustomAddTask", "CustomRemoveTask", "clipboard", "clipboard_uid", "derive_clipboard_uid", "CopyCard", "target_board", "insert_pos", "visible_clipboard_children", "card_in_clipboard", "column_uid", "column_patch_op", "add_or_reuse_column_locally", "card_copy_before", "values", "uid", "title", "safe_html", "new_color", "is_valid_change", "is_within_limit", "LIMIT_SMALL_TEXT", "LIMIT_HTML", "urls", "find_urls", "i", "n", "runInAction", "patch", "add_card_value", "PatchOpContainer", "SetCardColor", "escape_string_regexp", "Link", "note", "not_null", "SetCardNoteTitle", "SetCardNoteSafeHtml", "url", "style", "LIMIT_URL", "SetCardLinkStyle", "link", "SetCardLinkTitle", "SetCardLinkURL", "file_name", "display", "new_blob", "preview_image_blob", "is_valid_file_name", "blob_uid_mapping", "SetCardFileBlob", "SetCardFilePreviewImageBlob", "SetCardFileFileName", "SetCardFileTitle", "SetCardFileDisplay", "image_card_uid", "new_card_uid", "create_CardUID", "add_card", "title_images_board_uid", "AddComment", "AddCommentValue", "create_CommentUID", "Note", "board_quota_limits", "card_uid", "AddCard", "AddCardValue", "new_Patch", "file", "card_color", "target_card", "log", "parent_visible_children", "pos", "prev_card", "grandparent", "following_siblings", "SetBoardIndexedBySearchEngines", "CustomAddBoardACL", "CLING_PUBLIC", "call_function", "PatchFullAccountRequest", "create_PatchUID", "PatchAccountSettings", "PatchAccountBoardSettings", "error", "fn_name", "fn", "action", "target_pos", "column", "Column", "s", "limit", "random_board_style", "colors", "background_board", "board_resource", "background_images_board_uid", "cards", "current_user", "x", "card", "background_color", "background_image_blob", "Blob", "create_BlobUID", "BoardStyle", "__name", "model_actions_default", "model_actions", "_CardState", "card_uid", "__publicField", "makeObservable", "observable", "result", "value", "__name", "CardState", "_BoardState", "board_uid", "__publicField", "OPTIMUM_COLUMN_WITH", "makeObservable", "observable", "__name", "BoardState", "init_compat_module", "START_SCROLL_THRESHOLD", "RUBBER_BAND_WIDTH", "SWIPE_MIN_DISTANCE", "SWIPE_MIN_VELOCITY", "SWIPE_MAX_OFF_PATH", "_SnapScroll", "layout", "prevent_scroll_x", "on_snap", "__publicField", "__name", "i", "main_layout", "num_visible_columns", "e", "cancel_event", "ts", "dx", "ldx", "lsts", "touch_x0", "touch_y0", "touch_state", "touch", "x", "y", "dy", "new_x", "snap_options", "ady", "adx", "dt", "swipe_left", "swipe_right", "scroll_left", "best_index", "best_delta", "delta", "elm", "first_visible_column_index", "running_on_mobile_device", "reaction", "prevent_scroll", "opts", "x_right", "translate_x", "max", "not_null", "skip_animation", "SnapScroll", "FixedWidthColumns", "observer", "aux_column_children", "aux_column_props", "centered", "backdrop", "before_children", "before_children_class_name", "after_children", "after_children_class_name", "children", "layout", "on_first_visible_column_change", "first_visible_column_index", "on_view_port_width_change", "on_vert_scroll", "on_snap", "prevent_scroll_x", "view_port_width", "set_view_port_width", "d", "on_snap_cb", "q", "column_index", "runInAction", "snap_scroll", "A", "SnapScroll", "size_div", "main_columns_elm", "resize_timeout", "y", "on_resize", "update_immediately", "w", "update_view_port_width", "__name", "resize_observer", "T", "listener", "update_size_div_ref", "elm", "update_main_columns_ref", "slide_aux_in", "style", "slide_aux_out", "_", "main_layout", "aux_layout", "before_child", "idx", "after_child", "main_columns_left", "running_on_mobile_device", "num_children", "O", "right_space", "right_spacer", "main_columns_horizontal_scroll_container", "classNames", "child", "k", "MainColumn", "aux_column_horizontal_scroll_container", "manage_scrolling", "with_perfect_scrollbar", "div", "ref", "last_scroll_top", "_n", "running_on_ios", "last_touch_y", "e", "touch_y", "scrollTop", "direction", "target", "dir", "fixed_width_column_index", "$elm", "$col", "$fwc", "assert", "background_style", "url", "color", "is_pattern", "is_background_pattern", "__name", "init_compat_module", "module", "peg$subclass", "child", "parent", "C", "__name", "peg$SyntaxError", "message", "expected", "found", "location", "self", "peg$padEnd", "str", "targetLength", "padString", "sources", "src", "k", "s", "offset_s", "loc", "e", "filler", "line", "last", "hatLen", "DESCRIBE_EXPECTATION_FNS", "expectation", "literalEscape", "escapedParts", "part", "classEscape", "hex", "ch", "describeExpectation", "describeExpected", "descriptions", "i", "j", "describeFound", "peg$parse", "input", "options", "peg$FAILED", "peg$source", "peg$startRuleFunctions", "peg$parsestart", "peg$startRuleFunction", "peg$c0", "peg$c1", "peg$c2", "peg$c3", "peg$c4", "peg$c5", "peg$c6", "peg$c7", "peg$c8", "peg$c9", "peg$c10", "peg$c11", "peg$c12", "peg$c13", "peg$c14", "peg$c15", "peg$c16", "peg$c17", "peg$c18", "peg$c19", "peg$c20", "peg$c21", "peg$c22", "peg$c23", "peg$c24", "peg$c25", "peg$c26", "peg$c27", "peg$c28", "peg$c29", "peg$c30", "peg$c31", "peg$c32", "peg$c33", "peg$c34", "peg$c35", "peg$c36", "peg$c37", "peg$c38", "peg$c39", "peg$c40", "peg$c41", "peg$r0", "peg$r1", "peg$r2", "peg$r3", "peg$r4", "peg$e0", "peg$literalExpectation", "peg$e1", "peg$e2", "peg$e3", "peg$e4", "peg$e5", "peg$e6", "peg$e7", "peg$e8", "peg$e9", "peg$e10", "peg$e11", "peg$e12", "peg$e13", "peg$e14", "peg$e15", "peg$e16", "peg$e17", "peg$e18", "peg$e19", "peg$e20", "peg$e21", "peg$e22", "peg$e23", "peg$e24", "peg$e25", "peg$e26", "peg$e27", "peg$e28", "peg$e29", "peg$anyExpectation", "peg$e30", "peg$e31", "peg$e32", "peg$e33", "peg$e34", "peg$e35", "peg$e36", "peg$classExpectation", "peg$e37", "peg$e38", "peg$e39", "peg$e40", "peg$e41", "peg$e42", "peg$e43", "peg$e44", "peg$e45", "peg$e46", "peg$e47", "peg$otherExpectation", "peg$e48", "peg$f0", "field_expressions", "order", "peg$f1", "field", "dir", "peg$f2", "not", "field_exp", "peg$f3", "term", "value_error", "peg$f4", "peg$f5", "peg$f6", "peg$f7", "CardColor", "peg$f8", "peg$f9", "left_closed", "from", "to", "right_closed", "from_t", "to_t", "peg$f10", "invalid_value", "peg$f11", "peg$f12", "peg$f13", "term_list", "is_CardUID", "peg$f14", "is_CommentUID", "peg$f15", "peg$f16", "is_BoardUID", "peg$f17", "peg$f18", "peg$f19", "unknown_field_error", "peg$f20", "peg$f21", "peg$f22", "peg$f23", "peg$f24", "peg$f25", "peg$f26", "peg$f27", "text", "peg$currPos", "peg$savedPos", "peg$posDetailsCache", "peg$maxFailPos", "peg$maxFailExpected", "peg$silentFails", "peg$result", "offset", "range", "peg$computeLocation", "description", "peg$buildStructuredError", "error", "peg$buildSimpleError", "ignoreCase", "parts", "inverted", "peg$endExpectation", "peg$computePosDetails", "pos", "details", "p", "startPos", "endPos", "startPosDetails", "endPosDetails", "res", "peg$fail", "s0", "s1", "s2", "s3", "peg$parse_", "peg$parsefield_exp_top", "peg$parseorder", "s4", "s5", "s6", "s7", "s8", "s9", "peg$parsefield_exp", "peg$parseterm", "peg$parseiso8601_string", "peg$parseterm_list", "peg$parseunquoted_term", "peg$parsequoted_term", "peg$parseterm_char", "peg$parseor_term", "s10", "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23", "s24", "s25", "s26", "s27", "peg$parseD", "peg$parseEOF", "value", "parse", "parse", "query", "error", "__name", "_SequentialRunner", "name", "__publicField", "__name", "task", "promise", "enqueued_at", "time_in_queue", "start_time", "success", "result", "error", "duration", "listener", "task_or_name", "opts", "new_ControllablePromise", "queue_item", "SequentialRunner", "_SearchState", "swap_card_states", "call_search", "highlighted_card_uid", "is_forced_match", "current_user_uid", "__publicField", "SequentialRunner", "__name", "card", "makeObservable", "observable", "action", "computed", "f", "runInAction", "options", "opts", "error", "report_error", "query_string", "args", "x", "s", "_", "content", "field", "matches", "text", "escape_html", "hash", "fast_string_hash", "indices", "flatten", "y", "a", "b", "i", "start", "end", "cards", "deep_children", "board", "column", "board_info_resource", "res", "boards", "board_resource", "cards_map", "match", "cur_group_date_str", "cur_group_date", "cur_group", "safe_date", "millis", "d", "date_to_str", "date", "assert_never", "expressions_but_board", "sum", "hl_card_uid", "all_boards", "query", "run_search_retries", "run_search", "args_2", "message", "SearchState", "on_invalid_query", "on_successful_query", "t0", "parse", "log", "final_query", "required_board_uids", "indexed_board_uids", "computed_matches", "m", "board_uids", "archived_cards_visible", "visible_card_uids", "compute_visible_card_uids", "result", "visible_parents", "board_uid", "has_matching_comment", "traverse_cards", "parent", "_LayoutState", "min_column_width", "num_main_columns", "aux_column_shown", "inbox_shown", "__publicField", "MAX_COLUMN_WIDTH", "makeObservable", "observable", "computed", "action", "$x", "index", "runInAction", "max_index", "index_or_elm", "incr", "fixed_width_column_index", "column", "_first_visible_column_index", "_view_port_width", "layout", "x_left", "x_right", "left", "right", "w", "default_layout", "__name", "LayoutState", "nop", "__name", "_UserInterfaceState", "board_last_seen", "current_user", "call_search", "pause_board_sync", "__publicField", "running_on_mobile_device", "SearchState", "new_card_states", "prev", "runInAction", "x", "LayoutState", "board", "display_version", "visible_columns", "num_columns", "card_permissions", "scraped_by_search_bot", "reaction", "new_board_last_seen", "makeObservable", "observable", "computed", "board_uid", "cb", "reset_state", "board_info_resource", "board_resource", "skip", "report_error", "board_state", "BoardState", "call_function", "QueryBoardVersionRequest", "QueryBoardVersionResponse", "res", "log", "error", "__current_board_uid", "resettable_action", "f", "this_", "action", "args", "reset", "hide_card_menus_timeout", "actions", "on_click", "item", "is_cling_hp", "state", "card", "card_state", "card_uid", "opts", "Snackbar", "show_snackbar_if_board_size_soft_limit_is_exceeded", "card_rect", "dim", "what", "report_user_engagement", "assert", "focus_search", "which", "lang", "as_language", "props", "board_quota_limits", "date", "cur", "value", "traverse_cards", "collapse_children", "collapse_content", "child_state", "new_state", "current_board", "boards", "b", "query", "board_uids", "derive_clipboard_uid", "derive_trashcan_uid", "fn_name", "fn", "is_image", "note", "safe_html", "all_tags", "tags", "num_p_tags", "all_closing_tags", "markup_length", "sum", "seen", "is_CardUID", "permissions", "clipboard", "columns", "content", "user", "BoardInfo", "board_ref_last_seen", "board_info", "last_important_change_at", "last_important_change_by", "last_seen", "time", "last_change", "Comment", "Card", "assert_never", "target", "positions", "MAX_COLUMN_WIDTH", "MIN_COLUMN_WIDTH", "blob_uid", "i", "card_or_card_uid", "CardState", "incr", "cur_layout", "calc", "min_column_width", "default_layout", "new_min_width", "OPTIMUM_COLUMN_WITH", "UserInterfaceState", "_UploadState", "__publicField", "nop", "makeObservable", "observable", "action", "num_files_total", "num_bytes_total", "cancel_uploads", "file_name", "num_bytes_uploaded", "file_size", "on_all_uploads_done", "__name", "UploadState", "_ExportBoardState", "__publicField", "__name", "board_uid", "assert", "call_function", "ExportBoardRequest", "ExportBoardResponse", "job", "QueryExportBoardJobRequest", "QueryExportBoardJobResponse", "runInAction", "makeObservable", "observable", "action", "ExportBoardState", "_ImportBoardState", "__publicField", "__name", "upload_id", "call_function", "ImportBoardRequest", "ImportBoardResponse", "not_null", "report_error", "job", "QueryImportBoardJobRequest", "QueryImportBoardJobResponse", "runInAction", "makeObservable", "observable", "action", "ImportBoardState", "init", "_current_user", "call_search", "publish_patch", "pause_board_sync", "current_user", "ui_state", "UserInterfaceState", "ui_actions", "upload_state", "UploadState", "export_board_state", "ExportBoardState", "import_board_state", "ImportBoardState", "model_actions_default", "__name"]
}