{"version":3,"file":"index.cjs","sources":["../src/index.js"],"sourcesContent":["// adonix-db-pro.js\r\n// ESM module (Node >= 16 recommended)\r\n// Comprehensive single-file implementation of Adonix-DB core (File-based, schema-driven mini-ORM)\r\n\r\nimport fs from 'fs/promises';\r\nimport fscb from 'fs';\r\nimport path from 'path';\r\nimport crypto from 'crypto';\r\nimport os from 'os';\r\n\r\n/* ---------------------------\r\n   Utilities\r\n   --------------------------- */\r\nconst sleep = (ms) => new Promise((r) => setTimeout(r, ms));\r\nconst isPlainObject = (v) =>\r\n  v !== null && typeof v === 'object' && !Array.isArray(v);\r\n\r\nfunction safeParseJSON(s) {\r\n  try {\r\n    return JSON.parse(s);\r\n  } catch {\r\n    return null;\r\n  }\r\n}\r\n\r\nfunction atomicWrite(filePath, data) {\r\n  // Write to tmp, fsync, then rename (best-effort)\r\n  const tmp = filePath + '.tmp.' + crypto.randomBytes(6).toString('hex');\r\n  return fs\r\n    .writeFile(tmp, data, 'utf8')\r\n    .then(() =>\r\n      // try to fsync by opening then closing (best-effort; Node fsync via fsPromises not direct)\r\n      fs.rename(tmp, filePath)\r\n    )\r\n    .catch((err) => {\r\n      // cleanup tmp\r\n      try {\r\n        fscb.unlinkSync(tmp);\r\n      } catch {}\r\n      throw err;\r\n    });\r\n}\r\n\r\n/* ---------------------------\r\n   Locking (queue per-file)\r\n   --------------------------- */\r\nclass LockQueue {\r\n  constructor() {\r\n    this.map = new Map(); // filePath -> queue array of resolvers\r\n  }\r\n\r\n  async acquire(key) {\r\n    return new Promise((resolve) => {\r\n      const q = this.map.get(key) || [];\r\n      q.push(resolve);\r\n      this.map.set(key, q);\r\n      if (q.length === 1) {\r\n        // immediate lock\r\n        resolve();\r\n      }\r\n    });\r\n  }\r\n\r\n  release(key) {\r\n    const q = this.map.get(key);\r\n    if (!q) return;\r\n    q.shift();\r\n    if (q.length === 0) {\r\n      this.map.delete(key);\r\n      return;\r\n    }\r\n    const next = q[0];\r\n    // next is resolver scheduled earlier, call it to give lock\r\n    next();\r\n  }\r\n}\r\n\r\n/* ---------------------------\r\n   Type validators & coercions\r\n   --------------------------- */\r\nconst TYPE_VALIDATORS = {\r\n  string: (v) => typeof v === 'string',\r\n  number: (v) => typeof v === 'number' && !Number.isNaN(v),\r\n  boolean: (v) => typeof v === 'boolean',\r\n  object: (v) => isPlainObject(v),\r\n  array: (v) => Array.isArray(v),\r\n  date: (v) => v instanceof Date || !Number.isNaN(Date.parse(v)),\r\n  uuid: (v) =>\r\n    typeof v === 'string' &&\r\n    /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\r\n      v\r\n    ),\r\n  email: (v) => typeof v === 'string' && /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(v),\r\n  url: (v) =>\r\n    typeof v === 'string' && /^https?:\\/\\/[^\\s/$.?#].[^\\s]*$/i.test(v),\r\n  phone: (v) =>\r\n    typeof v === 'string' && /^(\\+98|0)?9\\d{9}$/.test(v.replace(/\\s/g, '')),\r\n  json: (v) => {\r\n    if (typeof v === 'string') {\r\n      try {\r\n        JSON.parse(v);\r\n        return true;\r\n      } catch {\r\n        return false;\r\n      }\r\n    }\r\n    return isPlainObject(v) || Array.isArray(v);\r\n  },\r\n  bigint: (v) => typeof v === 'bigint',\r\n  int: (v) => Number.isInteger(v),\r\n  float: (v) => typeof v === 'number' && !Number.isInteger(v),\r\n  enum: (v, def) => def.enum && Array.isArray(def.enum) && def.enum.includes(v),\r\n  positive: (v) => typeof v === 'number' && v > 0,\r\n  negative: (v) => typeof v === 'number' && v < 0,\r\n  nonNegative: (v) => typeof v === 'number' && v >= 0,\r\n};\r\n\r\n/* ---------------------------\r\n   Default RESERVED fields\r\n   --------------------------- */\r\nconst RESERVED_FIELDS = ['id', 'createdAt', 'updatedAt', '__meta'];\r\n\r\n/* ---------------------------\r\n   FileCollection - disk IO layer\r\n   - atomic writes\r\n   - lazy load cache\r\n   - indexes persistent option\r\n   --------------------------- */\r\nclass FileCollection {\r\n  constructor(collectionName, baseDir, opts = {}) {\r\n    this.collectionName = collectionName;\r\n    this.baseDir = baseDir;\r\n    this.filePath = path.join(baseDir, `${collectionName}.json`);\r\n    this.indexPath = path.join(baseDir, `${collectionName}._idx.json`);\r\n    this.metaPath = path.join(baseDir, `${collectionName}._meta.json`);\r\n    this.data = [];\r\n    this.loaded = false;\r\n    this.locker = opts.locker || new LockQueue();\r\n    this.inMemoryIndexes = {}; // field -> Map(value -> id)\r\n    this.indexFields = opts.indexFields || []; // fields to index (unique or not)\r\n    this.persistIndexes = !!opts.persistIndexes;\r\n    this.stats = { reads: 0, writes: 0 };\r\n  }\r\n\r\n  async ensureDir() {\r\n    await fs.mkdir(this.baseDir, { recursive: true });\r\n  }\r\n\r\n  async load() {\r\n    if (this.loaded) return;\r\n    await this.ensureDir();\r\n    try {\r\n      const b = await fs.readFile(this.filePath, 'utf8');\r\n      this.data = safeParseJSON(b) || [];\r\n    } catch (err) {\r\n      if (err.code === 'ENOENT') {\r\n        this.data = [];\r\n        // create empty file\r\n        await atomicWrite(this.filePath, JSON.stringify(this.data, null, 2));\r\n      } else throw err;\r\n    }\r\n\r\n    if (this.persistIndexes) {\r\n      try {\r\n        const idxb = await fs.readFile(this.indexPath, 'utf8');\r\n        const idxJson = safeParseJSON(idxb);\r\n        if (idxJson && typeof idxJson === 'object') {\r\n          for (const [f, mapping] of Object.entries(idxJson)) {\r\n            this.inMemoryIndexes[f] = new Map(Object.entries(mapping));\r\n          }\r\n        }\r\n      } catch (e) {\r\n        // ignore if not exist\r\n        this.rebuildIndexes();\r\n        await this.persistIndexFile().catch(() => {});\r\n      }\r\n    } else {\r\n      this.rebuildIndexes();\r\n    }\r\n\r\n    this.loaded = true;\r\n    this.stats.reads++;\r\n  }\r\n\r\n  rebuildIndexes() {\r\n    this.inMemoryIndexes = {};\r\n    for (const f of this.indexFields) this.inMemoryIndexes[f] = new Map();\r\n    for (const rec of this.data) {\r\n      for (const f of this.indexFields) {\r\n        const v = rec[f];\r\n        if (v !== undefined && v !== null) {\r\n          // keep latest id mapping (non-unique indexes store arrays? for simplicity map to id or comma list)\r\n          const map = this.inMemoryIndexes[f];\r\n          if (!map.has(String(v))) map.set(String(v), rec.id);\r\n          // for non-unique we could store Set of ids — omitted for brevity\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  async persistIndexFile() {\r\n    if (!this.persistIndexes) return;\r\n    const payload = {};\r\n    for (const [f, map] of Object.entries(this.inMemoryIndexes)) {\r\n      payload[f] = Object.fromEntries(map.entries());\r\n    }\r\n    await atomicWrite(this.indexPath, JSON.stringify(payload, null, 2));\r\n  }\r\n\r\n  async saveData() {\r\n    const dump = JSON.stringify(this.data, null, 2);\r\n    await atomicWrite(this.filePath, dump);\r\n    this.stats.writes++;\r\n    await this.persistIndexFile().catch(() => {});\r\n  }\r\n\r\n  async withLock(fn) {\r\n    await this.locker.acquire(this.filePath);\r\n    try {\r\n      const r = await fn();\r\n      return r;\r\n    } finally {\r\n      this.locker.release(this.filePath);\r\n    }\r\n  }\r\n\r\n  _applyIndexForRecord(rec) {\r\n    for (const f of this.indexFields) {\r\n      const v = rec[f];\r\n      if (v !== undefined && v !== null) {\r\n        this.inMemoryIndexes[f].set(String(v), rec.id);\r\n      }\r\n    }\r\n  }\r\n\r\n  _removeIndexForRecord(rec) {\r\n    for (const f of this.indexFields) {\r\n      const v = rec[f];\r\n      if (v !== undefined && v !== null) {\r\n        this.inMemoryIndexes[f].delete(String(v));\r\n      }\r\n    }\r\n  }\r\n\r\n  async create(record) {\r\n    // create MUST be atomic w.r.t unique constraints (handled at model level)\r\n    return this.withLock(async () => {\r\n      await this.load();\r\n      this.data.push(record);\r\n      this._applyIndexForRecord(record);\r\n      await this.saveData();\r\n      return record;\r\n    });\r\n  }\r\n\r\n  async findMany({\r\n    where = null,\r\n    orderBy = null,\r\n    skip = 0,\r\n    take = null,\r\n    select = null,\r\n  } = {}) {\r\n    await this.load();\r\n    let results = this.data;\r\n\r\n    if (where) {\r\n      results = results.filter((item) => matchWhere(item, where));\r\n    }\r\n\r\n    if (orderBy) {\r\n      // orderBy: [{ key, dir }] or { key: 'asc' } or array\r\n      let orders = [];\r\n      if (Array.isArray(orderBy)) orders = orderBy;\r\n      else if (isPlainObject(orderBy))\r\n        orders = Object.entries(orderBy).map(([k, v]) => ({\r\n          key: k,\r\n          dir: String(v).toLowerCase(),\r\n        }));\r\n      results = results.slice(0);\r\n      results.sort((a, b) => {\r\n        for (const o of orders) {\r\n          const k = o.key;\r\n          const dir = o.dir === 'desc' ? -1 : 1;\r\n          if (a[k] === b[k]) continue;\r\n          if (a[k] > b[k]) return 1 * dir;\r\n          return -1 * dir;\r\n        }\r\n        return 0;\r\n      });\r\n    }\r\n\r\n    if (skip) results = results.slice(skip);\r\n    if (take != null) results = results.slice(0, take);\r\n\r\n    if (select && Array.isArray(select)) {\r\n      results = results.map((r) => {\r\n        const out = {};\r\n        for (const k of select) if (k in r) out[k] = r[k];\r\n        return out;\r\n      });\r\n    }\r\n\r\n    return results;\r\n  }\r\n\r\n  async findFirst(opts = {}) {\r\n    const res = await this.findMany({ ...opts, take: 1 });\r\n    return res.length ? res[0] : null;\r\n  }\r\n\r\n  async findById(id) {\r\n    await this.load();\r\n    return this.data.find((d) => d.id === id) || null;\r\n  }\r\n\r\n  async updateById(id, patch) {\r\n    return this.withLock(async () => {\r\n      await this.load();\r\n      const idx = this.data.findIndex((d) => d.id === id);\r\n      if (idx === -1) return null;\r\n      const old = this.data[idx];\r\n      this._removeIndexForRecord(old);\r\n      const updated = { ...old, ...patch, updatedAt: new Date().toISOString() };\r\n      this.data[idx] = updated;\r\n      this._applyIndexForRecord(updated);\r\n      await this.saveData();\r\n      return updated;\r\n    });\r\n  }\r\n\r\n  async deleteById(id) {\r\n    return this.withLock(async () => {\r\n      await this.load();\r\n      const idx = this.data.findIndex((d) => d.id === id);\r\n      if (idx === -1) return null;\r\n      const [deleted] = this.data.splice(idx, 1);\r\n      this._removeIndexForRecord(deleted);\r\n      await this.saveData();\r\n      return deleted;\r\n    });\r\n  }\r\n}\r\n\r\n/* ---------------------------\r\n   Where matcher & Query helpers\r\n   --------------------------- */\r\nfunction matchWhere(item, where) {\r\n  // where can be { field: value } or { field: { op: val, ... } } or logical { AND: [...], OR: [...] }\r\n  if (!where || Object.keys(where).length === 0) return true;\r\n  // logical\r\n  if (where.AND && Array.isArray(where.AND)) {\r\n    return where.AND.every((w) => matchWhere(item, w));\r\n  }\r\n  if (where.OR && Array.isArray(where.OR)) {\r\n    return where.OR.some((w) => matchWhere(item, w));\r\n  }\r\n  for (const [k, cond] of Object.entries(where)) {\r\n    if (k === 'AND' || k === 'OR') continue;\r\n    const val = item[k];\r\n    if (cond === null || typeof cond !== 'object' || Array.isArray(cond)) {\r\n      if (val !== cond) return false;\r\n      continue;\r\n    }\r\n    // cond is object with ops\r\n    for (const [op, v] of Object.entries(cond)) {\r\n      switch (op) {\r\n        case 'eq':\r\n          if (val !== v) return false;\r\n          break;\r\n        case 'neq':\r\n          if (val === v) return false;\r\n          break;\r\n        case 'gt':\r\n          if (!(val > v)) return false;\r\n          break;\r\n        case 'gte':\r\n          if (!(val >= v)) return false;\r\n          break;\r\n        case 'lt':\r\n          if (!(val < v)) return false;\r\n          break;\r\n        case 'lte':\r\n          if (!(val <= v)) return false;\r\n          break;\r\n        case 'in':\r\n          if (!Array.isArray(v) || !v.includes(val)) return false;\r\n          break;\r\n        case 'notin':\r\n          if (Array.isArray(v) && v.includes(val)) return false;\r\n          break;\r\n        case 'contains':\r\n          if (typeof val !== 'string' || !val.includes(v)) return false;\r\n          break;\r\n        case 'startsWith':\r\n          if (typeof val !== 'string' || !val.startsWith(v)) return false;\r\n          break;\r\n        case 'endsWith':\r\n          if (typeof val !== 'string' || !val.endsWith(v)) return false;\r\n          break;\r\n        case 'exists':\r\n          if (\r\n            (v && (val === undefined || val === null)) ||\r\n            (!v && val !== undefined && val !== null)\r\n          )\r\n            return false;\r\n          break;\r\n        default:\r\n          throw new Error(`Unsupported operator '${op}'`);\r\n      }\r\n    }\r\n  }\r\n  return true;\r\n}\r\n\r\n/* ---------------------------\r\n   JsonModel - validation, relations, hooks, high-level CRUD\r\n   --------------------------- */\r\nclass JsonModel {\r\n  constructor({\r\n    name,\r\n    schema,\r\n    collection,\r\n    relations = {},\r\n    modelsRegistry = {},\r\n    opts = {},\r\n  }) {\r\n    this.name = name;\r\n    this.schema = schema;\r\n    this.collection = collection;\r\n    this.relations = relations; // { relName: { model: 'Other', type, foreignKey } }\r\n    this.modelsRegistry = modelsRegistry;\r\n    this.hooks = {\r\n      beforeCreate: [],\r\n      afterCreate: [],\r\n      beforeUpdate: [],\r\n      afterUpdate: [],\r\n      beforeDelete: [],\r\n      afterDelete: [],\r\n    };\r\n    this.opts = opts;\r\n    this._uniqueFields = Object.entries(schema)\r\n      .filter(([, def]) => def && def.unique)\r\n      .map(([k]) => k);\r\n    // build collection index fields from schema (unique or index)\r\n    this.collection.indexFields = Array.from(\r\n      new Set([\r\n        ...this.collection.indexFields,\r\n        ...Object.entries(schema)\r\n          .filter(([, def]) => def && (def.unique || def.index))\r\n          .map(([k]) => k),\r\n      ])\r\n    );\r\n  }\r\n\r\n  on(hookName, fn) {\r\n    if (!this.hooks[hookName]) throw new Error(`Unknown hook ${hookName}`);\r\n    this.hooks[hookName].push(fn);\r\n  }\r\n\r\n  async _runHooks(name, context) {\r\n    const arr = this.hooks[name] || [];\r\n    for (const fn of arr) {\r\n      await fn(context);\r\n    }\r\n  }\r\n\r\n  _coerceAndValidateField(key, def, rawValue, isUpdate = false) {\r\n    // handle default\r\n    if (\r\n      (rawValue === undefined || rawValue === null) &&\r\n      def.default !== undefined &&\r\n      !isUpdate\r\n    ) {\r\n      return typeof def.default === 'function' ? def.default() : def.default;\r\n    }\r\n\r\n    let v = rawValue;\r\n\r\n    if (v === undefined || v === null) return v;\r\n\r\n    // coercion\r\n    if (def.type === 'number' && typeof v === 'string' && v.trim() !== '') {\r\n      const n = Number(v);\r\n      if (!Number.isNaN(n)) v = n;\r\n    } else if (def.type === 'int' && typeof v === 'string') {\r\n      const n = parseInt(v, 10);\r\n      if (!Number.isNaN(n)) v = n;\r\n    } else if (def.type === 'float' && typeof v === 'string') {\r\n      const n = parseFloat(v);\r\n      if (!Number.isNaN(n)) v = n;\r\n    } else if (def.type === 'date' && typeof v === 'string') {\r\n      const d = new Date(v);\r\n      if (!Number.isNaN(d)) v = d;\r\n    } else if (def.type === 'bigint' && typeof v === 'string') {\r\n      try {\r\n        v = BigInt(v);\r\n      } catch (e) {\r\n        throw new Error(`Invalid BigInt for '${key}'`);\r\n      }\r\n    } else if (def.type === 'json' && typeof v === 'string') {\r\n      try {\r\n        v = JSON.parse(v);\r\n      } catch {\r\n        throw new Error(`Invalid JSON for '${key}'`);\r\n      }\r\n    }\r\n\r\n    // validator existence\r\n    const validator = TYPE_VALIDATORS[def.type];\r\n    if (!validator) throw new Error(`Unknown type '${def.type}' for '${key}'`);\r\n\r\n    // pattern\r\n    if (def.pattern && v != null) {\r\n      const re =\r\n        def.pattern instanceof RegExp ? def.pattern : new RegExp(def.pattern);\r\n      if (!re.test(typeof v === 'string' ? v : String(v))) {\r\n        throw new Error(`'${key}' does not match pattern`);\r\n      }\r\n    }\r\n\r\n    // type check\r\n    if (!validator(v, def)) {\r\n      throw new Error(`Invalid value for '${key}' (type: ${def.type})`);\r\n    }\r\n\r\n    // ranges\r\n    if (typeof v === 'string' || Array.isArray(v)) {\r\n      if (def.minLength !== undefined && v.length < def.minLength)\r\n        throw new Error(`'${key}' length >= ${def.minLength}`);\r\n      if (def.maxLength !== undefined && v.length > def.maxLength)\r\n        throw new Error(`'${key}' length <= ${def.maxLength}`);\r\n    } else if (typeof v === 'number') {\r\n      if (def.min !== undefined && v < def.min)\r\n        throw new Error(`'${key}' >= ${def.min}`);\r\n      if (def.max !== undefined && v > def.max)\r\n        throw new Error(`'${key}' <= ${def.max}`);\r\n    }\r\n\r\n    // enum\r\n    if (def.type === 'enum' && (!def.enum || !Array.isArray(def.enum))) {\r\n      throw new Error(`'enum' field '${key}' needs 'enum: [...]'`);\r\n    }\r\n\r\n    return v;\r\n  }\r\n\r\n  _validateAndPreparePayload(payload, isUpdate = false) {\r\n    const out = {};\r\n    for (const [k, def] of Object.entries(this.schema)) {\r\n      const present = k in payload;\r\n      const raw = payload[k];\r\n\r\n      if (def.required && !isUpdate && !present) {\r\n        throw new Error(`Field '${k}' is required`);\r\n      }\r\n      if (!present) {\r\n        const defval = def.default;\r\n        if (defval !== undefined && !isUpdate) {\r\n          out[k] = typeof defval === 'function' ? defval() : defval;\r\n        }\r\n        continue;\r\n      }\r\n\r\n      const validated = this._coerceAndValidateField(k, def, raw, isUpdate);\r\n      out[k] = validated;\r\n    }\r\n\r\n    // any unknown keys? allow by default but filter reserved fields\r\n    for (const k of Object.keys(payload)) {\r\n      if (RESERVED_FIELDS.includes(k)) continue;\r\n      if (!(k in this.schema)) {\r\n        out[k] = payload[k];\r\n      }\r\n    }\r\n    return out;\r\n  }\r\n\r\n  async _checkUniqueConstraints(patch, excludeId = null) {\r\n    if (this._uniqueFields.length === 0) return;\r\n    // simple check by scanning indexes if available\r\n    for (const field of this._uniqueFields) {\r\n      if (!(field in patch)) continue;\r\n      const value = patch[field];\r\n      if (value === undefined || value === null) continue;\r\n\r\n      // if index exists:\r\n      const idxMap = this.collection.inMemoryIndexes[field];\r\n      if (idxMap) {\r\n        const existing = idxMap.get(String(value));\r\n        if (existing && existing !== excludeId) {\r\n          throw new Error(`Unique constraint violation on '${field}'`);\r\n        }\r\n      } else {\r\n        // fallback full scan\r\n        await this.collection.load();\r\n        const found = this.collection.data.find(\r\n          (r) => r[field] === value && r.id !== excludeId\r\n        );\r\n        if (found) throw new Error(`Unique constraint violation on '${field}'`);\r\n      }\r\n    }\r\n  }\r\n\r\n  // -------------------------\r\n  // public CRUD\r\n  // -------------------------\r\n  async create({ data, include = null } = {}) {\r\n    if (!data) throw new Error('Data required');\r\n    // handle nested create/connect for relations\r\n    const payload = { ...data };\r\n    const nestedCreates = [];\r\n    // pick nested create keys\r\n    for (const [relName, rel] of Object.entries(this.relations || {})) {\r\n      if (payload[relName] && payload[relName].create) {\r\n        nestedCreates.push(relName);\r\n      }\r\n    }\r\n\r\n    // validation\r\n    const prepared = this._validateAndPreparePayload(payload, false);\r\n\r\n    // unique check\r\n    await this._checkUniqueConstraints(prepared);\r\n\r\n    // assign id and reserved fields\r\n    const now = new Date().toISOString();\r\n    const record = {\r\n      ...prepared,\r\n      id: prepared.id || crypto.randomUUID(),\r\n      createdAt: now,\r\n      updatedAt: now,\r\n    };\r\n\r\n    // hooks beforeCreate\r\n    await this._runHooks('beforeCreate', { model: this, data: record });\r\n\r\n    // persist via collection (which is atomic)\r\n    const saved = await this.collection.create(record);\r\n\r\n    // run afterCreate\r\n    await this._runHooks('afterCreate', { model: this, data: saved });\r\n\r\n    // nested create handling\r\n    const output = { ...saved };\r\n    for (const relName of nestedCreates) {\r\n      const rel = this.relations[relName];\r\n      const targetModel = this.modelsRegistry[rel.model];\r\n      if (!targetModel)\r\n        throw new Error(`Relation model '${rel.model}' not found`);\r\n      const toCreate = data[relName].create;\r\n      if (Array.isArray(toCreate)) {\r\n        const created = [];\r\n        for (const item of toCreate) {\r\n          // set foreign key on child\r\n          item[rel.foreignKey] = saved.id;\r\n          created.push(await targetModel.create({ data: item }));\r\n        }\r\n        output[relName] = created;\r\n      } else if (isPlainObject(toCreate)) {\r\n        const item = toCreate;\r\n        item[rel.foreignKey] = saved.id;\r\n        output[relName] = await targetModel.create({ data: item });\r\n      }\r\n    }\r\n\r\n    // include resolution\r\n    if (include) {\r\n      const included = await this._handleInclude([output], include);\r\n      return included[0];\r\n    }\r\n\r\n    return output;\r\n  }\r\n\r\n  async findMany({\r\n    where = null,\r\n    orderBy = null,\r\n    skip = 0,\r\n    take = null,\r\n    include = null,\r\n    select = null,\r\n  } = {}) {\r\n    const res = await this.collection.findMany({\r\n      where,\r\n      orderBy,\r\n      skip,\r\n      take,\r\n      select,\r\n    });\r\n    if (include) return this._handleInclude(res, include);\r\n    return res;\r\n  }\r\n\r\n  async findFirst(opts = {}) {\r\n    const r = await this.collection.findFirst(opts);\r\n    if (!r) return null;\r\n    if (opts.include) {\r\n      const inc = await this._handleInclude([r], opts.include);\r\n      return inc[0];\r\n    }\r\n    return r;\r\n  }\r\n\r\n  async findUnique({ where, include = null } = {}) {\r\n    // typically where: { id: '...' } or unique field\r\n    if (!where) throw new Error('where required');\r\n    // if where has id -> direct\r\n    if (where.id) {\r\n      const r = await this.collection.findById(where.id);\r\n      if (!r) return null;\r\n      if (include) {\r\n        const inc = await this._handleInclude([r], include);\r\n        return inc[0];\r\n      }\r\n      return r;\r\n    }\r\n    // try unique indexes\r\n    await this.collection.load();\r\n    for (const field of this._uniqueFields) {\r\n      if (where[field] !== undefined) {\r\n        const idx = this.collection.inMemoryIndexes[field];\r\n        if (idx) {\r\n          const id = idx.get(String(where[field]));\r\n          if (id) {\r\n            const r = await this.collection.findById(id);\r\n            if (!r) return null;\r\n            if (include) {\r\n              const inc = await this._handleInclude([r], include);\r\n              return inc[0];\r\n            }\r\n            return r;\r\n          }\r\n        } else {\r\n          // fallback full scan\r\n          const found = this.collection.data.find(\r\n            (d) => d[field] === where[field]\r\n          );\r\n          if (found) {\r\n            if (include) {\r\n              const inc = await this._handleInclude([found], include);\r\n              return inc[0];\r\n            }\r\n            return found;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    // fallback to findMany\r\n    const list = await this.collection.findMany({ where, take: 1 });\r\n    if (list.length === 0) return null;\r\n    const r = list[0];\r\n    if (include) {\r\n      const inc = await this._handleInclude([r], include);\r\n      return inc[0];\r\n    }\r\n    return r;\r\n  }\r\n\r\n  async update({ where, data } = {}) {\r\n    if (!where || !where.id) throw new Error('ID required');\r\n    if (!data) throw new Error('data required');\r\n    // validate patch\r\n    const validated = this._validateAndPreparePayload(data, true);\r\n    // unique constraints\r\n    await this._checkUniqueConstraints(validated, where.id);\r\n\r\n    await this._runHooks('beforeUpdate', {\r\n      model: this,\r\n      where,\r\n      data: validated,\r\n    });\r\n\r\n    const updated = await this.collection.updateById(where.id, validated);\r\n\r\n    await this._runHooks('afterUpdate', { model: this, where, data: updated });\r\n\r\n    return updated;\r\n  }\r\n\r\n  async delete({ where } = {}) {\r\n    if (!where || !where.id) throw new Error('ID required');\r\n    await this._runHooks('beforeDelete', { model: this, where });\r\n    const deleted = await this.collection.deleteById(where.id);\r\n    await this._runHooks('afterDelete', { model: this, where, data: deleted });\r\n    return deleted;\r\n  }\r\n\r\n  // include resolution (joins)\r\n  async _handleInclude(records, includeSpec) {\r\n    if (!records || records.length === 0 || !includeSpec) return records;\r\n\r\n    const out = records.map((r) => ({ ...r }));\r\n\r\n    for (const [relName, relCfg] of Object.entries(includeSpec)) {\r\n      // اگر فقط true بود → { select: null, where: null, ... }\r\n      const cfg = relCfg === true ? {} : relCfg;\r\n      const {\r\n        select,\r\n        where,\r\n        orderBy,\r\n        take,\r\n        skip,\r\n        include: nestedInclude,\r\n      } = cfg;\r\n\r\n      const rel = this.relations[relName];\r\n      if (!rel) continue;\r\n\r\n      const targetModel = this.modelsRegistry[rel.model];\r\n      if (!targetModel) continue;\r\n\r\n      // یک بار مجموعه هدف رو لود کن (بهینه)\r\n      await targetModel.collection.load();\r\n\r\n      if (rel.type === 'Many-to-One' || rel.type === 'One-to-One') {\r\n        // رابطه فرزند → والد (foreignKey در این مدل است)\r\n        for (const rec of out) {\r\n          const fkValue = rec[rel.foreignKey];\r\n          if (fkValue === undefined || fkValue === null) {\r\n            rec[relName] = null;\r\n            continue;\r\n          }\r\n\r\n          let query = { where: { id: fkValue } };\r\n          if (select) query.select = select;\r\n          if (nestedInclude) query.include = nestedInclude;\r\n\r\n          const found = await targetModel.findFirst(query);\r\n          rec[relName] = found;\r\n        }\r\n      } else if (rel.type === 'One-to-Many') {\r\n        // رابطه والد → فرزندان (foreignKey در مدل هدف است)\r\n        const parentIds = out.map((r) => r.id).filter(Boolean);\r\n\r\n        let queryOpts = { where: { [rel.foreignKey]: { in: parentIds } } };\r\n        if (orderBy) queryOpts.orderBy = orderBy;\r\n        if (take !== undefined) queryOpts.take = take;\r\n        if (skip !== undefined) queryOpts.skip = skip;\r\n        if (select) queryOpts.select = select;\r\n        if (nestedInclude) queryOpts.include = nestedInclude;\r\n\r\n        const children = await targetModel.findMany(queryOpts);\r\n\r\n        // گروه‌بندی کودکان بر اساس parentId\r\n        const childrenMap = {};\r\n        for (const child of children) {\r\n          const parentId = child[rel.foreignKey];\r\n          if (!childrenMap[parentId]) childrenMap[parentId] = [];\r\n          childrenMap[parentId].push(child);\r\n        }\r\n\r\n        for (const rec of out) {\r\n          rec[relName] = childrenMap[rec.id] || [];\r\n        }\r\n      } else if (rel.type === 'Many-to-Many') {\r\n        // هنوز پیاده‌سازی نشده — می‌تونی بعداً با جدول واسط اضافه کنی\r\n        for (const rec of out) rec[relName] = [];\r\n      }\r\n    }\r\n\r\n    return out;\r\n  }\r\n}\r\n\r\n/* ---------------------------\r\n   JsonDb - orchestrator\r\n   --------------------------- */\r\nclass JsonDb {\r\n  constructor(opts = {}) {\r\n    // opts: baseDir, persistIndexes\r\n    this.baseDir = path.resolve(\r\n      opts.baseDir || path.join(process.cwd(), 'adonix_db_files')\r\n    );\r\n    this.models = {}; // name -> JsonModel\r\n    this.collections = {}; // name -> FileCollection\r\n    this.locker = new LockQueue();\r\n    this.opts = opts;\r\n  }\r\n\r\n  async connect() {\r\n    await fs.mkdir(this.baseDir, { recursive: true });\r\n    return true;\r\n  }\r\n\r\n  defineModel(name, schema, relations = {}, modelOpts = {}) {\r\n    if (this.models[name]) throw new Error(`Model '${name}' already defined`);\r\n    // prevent reserved fields\r\n    for (const rf of RESERVED_FIELDS) {\r\n      if (schema[rf])\r\n        throw new Error(`Field '${rf}' is reserved and cannot be defined`);\r\n    }\r\n\r\n    // basic schema sanity checks\r\n    for (const [k, def] of Object.entries(schema)) {\r\n      if (!def || typeof def !== 'object')\r\n        throw new Error(`Schema definition for '${k}' must be an object`);\r\n      if (!def.type) throw new Error(`Field '${k}' requires a 'type'`);\r\n      if (!TYPE_VALIDATORS[def.type] && def.type !== 'enum') {\r\n        throw new Error(`Unknown type '${def.type}' for field '${k}'`);\r\n      }\r\n      if (def.type === 'enum' && (!def.enum || !Array.isArray(def.enum))) {\r\n        throw new Error(`Enum field '${k}' must specify an 'enum' array`);\r\n      }\r\n    }\r\n\r\n    const coll = new FileCollection(name, this.baseDir, {\r\n      locker: this.locker,\r\n      indexFields: Object.entries(schema)\r\n        .filter(([, d]) => d && (d.unique || d.index))\r\n        .map(([k]) => k),\r\n      persistIndexes: !!this.opts.persistIndexes,\r\n    });\r\n\r\n    const model = new JsonModel({\r\n      name,\r\n      schema,\r\n      collection: coll,\r\n      relations,\r\n      modelsRegistry: this.models,\r\n      opts: modelOpts,\r\n    });\r\n    this.collections[name] = coll;\r\n    this.models[name] = model;\r\n    return model;\r\n  }\r\n\r\n  model(name) {\r\n    if (!this.models[name]) throw new Error(`Model '${name}' not defined`);\r\n    return this.models[name];\r\n  }\r\n}\r\n\r\n/* ---------------------------\r\n   Export\r\n   --------------------------- */\r\nexport default JsonDb;\r\nexport { JsonDb, JsonModel, FileCollection, TYPE_VALIDATORS, RESERVED_FIELDS };\r\n"],"names":[],"mappings":";;;;;;;;;;AAAA;AACA;AACA;AACA;AAWA,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,EAAE,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC3D;AACA,SAAS,aAAa,CAAC,CAAC,EAAE;AAC1B,EAAE,IAAI;AACN,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACzB,EAAE,CAAC,CAAC,MAAM;AACV,IAAI,OAAO,IAAI,CAAC;AAChB,EAAE,CAAC;AACH,CAAC;AACD;AACA,SAAS,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE;AACrC;AACA,EAAE,MAAM,GAAG,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzE,EAAE,OAAO,EAAE;AACX,KAAK,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC;AACjC,KAAK,IAAI,CAAC;AACV;AACA,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC;AAC9B,KAAK;AACL,KAAK,KAAK,CAAC,CAAC,GAAG,KAAK;AACpB;AACA,MAAM,IAAI;AACV,QAAQ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC7B,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AAChB,MAAM,MAAM,GAAG,CAAC;AAChB,IAAI,CAAC,CAAC,CAAC;AACP,CAAC;AACD;AACA;AACA;AACA;AACA,MAAM,SAAS,CAAC;AAChB,EAAE,WAAW,GAAG;AAChB,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;AACzB,EAAE,CAAC;AACH;AACA,EAAE,MAAM,OAAO,CAAC,GAAG,EAAE;AACrB,IAAI,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK;AACpC,MAAM,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;AACxC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACtB,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAC3B,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1B;AACA,QAAQ,OAAO,EAAE,CAAC;AAClB,MAAM,CAAC;AACP,IAAI,CAAC,CAAC,CAAC;AACP,EAAE,CAAC;AACH;AACA,EAAE,OAAO,CAAC,GAAG,EAAE;AACf,IAAI,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAChC,IAAI,IAAI,CAAC,CAAC,EAAE,OAAO;AACnB,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;AACd,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;AACxB,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC3B,MAAM,OAAO;AACb,IAAI,CAAC;AACL,IAAI,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACtB;AACA,IAAI,IAAI,EAAE,CAAC;AACX,EAAE,CAAC;AACH,CAAC;AACD;AACA;AACA;AACA;AACK,MAAC,eAAe,GAAG;AACxB,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,QAAQ;AACtC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1D,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,SAAS;AACxC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC;AACjC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAChC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAChE,EAAE,IAAI,EAAE,CAAC,CAAC;AACV,IAAI,OAAO,CAAC,KAAK,QAAQ;AACzB,IAAI,4EAA4E,CAAC,IAAI;AACrF,MAAM,CAAC;AACP,KAAK;AACL,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,QAAQ,IAAI,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7E,EAAE,GAAG,EAAE,CAAC,CAAC;AACT,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,iCAAiC,CAAC,IAAI,CAAC,CAAC,CAAC;AACtE,EAAE,KAAK,EAAE,CAAC,CAAC;AACX,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC3E,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK;AACf,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;AAC/B,MAAM,IAAI;AACV,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACtB,QAAQ,OAAO,IAAI,CAAC;AACpB,MAAM,CAAC,CAAC,MAAM;AACd,QAAQ,OAAO,KAAK,CAAC;AACrB,MAAM,CAAC;AACP,IAAI,CAAC;AACL,IAAI,OAAO,aAAa,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAChD,EAAE,CAAC;AACH,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,QAAQ;AACtC,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;AACjC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;AAC7D,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/E,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC;AACjD,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC;AACjD,EAAE,WAAW,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC;AACrD,EAAE;AACF;AACA;AACA;AACA;AACK,MAAC,eAAe,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,cAAc,CAAC;AACrB,EAAE,WAAW,CAAC,cAAc,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE;AAClD,IAAI,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;AACzC,IAAI,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;AAC3B,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;AACjE,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;AACvE,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;AACvE,IAAI,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;AACnB,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;AACxB,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;AACjD,IAAI,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;AAC9B,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;AAC9C,IAAI,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;AAChD,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACzC,EAAE,CAAC;AACH;AACA,EAAE,MAAM,SAAS,GAAG;AACpB,IAAI,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACtD,EAAE,CAAC;AACH;AACA,EAAE,MAAM,IAAI,GAAG;AACf,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO;AAC5B,IAAI,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;AAC3B,IAAI,IAAI;AACR,MAAM,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACzD,MAAM,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACzC,IAAI,CAAC,CAAC,OAAO,GAAG,EAAE;AAClB,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE;AACjC,QAAQ,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;AACvB;AACA,QAAQ,MAAM,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7E,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC;AACvB,IAAI,CAAC;AACL;AACA,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE;AAC7B,MAAM,IAAI;AACV,QAAQ,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAC/D,QAAQ,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;AAC5C,QAAQ,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AACpD,UAAU,KAAK,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AAC9D,YAAY,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AACvE,UAAU,CAAC;AACX,QAAQ,CAAC;AACT,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE;AAClB;AACA,QAAQ,IAAI,CAAC,cAAc,EAAE,CAAC;AAC9B,QAAQ,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACtD,MAAM,CAAC;AACP,IAAI,CAAC,MAAM;AACX,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;AAC5B,IAAI,CAAC;AACL;AACA,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;AACvB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;AACvB,EAAE,CAAC;AACH;AACA,EAAE,cAAc,GAAG;AACnB,IAAI,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;AAC9B,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;AAC1E,IAAI,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE;AACjC,MAAM,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE;AACxC,QAAQ,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AACzB,QAAQ,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,EAAE;AAC3C;AACA,UAAU,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;AAC9C,UAAU,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AAC9D;AACA,QAAQ,CAAC;AACT,MAAM,CAAC;AACP,IAAI,CAAC;AACL,EAAE,CAAC;AACH;AACA,EAAE,MAAM,gBAAgB,GAAG;AAC3B,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO;AACrC,IAAI,MAAM,OAAO,GAAG,EAAE,CAAC;AACvB,IAAI,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE;AACjE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;AACrD,IAAI,CAAC;AACL,IAAI,MAAM,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACxE,EAAE,CAAC;AACH;AACA,EAAE,MAAM,QAAQ,GAAG;AACnB,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACpD,IAAI,MAAM,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC3C,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;AACxB,IAAI,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAClD,EAAE,CAAC;AACH;AACA,EAAE,MAAM,QAAQ,CAAC,EAAE,EAAE;AACrB,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC7C,IAAI,IAAI;AACR,MAAM,MAAM,CAAC,GAAG,MAAM,EAAE,EAAE,CAAC;AAC3B,MAAM,OAAO,CAAC,CAAC;AACf,IAAI,CAAC,SAAS;AACd,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzC,IAAI,CAAC;AACL,EAAE,CAAC;AACH;AACA,EAAE,oBAAoB,CAAC,GAAG,EAAE;AAC5B,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE;AACtC,MAAM,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AACvB,MAAM,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,EAAE;AACzC,QAAQ,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AACvD,MAAM,CAAC;AACP,IAAI,CAAC;AACL,EAAE,CAAC;AACH;AACA,EAAE,qBAAqB,CAAC,GAAG,EAAE;AAC7B,IAAI,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE;AACtC,MAAM,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AACvB,MAAM,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,EAAE;AACzC,QAAQ,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,MAAM,CAAC;AACP,IAAI,CAAC;AACL,EAAE,CAAC;AACH;AACA,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE;AACvB;AACA,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY;AACrC,MAAM,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;AACxB,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC7B,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;AACxC,MAAM,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC5B,MAAM,OAAO,MAAM,CAAC;AACpB,IAAI,CAAC,CAAC,CAAC;AACP,EAAE,CAAC;AACH;AACA,EAAE,MAAM,QAAQ,CAAC;AACjB,IAAI,KAAK,GAAG,IAAI;AAChB,IAAI,OAAO,GAAG,IAAI;AAClB,IAAI,IAAI,GAAG,CAAC;AACZ,IAAI,IAAI,GAAG,IAAI;AACf,IAAI,MAAM,GAAG,IAAI;AACjB,GAAG,GAAG,EAAE,EAAE;AACV,IAAI,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;AACtB,IAAI,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;AAC5B;AACA,IAAI,IAAI,KAAK,EAAE;AACf,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;AAClE,IAAI,CAAC;AACL;AACA,IAAI,IAAI,OAAO,EAAE;AACjB;AACA,MAAM,IAAI,MAAM,GAAG,EAAE,CAAC;AACtB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;AACnD,WAAW,IAAI,aAAa,CAAC,OAAO,CAAC;AACrC,QAAQ,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM;AAC1D,UAAU,GAAG,EAAE,CAAC;AAChB,UAAU,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;AACtC,SAAS,CAAC,CAAC,CAAC;AACZ,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACjC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK;AAC7B,QAAQ,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE;AAChC,UAAU,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;AAC1B,UAAU,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC;AAChD,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS;AACtC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC;AAC1C,UAAU,OAAO,EAAE,GAAG,GAAG,CAAC;AAC1B,QAAQ,CAAC;AACT,QAAQ,OAAO,CAAC,CAAC;AACjB,MAAM,CAAC,CAAC,CAAC;AACT,IAAI,CAAC;AACL;AACA,IAAI,IAAI,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5C,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACvD;AACA,IAAI,IAAI,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACzC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK;AACnC,QAAQ,MAAM,GAAG,GAAG,EAAE,CAAC;AACvB,QAAQ,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,QAAQ,OAAO,GAAG,CAAC;AACnB,MAAM,CAAC,CAAC,CAAC;AACT,IAAI,CAAC;AACL;AACA,IAAI,OAAO,OAAO,CAAC;AACnB,EAAE,CAAC;AACH;AACA,EAAE,MAAM,SAAS,CAAC,IAAI,GAAG,EAAE,EAAE;AAC7B,IAAI,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;AAC1D,IAAI,OAAO,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AACtC,EAAE,CAAC;AACH;AACA,EAAE,MAAM,QAAQ,CAAC,EAAE,EAAE;AACrB,IAAI,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;AACtB,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;AACtD,EAAE,CAAC;AACH;AACA,EAAE,MAAM,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE;AAC9B,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY;AACrC,MAAM,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;AACxB,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1D,MAAM,IAAI,GAAG,KAAK,EAAE,EAAE,OAAO,IAAI,CAAC;AAClC,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjC,MAAM,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;AACtC,MAAM,MAAM,OAAO,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;AAChF,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;AAC/B,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AACzC,MAAM,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC5B,MAAM,OAAO,OAAO,CAAC;AACrB,IAAI,CAAC,CAAC,CAAC;AACP,EAAE,CAAC;AACH;AACA,EAAE,MAAM,UAAU,CAAC,EAAE,EAAE;AACvB,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY;AACrC,MAAM,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;AACxB,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1D,MAAM,IAAI,GAAG,KAAK,EAAE,EAAE,OAAO,IAAI,CAAC;AAClC,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AACjD,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC1C,MAAM,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC5B,MAAM,OAAO,OAAO,CAAC;AACrB,IAAI,CAAC,CAAC,CAAC;AACP,EAAE,CAAC;AACH,CAAC;AACD;AACA;AACA;AACA;AACA,SAAS,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE;AACjC;AACA,EAAE,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC;AAC7D;AACA,EAAE,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;AAC7C,IAAI,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACvD,EAAE,CAAC;AACH,EAAE,IAAI,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;AAC3C,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACrD,EAAE,CAAC;AACH,EAAE,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACjD,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,EAAE,SAAS;AAC5C,IAAI,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACxB,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AAC1E,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE,OAAO,KAAK,CAAC;AACrC,MAAM,SAAS;AACf,IAAI,CAAC;AACL;AACA,IAAI,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AAChD,MAAM,QAAQ,EAAE;AAChB,QAAQ,KAAK,IAAI;AACjB,UAAU,IAAI,GAAG,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;AACtC,UAAU,MAAM;AAChB,QAAQ,KAAK,KAAK;AAClB,UAAU,IAAI,GAAG,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;AACtC,UAAU,MAAM;AAChB,QAAQ,KAAK,IAAI;AACjB,UAAU,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC;AACvC,UAAU,MAAM;AAChB,QAAQ,KAAK,KAAK;AAClB,UAAU,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC;AACxC,UAAU,MAAM;AAChB,QAAQ,KAAK,IAAI;AACjB,UAAU,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC;AACvC,UAAU,MAAM;AAChB,QAAQ,KAAK,KAAK;AAClB,UAAU,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC;AACxC,UAAU,MAAM;AAChB,QAAQ,KAAK,IAAI;AACjB,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,CAAC;AAClE,UAAU,MAAM;AAChB,QAAQ,KAAK,OAAO;AACpB,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,CAAC;AAChE,UAAU,MAAM;AAChB,QAAQ,KAAK,UAAU;AACvB,UAAU,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC;AACxE,UAAU,MAAM;AAChB,QAAQ,KAAK,YAAY;AACzB,UAAU,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC;AAC1E,UAAU,MAAM;AAChB,QAAQ,KAAK,UAAU;AACvB,UAAU,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC;AACxE,UAAU,MAAM;AAChB,QAAQ,KAAK,QAAQ;AACrB,UAAU;AACV,YAAY,CAAC,CAAC,KAAK,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,CAAC;AACrD,aAAa,CAAC,CAAC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,CAAC;AACrD;AACA,YAAY,OAAO,KAAK,CAAC;AACzB,UAAU,MAAM;AAChB,QAAQ;AACR,UAAU,MAAM,IAAI,KAAK,CAAC,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,OAAO;AACP,IAAI,CAAC;AACL,EAAE,CAAC;AACH,EAAE,OAAO,IAAI,CAAC;AACd,CAAC;AACD;AACA;AACA;AACA;AACA,MAAM,SAAS,CAAC;AAChB,EAAE,WAAW,CAAC;AACd,IAAI,IAAI;AACR,IAAI,MAAM;AACV,IAAI,UAAU;AACd,IAAI,SAAS,GAAG,EAAE;AAClB,IAAI,cAAc,GAAG,EAAE;AACvB,IAAI,IAAI,GAAG,EAAE;AACb,GAAG,EAAE;AACL,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACrB,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACzB,IAAI,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;AACjC,IAAI,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;AAC/B,IAAI,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;AACzC,IAAI,IAAI,CAAC,KAAK,GAAG;AACjB,MAAM,YAAY,EAAE,EAAE;AACtB,MAAM,WAAW,EAAE,EAAE;AACrB,MAAM,YAAY,EAAE,EAAE;AACtB,MAAM,WAAW,EAAE,EAAE;AACrB,MAAM,YAAY,EAAE,EAAE;AACtB,MAAM,WAAW,EAAE,EAAE;AACrB,KAAK,CAAC;AACN,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACrB,IAAI,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;AAC/C,OAAO,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC;AAC7C,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACvB;AACA,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI;AAC5C,MAAM,IAAI,GAAG,CAAC;AACd,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW;AACtC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;AACjC,WAAW,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;AAChE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC1B,OAAO,CAAC;AACR,KAAK,CAAC;AACN,EAAE,CAAC;AACH;AACA,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,EAAE;AACnB,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC3E,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAClC,EAAE,CAAC;AACH;AACA,EAAE,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE;AACjC,IAAI,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACvC,IAAI,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE;AAC1B,MAAM,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC;AACxB,IAAI,CAAC;AACL,EAAE,CAAC;AACH;AACA,EAAE,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,GAAG,KAAK,EAAE;AAChE;AACA,IAAI;AACJ,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;AAClD,MAAM,GAAG,CAAC,OAAO,KAAK,SAAS;AAC/B,MAAM,CAAC,QAAQ;AACf,MAAM;AACN,MAAM,OAAO,OAAO,GAAG,CAAC,OAAO,KAAK,UAAU,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;AAC7E,IAAI,CAAC;AACL;AACA,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC;AACrB;AACA,IAAI,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,EAAE,OAAO,CAAC,CAAC;AAChD;AACA;AACA,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;AAC3E,MAAM,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAC1B,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;AAClC,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;AAC5D,MAAM,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAChC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;AAClC,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;AAC9D,MAAM,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;AAC9B,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;AAClC,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;AAC7D,MAAM,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;AAC5B,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;AAClC,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;AAC/D,MAAM,IAAI;AACV,QAAQ,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACtB,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE;AAClB,QAAQ,MAAM,IAAI,KAAK,CAAC,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,MAAM,CAAC;AACP,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;AAC7D,MAAM,IAAI;AACV,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1B,MAAM,CAAC,CAAC,MAAM;AACd,QAAQ,MAAM,IAAI,KAAK,CAAC,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,MAAM,CAAC;AACP,IAAI,CAAC;AACL;AACA;AACA,IAAI,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChD,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,cAAc,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/E;AACA;AACA,IAAI,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,IAAI,EAAE;AAClC,MAAM,MAAM,EAAE;AACd,QAAQ,GAAG,CAAC,OAAO,YAAY,MAAM,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC9E,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;AAC3D,QAAQ,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;AAC3D,MAAM,CAAC;AACP,IAAI,CAAC;AACL;AACA;AACA,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;AAC5B,MAAM,MAAM,IAAI,KAAK,CAAC,CAAC,mBAAmB,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACxE,IAAI,CAAC;AACL;AACA;AACA,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;AACnD,MAAM,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,SAAS;AACjE,QAAQ,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC/D,MAAM,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,SAAS;AACjE,QAAQ,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC/D,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;AACtC,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG;AAC9C,QAAQ,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAClD,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG;AAC9C,QAAQ,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAClD,IAAI,CAAC;AACL;AACA;AACA,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE;AACxE,MAAM,MAAM,IAAI,KAAK,CAAC,CAAC,cAAc,EAAE,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;AACnE,IAAI,CAAC;AACL;AACA,IAAI,OAAO,CAAC,CAAC;AACb,EAAE,CAAC;AACH;AACA,EAAE,0BAA0B,CAAC,OAAO,EAAE,QAAQ,GAAG,KAAK,EAAE;AACxD,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;AACnB,IAAI,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;AACxD,MAAM,MAAM,OAAO,GAAG,CAAC,IAAI,OAAO,CAAC;AACnC,MAAM,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAC7B;AACA,MAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE;AACjD,QAAQ,MAAM,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;AACpD,MAAM,CAAC;AACP,MAAM,IAAI,CAAC,OAAO,EAAE;AACpB,QAAQ,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;AACnC,QAAQ,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,QAAQ,EAAE;AAC/C,UAAU,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,MAAM,KAAK,UAAU,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC;AACpE,QAAQ,CAAC;AACT,QAAQ,SAAS;AACjB,MAAM,CAAC;AACP;AACA,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,uBAAuB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC5E,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;AACzB,IAAI,CAAC;AACL;AACA;AACA,IAAI,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;AAC1C,MAAM,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS;AAChD,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE;AAC/B,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAC5B,MAAM,CAAC;AACP,IAAI,CAAC;AACL,IAAI,OAAO,GAAG,CAAC;AACf,EAAE,CAAC;AACH;AACA,EAAE,MAAM,uBAAuB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,EAAE;AACzD,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,OAAO;AAChD;AACA,IAAI,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE;AAC5C,MAAM,IAAI,EAAE,KAAK,IAAI,KAAK,CAAC,EAAE,SAAS;AACtC,MAAM,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;AACjC,MAAM,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,SAAS;AAC1D;AACA;AACA,MAAM,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;AAC5D,MAAM,IAAI,MAAM,EAAE;AAClB,QAAQ,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD,QAAQ,IAAI,QAAQ,IAAI,QAAQ,KAAK,SAAS,EAAE;AAChD,UAAU,MAAM,IAAI,KAAK,CAAC,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACvE,QAAQ,CAAC;AACT,MAAM,CAAC,MAAM;AACb;AACA,QAAQ,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AACrC,QAAQ,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI;AAC/C,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,EAAE,KAAK,SAAS;AACzD,SAAS,CAAC;AACV,QAAQ,IAAI,KAAK,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAChF,MAAM,CAAC;AACP,IAAI,CAAC;AACL,EAAE,CAAC;AACH;AACA;AACA;AACA;AACA,EAAE,MAAM,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE;AAC9C,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;AAChD;AACA,IAAI,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;AAChC,IAAI,MAAM,aAAa,GAAG,EAAE,CAAC;AAC7B;AACA,IAAI,KAAK,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE;AACvE,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE;AACvD,QAAQ,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACpC,MAAM,CAAC;AACP,IAAI,CAAC;AACL;AACA;AACA,IAAI,MAAM,QAAQ,GAAG,IAAI,CAAC,0BAA0B,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACrE;AACA;AACA,IAAI,MAAM,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;AACjD;AACA;AACA,IAAI,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AACzC,IAAI,MAAM,MAAM,GAAG;AACnB,MAAM,GAAG,QAAQ;AACjB,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE;AAC5C,MAAM,SAAS,EAAE,GAAG;AACpB,MAAM,SAAS,EAAE,GAAG;AACpB,KAAK,CAAC;AACN;AACA;AACA,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AACxE;AACA;AACA,IAAI,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACvD;AACA;AACA,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACtE;AACA;AACA,IAAI,MAAM,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;AAChC,IAAI,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE;AACzC,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAC1C,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACzD,MAAM,IAAI,CAAC,WAAW;AACtB,QAAQ,MAAM,IAAI,KAAK,CAAC,CAAC,gBAAgB,EAAE,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;AACnE,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AAC5C,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AACnC,QAAQ,MAAM,OAAO,GAAG,EAAE,CAAC;AAC3B,QAAQ,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;AACrC;AACA,UAAU,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;AAC1C,UAAU,OAAO,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACjE,QAAQ,CAAC;AACT,QAAQ,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAClC,MAAM,CAAC,MAAM,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE;AAC1C,QAAQ,MAAM,IAAI,GAAG,QAAQ,CAAC;AAC9B,QAAQ,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;AACxC,QAAQ,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AACnE,MAAM,CAAC;AACP,IAAI,CAAC;AACL;AACA;AACA,IAAI,IAAI,OAAO,EAAE;AACjB,MAAM,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;AACpE,MAAM,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC;AACzB,IAAI,CAAC;AACL;AACA,IAAI,OAAO,MAAM,CAAC;AAClB,EAAE,CAAC;AACH;AACA,EAAE,MAAM,QAAQ,CAAC;AACjB,IAAI,KAAK,GAAG,IAAI;AAChB,IAAI,OAAO,GAAG,IAAI;AAClB,IAAI,IAAI,GAAG,CAAC;AACZ,IAAI,IAAI,GAAG,IAAI;AACf,IAAI,OAAO,GAAG,IAAI;AAClB,IAAI,MAAM,GAAG,IAAI;AACjB,GAAG,GAAG,EAAE,EAAE;AACV,IAAI,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AAC/C,MAAM,KAAK;AACX,MAAM,OAAO;AACb,MAAM,IAAI;AACV,MAAM,IAAI;AACV,MAAM,MAAM;AACZ,KAAK,CAAC,CAAC;AACP,IAAI,IAAI,OAAO,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAC1D,IAAI,OAAO,GAAG,CAAC;AACf,EAAE,CAAC;AACH;AACA,EAAE,MAAM,SAAS,CAAC,IAAI,GAAG,EAAE,EAAE;AAC7B,IAAI,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACpD,IAAI,IAAI,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC;AACxB,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE;AACtB,MAAM,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/D,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;AACpB,IAAI,CAAC;AACL,IAAI,OAAO,CAAC,CAAC;AACb,EAAE,CAAC;AACH;AACA,EAAE,MAAM,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE;AACnD;AACA,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;AAClD;AACA,IAAI,IAAI,KAAK,CAAC,EAAE,EAAE;AAClB,MAAM,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACzD,MAAM,IAAI,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC;AAC1B,MAAM,IAAI,OAAO,EAAE;AACnB,QAAQ,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5D,QAAQ,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;AACtB,MAAM,CAAC;AACP,MAAM,OAAO,CAAC,CAAC;AACf,IAAI,CAAC;AACL;AACA,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AACjC,IAAI,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE;AAC5C,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,SAAS,EAAE;AACtC,QAAQ,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;AAC3D,QAAQ,IAAI,GAAG,EAAE;AACjB,UAAU,MAAM,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnD,UAAU,IAAI,EAAE,EAAE;AAClB,YAAY,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACzD,YAAY,IAAI,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC;AAChC,YAAY,IAAI,OAAO,EAAE;AACzB,cAAc,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAClE,cAAc,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;AAC5B,YAAY,CAAC;AACb,YAAY,OAAO,CAAC,CAAC;AACrB,UAAU,CAAC;AACX,QAAQ,CAAC,MAAM;AACf;AACA,UAAU,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI;AACjD,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC;AAC5C,WAAW,CAAC;AACZ,UAAU,IAAI,KAAK,EAAE;AACrB,YAAY,IAAI,OAAO,EAAE;AACzB,cAAc,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;AACtE,cAAc,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;AAC5B,YAAY,CAAC;AACb,YAAY,OAAO,KAAK,CAAC;AACzB,UAAU,CAAC;AACX,QAAQ,CAAC;AACT,MAAM,CAAC;AACP,IAAI,CAAC;AACL;AACA;AACA,IAAI,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;AACpE,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI,CAAC;AACvC,IAAI,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACtB,IAAI,IAAI,OAAO,EAAE;AACjB,MAAM,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC1D,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;AACpB,IAAI,CAAC;AACL,IAAI,OAAO,CAAC,CAAC;AACb,EAAE,CAAC;AACH;AACA,EAAE,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;AACrC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;AAC5D,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;AAChD;AACA,IAAI,MAAM,SAAS,GAAG,IAAI,CAAC,0BAA0B,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAClE;AACA,IAAI,MAAM,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;AAC5D;AACA,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE;AACzC,MAAM,KAAK,EAAE,IAAI;AACjB,MAAM,KAAK;AACX,MAAM,IAAI,EAAE,SAAS;AACrB,KAAK,CAAC,CAAC;AACP;AACA,IAAI,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;AAC1E;AACA,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAC/E;AACA,IAAI,OAAO,OAAO,CAAC;AACnB,EAAE,CAAC;AACH;AACA,EAAE,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;AAC/B,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;AAC5D,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACjE,IAAI,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC/D,IAAI,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAC/E,IAAI,OAAO,OAAO,CAAC;AACnB,EAAE,CAAC;AACH;AACA;AACA,EAAE,MAAM,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE;AAC7C,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,OAAO,CAAC;AACzE;AACA,IAAI,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/C;AACA,IAAI,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE;AACjE;AACA,MAAM,MAAM,GAAG,GAAG,MAAM,KAAK,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC;AAChD,MAAM,MAAM;AACZ,QAAQ,MAAM;AACd,QAAQ,KAAK;AACb,QAAQ,OAAO;AACf,QAAQ,IAAI;AACZ,QAAQ,IAAI;AACZ,QAAQ,OAAO,EAAE,aAAa;AAC9B,OAAO,GAAG,GAAG,CAAC;AACd;AACA,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAC1C,MAAM,IAAI,CAAC,GAAG,EAAE,SAAS;AACzB;AACA,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACzD,MAAM,IAAI,CAAC,WAAW,EAAE,SAAS;AACjC;AACA;AACA,MAAM,MAAM,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AAC1C;AACA,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE;AACnE;AACA,QAAQ,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE;AAC/B,UAAU,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAC9C,UAAU,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,EAAE;AACzD,YAAY,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;AAChC,YAAY,SAAS;AACrB,UAAU,CAAC;AACX;AACA,UAAU,IAAI,KAAK,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC;AACjD,UAAU,IAAI,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;AAC5C,UAAU,IAAI,aAAa,EAAE,KAAK,CAAC,OAAO,GAAG,aAAa,CAAC;AAC3D;AACA,UAAU,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC3D,UAAU,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;AAC/B,QAAQ,CAAC;AACT,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,EAAE;AAC7C;AACA,QAAQ,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC/D;AACA,QAAQ,IAAI,SAAS,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AAC3E,QAAQ,IAAI,OAAO,EAAE,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC;AACjD,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC;AACtD,QAAQ,IAAI,IAAI,KAAK,SAAS,EAAE,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC;AACtD,QAAQ,IAAI,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC;AAC9C,QAAQ,IAAI,aAAa,EAAE,SAAS,CAAC,OAAO,GAAG,aAAa,CAAC;AAC7D;AACA,QAAQ,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC/D;AACA;AACA,QAAQ,MAAM,WAAW,GAAG,EAAE,CAAC;AAC/B,QAAQ,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;AACtC,UAAU,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AACjD,UAAU,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;AACjE,UAAU,WAAW,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5C,QAAQ,CAAC;AACT;AACA,QAAQ,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE;AAC/B,UAAU,GAAG,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;AACnD,QAAQ,CAAC;AACT,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE;AAC9C;AACA,QAAQ,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;AACjD,MAAM,CAAC;AACP,IAAI,CAAC;AACL;AACA,IAAI,OAAO,GAAG,CAAC;AACf,EAAE,CAAC;AACH,CAAC;AACD;AACA;AACA;AACA;AACA,MAAM,MAAM,CAAC;AACb,EAAE,WAAW,CAAC,IAAI,GAAG,EAAE,EAAE;AACzB;AACA,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;AAC/B,MAAM,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,iBAAiB,CAAC;AACjE,KAAK,CAAC;AACN,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;AACrB,IAAI,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;AAC1B,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;AAClC,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACrB,EAAE,CAAC;AACH;AACA,EAAE,MAAM,OAAO,GAAG;AAClB,IAAI,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACtD,IAAI,OAAO,IAAI,CAAC;AAChB,EAAE,CAAC;AACH;AACA,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAG,EAAE,EAAE,SAAS,GAAG,EAAE,EAAE;AAC5D,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC9E;AACA,IAAI,KAAK,MAAM,EAAE,IAAI,eAAe,EAAE;AACtC,MAAM,IAAI,MAAM,CAAC,EAAE,CAAC;AACpB,QAAQ,MAAM,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,mCAAmC,CAAC,CAAC,CAAC;AAC3E,IAAI,CAAC;AACL;AACA;AACA,IAAI,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACnD,MAAM,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;AACzC,QAAQ,MAAM,IAAI,KAAK,CAAC,CAAC,uBAAuB,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAC1E,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;AACvE,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;AAC7D,QAAQ,MAAM,IAAI,KAAK,CAAC,CAAC,cAAc,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvE,MAAM,CAAC;AACP,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE;AAC1E,QAAQ,MAAM,IAAI,KAAK,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC;AAC1E,MAAM,CAAC;AACP,IAAI,CAAC;AACL;AACA,IAAI,MAAM,IAAI,GAAG,IAAI,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE;AACxD,MAAM,MAAM,EAAE,IAAI,CAAC,MAAM;AACzB,MAAM,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;AACzC,SAAS,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;AACtD,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACxB,MAAM,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc;AAChD,KAAK,CAAC,CAAC;AACP;AACA,IAAI,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC;AAChC,MAAM,IAAI;AACV,MAAM,MAAM;AACZ,MAAM,UAAU,EAAE,IAAI;AACtB,MAAM,SAAS;AACf,MAAM,cAAc,EAAE,IAAI,CAAC,MAAM;AACjC,MAAM,IAAI,EAAE,SAAS;AACrB,KAAK,CAAC,CAAC;AACP,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAClC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;AAC9B,IAAI,OAAO,KAAK,CAAC;AACjB,EAAE,CAAC;AACH;AACA,EAAE,KAAK,CAAC,IAAI,EAAE;AACd,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AAC3E,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,EAAE,CAAC;AACH;;;;;;;;;"}