{
  "version": 3,
  "sources": ["../index.ts", "../utils.ts", "../zlib/index.browser.ts"],
  "sourcesContent": ["/**\n * The nbt module provides nbt {@link serialize} and {@link deserialize} functions.\n *\n * @packageDocumentation\n * @module @xmcl/nbt\n */\n\nimport { ByteBuffer } from '@xmcl/bytebuffer'\nimport { readUTF8, writeUTF8 } from './utils'\nimport {\n  ungzip,\n  inflate,\n  gunzipSync,\n  gzip,\n  gzipSync,\n  inflateSync,\n  deflateSync,\n  deflate,\n} from './zlib'\n\ntype Constructor<T> = new (...args: any) => T\n\nexport const kNBTPrototype = Symbol('NBTPrototype')\nexport const kNBTConstructor = Symbol('NBTConstructor')\n\nexport type TagType = TagTypePrimitive | typeof TagType.List | typeof TagType.Compound\n\nexport type TagTypePrimitive =\n  | typeof TagType.End\n  | typeof TagType.Byte\n  | typeof TagType.Short\n  | typeof TagType.Int\n  | typeof TagType.Long\n  | typeof TagType.Float\n  | typeof TagType.Double\n  | typeof TagType.ByteArray\n  | typeof TagType.String\n  | typeof TagType.IntArray\n  | typeof TagType.LongArray\n\n/**\n * Ensure the plain object or prototype object has correctly setup the NBTPrototype.\n *\n * @returns The NBTPrototype object\n */\nfunction ensurePrototype(object: object & { constructor?: Constructor<any> }) {\n  let nbtPrototype = getPrototypeOf(object)\n  // no prototype, create linked structure\n  if (!nbtPrototype) {\n    nbtPrototype = createPrototypeObject({}, object.constructor)\n    // link the prototype chain\n    setPrototypeOf(object, nbtPrototype)\n\n    // link the parent prototype chain\n    const parentProtoType = Object.getPrototypeOf(object)\n    if (parentProtoType !== Object.prototype) {\n      const parentPrototype = ensurePrototype(parentProtoType)\n      Object.setPrototypeOf(nbtPrototype, parentPrototype)\n    }\n  }\n  return nbtPrototype\n}\n\n/**\n * Annotate the type of a field\n */\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport function TagType<T>(type: TagType | Constructor<T> | Schema) {\n  return (clzPrototype: any, key: string) => {\n    const nbtPrototype = ensurePrototype(clzPrototype)\n    nbtPrototype[key] = type\n  }\n}\n\n/**\n * Construct the object from schema or constructor.\n *\n * - If pass-in value type is a schema object, it create a prototype with constructor constructing the object with this schema as NBTPrototype.\n * - If pass-in value is a constructor, it will try to take the NBTPrototype on the constructor to create object.\n */\nfunction constructObject(valueType: CompoundSchema | Constructor<any> | undefined): any {\n  if (!valueType) {\n    return {}\n  }\n  const prot =\n    typeof valueType === 'object' ? createPrototypeObject(valueType) : getPrototypeOf(valueType)\n  if (prot) return prot[kNBTConstructor]()\n  if (!prot) {\n    // value is constructor but no tag decodated yet.\n    // in this case we just return a empty object.\n    return {}\n  }\n}\n\nfunction createPrototypeObject(\n  schema: CompoundSchema,\n  constructor?: Constructor<any>,\n): NBTPrototype {\n  const proto: any = {\n    ...schema,\n  }\n  Object.defineProperty(proto, kNBTConstructor, {\n    value: () => {\n      let object: any\n      if (constructor) {\n        try {\n          object = new constructor()\n        } catch {\n          object = {}\n          Object.setPrototypeOf(object, constructor.prototype)\n        }\n      } else {\n        object = {}\n      }\n      Object.defineProperty(object, kNBTPrototype, { value: proto })\n      return object\n    },\n  })\n  return proto\n}\n\n/**\n * Get NBT schema for this object or a class.\n *\n * If the param is a object, any modifications on this prototype will only affact this object.\n * If the param is a class, any modifications on this prototype will affact all object under this class\n *\n * @param object The object or class\n */\nexport function getPrototypeOf(object: object | ((...p: any[]) => any)): NBTPrototype | undefined {\n  const targetObject = typeof object === 'function' ? object.prototype : object\n  return targetObject[kNBTPrototype]\n}\n\n/**\n * Set and change the NBT prototype of this object or class\n * @param object A object or a class function\n * @param nbtPrototype The nbt prototype\n */\nexport function setPrototypeOf(\n  object: object | ((...p: any[]) => any),\n  nbtPrototype: NBTPrototype,\n) {\n  const target = typeof object === 'function' ? object.prototype : object\n  Object.defineProperty(target, kNBTPrototype, { value: nbtPrototype })\n}\n\nfunction isTagType(n: number): n is TagType {\n  return n >= 0 && n <= 12\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace, @typescript-eslint/no-redeclare\nexport namespace TagType {\n  export const End = 0 as const\n  export const Byte = 1 as const\n  export const Short = 2 as const\n  export const Int = 3 as const\n  export const Long = 4 as const\n  export const Float = 5 as const\n  export const Double = 6 as const\n  export const ByteArray = 7 as const\n  export const String = 8 as const\n  export const List = 9 as const\n  export const Compound = 10 as const\n  export const IntArray = 11 as const\n  export const LongArray = 12 as const\n\n  export function getName(tagType: TagType) {\n    return [\n      'End',\n      'Byte',\n      'Short',\n      'Int',\n      'Long',\n      'Float',\n      'Double',\n      'ByteArray',\n      'String',\n      'List',\n      'Compound',\n      'IntArray',\n      'LongArray',\n    ][tagType]\n  }\n}\n\nexport type Schema = ListSchema | CompoundSchema | Constructor<any>\nexport type ListSchema = [TagType | Schema]\nexport type CompoundSchema = { [key: string]: TagType | Schema }\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport interface NBTPrototype extends CompoundSchema {\n  [kNBTConstructor]: () => any\n}\n\nexport interface TagCoder {\n  write(buf: ByteBuffer, context: ReadContext): any\n  read(buf: ByteBuffer, value: any, context: WriteContext): void\n}\n\nconst coders: TagCoder[] = [\n  { write: (buf) => undefined, read(buf, v) {} }, // end\n  {\n    write: (buf) => buf.readByte(),\n    read(buf, v = 0) {\n      buf.writeByte(v)\n    },\n  }, // byte\n  {\n    write: (buf) => buf.readShort(),\n    read(buf, v = 0) {\n      buf.writeShort(v)\n    },\n  }, // short\n  {\n    write: (buf) => buf.readInt(),\n    read(buf, v = 0) {\n      buf.writeInt(v)\n    },\n  }, // int\n  {\n    write: (buf) => buf.readInt64(),\n    read(buf, v = 0) {\n      buf.writeInt64(v)\n    },\n  }, // long\n  {\n    write: (buf) => buf.readFloat(),\n    read(buf, v = 0) {\n      buf.writeFloat(v)\n    },\n  }, // float\n  {\n    write: (buf) => buf.readDouble(),\n    read(buf, v = 0) {\n      buf.writeDouble(v)\n    },\n  }, // double\n  {\n    // byte array\n    write(buf) {\n      const arr = new Array(buf.readInt())\n      for (let i = 0; i < arr.length; i++) {\n        arr[i] = buf.readByte()\n      }\n      return arr\n    },\n    read(buf, arr = []) {\n      buf.writeInt(arr.length)\n      for (let i = 0; i < arr.length; i++) {\n        buf.writeByte(arr[i])\n      }\n    },\n  },\n  {\n    write: (buf, context) => readUTF8(buf, context),\n    read: (buf, v = '', context) => writeUTF8(buf, v, context),\n  }, // string\n  {\n    // list\n    write(buf, context) {\n      const listType = buf.readByte()\n\n      assertTag(listType)\n\n      const len = buf.readInt()\n      const list = new Array(len)\n\n      if (context.schema) {\n        assertListSchema(context.schema)\n      }\n\n      if (!!context.schema && typeof context.schema === 'number' && listType !== context.schema) {\n        // ignore the value if we know the type mismatched\n        return list\n      }\n\n      const childContext = context.fork(context.schema ? context.schema[0] : listType)\n      const shouldInspectChildType = !childContext.schema\n\n      for (let i = 0; i < len; i++) {\n        // console.log(`[read] ${shouldInspectChildType ? 'inspecting' : ''} -> [${i}]: ${JSON.stringify(nextContext.valueType)} ${TagType.getName(listType)}`);\n        list[i] = coders[listType].write(buf, childContext)\n        // console.log(`[read] ${shouldInspectChildType ? 'inspecting' : ''} <- [${i}]: ${JSON.stringify(nextContext.valueType)} ${TagType.getName(listType)} ${JSON.stringify(list[i])}`);\n      }\n\n      if (shouldInspectChildType) {\n        context.inspect = childContext.inspect || [childContext.tagType]\n      }\n\n      return list\n    },\n    read(buf, value: any[] = [], context) {\n      assertListSchema(context.schema)\n\n      const valueType = context.schema[0]\n      const childContext = context.fork(valueType)\n      const tagType = childContext.tagType\n      const writer = coders[tagType]\n\n      assertTag(tagType)\n\n      if ((tagType === TagType.Compound || tagType === TagType.List) && !childContext.schema) {\n        // skip for undefined property\n        return\n      }\n\n      try {\n        buf.writeByte(tagType)\n        buf.writeInt(value.length)\n        for (const v of value) {\n          writer.read(buf, v, childContext)\n        }\n      } catch (e) {\n        if (e instanceof TypeError) {\n          throw new TypeError(`Require ${TagType.getName(tagType)} but found ${typeof value}`)\n        }\n      }\n    },\n  },\n  {\n    // tag compound\n    write(buf, context) {\n      assertCompoundSchema(context.schema)\n\n      const object = constructObject(context.schema) // create from constructor\n      const nbtPrototype = ensurePrototype(object as any)\n      const knowingType = !!context.schema\n\n      for (let tag = 0; (tag = buf.readByte()) !== TagType.End; ) {\n        const reader = coders[tag]\n\n        const key = readUTF8(buf, context)\n        // not reader or illegal tag type\n        assertTag(tag)\n\n        let childContext: ReadContext\n        if (knowingType) {\n          const valueType = nbtPrototype[key]\n          // Field is not in the schema, or its on-disk tag type does not match\n          // the schema's. We still must read and discard the value so the\n          // buffer cursor stays aligned for the following fields; simply\n          // `continue`-ing would desync the stream and corrupt the rest of the\n          // compound (e.g. newer `servers.dat` adds `preventsChatReports` /\n          // `hidden` bytes that older schemas don't know about).\n          if (\n            typeof valueType === 'undefined' ||\n            (typeof valueType === 'number' && valueType !== tag)\n          ) {\n            reader.write(buf, context.fork(tag))\n            continue\n          }\n          childContext = context.fork(valueType)\n        } else {\n          childContext = context.fork(tag)\n        }\n\n        const shouldInspectChildType = !childContext.schema\n        object[key] = reader.write(buf, childContext)\n        if (shouldInspectChildType) {\n          nbtPrototype[key] = childContext.inspect || childContext.tagType\n        }\n      }\n      if (!knowingType) {\n        context.inspect = nbtPrototype\n      }\n\n      return object\n    },\n    read(buf, object = {}, context) {\n      assertCompoundSchema(context.schema)\n\n      const schema =\n        (context.schema\n          ? context.schema instanceof Function\n            ? getPrototypeOf(context.schema)\n            : context.schema\n          : getPrototypeOf(object)) || ({} as CompoundSchema)\n\n      for (const [key, value] of Object.entries(object)) {\n        const valueType = schema[key]\n\n        if (typeof valueType === 'undefined') {\n          // skip for undefined property\n          continue\n        }\n\n        const childContext = context.fork(valueType)\n        const tagType = childContext.tagType\n        const writer = coders[tagType]\n\n        assertTag(tagType)\n\n        if (!childContext.schema && (tagType === TagType.Compound || tagType === TagType.List)) {\n          // skip for undefined property\n          continue\n        }\n        // console.log(`Write ${key}: ${TagType.getName(tagType)} ${JSON.stringify(childContext.schema)} ${childContext.schema} ${childContext.schema instanceof Array}`)\n        try {\n          buf.writeByte(tagType)\n          writeUTF8(buf, key, context)\n          writer.read(buf, value, childContext)\n        } catch (e) {\n          if (e instanceof TypeError) {\n            throw new TypeError(`Required ${TagType.getName(tagType)} but found ${typeof value}`)\n          }\n        }\n      }\n      buf.writeByte(TagType.End)\n    },\n  },\n  {\n    // int array\n    write(buf) {\n      const arr = new Array(buf.readInt())\n      for (let i = 0; i < arr.length; i++) {\n        arr[i] = buf.readInt()\n      }\n      return arr\n    },\n    read(buf, v = []) {\n      buf.writeInt(v.length)\n      for (let i = 0; i < v.length; i++) {\n        buf.writeInt(v[i])\n      }\n    },\n  },\n  {\n    // long array\n    write(buf) {\n      const len = buf.readInt()\n      const arr: bigint[] = new Array(len)\n      for (let i = 0; i < len; i++) {\n        arr[i] = buf.readInt64()\n      }\n      return arr\n    },\n    read(buf, v = []) {\n      buf.writeInt(v.length)\n      for (let i = 0; i < v.length; i++) {\n        buf.writeInt64(v[i])\n      }\n    },\n  },\n]\n\nexport interface SerializationOption {\n  compressed?: true | 'deflate' | 'gzip'\n  /**\n   * IO override for serialization\n   */\n  io?: { [tagType: number]: TagCoder }\n\n  /**\n   * Used for serialize function. Assign the filename for it.\n   */\n  filename?: string\n}\n\nexport interface DeserializationOption<T> {\n  compressed?: true | 'deflate' | 'gzip'\n  /**\n   * IO override for serialization\n   */\n  io?: { [tagType: number]: TagCoder }\n\n  type?: Constructor<T>\n}\n\n/**\n * Serialzie an nbt typed json object into NBT binary\n * @param object The json\n * @param compressed Should we compress it\n */\nexport async function serialize(\n  object: object,\n  option: SerializationOption = {},\n): Promise<Uint8Array> {\n  const buff = writeRootTag(\n    object,\n    undefined,\n    option.filename || '',\n    Object.assign({}, coders, option.io),\n  )\n  return normalizeBuffer(buff, option.compressed)\n}\n\n/**\n * Deserialize the nbt binary into json\n * @param fileData The nbt binary\n */\nexport async function deserialize<T>(\n  fileData: Uint8Array,\n  option: DeserializationOption<T> = {},\n): Promise<T> {\n  const doUnzip = normalizeCompress(fileData, option.compressed)\n  const bb = ByteBuffer.wrap(\n    doUnzip === 'none'\n      ? fileData\n      : doUnzip === 'gzip'\n        ? await ungzip(fileData)\n        : await inflate(fileData),\n  )\n\n  return readRootTag(bb, Object.assign({}, coders, option.io), option.type)\n}\n\n/**\n * Serialzie an nbt typed json object into NBT binary\n * @param object The json\n */\nexport function serializeSync(object: object, option: SerializationOption = {}): Uint8Array {\n  const buff = writeRootTag(\n    object,\n    undefined,\n    option.filename || '',\n    Object.assign({}, coders, option.io),\n  )\n  return normalizeBufferSync(buff, option.compressed)\n}\n\n/**\n * Deserialize the nbt binary into json\n * @param fileData The nbt binary\n * @param compressed Should we compress it\n */\nexport function deserializeSync<T>(fileData: Uint8Array, option: DeserializationOption<T> = {}): T {\n  const doUnzip = normalizeCompress(fileData, option.compressed)\n  const bb = ByteBuffer.wrap(\n    doUnzip === 'none'\n      ? fileData\n      : doUnzip === 'gzip'\n        ? gunzipSync(fileData)\n        : inflateSync(fileData),\n  )\n\n  return readRootTag(bb, Object.assign({}, coders, option.io), option.type)\n}\n\nfunction normalizeCompress(\n  fileData: Uint8Array,\n  compressed?: true | 'deflate' | 'gzip',\n): 'none' | 'gzip' | 'deflate' {\n  let doUnzip: 'none' | 'gzip' | 'deflate'\n  if (typeof compressed === 'undefined') {\n    doUnzip = 'none'\n  } else if (typeof compressed === 'boolean' && compressed) {\n    doUnzip = 'gzip'\n  } else {\n    doUnzip = compressed\n  }\n  return doUnzip\n}\n\nfunction normalizeBuffer(buff: Uint8Array, compressed?: true | 'deflate' | 'gzip') {\n  if (!compressed) {\n    return buff\n  }\n  if (compressed === 'deflate') {\n    return deflate(buff)\n  }\n  return gzip(buff)\n}\nfunction normalizeBufferSync(buff: Uint8Array, compressed?: true | 'deflate' | 'gzip') {\n  if (!compressed) {\n    return buff\n  }\n  if (compressed === 'deflate') {\n    return deflateSync(buff)\n  }\n  return gzipSync(buff)\n}\n\nfunction readRootTag(buffer: ByteBuffer, io: ArrayLike<TagCoder>, type?: Constructor<any>) {\n  const rootType = buffer.readByte()\n  if (rootType === TagType.End) {\n    throw new Error('NBTEnd')\n  }\n  if (rootType !== TagType.Compound) {\n    throw new Error('Root tag must be a named compound tag. ' + rootType)\n  }\n  const context = new ReadContext(type, TagType.Compound)\n  const name = readUTF8(buffer, context) // I think this is the nameProperty of the file...\n  const value = io[TagType.Compound].write(buffer, context)\n  return value\n}\n\nfunction writeRootTag(\n  value: any,\n  type: Schema | undefined,\n  filename: string,\n  coders: TagCoder[],\n): Uint8Array {\n  const buffer = new ByteBuffer()\n  buffer.writeByte(TagType.Compound)\n  const context = new WriteContext(type, 10)\n\n  writeUTF8(buffer, filename || '', context)\n  coders[TagType.Compound].read(buffer, value, context)\n\n  return new Uint8Array(buffer.flip().buffer.slice(0, buffer.limit))\n}\n\nfunction assertListSchema<T>(v: T | T[]): asserts v is T[] {\n  if (!(v instanceof Array)) {\n    throw new Error('IllegalState')\n  }\n}\nfunction assertCompoundSchema(v: Schema | undefined): asserts v is CompoundSchema | undefined {\n  if (v instanceof Array) {\n    throw new Error('IllegalState')\n  }\n}\nfunction assertTag(v: number): asserts v is TagType {\n  if (!isTagType(v)) {\n    throw new Error('Unknown type ' + v)\n  }\n}\n\nexport class ReadContext {\n  public inspect: Schema | undefined\n  #decoder: TextDecoder | undefined\n  constructor(\n    public schema: Schema | undefined,\n    public tagType: TagType,\n  ) {}\n\n  get decoder() {\n    if (!this.#decoder) {\n      this.#decoder = new TextDecoder()\n    }\n    return this.#decoder\n  }\n\n  fork(schemaOrTagType: TagType | Schema) {\n    if (typeof schemaOrTagType === 'number') {\n      return new ReadContext(undefined, schemaOrTagType)\n    }\n    return new ReadContext(\n      schemaOrTagType,\n      typeof schemaOrTagType === 'number'\n        ? schemaOrTagType\n        : schemaOrTagType instanceof Array\n          ? TagType.List\n          : TagType.Compound,\n    )\n  }\n}\n\nexport class WriteContext {\n  #encoder: TextEncoder | undefined\n  constructor(\n    readonly schema: Schema | undefined,\n    readonly tagType: TagType,\n  ) {}\n\n  get encoder() {\n    if (!this.#encoder) {\n      this.#encoder = new TextEncoder()\n    }\n    return this.#encoder\n  }\n\n  fork(schemaOrTagType: TagType | Schema): WriteContext {\n    if (schemaOrTagType === TagType.Compound) {\n      throw new Error('IllegalState')\n    }\n    return new WriteContext(\n      typeof schemaOrTagType === 'number' ? undefined : schemaOrTagType,\n      typeof schemaOrTagType === 'number'\n        ? schemaOrTagType\n        : schemaOrTagType instanceof Array\n          ? TagType.List\n          : TagType.Compound,\n    )\n  }\n}\n", "import { ByteBuffer } from '@xmcl/bytebuffer'\nimport type { ReadContext, WriteContext } from './index'\n\nexport function writeUTF8(out: ByteBuffer, str = '', context: WriteContext) {\n  const strlen = str.length\n  let utflen = 0\n  let c: number\n\n  /* use charAt instead of copying String to char array */\n  for (let idx = 0; idx < strlen; idx++) {\n    c = str.charCodeAt(idx)\n    if (c >= 0x0001 && c <= 0x007f) {\n      utflen++\n    } else if (c > 0x07ff) {\n      utflen += 3\n    } else {\n      utflen += 2\n    }\n  }\n\n  if (utflen > 65535) {\n    throw new RangeError('encoded string too long: ' + utflen + ' bytes')\n  }\n\n  out.writeInt16(utflen)\n  if (utflen > 0) {\n    out.writeBytes(context.encoder.encode(str))\n  }\n}\n\nexport function readUTF8(buff: ByteBuffer, context: ReadContext) {\n  const utflen = buff.readInt16()\n  const result = context.decoder.decode(buff.buffer.slice(buff.offset, buff.offset + utflen))\n  buff.offset += utflen\n  return result\n}\n", "import pako from 'pako'\n\nexport function gzip(buffer: Uint8Array) {\n  return Promise.resolve(pako.gzip(buffer))\n}\nexport function gzipSync(buffer: Uint8Array) {\n  return pako.gzip(buffer)\n}\nexport function ungzip(buffer: Uint8Array) {\n  return Promise.resolve(pako.ungzip(buffer))\n}\nexport function gunzipSync(buffer: Uint8Array) {\n  return pako.ungzip(buffer)\n}\nexport function inflate(buffer: Uint8Array) {\n  return Promise.resolve(pako.inflate(buffer))\n}\nexport function deflate(buffer: Uint8Array) {\n  return Promise.resolve(pako.deflate(buffer))\n}\nexport function inflateSync(buffer: Uint8Array) {\n  return pako.inflate(buffer)\n}\nexport function deflateSync(buffer: Uint8Array) {\n  return pako.deflate(buffer)\n}\n"],
  "mappings": ";;;;;;;;;;;;AAOA,SAAS,kBAAkB;;;ACJpB,SAAS,UAAU,KAAiB,MAAM,IAAI,SAAuB;AAC1E,QAAM,SAAS,IAAI;AACnB,MAAI,SAAS;AACb,MAAI;AAGJ,WAAS,MAAM,GAAG,MAAM,QAAQ,OAAO;AACrC,QAAI,IAAI,WAAW,GAAG;AACtB,QAAI,KAAK,KAAU,KAAK,KAAQ;AAC9B;AAAA,IACF,WAAW,IAAI,MAAQ;AACrB,gBAAU;AAAA,IACZ,OAAO;AACL,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,SAAS,OAAO;AAClB,UAAM,IAAI,WAAW,8BAA8B,SAAS,QAAQ;AAAA,EACtE;AAEA,MAAI,WAAW,MAAM;AACrB,MAAI,SAAS,GAAG;AACd,QAAI,WAAW,QAAQ,QAAQ,OAAO,GAAG,CAAC;AAAA,EAC5C;AACF;AAEO,SAAS,SAAS,MAAkB,SAAsB;AAC/D,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,SAAS,QAAQ,QAAQ,OAAO,KAAK,OAAO,MAAM,KAAK,QAAQ,KAAK,SAAS,MAAM,CAAC;AAC1F,OAAK,UAAU;AACf,SAAO;AACT;;;ACnCA,OAAO,UAAU;AAEV,SAAS,KAAK,QAAoB;AACvC,SAAO,QAAQ,QAAQ,KAAK,KAAK,MAAM,CAAC;AAC1C;AACO,SAAS,SAAS,QAAoB;AAC3C,SAAO,KAAK,KAAK,MAAM;AACzB;AACO,SAAS,OAAO,QAAoB;AACzC,SAAO,QAAQ,QAAQ,KAAK,OAAO,MAAM,CAAC;AAC5C;AACO,SAAS,WAAW,QAAoB;AAC7C,SAAO,KAAK,OAAO,MAAM;AAC3B;AACO,SAAS,QAAQ,QAAoB;AAC1C,SAAO,QAAQ,QAAQ,KAAK,QAAQ,MAAM,CAAC;AAC7C;AACO,SAAS,QAAQ,QAAoB;AAC1C,SAAO,QAAQ,QAAQ,KAAK,QAAQ,MAAM,CAAC;AAC7C;AACO,SAAS,YAAY,QAAoB;AAC9C,SAAO,KAAK,QAAQ,MAAM;AAC5B;AACO,SAAS,YAAY,QAAoB;AAC9C,SAAO,KAAK,QAAQ,MAAM;AAC5B;;;AFHO,IAAM,gBAAgB,uBAAO,cAAc;AAC3C,IAAM,kBAAkB,uBAAO,gBAAgB;AAsBtD,SAAS,gBAAgB,QAAqD;AAC5E,MAAI,eAAe,eAAe,MAAM;AAExC,MAAI,CAAC,cAAc;AACjB,mBAAe,sBAAsB,CAAC,GAAG,OAAO,WAAW;AAE3D,mBAAe,QAAQ,YAAY;AAGnC,UAAM,kBAAkB,OAAO,eAAe,MAAM;AACpD,QAAI,oBAAoB,OAAO,WAAW;AACxC,YAAM,kBAAkB,gBAAgB,eAAe;AACvD,aAAO,eAAe,cAAc,eAAe;AAAA,IACrD;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,QAAW,MAAyC;AAClE,SAAO,CAAC,cAAmB,QAAgB;AACzC,UAAM,eAAe,gBAAgB,YAAY;AACjD,iBAAa,GAAG,IAAI;AAAA,EACtB;AACF;AAQA,SAAS,gBAAgB,WAA+D;AACtF,MAAI,CAAC,WAAW;AACd,WAAO,CAAC;AAAA,EACV;AACA,QAAM,OACJ,OAAO,cAAc,WAAW,sBAAsB,SAAS,IAAI,eAAe,SAAS;AAC7F,MAAI,KAAM,QAAO,KAAK,eAAe,EAAE;AACvC,MAAI,CAAC,MAAM;AAGT,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,sBACP,QACA,aACc;AACd,QAAM,QAAa;AAAA,IACjB,GAAG;AAAA,EACL;AACA,SAAO,eAAe,OAAO,iBAAiB;AAAA,IAC5C,OAAO,MAAM;AACX,UAAI;AACJ,UAAI,aAAa;AACf,YAAI;AACF,mBAAS,IAAI,YAAY;AAAA,QAC3B,QAAQ;AACN,mBAAS,CAAC;AACV,iBAAO,eAAe,QAAQ,YAAY,SAAS;AAAA,QACrD;AAAA,MACF,OAAO;AACL,iBAAS,CAAC;AAAA,MACZ;AACA,aAAO,eAAe,QAAQ,eAAe,EAAE,OAAO,MAAM,CAAC;AAC7D,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAUO,SAAS,eAAe,QAAmE;AAChG,QAAM,eAAe,OAAO,WAAW,aAAa,OAAO,YAAY;AACvE,SAAO,aAAa,aAAa;AACnC;AAOO,SAAS,eACd,QACA,cACA;AACA,QAAM,SAAS,OAAO,WAAW,aAAa,OAAO,YAAY;AACjE,SAAO,eAAe,QAAQ,eAAe,EAAE,OAAO,aAAa,CAAC;AACtE;AAEA,SAAS,UAAU,GAAyB;AAC1C,SAAO,KAAK,KAAK,KAAK;AACxB;AAAA,CAGO,CAAUA,aAAV;AACE,EAAMA,SAAA,MAAM;AACZ,EAAMA,SAAA,OAAO;AACb,EAAMA,SAAA,QAAQ;AACd,EAAMA,SAAA,MAAM;AACZ,EAAMA,SAAA,OAAO;AACb,EAAMA,SAAA,QAAQ;AACd,EAAMA,SAAA,SAAS;AACf,EAAMA,SAAA,YAAY;AAClB,EAAMA,SAAA,SAAS;AACf,EAAMA,SAAA,OAAO;AACb,EAAMA,SAAA,WAAW;AACjB,EAAMA,SAAA,WAAW;AACjB,EAAMA,SAAA,YAAY;AAElB,WAAS,QAAQ,SAAkB;AACxC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,OAAO;AAAA,EACX;AAhBO,EAAAA,SAAS;AAAA,GAfD;AAgDjB,IAAM,SAAqB;AAAA,EACzB,EAAE,OAAO,CAAC,QAAQ,QAAW,KAAK,KAAK,GAAG;AAAA,EAAC,EAAE;AAAA;AAAA,EAC7C;AAAA,IACE,OAAO,CAAC,QAAQ,IAAI,SAAS;AAAA,IAC7B,KAAK,KAAK,IAAI,GAAG;AACf,UAAI,UAAU,CAAC;AAAA,IACjB;AAAA,EACF;AAAA;AAAA,EACA;AAAA,IACE,OAAO,CAAC,QAAQ,IAAI,UAAU;AAAA,IAC9B,KAAK,KAAK,IAAI,GAAG;AACf,UAAI,WAAW,CAAC;AAAA,IAClB;AAAA,EACF;AAAA;AAAA,EACA;AAAA,IACE,OAAO,CAAC,QAAQ,IAAI,QAAQ;AAAA,IAC5B,KAAK,KAAK,IAAI,GAAG;AACf,UAAI,SAAS,CAAC;AAAA,IAChB;AAAA,EACF;AAAA;AAAA,EACA;AAAA,IACE,OAAO,CAAC,QAAQ,IAAI,UAAU;AAAA,IAC9B,KAAK,KAAK,IAAI,GAAG;AACf,UAAI,WAAW,CAAC;AAAA,IAClB;AAAA,EACF;AAAA;AAAA,EACA;AAAA,IACE,OAAO,CAAC,QAAQ,IAAI,UAAU;AAAA,IAC9B,KAAK,KAAK,IAAI,GAAG;AACf,UAAI,WAAW,CAAC;AAAA,IAClB;AAAA,EACF;AAAA;AAAA,EACA;AAAA,IACE,OAAO,CAAC,QAAQ,IAAI,WAAW;AAAA,IAC/B,KAAK,KAAK,IAAI,GAAG;AACf,UAAI,YAAY,CAAC;AAAA,IACnB;AAAA,EACF;AAAA;AAAA,EACA;AAAA;AAAA,IAEE,MAAM,KAAK;AACT,YAAM,MAAM,IAAI,MAAM,IAAI,QAAQ,CAAC;AACnC,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,YAAI,CAAC,IAAI,IAAI,SAAS;AAAA,MACxB;AACA,aAAO;AAAA,IACT;AAAA,IACA,KAAK,KAAK,MAAM,CAAC,GAAG;AAClB,UAAI,SAAS,IAAI,MAAM;AACvB,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,YAAI,UAAU,IAAI,CAAC,CAAC;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO,CAAC,KAAK,YAAY,SAAS,KAAK,OAAO;AAAA,IAC9C,MAAM,CAAC,KAAK,IAAI,IAAI,YAAY,UAAU,KAAK,GAAG,OAAO;AAAA,EAC3D;AAAA;AAAA,EACA;AAAA;AAAA,IAEE,MAAM,KAAK,SAAS;AAClB,YAAM,WAAW,IAAI,SAAS;AAE9B,gBAAU,QAAQ;AAElB,YAAM,MAAM,IAAI,QAAQ;AACxB,YAAM,OAAO,IAAI,MAAM,GAAG;AAE1B,UAAI,QAAQ,QAAQ;AAClB,yBAAiB,QAAQ,MAAM;AAAA,MACjC;AAEA,UAAI,CAAC,CAAC,QAAQ,UAAU,OAAO,QAAQ,WAAW,YAAY,aAAa,QAAQ,QAAQ;AAEzF,eAAO;AAAA,MACT;AAEA,YAAM,eAAe,QAAQ,KAAK,QAAQ,SAAS,QAAQ,OAAO,CAAC,IAAI,QAAQ;AAC/E,YAAM,yBAAyB,CAAC,aAAa;AAE7C,eAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAE5B,aAAK,CAAC,IAAI,OAAO,QAAQ,EAAE,MAAM,KAAK,YAAY;AAAA,MAEpD;AAEA,UAAI,wBAAwB;AAC1B,gBAAQ,UAAU,aAAa,WAAW,CAAC,aAAa,OAAO;AAAA,MACjE;AAEA,aAAO;AAAA,IACT;AAAA,IACA,KAAK,KAAK,QAAe,CAAC,GAAG,SAAS;AACpC,uBAAiB,QAAQ,MAAM;AAE/B,YAAM,YAAY,QAAQ,OAAO,CAAC;AAClC,YAAM,eAAe,QAAQ,KAAK,SAAS;AAC3C,YAAM,UAAU,aAAa;AAC7B,YAAM,SAAS,OAAO,OAAO;AAE7B,gBAAU,OAAO;AAEjB,WAAK,YAAY,QAAQ,YAAY,YAAY,QAAQ,SAAS,CAAC,aAAa,QAAQ;AAEtF;AAAA,MACF;AAEA,UAAI;AACF,YAAI,UAAU,OAAO;AACrB,YAAI,SAAS,MAAM,MAAM;AACzB,mBAAW,KAAK,OAAO;AACrB,iBAAO,KAAK,KAAK,GAAG,YAAY;AAAA,QAClC;AAAA,MACF,SAAS,GAAG;AACV,YAAI,aAAa,WAAW;AAC1B,gBAAM,IAAI,UAAU,WAAW,QAAQ,QAAQ,OAAO,CAAC,cAAc,OAAO,KAAK,EAAE;AAAA,QACrF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA;AAAA,IAEE,MAAM,KAAK,SAAS;AAClB,2BAAqB,QAAQ,MAAM;AAEnC,YAAM,SAAS,gBAAgB,QAAQ,MAAM;AAC7C,YAAM,eAAe,gBAAgB,MAAa;AAClD,YAAM,cAAc,CAAC,CAAC,QAAQ;AAE9B,eAAS,MAAM,IAAI,MAAM,IAAI,SAAS,OAAO,QAAQ,OAAO;AAC1D,cAAM,SAAS,OAAO,GAAG;AAEzB,cAAM,MAAM,SAAS,KAAK,OAAO;AAEjC,kBAAU,GAAG;AAEb,YAAI;AACJ,YAAI,aAAa;AACf,gBAAM,YAAY,aAAa,GAAG;AAOlC,cACE,OAAO,cAAc,eACpB,OAAO,cAAc,YAAY,cAAc,KAChD;AACA,mBAAO,MAAM,KAAK,QAAQ,KAAK,GAAG,CAAC;AACnC;AAAA,UACF;AACA,yBAAe,QAAQ,KAAK,SAAS;AAAA,QACvC,OAAO;AACL,yBAAe,QAAQ,KAAK,GAAG;AAAA,QACjC;AAEA,cAAM,yBAAyB,CAAC,aAAa;AAC7C,eAAO,GAAG,IAAI,OAAO,MAAM,KAAK,YAAY;AAC5C,YAAI,wBAAwB;AAC1B,uBAAa,GAAG,IAAI,aAAa,WAAW,aAAa;AAAA,QAC3D;AAAA,MACF;AACA,UAAI,CAAC,aAAa;AAChB,gBAAQ,UAAU;AAAA,MACpB;AAEA,aAAO;AAAA,IACT;AAAA,IACA,KAAK,KAAK,SAAS,CAAC,GAAG,SAAS;AAC9B,2BAAqB,QAAQ,MAAM;AAEnC,YAAM,UACH,QAAQ,SACL,QAAQ,kBAAkB,WACxB,eAAe,QAAQ,MAAM,IAC7B,QAAQ,SACV,eAAe,MAAM,MAAO,CAAC;AAEnC,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,cAAM,YAAY,OAAO,GAAG;AAE5B,YAAI,OAAO,cAAc,aAAa;AAEpC;AAAA,QACF;AAEA,cAAM,eAAe,QAAQ,KAAK,SAAS;AAC3C,cAAM,UAAU,aAAa;AAC7B,cAAM,SAAS,OAAO,OAAO;AAE7B,kBAAU,OAAO;AAEjB,YAAI,CAAC,aAAa,WAAW,YAAY,QAAQ,YAAY,YAAY,QAAQ,OAAO;AAEtF;AAAA,QACF;AAEA,YAAI;AACF,cAAI,UAAU,OAAO;AACrB,oBAAU,KAAK,KAAK,OAAO;AAC3B,iBAAO,KAAK,KAAK,OAAO,YAAY;AAAA,QACtC,SAAS,GAAG;AACV,cAAI,aAAa,WAAW;AAC1B,kBAAM,IAAI,UAAU,YAAY,QAAQ,QAAQ,OAAO,CAAC,cAAc,OAAO,KAAK,EAAE;AAAA,UACtF;AAAA,QACF;AAAA,MACF;AACA,UAAI,UAAU,QAAQ,GAAG;AAAA,IAC3B;AAAA,EACF;AAAA,EACA;AAAA;AAAA,IAEE,MAAM,KAAK;AACT,YAAM,MAAM,IAAI,MAAM,IAAI,QAAQ,CAAC;AACnC,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,YAAI,CAAC,IAAI,IAAI,QAAQ;AAAA,MACvB;AACA,aAAO;AAAA,IACT;AAAA,IACA,KAAK,KAAK,IAAI,CAAC,GAAG;AAChB,UAAI,SAAS,EAAE,MAAM;AACrB,eAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,YAAI,SAAS,EAAE,CAAC,CAAC;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA;AAAA,IAEE,MAAM,KAAK;AACT,YAAM,MAAM,IAAI,QAAQ;AACxB,YAAM,MAAgB,IAAI,MAAM,GAAG;AACnC,eAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,YAAI,CAAC,IAAI,IAAI,UAAU;AAAA,MACzB;AACA,aAAO;AAAA,IACT;AAAA,IACA,KAAK,KAAK,IAAI,CAAC,GAAG;AAChB,UAAI,SAAS,EAAE,MAAM;AACrB,eAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,YAAI,WAAW,EAAE,CAAC,CAAC;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AACF;AA8BA,eAAsB,UACpB,QACA,SAA8B,CAAC,GACV;AACrB,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA,OAAO,YAAY;AAAA,IACnB,OAAO,OAAO,CAAC,GAAG,QAAQ,OAAO,EAAE;AAAA,EACrC;AACA,SAAO,gBAAgB,MAAM,OAAO,UAAU;AAChD;AAMA,eAAsB,YACpB,UACA,SAAmC,CAAC,GACxB;AACZ,QAAM,UAAU,kBAAkB,UAAU,OAAO,UAAU;AAC7D,QAAM,KAAK,WAAW;AAAA,IACpB,YAAY,SACR,WACA,YAAY,SACV,MAAM,OAAO,QAAQ,IACrB,MAAM,QAAQ,QAAQ;AAAA,EAC9B;AAEA,SAAO,YAAY,IAAI,OAAO,OAAO,CAAC,GAAG,QAAQ,OAAO,EAAE,GAAG,OAAO,IAAI;AAC1E;AAMO,SAAS,cAAc,QAAgB,SAA8B,CAAC,GAAe;AAC1F,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA,OAAO,YAAY;AAAA,IACnB,OAAO,OAAO,CAAC,GAAG,QAAQ,OAAO,EAAE;AAAA,EACrC;AACA,SAAO,oBAAoB,MAAM,OAAO,UAAU;AACpD;AAOO,SAAS,gBAAmB,UAAsB,SAAmC,CAAC,GAAM;AACjG,QAAM,UAAU,kBAAkB,UAAU,OAAO,UAAU;AAC7D,QAAM,KAAK,WAAW;AAAA,IACpB,YAAY,SACR,WACA,YAAY,SACV,WAAW,QAAQ,IACnB,YAAY,QAAQ;AAAA,EAC5B;AAEA,SAAO,YAAY,IAAI,OAAO,OAAO,CAAC,GAAG,QAAQ,OAAO,EAAE,GAAG,OAAO,IAAI;AAC1E;AAEA,SAAS,kBACP,UACA,YAC6B;AAC7B,MAAI;AACJ,MAAI,OAAO,eAAe,aAAa;AACrC,cAAU;AAAA,EACZ,WAAW,OAAO,eAAe,aAAa,YAAY;AACxD,cAAU;AAAA,EACZ,OAAO;AACL,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAkB,YAAwC;AACjF,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AACA,MAAI,eAAe,WAAW;AAC5B,WAAO,QAAQ,IAAI;AAAA,EACrB;AACA,SAAO,KAAK,IAAI;AAClB;AACA,SAAS,oBAAoB,MAAkB,YAAwC;AACrF,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AACA,MAAI,eAAe,WAAW;AAC5B,WAAO,YAAY,IAAI;AAAA,EACzB;AACA,SAAO,SAAS,IAAI;AACtB;AAEA,SAAS,YAAY,QAAoB,IAAyB,MAAyB;AACzF,QAAM,WAAW,OAAO,SAAS;AACjC,MAAI,aAAa,QAAQ,KAAK;AAC5B,UAAM,IAAI,MAAM,QAAQ;AAAA,EAC1B;AACA,MAAI,aAAa,QAAQ,UAAU;AACjC,UAAM,IAAI,MAAM,4CAA4C,QAAQ;AAAA,EACtE;AACA,QAAM,UAAU,IAAI,YAAY,MAAM,QAAQ,QAAQ;AACtD,QAAM,OAAO,SAAS,QAAQ,OAAO;AACrC,QAAM,QAAQ,GAAG,QAAQ,QAAQ,EAAE,MAAM,QAAQ,OAAO;AACxD,SAAO;AACT;AAEA,SAAS,aACP,OACA,MACA,UACAC,SACY;AACZ,QAAM,SAAS,IAAI,WAAW;AAC9B,SAAO,UAAU,QAAQ,QAAQ;AACjC,QAAM,UAAU,IAAI,aAAa,MAAM,EAAE;AAEzC,YAAU,QAAQ,YAAY,IAAI,OAAO;AACzC,EAAAA,QAAO,QAAQ,QAAQ,EAAE,KAAK,QAAQ,OAAO,OAAO;AAEpD,SAAO,IAAI,WAAW,OAAO,KAAK,EAAE,OAAO,MAAM,GAAG,OAAO,KAAK,CAAC;AACnE;AAEA,SAAS,iBAAoB,GAA8B;AACzD,MAAI,EAAE,aAAa,QAAQ;AACzB,UAAM,IAAI,MAAM,cAAc;AAAA,EAChC;AACF;AACA,SAAS,qBAAqB,GAAgE;AAC5F,MAAI,aAAa,OAAO;AACtB,UAAM,IAAI,MAAM,cAAc;AAAA,EAChC;AACF;AACA,SAAS,UAAU,GAAiC;AAClD,MAAI,CAAC,UAAU,CAAC,GAAG;AACjB,UAAM,IAAI,MAAM,kBAAkB,CAAC;AAAA,EACrC;AACF;AAzmBA;AA2mBO,IAAM,eAAN,MAAM,aAAY;AAAA,EAGvB,YACS,QACA,SACP;AAFO;AACA;AAJT,wBAAO;AACP;AAAA,EAIG;AAAA,EAEH,IAAI,UAAU;AACZ,QAAI,CAAC,mBAAK,WAAU;AAClB,yBAAK,UAAW,IAAI,YAAY;AAAA,IAClC;AACA,WAAO,mBAAK;AAAA,EACd;AAAA,EAEA,KAAK,iBAAmC;AACtC,QAAI,OAAO,oBAAoB,UAAU;AACvC,aAAO,IAAI,aAAY,QAAW,eAAe;AAAA,IACnD;AACA,WAAO,IAAI;AAAA,MACT;AAAA,MACA,OAAO,oBAAoB,WACvB,kBACA,2BAA2B,QACzB,QAAQ,OACR,QAAQ;AAAA,IAChB;AAAA,EACF;AACF;AA1BE;AAFK,IAAM,cAAN;AA3mBP;AAyoBO,IAAM,gBAAN,MAAM,cAAa;AAAA,EAExB,YACW,QACA,SACT;AAFS;AACA;AAHX;AAAA,EAIG;AAAA,EAEH,IAAI,UAAU;AACZ,QAAI,CAAC,mBAAK,WAAU;AAClB,yBAAK,UAAW,IAAI,YAAY;AAAA,IAClC;AACA,WAAO,mBAAK;AAAA,EACd;AAAA,EAEA,KAAK,iBAAiD;AACpD,QAAI,oBAAoB,QAAQ,UAAU;AACxC,YAAM,IAAI,MAAM,cAAc;AAAA,IAChC;AACA,WAAO,IAAI;AAAA,MACT,OAAO,oBAAoB,WAAW,SAAY;AAAA,MAClD,OAAO,oBAAoB,WACvB,kBACA,2BAA2B,QACzB,QAAQ,OACR,QAAQ;AAAA,IAChB;AAAA,EACF;AACF;AA1BE;AADK,IAAM,eAAN;",
  "names": ["TagType", "coders"]
}
