@player-ui/common-types-plugin 0.15.1-next.6 → 0.15.2-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/CommonTypesPlugin.native.js +2 -2
  2. package/dist/CommonTypesPlugin.native.js.map +1 -1
  3. package/dist/cjs/index.cjs.map +1 -1
  4. package/dist/index.legacy-esm.js +0 -785
  5. package/dist/index.mjs.map +1 -1
  6. package/dist/xlr/DataTypes.BooleanType.json +72 -0
  7. package/dist/xlr/DataTypes.CollectionType.json +39 -0
  8. package/dist/xlr/DataTypes.DateType.json +55 -0
  9. package/dist/xlr/DataTypes.IntegerNNType.json +75 -0
  10. package/dist/xlr/DataTypes.IntegerPosType.json +75 -0
  11. package/dist/xlr/DataTypes.IntegerType.json +55 -0
  12. package/dist/xlr/DataTypes.PhoneType.json +55 -0
  13. package/dist/xlr/DataTypes.StringType.json +62 -0
  14. package/dist/xlr/Formatters.commaNumber.json +28 -0
  15. package/dist/xlr/Formatters.currency.json +44 -0
  16. package/dist/xlr/Formatters.date.json +28 -0
  17. package/dist/xlr/Formatters.integer.json +14 -0
  18. package/dist/xlr/Formatters.phone.json +11 -0
  19. package/dist/xlr/Validators.collection.json +6 -0
  20. package/dist/xlr/Validators.email.json +6 -0
  21. package/dist/xlr/Validators.expression.json +23 -0
  22. package/dist/xlr/Validators.integer.json +6 -0
  23. package/dist/xlr/Validators.length.json +49 -0
  24. package/dist/xlr/Validators.max.json +22 -0
  25. package/dist/xlr/Validators.min.json +22 -0
  26. package/dist/xlr/Validators.oneOf.json +25 -0
  27. package/dist/xlr/Validators.phone.json +6 -0
  28. package/dist/xlr/Validators.readonly.json +6 -0
  29. package/dist/xlr/Validators.regex.json +22 -0
  30. package/dist/xlr/Validators.required.json +32 -0
  31. package/dist/xlr/Validators.string.json +6 -0
  32. package/dist/xlr/Validators.zip.json +6 -0
  33. package/dist/xlr/manifest.js +42 -0
  34. package/dist/xlr/manifest.json +51 -0
  35. package/package.json +6 -4
  36. package/src/index.ts +44 -2
  37. package/src/validators/index.ts +3 -3
  38. package/types/index.d.ts +24 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/common-types/core/src/index.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/common-types/core/src/validators/index.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/common-types/core/src/data-types/types.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/common-types/core/src/formats/index.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/common-types/core/src/formats/utils.ts"],"sourcesContent":["import type { Player, ExtendedPlayerPlugin } from \"@player-ui/player\";\nimport { TypesProviderPlugin } from \"@player-ui/types-provider-plugin\";\n\nimport * as validators from \"./validators\";\nimport * as dataTypes from \"./data-types/types\";\nimport * as formats from \"./formats\";\nimport type {\n BooleanType,\n IntegerType,\n IntegerPosType,\n IntegerNNType,\n StringType,\n CollectionType,\n DateType,\n PhoneType,\n} from \"./data-types/types\";\n\nexport { validators, dataTypes, formats };\n\nexport * from \"./formats/utils\";\n\n/**\n * Exposes a lot of common DataTypes, validations, and formats to Player instance.\n */\nexport class CommonTypesPlugin\n implements\n ExtendedPlayerPlugin<\n [],\n [],\n [],\n [\n typeof BooleanType,\n typeof IntegerType,\n typeof IntegerPosType,\n typeof IntegerNNType,\n typeof StringType,\n typeof CollectionType,\n typeof DateType,\n typeof PhoneType,\n ]\n >\n{\n name = \"CommonTypes\";\n\n apply(player: Player) {\n player.registerPlugin(\n new TypesProviderPlugin({\n types: Object.values(dataTypes),\n formats: Object.values(formats),\n validators: Object.entries(validators),\n }),\n );\n }\n}\n","import { resolveDataRefs } from \"@player-ui/player\";\nimport type { ValidatorFunction, Expression } from \"@player-ui/player\";\n\n// Shamelessly lifted from Scott Gonzalez via the Bassistance Validation plugin http://projects.scottsplayground.com/email_address_validation/\n\nconst EMAIL_REGEX =\n // eslint-disable-next-line no-control-regex\n /^((([a-z]|\\d|[!#$%&'*+\\-/=?^_`{|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#$%&'*+-/=?^_`{|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?$/i;\nconst PHONE_REGEX = /^\\+?[1]?[- ]?\\(?\\d{3}[)\\- ]?\\s?\\d{3}[ -]?\\d{4}$/;\nconst ZIP_REGEX = /^\\d{5}(-\\d{4})?$/;\n\n/** Skip any null or undefined value when running the validator */\nfunction skipNullish<T>(\n validationFn: ValidatorFunction<T>,\n): ValidatorFunction<T> {\n return (context, value, options) => {\n if (value === null || value === undefined) {\n return;\n }\n\n return validationFn(context, value, options);\n };\n}\n\n/** Checks to see if the data-type is a string */\nexport const string: ValidatorFunction = skipNullish((context, value) => {\n if (typeof value !== \"string\") {\n const message = context.constants.getConstants(\n \"validation.string\",\n \"constants\",\n \"Value must be a string\",\n ) as string;\n\n return {\n message,\n parameters: {\n type: typeof value,\n },\n };\n }\n});\n\n/** Validation for a non-mutable property */\nexport const readonly: ValidatorFunction = (context) => {\n const message = context.constants.getConstants(\n \"validation.readonly\",\n \"constants\",\n \"Value cannot be modified\",\n ) as string;\n\n return { message };\n};\n\n/** Check to see if the value represents an array of items */\nexport const collection: ValidatorFunction = skipNullish((context, value) => {\n if (!Array.isArray(value)) {\n const message = context.constants.getConstants(\n \"validation.collection\",\n \"constants\",\n \"Cannot set collection to non-array\",\n ) as string;\n\n return { message };\n }\n});\n\n/** Checks to see if the value is an integer */\nexport const integer: ValidatorFunction = skipNullish((context, value) => {\n if (\n value &&\n (typeof value !== \"number\" ||\n Math.floor(value) !== value ||\n Number(value) > Number.MAX_SAFE_INTEGER ||\n Number(value) < Number.MIN_SAFE_INTEGER)\n ) {\n const message = context.constants.getConstants(\n \"validation.integer\",\n \"constants\",\n \"Value must be an integer\",\n ) as string;\n\n return {\n message,\n parameters: {\n type: typeof value,\n flooredValue: Math.floor(value),\n },\n };\n }\n});\n\n/** An enum check to see if the value is in a provided list of acceptable options */\nexport const oneOf: ValidatorFunction<{\n /** The enum values that are acceptable */\n options: Array<unknown>;\n}> = skipNullish((context, value, options) => {\n if (options?.options === undefined || options.options?.includes(value)) {\n return;\n }\n\n const message = context.constants.getConstants(\n \"validation.oneOf\",\n \"constants\",\n \"Invalid entry\",\n ) as string;\n\n return { message };\n});\n\n/** A validator that evaluates an expression for validation */\nexport const expression: ValidatorFunction<{\n /**\n * The expression to evaluate.\n * Falsy values indicate an invalid response\n */\n exp: Expression;\n}> = (context, value, options?) => {\n if (options?.exp === undefined) {\n context.logger.warn(\"No expression defined for validation\");\n\n return;\n }\n\n const result = context.evaluate(options.exp);\n\n if (!result) {\n const message = context.constants.getConstants(\n \"validation.expression\",\n \"constants\",\n \"Expression evaluation failed\",\n ) as string;\n\n return { message };\n }\n};\n\n/** A validator that requires a non-null value */\nexport const required: ValidatorFunction<{\n /** An optional expression to limit the required check only if true */\n if?: Expression;\n\n /** An optional expression to limit the required check only if false */\n ifNot?: Expression;\n}> = (context, value, options) => {\n if (\n (options?.if && !context.evaluate(options.if)) ||\n (options?.ifNot && context.evaluate(options.ifNot))\n ) {\n // Skipping due to if check\n return;\n }\n\n if (value === undefined || value === null || value === \"\") {\n const message = context.constants.getConstants(\n \"validation.required\",\n \"constants\",\n \"A value is required\",\n ) as string;\n\n return { message, severity: \"error\" };\n }\n};\n\n/** A validator that uses a regular expression */\nexport const regex: ValidatorFunction<{\n /**\n * The regular expression to test: /pattern/\n * Can optionally include flags after the pattern: /pattern/flags\n */\n regex: string;\n}> = skipNullish((context, value, options) => {\n if (\n value === undefined ||\n value === null ||\n value === \"\" ||\n typeof options?.regex !== \"string\"\n ) {\n return;\n }\n\n const resolvedRegex = resolveDataRefs(options.regex, context);\n // Split up /pattern/flags into [pattern, flags]\n const patternMatch = resolvedRegex.match(/^\\/(.*)\\/(\\w)*$/);\n\n const regexp = patternMatch\n ? new RegExp(patternMatch[1], patternMatch[2])\n : new RegExp(resolvedRegex);\n\n if (!regexp.test(value)) {\n const message = context.constants.getConstants(\n \"validation.regex\",\n \"constants\",\n \"Invalid entry\",\n ) as string;\n\n return { message };\n }\n});\n\n/** Checks the length of a value */\nexport const length: ValidatorFunction<\n | {\n /** The minimum length to check against */\n min?: number;\n\n /** The maximum length to check against */\n max?: number;\n }\n | {\n /** The exact length to match against */\n exact: number;\n }\n> = skipNullish((context, value, options) => {\n if (typeof options !== \"object\") {\n context.logger.warn(\"Missing comparison in length validation\");\n\n return;\n }\n\n let valLength: number | undefined;\n let itemName = \"items\";\n\n if (typeof value === \"string\") {\n valLength = value.length;\n itemName = \"characters\";\n } else if (typeof value === \"object\" && value !== null) {\n valLength = Object.keys(value).length;\n }\n\n if (valLength === undefined) {\n context.logger.warn(\n `Unable to determine a length for value of type: ${value}`,\n );\n\n return;\n }\n\n if (\"exact\" in options) {\n if (valLength !== options.exact) {\n return {\n message: `Must be exactly ${options.exact} ${itemName} long`,\n parameters: {\n validationLength: valLength,\n },\n };\n }\n\n return;\n }\n\n if (options.min !== undefined && valLength < options.min) {\n const message = context.constants.getConstants(\n \"validation.length.minimum\",\n \"constants\",\n `At least ${options.min} ${itemName} needed`,\n ) as string;\n\n return {\n message,\n parameters: {\n validationLength: valLength,\n },\n };\n }\n\n if (options.max !== undefined && valLength > options.max) {\n const message = context.constants.getConstants(\n \"validation.length.maximum\",\n \"constants\",\n `Up to ${options.max} ${itemName} allowed`,\n ) as string;\n\n return {\n message,\n parameters: {\n validationLength: valLength,\n },\n };\n }\n});\n\n/**\n * Checks that the given value is at least the expected one\n */\nexport const min: ValidatorFunction<{\n /** The minimum value */\n value: number;\n}> = skipNullish((context, value, options) => {\n if (typeof value !== \"number\" || options?.value === undefined) {\n return;\n }\n\n if (value < options.value) {\n const message = context.constants.getConstants(\n \"validation.min\",\n \"constants\",\n `Must be at least ${options.value}`,\n ) as string;\n\n return { message };\n }\n});\n\n/**\n * Checks that the given value is at least the expected one\n */\nexport const max: ValidatorFunction<{\n /** The minimum value */\n value: number;\n}> = skipNullish((context, value, options) => {\n if (typeof value !== \"number\" || options?.value === undefined) {\n return;\n }\n\n if (value > options.value) {\n const message = context.constants.getConstants(\n \"validation.max\",\n \"constants\",\n `Cannot exceed ${options.value}`,\n ) as string;\n\n return { message };\n }\n});\n\n/** Create a validator using a regular expression */\nconst stringRegexValidator = (\n test: RegExp,\n messagePath: string,\n invalidMessage: string,\n): ValidatorFunction => {\n return skipNullish((context, value) => {\n if (typeof value === \"string\" && value === \"\") {\n return;\n }\n\n if (typeof value !== \"string\" || !test.test(value)) {\n const message = context.constants.getConstants(\n messagePath,\n \"constants\",\n invalidMessage,\n ) as string;\n\n return { message };\n }\n });\n};\n\n/** Checks that the given value represents an email */\nexport const email = stringRegexValidator(\n EMAIL_REGEX,\n \"validation.email\",\n \"Improper email format\",\n);\n\n/** Checks that the given value represents a phone number */\nexport const phone = stringRegexValidator(\n PHONE_REGEX,\n \"validation.phone\",\n \"Invalid phone number\",\n);\n\n/** Checks that the given value represents a phone number */\nexport const zip = stringRegexValidator(\n ZIP_REGEX,\n \"validation.regex\",\n \"Invalid zip code\",\n);\n","import type { Schema } from \"@player-ui/player\";\n\nexport const BooleanType: Schema.DataType<boolean> = {\n type: \"BooleanType\",\n default: false,\n validation: [\n {\n type: \"oneOf\",\n message: \"Value must be true or false\",\n options: [true, false],\n },\n ],\n};\n\nexport const IntegerType: Schema.DataType<number> = {\n type: \"IntegerType\",\n validation: [\n {\n type: \"integer\",\n },\n ],\n format: {\n type: \"integer\",\n },\n};\n\nexport const IntegerPosType: Schema.DataType<number> = {\n type: \"IntegerPosType\",\n validation: [\n {\n type: \"integer\",\n },\n {\n type: \"min\",\n value: 1,\n },\n ],\n format: {\n type: \"integer\",\n },\n};\n\nexport const IntegerNNType: Schema.DataType<number> = {\n type: \"IntegerNNType\",\n validation: [\n {\n type: \"integer\",\n },\n {\n type: \"min\",\n value: 0,\n },\n ],\n format: {\n type: \"integer\",\n },\n};\n\nexport const StringType: Schema.DataType<string> = {\n type: \"StringType\",\n default: \"\",\n validation: [\n {\n type: \"string\",\n },\n ],\n format: {\n type: \"string\",\n },\n};\n\nexport const CollectionType: Schema.DataType<Array<unknown>> = {\n type: \"CollectionType\",\n validation: [\n {\n type: \"collection\",\n },\n ],\n};\n\nexport const DateType: Schema.DataType<string> = {\n type: \"DateType\",\n validation: [\n {\n type: \"string\",\n },\n ],\n format: {\n type: \"date\",\n },\n};\n\nexport const PhoneType: Schema.DataType<string> = {\n type: \"PhoneType\",\n validation: [\n {\n type: \"phone\",\n },\n ],\n format: {\n type: \"phone\",\n },\n};\n","import type { FormatType } from \"@player-ui/player\";\nimport { createMaskedNumericFormatter } from \"./utils\";\n\nconst LENGTH_OF_MAX_INT = String(Number.MAX_SAFE_INTEGER).split(\"\").length;\n\n/**\n * Converts an integer to and from a string for display\n */\nexport const integer: FormatType<number, string> = {\n name: \"integer\",\n\n /** Converts any integer to a string */\n format: (value) => {\n if (value === \"-\") {\n return value;\n }\n\n const formatted = integer.deformat?.(value) ?? value;\n\n if (typeof formatted === \"number\") {\n return String(formatted);\n }\n\n return \"\";\n },\n\n /** Converts any string or number to an integer */\n deformat: (value) => {\n if (typeof value === \"number\") {\n // Handle different zeros. Math.floor(-0) is still -0\n return Math.floor(value) + 0;\n }\n\n if (typeof value !== \"string\") {\n return;\n }\n\n const isNeg = value.replace(/[^0-9.-]/g, \"\").charAt(0) === \"-\";\n\n // Remove everything but digits and decimal\n let digits = value.replace(/[^0-9.]/g, \"\");\n const decimalPlace = digits.indexOf(\".\");\n\n if (decimalPlace > -1) {\n digits = digits.substring(0, decimalPlace);\n }\n\n if (digits.length === 0) {\n return;\n }\n\n // Can't be longer than the biggest int\n digits = digits.substr(0, LENGTH_OF_MAX_INT);\n\n const num = Number(`${isNeg ? \"-\" : \"\"}${digits}`);\n\n // Handle different zeros. Math.floor(-0) is still -0\n return Math.floor(num) + 0;\n },\n};\n\n/** Converts a number to/from a comma separated version */\nexport const commaNumber: FormatType<\n number,\n string,\n {\n /** The number of decimal places to show */\n precision?: number;\n }\n> = {\n name: \"commaNumber\",\n\n /** Go from number to number w/ commas */\n format: (_value, options) => {\n if (_value === undefined || _value === \"\") {\n return _value;\n }\n\n if (typeof _value !== \"string\" && typeof _value !== \"number\") {\n return \"\";\n }\n\n const value = String(_value);\n\n // Check to see if first valid char is a negative\n const isNeg = value.replace(/[^0-9.-]/g, \"\").charAt(0) === \"-\";\n // Remove everything but digits and decimal\n let digitAndDecimal = value.replace(/[^0-9.]/g, \"\");\n // Remove extra leading zeros\n digitAndDecimal = digitAndDecimal.replace(/^(0*)((0.)?\\d)/g, \"$2\");\n\n // Find index of first decimal point, for insertion later\n const firstDecimal = digitAndDecimal.indexOf(\".\");\n\n // Remove all non-digits i.e. extra decimal points\n const digitsOnly = digitAndDecimal.replace(/[^0-9]/g, \"\");\n\n let preDecDigits = digitsOnly;\n let postDecDigits = \"\";\n\n if (firstDecimal >= 0) {\n preDecDigits = digitsOnly\n .substring(0, firstDecimal)\n .substr(0, LENGTH_OF_MAX_INT);\n postDecDigits = digitsOnly.substring(firstDecimal);\n } else {\n preDecDigits = preDecDigits.substr(0, LENGTH_OF_MAX_INT);\n }\n\n if (options?.precision !== undefined) {\n postDecDigits = postDecDigits\n .substring(0, options.precision)\n .padEnd(options.precision, \"0\");\n }\n\n // Beautify\n preDecDigits = preDecDigits.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n if (preDecDigits === \"\" && firstDecimal === 0) {\n preDecDigits = \"0\";\n }\n\n // Put pieces together\n let retVal = preDecDigits;\n\n if (isNeg) {\n retVal = `-${retVal}`;\n }\n\n if (\n (firstDecimal >= 0 || options?.precision !== undefined) &&\n postDecDigits !== \"\"\n ) {\n retVal += `.${postDecDigits}`;\n }\n\n return retVal;\n },\n\n /** Go from string with comma's to numbers */\n deformat: (value) => {\n if (typeof value !== \"string\") {\n return value;\n }\n\n const strValue = value.replace(/,/g, \"\");\n\n if (strValue === \"\") {\n return undefined;\n }\n\n const number = Number(strValue);\n\n return isNaN(number) ||\n number > Number.MAX_SAFE_INTEGER ||\n number < Number.MIN_SAFE_INTEGER\n ? undefined\n : number;\n },\n};\n\nexport const date: FormatType<\n string,\n string,\n {\n /** The mask to use to format the date */\n mask?: string;\n }\n> = {\n name: \"date\",\n\n format: (_value, options) => {\n let value = typeof _value === \"number\" ? String(_value) : _value;\n if (_value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"string\" || value === \"\") {\n return \"\";\n }\n\n // matching anything in DDDD-DD-DD format, including invalid date like 1111-99-99\n if (value.match(/^\\d{4}[-]\\d{1,2}[-]\\d{1,2}$/)) {\n const tempVal = value.split(\"-\");\n value = `${tempVal[1]}/${tempVal[2]}/${tempVal[0]}`;\n }\n\n const dateFormat = options?.mask?.toUpperCase() ?? \"MM/DD/YYYY\";\n\n const delimiter = dateFormat.replace(/[^/.-]/g, \"\").charAt(0);\n const formatParts = dateFormat.split(delimiter);\n const valueParts = value.split(delimiter);\n const processedValueParts = [];\n let lastMatchIsFull = true;\n\n for (let index = 0; index < valueParts.length; index++) {\n let part = valueParts[index];\n\n if (lastMatchIsFull && index < formatParts.length) {\n // Remove all non-digits\n part = part.replace(/[^0-9]/g, \"\");\n const isLastExpectedField = formatParts.length - 1 === index;\n const hasDelimiterAfter = valueParts.length - 1 > index;\n const curFormat = formatParts[index];\n\n if (curFormat === \"YYYY\") {\n if (part.length > 4) {\n valueParts[index + 1] = [\n \"*\",\n part.substring(4),\n valueParts[index + 1],\n ].join(\"\");\n part = part.substring(0, 4);\n }\n\n if (part.length === 4) {\n lastMatchIsFull = true;\n processedValueParts.push(part);\n }\n\n if (part.length === 3) {\n if (isLastExpectedField || !hasDelimiterAfter) {\n lastMatchIsFull = false;\n processedValueParts.push(part);\n } else {\n valueParts[index + 1] = `*${part.substring(2)}${\n valueParts[index + 1]\n }`;\n part = part.substring(0, 2);\n }\n }\n\n if (part.length === 2) {\n // Autocomplete completes 2 digit years based on rule:\n // If autocompleted year is in this millennium up to this year + 2\n // Else put it in the last millennium\n // 19 and 20 aren't autocompleted unless there is a separator after\n let autocomplete;\n\n // If user didn't enter 2 digits, don't autocomplete YYYY\n // Otherwise, 19 and 20 aren't autocompleted unless there is a separator after\n if (\n part.length === 2 &&\n (hasDelimiterAfter ||\n (isLastExpectedField && part !== \"19\" && part !== \"20\"))\n ) {\n autocomplete = `20${part}`;\n\n if (\n part > (new Date().getFullYear() + 5).toString().substring(2)\n ) {\n autocomplete = `19${part}`;\n }\n }\n\n if (autocomplete) {\n lastMatchIsFull = true;\n processedValueParts.push(autocomplete);\n } else {\n lastMatchIsFull = false;\n processedValueParts.push(part);\n }\n }\n\n if (part.length === 1 || part.length === 0) {\n lastMatchIsFull = false;\n processedValueParts.push(part);\n }\n } else if (curFormat === \"YY\") {\n if (part.length > 2) {\n valueParts[index + 1] = [\n \"*\",\n part.substring(2),\n valueParts[index + 1],\n ].join(\"\");\n part = part.substring(0, 2);\n }\n\n if (part.length === 2) {\n lastMatchIsFull = true;\n processedValueParts.push(part);\n }\n\n if (part.length === 1 || part.length === 0) {\n lastMatchIsFull = false;\n processedValueParts.push(part);\n }\n } else {\n // Only MM and DD left\n if (part.length > 2) {\n valueParts[index + 1] = [\n \"*\",\n part.substring(2),\n valueParts[index + 1],\n ].join(\"\");\n part = part.substring(0, 2);\n }\n\n if (part.length === 2) {\n // 00 isn't a valid month or day,\n // but if they typed in a delimiter,\n // let them deal with it being wrong\n if (part === \"00\" && !hasDelimiterAfter) {\n lastMatchIsFull = false;\n processedValueParts.push(\"0\");\n } else {\n lastMatchIsFull = true;\n processedValueParts.push(part);\n }\n }\n\n if (part.length === 1) {\n if (hasDelimiterAfter) {\n lastMatchIsFull = true;\n processedValueParts.push(`0${part}`);\n } else {\n lastMatchIsFull = false;\n processedValueParts.push(part);\n }\n }\n\n if (part.length === 0) {\n lastMatchIsFull = false;\n processedValueParts.push(part);\n }\n }\n }\n }\n\n return processedValueParts.join(delimiter);\n },\n};\n\nexport const currency: FormatType<\n number,\n string,\n {\n /** The symbol to use for currency */\n currencySymbol?: string;\n\n /** Use parenthesis instead of a - sign for negative values */\n useParensForNeg?: boolean;\n\n /** The number of decimal places to show */\n precision?: number;\n }\n> = {\n name: \"currency\",\n format: (_value, options) => {\n const value = typeof _value === \"number\" ? String(_value) : _value;\n const {\n currencySymbol = \"\",\n useParensForNeg = false,\n precision = 2,\n } = options ?? {};\n\n if (value === undefined || value === \"\") {\n return value;\n }\n\n if (typeof value !== \"string\") {\n return value;\n }\n\n const sign = /^\\s*-/.test(value) ? -1 : 1;\n const dotIndex = value.indexOf(\".\");\n\n let preDecimal: string;\n let postDecimal: string;\n\n // Strip out non-digits\n // Check if first non-empty character is a minus sign\n if (dotIndex >= 0) {\n preDecimal = value.substr(0, dotIndex).replace(/\\D+/g, \"\");\n postDecimal = value.substr(dotIndex + 1).replace(/\\D+/g, \"\");\n } else {\n preDecimal = value.replace(/\\D+/g, \"\");\n postDecimal = \"0\";\n }\n\n const numericalValue = sign * Number(`${preDecimal}.${postDecimal}`);\n\n const fixedString = numericalValue.toFixed(precision);\n\n // Beautify - add commas between groups of 3 digits\n // Would need to split the string first if we had more than 3 decimal places\n const prettyString = fixedString.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n\n if (prettyString.charAt(0) === \"-\") {\n if (useParensForNeg) {\n return `(${currencySymbol}${prettyString.substring(1)})`;\n }\n\n return `-${currencySymbol}${prettyString.substring(1)}`;\n }\n\n return currencySymbol + prettyString;\n },\n deformat: (value, options) => {\n if (typeof value === \"number\") {\n return value;\n }\n\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n let deformatted = value;\n\n if (options?.currencySymbol) {\n deformatted = value.replace(options.currencySymbol, \"\");\n }\n\n return commaNumber.deformat?.(deformatted);\n },\n};\n\nconst basePhoneFormatter = createMaskedNumericFormatter(\n \"phone\",\n \"(###) ###-####\",\n);\n\nexport const phone: FormatType<string> = {\n ...basePhoneFormatter,\n deformat: (value) => basePhoneFormatter.deformat?.(value),\n format: (value) =>\n basePhoneFormatter.format?.(value === \"(\" ? \"\" : value) ?? value,\n};\n","import type { FormatType } from \"@player-ui/player\";\n\nexport const PLACEHOLDER = \"#\";\n\n/**\n * Remove any formatting characters in the 'mask' from 'value'\n *\n * @param value - The string to remove the control characters from\n * @param mask - The mask to use and test against\n * @param reserved - The reserved _slots_ (these are the chars that you expect new values to be subbed into)\n *\n * @example\n * removeFormatCharactersFromMaskedString('123-456', '###-###', ['#']) => '123456'\n */\nexport const removeFormatCharactersFromMaskedString = (\n value: string,\n mask: string,\n reserved: string[] = [PLACEHOLDER],\n): string => {\n const reservedMatchesLength = mask\n .split(\"\")\n .filter((val) => reserved.includes(val)).length;\n let replacements = 0;\n\n return value.split(\"\").reduce((newString, nextChar, nextIndex) => {\n const maskedVal = mask[nextIndex];\n\n if (maskedVal === undefined) {\n return newString;\n }\n\n if (reservedMatchesLength === replacements) {\n return newString;\n }\n\n if (reserved.includes(maskedVal)) {\n replacements++;\n return newString + nextChar;\n }\n\n /**\n * Characters will match when the incoming value is formatted, but in cases\n * where it's being pulled from the model and deformatted again, ensure we\n * don't skip over characters.\n */\n if (maskedVal !== nextChar) {\n replacements++;\n return newString + nextChar;\n }\n\n return newString;\n }, \"\");\n};\n\n/**\n * Format the given string using one of the accepted values\n * Optionally, the value can be choose to ignore case when formatting, or to autocomplete if only 1 option is viable\n * If no such option is viable, undefined is returned\n */\nexport const formatAsEnum = (\n value: string,\n acceptedValues: string[],\n options?: {\n /** Ignore the case of the provided value when comparing to the acceptedValues */\n ignoreCase?: boolean;\n\n /** If only 1 option is viable, autocomplete the value to the accepted one */\n autocomplete?: boolean;\n },\n): string | undefined => {\n const autoCompletionsByOverlapCount = acceptedValues\n .reduce<\n Array<{\n /** The size of the overlap (ranking) */\n count: number;\n\n /** One of the acceptedValues */\n target: string;\n }>\n >((validCompletions, validValue) => {\n let overlap = 0;\n\n for (\n let charIndex = 0;\n charIndex < Math.min(validValue.length, value.length);\n charIndex++\n ) {\n const validChar = options?.ignoreCase\n ? validValue[charIndex].toLowerCase()\n : validValue[charIndex];\n const actualChar = options?.ignoreCase\n ? value[charIndex].toLowerCase()\n : value[charIndex];\n\n if (validChar !== actualChar) {\n break;\n }\n\n overlap += 1;\n }\n\n if (overlap === 0) {\n return validCompletions;\n }\n\n validCompletions.push({\n count: overlap,\n target: validValue,\n });\n\n return validCompletions;\n }, [])\n .sort((e) => e.count);\n\n if (autoCompletionsByOverlapCount.length === 0) {\n return undefined;\n }\n\n if (autoCompletionsByOverlapCount.length === 1 && options?.autocomplete) {\n return autoCompletionsByOverlapCount[0].target;\n }\n\n return autoCompletionsByOverlapCount[0].target.substr(\n 0,\n autoCompletionsByOverlapCount[0].count,\n );\n};\n\n/**\n * Format the given value using the mask + match\n *\n * @param value - The string value to format\n * @param valueCharMaskMatch - A regular expression that matches characters to substitute in the match. This is typically `/\\d/g` or `/\\w/g`\n * @param mask - The mask to format against. Use # as a placeholder for\n */\nexport const formatAsMasked = (\n value: string | number,\n valueCharMaskMatch: RegExp,\n mask: string,\n): string => {\n const valStr = String(value);\n let withMask = mask;\n\n if (valStr.trim() === \"\") {\n return \"\";\n }\n\n valStr.replace(valueCharMaskMatch, (match) => {\n withMask = withMask.replace(PLACEHOLDER, match);\n\n return match;\n });\n\n return withMask.split(PLACEHOLDER)[0];\n};\n\n/**\n * Creates a format definition with the given mask\n * Use the `#` char as a placeholder for a number\n */\nexport const createMaskedNumericFormatter = (\n name: string,\n mask: string,\n): FormatType<\n string,\n string,\n {\n /** An enum of values that are also acceptable, and don't fall under the mask */\n exceptions?: Array<string>;\n }\n> => {\n return {\n name,\n format: (value, options) => {\n if (typeof value !== \"string\") {\n return value;\n }\n\n if (options?.exceptions && options.exceptions.length > 0) {\n const formattedUsingExceptions = formatAsEnum(\n value,\n options.exceptions,\n {\n autocomplete: true,\n ignoreCase: true,\n },\n );\n\n if (formattedUsingExceptions !== undefined) {\n return formattedUsingExceptions;\n }\n }\n\n return formatAsMasked(value, /\\d/g, mask);\n },\n deformat: (value, options) => {\n if (typeof value !== \"string\") {\n return value;\n }\n\n if (options?.exceptions && options.exceptions.length > 0) {\n const usingExceptions = formatAsEnum(value, options.exceptions, {\n autocomplete: false,\n ignoreCase: false,\n });\n\n if (usingExceptions !== undefined) {\n return usingExceptions;\n }\n }\n\n return formatAsMasked(value, /\\d/g, mask.replace(/[^#]/g, \"\"));\n },\n };\n};\n"],"mappings":"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","names":["integer","phone","integer","phone"]}
1
+ {"version":3,"sources":["../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/common-types/core/src/index.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/common-types/core/src/validators/index.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/common-types/core/src/data-types/types.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/common-types/core/src/formats/index.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/plugins/common-types/core/src/formats/utils.ts"],"sourcesContent":["import type { Player, ExtendedPlayerPlugin } from \"@player-ui/player\";\nimport { TypesProviderPlugin } from \"@player-ui/types-provider-plugin\";\n\nimport * as validators from \"./validators\";\nimport * as dataTypes from \"./data-types/types\";\nimport * as formats from \"./formats\";\nimport {\n BooleanType,\n IntegerType,\n IntegerPosType,\n IntegerNNType,\n StringType,\n CollectionType,\n DateType,\n PhoneType,\n} from \"./data-types/types\";\n\nimport { commaNumber, currency, date, integer, phone } from \"./formats/index\";\n\nimport {\n collection,\n email,\n expression,\n integer as vinteger,\n length,\n max,\n min,\n oneOf,\n phone as vphone,\n readonly,\n regex,\n required,\n string,\n zip,\n} from \"./validators/index\";\n\nexport { validators, dataTypes, formats };\n\nexport * from \"./formats/utils\";\n\n/**\n * Exposes a lot of common DataTypes, validations, and formats to Player instance.\n */\nexport class CommonTypesPlugin\n implements\n ExtendedPlayerPlugin<\n [],\n [],\n [],\n [\n typeof BooleanType,\n typeof IntegerType,\n typeof IntegerPosType,\n typeof IntegerNNType,\n typeof StringType,\n typeof CollectionType,\n typeof DateType,\n typeof PhoneType,\n ],\n [\n typeof commaNumber,\n typeof currency,\n typeof date,\n typeof integer,\n typeof phone,\n ],\n [\n typeof collection,\n typeof email,\n typeof expression,\n typeof vinteger,\n typeof length,\n typeof max,\n typeof min,\n typeof oneOf,\n typeof vphone,\n typeof readonly,\n typeof regex,\n typeof required,\n typeof string,\n typeof zip,\n ]\n >\n{\n name = \"CommonTypes\";\n\n apply(player: Player): void {\n player.registerPlugin(\n new TypesProviderPlugin({\n types: Object.values(dataTypes),\n formats: Object.values(formats),\n validators: Object.entries(validators),\n }),\n );\n }\n}\n","import { resolveDataRefs } from \"@player-ui/player\";\nimport type { ValidatorFunction, Expression } from \"@player-ui/player\";\n\n// Shamelessly lifted from Scott Gonzalez via the Bassistance Validation plugin http://projects.scottsplayground.com/email_address_validation/\n\nconst EMAIL_REGEX =\n // eslint-disable-next-line no-control-regex\n /^((([a-z]|\\d|[!#$%&'*+\\-/=?^_`{|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#$%&'*+-/=?^_`{|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?$/i;\nconst PHONE_REGEX = /^\\+?[1]?[- ]?\\(?\\d{3}[)\\- ]?\\s?\\d{3}[ -]?\\d{4}$/;\nconst ZIP_REGEX = /^\\d{5}(-\\d{4})?$/;\n\n/** Skip any null or undefined value when running the validator */\nfunction skipNullish<T>(\n validationFn: ValidatorFunction<T>,\n): ValidatorFunction<T> {\n return (context, value, options) => {\n if (value === null || value === undefined) {\n return;\n }\n\n return validationFn(context, value, options);\n };\n}\n\n/** Checks to see if the data-type is a string */\nexport const string: ValidatorFunction = skipNullish((context, value) => {\n if (typeof value !== \"string\") {\n const message = context.constants.getConstants(\n \"validation.string\",\n \"constants\",\n \"Value must be a string\",\n ) as string;\n\n return {\n message,\n parameters: {\n type: typeof value,\n },\n };\n }\n});\n\n/** Validation for a non-mutable property */\nexport const readonly: ValidatorFunction = (context) => {\n const message = context.constants.getConstants(\n \"validation.readonly\",\n \"constants\",\n \"Value cannot be modified\",\n ) as string;\n\n return { message };\n};\n\n/** Check to see if the value represents an array of items */\nexport const collection: ValidatorFunction = skipNullish((context, value) => {\n if (!Array.isArray(value)) {\n const message = context.constants.getConstants(\n \"validation.collection\",\n \"constants\",\n \"Cannot set collection to non-array\",\n ) as string;\n\n return { message };\n }\n});\n\n/** Checks to see if the value is an integer */\nexport const integer: ValidatorFunction = skipNullish((context, value) => {\n if (\n value &&\n (typeof value !== \"number\" ||\n Math.floor(value) !== value ||\n Number(value) > Number.MAX_SAFE_INTEGER ||\n Number(value) < Number.MIN_SAFE_INTEGER)\n ) {\n const message = context.constants.getConstants(\n \"validation.integer\",\n \"constants\",\n \"Value must be an integer\",\n ) as string;\n\n return {\n message,\n parameters: {\n type: typeof value,\n flooredValue: Math.floor(value),\n },\n };\n }\n});\n\n/** An enum check to see if the value is in a provided list of acceptable options */\nexport const oneOf: ValidatorFunction<{\n /** The enum values that are acceptable */\n options: Array<unknown>;\n}> = skipNullish((context, value, options) => {\n if (options?.options === undefined || options.options?.includes(value)) {\n return;\n }\n\n const message = context.constants.getConstants(\n \"validation.oneOf\",\n \"constants\",\n \"Invalid entry\",\n ) as string;\n\n return { message };\n});\n\n/** A validator that evaluates an expression for validation */\nexport const expression: ValidatorFunction<{\n /**\n * The expression to evaluate.\n * Falsy values indicate an invalid response\n */\n exp: Expression;\n}> = (context, value, options?) => {\n if (options?.exp === undefined) {\n context.logger.warn(\"No expression defined for validation\");\n\n return;\n }\n\n const result = context.evaluate(options.exp);\n\n if (!result) {\n const message = context.constants.getConstants(\n \"validation.expression\",\n \"constants\",\n \"Expression evaluation failed\",\n ) as string;\n\n return { message };\n }\n};\n\n/** A validator that requires a non-null value */\nexport const required: ValidatorFunction<{\n /** An optional expression to limit the required check only if true */\n if?: Expression;\n\n /** An optional expression to limit the required check only if false */\n ifNot?: Expression;\n}> = (context, value, options) => {\n if (\n (options?.if && !context.evaluate(options.if)) ||\n (options?.ifNot && context.evaluate(options.ifNot))\n ) {\n // Skipping due to if check\n return;\n }\n\n if (value === undefined || value === null || value === \"\") {\n const message = context.constants.getConstants(\n \"validation.required\",\n \"constants\",\n \"A value is required\",\n ) as string;\n\n return { message, severity: \"error\" };\n }\n};\n\n/** A validator that uses a regular expression */\nexport const regex: ValidatorFunction<{\n /**\n * The regular expression to test: /pattern/\n * Can optionally include flags after the pattern: /pattern/flags\n */\n regex: string;\n}> = skipNullish((context, value, options) => {\n if (\n value === undefined ||\n value === null ||\n value === \"\" ||\n typeof options?.regex !== \"string\"\n ) {\n return;\n }\n\n const resolvedRegex = resolveDataRefs(options.regex, context);\n // Split up /pattern/flags into [pattern, flags]\n const patternMatch = resolvedRegex.match(/^\\/(.*)\\/(\\w)*$/);\n\n const regexp = patternMatch\n ? new RegExp(patternMatch[1], patternMatch[2])\n : new RegExp(resolvedRegex);\n\n if (!regexp.test(value)) {\n const message = context.constants.getConstants(\n \"validation.regex\",\n \"constants\",\n \"Invalid entry\",\n ) as string;\n\n return { message };\n }\n});\n\n/** Checks the length of a value */\nexport const length: ValidatorFunction<\n | {\n /** The minimum length to check against */\n min?: number;\n\n /** The maximum length to check against */\n max?: number;\n }\n | {\n /** The exact length to match against */\n exact: number;\n }\n> = skipNullish((context, value, options) => {\n if (typeof options !== \"object\") {\n context.logger.warn(\"Missing comparison in length validation\");\n\n return;\n }\n\n let valLength: number | undefined;\n let itemName = \"items\";\n\n if (typeof value === \"string\") {\n valLength = value.length;\n itemName = \"characters\";\n } else if (typeof value === \"object\" && value !== null) {\n valLength = Object.keys(value).length;\n }\n\n if (valLength === undefined) {\n context.logger.warn(\n `Unable to determine a length for value of type: ${value}`,\n );\n\n return;\n }\n\n if (\"exact\" in options) {\n if (valLength !== options.exact) {\n return {\n message: `Must be exactly ${options.exact} ${itemName} long`,\n parameters: {\n validationLength: valLength,\n },\n };\n }\n\n return;\n }\n\n if (options.min !== undefined && valLength < options.min) {\n const message = context.constants.getConstants(\n \"validation.length.minimum\",\n \"constants\",\n `At least ${options.min} ${itemName} needed`,\n ) as string;\n\n return {\n message,\n parameters: {\n validationLength: valLength,\n },\n };\n }\n\n if (options.max !== undefined && valLength > options.max) {\n const message = context.constants.getConstants(\n \"validation.length.maximum\",\n \"constants\",\n `Up to ${options.max} ${itemName} allowed`,\n ) as string;\n\n return {\n message,\n parameters: {\n validationLength: valLength,\n },\n };\n }\n});\n\n/**\n * Checks that the given value is at least the expected one\n */\nexport const min: ValidatorFunction<{\n /** The minimum value */\n value: number;\n}> = skipNullish((context, value, options) => {\n if (typeof value !== \"number\" || options?.value === undefined) {\n return;\n }\n\n if (value < options.value) {\n const message = context.constants.getConstants(\n \"validation.min\",\n \"constants\",\n `Must be at least ${options.value}`,\n ) as string;\n\n return { message };\n }\n});\n\n/**\n * Checks that the given value is at least the expected one\n */\nexport const max: ValidatorFunction<{\n /** The minimum value */\n value: number;\n}> = skipNullish((context, value, options) => {\n if (typeof value !== \"number\" || options?.value === undefined) {\n return;\n }\n\n if (value > options.value) {\n const message = context.constants.getConstants(\n \"validation.max\",\n \"constants\",\n `Cannot exceed ${options.value}`,\n ) as string;\n\n return { message };\n }\n});\n\n/** Create a validator using a regular expression */\nconst stringRegexValidator = (\n test: RegExp,\n messagePath: string,\n invalidMessage: string,\n): ValidatorFunction => {\n return skipNullish((context, value) => {\n if (typeof value === \"string\" && value === \"\") {\n return;\n }\n\n if (typeof value !== \"string\" || !test.test(value)) {\n const message = context.constants.getConstants(\n messagePath,\n \"constants\",\n invalidMessage,\n ) as string;\n\n return { message };\n }\n });\n};\n\n/** Checks that the given value represents an email */\nexport const email: ValidatorFunction = stringRegexValidator(\n EMAIL_REGEX,\n \"validation.email\",\n \"Improper email format\",\n);\n\n/** Checks that the given value represents a phone number */\nexport const phone: ValidatorFunction = stringRegexValidator(\n PHONE_REGEX,\n \"validation.phone\",\n \"Invalid phone number\",\n);\n\n/** Checks that the given value represents a phone number */\nexport const zip: ValidatorFunction = stringRegexValidator(\n ZIP_REGEX,\n \"validation.regex\",\n \"Invalid zip code\",\n);\n","import type { Schema } from \"@player-ui/player\";\n\nexport const BooleanType: Schema.DataType<boolean> = {\n type: \"BooleanType\",\n default: false,\n validation: [\n {\n type: \"oneOf\",\n message: \"Value must be true or false\",\n options: [true, false],\n },\n ],\n};\n\nexport const IntegerType: Schema.DataType<number> = {\n type: \"IntegerType\",\n validation: [\n {\n type: \"integer\",\n },\n ],\n format: {\n type: \"integer\",\n },\n};\n\nexport const IntegerPosType: Schema.DataType<number> = {\n type: \"IntegerPosType\",\n validation: [\n {\n type: \"integer\",\n },\n {\n type: \"min\",\n value: 1,\n },\n ],\n format: {\n type: \"integer\",\n },\n};\n\nexport const IntegerNNType: Schema.DataType<number> = {\n type: \"IntegerNNType\",\n validation: [\n {\n type: \"integer\",\n },\n {\n type: \"min\",\n value: 0,\n },\n ],\n format: {\n type: \"integer\",\n },\n};\n\nexport const StringType: Schema.DataType<string> = {\n type: \"StringType\",\n default: \"\",\n validation: [\n {\n type: \"string\",\n },\n ],\n format: {\n type: \"string\",\n },\n};\n\nexport const CollectionType: Schema.DataType<Array<unknown>> = {\n type: \"CollectionType\",\n validation: [\n {\n type: \"collection\",\n },\n ],\n};\n\nexport const DateType: Schema.DataType<string> = {\n type: \"DateType\",\n validation: [\n {\n type: \"string\",\n },\n ],\n format: {\n type: \"date\",\n },\n};\n\nexport const PhoneType: Schema.DataType<string> = {\n type: \"PhoneType\",\n validation: [\n {\n type: \"phone\",\n },\n ],\n format: {\n type: \"phone\",\n },\n};\n","import type { FormatType } from \"@player-ui/player\";\nimport { createMaskedNumericFormatter } from \"./utils\";\n\nconst LENGTH_OF_MAX_INT = String(Number.MAX_SAFE_INTEGER).split(\"\").length;\n\n/**\n * Converts an integer to and from a string for display\n */\nexport const integer: FormatType<number, string> = {\n name: \"integer\",\n\n /** Converts any integer to a string */\n format: (value) => {\n if (value === \"-\") {\n return value;\n }\n\n const formatted = integer.deformat?.(value) ?? value;\n\n if (typeof formatted === \"number\") {\n return String(formatted);\n }\n\n return \"\";\n },\n\n /** Converts any string or number to an integer */\n deformat: (value) => {\n if (typeof value === \"number\") {\n // Handle different zeros. Math.floor(-0) is still -0\n return Math.floor(value) + 0;\n }\n\n if (typeof value !== \"string\") {\n return;\n }\n\n const isNeg = value.replace(/[^0-9.-]/g, \"\").charAt(0) === \"-\";\n\n // Remove everything but digits and decimal\n let digits = value.replace(/[^0-9.]/g, \"\");\n const decimalPlace = digits.indexOf(\".\");\n\n if (decimalPlace > -1) {\n digits = digits.substring(0, decimalPlace);\n }\n\n if (digits.length === 0) {\n return;\n }\n\n // Can't be longer than the biggest int\n digits = digits.substr(0, LENGTH_OF_MAX_INT);\n\n const num = Number(`${isNeg ? \"-\" : \"\"}${digits}`);\n\n // Handle different zeros. Math.floor(-0) is still -0\n return Math.floor(num) + 0;\n },\n};\n\n/** Converts a number to/from a comma separated version */\nexport const commaNumber: FormatType<\n number,\n string,\n {\n /** The number of decimal places to show */\n precision?: number;\n }\n> = {\n name: \"commaNumber\",\n\n /** Go from number to number w/ commas */\n format: (_value, options) => {\n if (_value === undefined || _value === \"\") {\n return _value;\n }\n\n if (typeof _value !== \"string\" && typeof _value !== \"number\") {\n return \"\";\n }\n\n const value = String(_value);\n\n // Check to see if first valid char is a negative\n const isNeg = value.replace(/[^0-9.-]/g, \"\").charAt(0) === \"-\";\n // Remove everything but digits and decimal\n let digitAndDecimal = value.replace(/[^0-9.]/g, \"\");\n // Remove extra leading zeros\n digitAndDecimal = digitAndDecimal.replace(/^(0*)((0.)?\\d)/g, \"$2\");\n\n // Find index of first decimal point, for insertion later\n const firstDecimal = digitAndDecimal.indexOf(\".\");\n\n // Remove all non-digits i.e. extra decimal points\n const digitsOnly = digitAndDecimal.replace(/[^0-9]/g, \"\");\n\n let preDecDigits = digitsOnly;\n let postDecDigits = \"\";\n\n if (firstDecimal >= 0) {\n preDecDigits = digitsOnly\n .substring(0, firstDecimal)\n .substr(0, LENGTH_OF_MAX_INT);\n postDecDigits = digitsOnly.substring(firstDecimal);\n } else {\n preDecDigits = preDecDigits.substr(0, LENGTH_OF_MAX_INT);\n }\n\n if (options?.precision !== undefined) {\n postDecDigits = postDecDigits\n .substring(0, options.precision)\n .padEnd(options.precision, \"0\");\n }\n\n // Beautify\n preDecDigits = preDecDigits.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n if (preDecDigits === \"\" && firstDecimal === 0) {\n preDecDigits = \"0\";\n }\n\n // Put pieces together\n let retVal = preDecDigits;\n\n if (isNeg) {\n retVal = `-${retVal}`;\n }\n\n if (\n (firstDecimal >= 0 || options?.precision !== undefined) &&\n postDecDigits !== \"\"\n ) {\n retVal += `.${postDecDigits}`;\n }\n\n return retVal;\n },\n\n /** Go from string with comma's to numbers */\n deformat: (value) => {\n if (typeof value !== \"string\") {\n return value;\n }\n\n const strValue = value.replace(/,/g, \"\");\n\n if (strValue === \"\") {\n return undefined;\n }\n\n const number = Number(strValue);\n\n return isNaN(number) ||\n number > Number.MAX_SAFE_INTEGER ||\n number < Number.MIN_SAFE_INTEGER\n ? undefined\n : number;\n },\n};\n\nexport const date: FormatType<\n string,\n string,\n {\n /** The mask to use to format the date */\n mask?: string;\n }\n> = {\n name: \"date\",\n\n format: (_value, options) => {\n let value = typeof _value === \"number\" ? String(_value) : _value;\n if (_value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"string\" || value === \"\") {\n return \"\";\n }\n\n // matching anything in DDDD-DD-DD format, including invalid date like 1111-99-99\n if (value.match(/^\\d{4}[-]\\d{1,2}[-]\\d{1,2}$/)) {\n const tempVal = value.split(\"-\");\n value = `${tempVal[1]}/${tempVal[2]}/${tempVal[0]}`;\n }\n\n const dateFormat = options?.mask?.toUpperCase() ?? \"MM/DD/YYYY\";\n\n const delimiter = dateFormat.replace(/[^/.-]/g, \"\").charAt(0);\n const formatParts = dateFormat.split(delimiter);\n const valueParts = value.split(delimiter);\n const processedValueParts = [];\n let lastMatchIsFull = true;\n\n for (let index = 0; index < valueParts.length; index++) {\n let part = valueParts[index];\n\n if (lastMatchIsFull && index < formatParts.length) {\n // Remove all non-digits\n part = part.replace(/[^0-9]/g, \"\");\n const isLastExpectedField = formatParts.length - 1 === index;\n const hasDelimiterAfter = valueParts.length - 1 > index;\n const curFormat = formatParts[index];\n\n if (curFormat === \"YYYY\") {\n if (part.length > 4) {\n valueParts[index + 1] = [\n \"*\",\n part.substring(4),\n valueParts[index + 1],\n ].join(\"\");\n part = part.substring(0, 4);\n }\n\n if (part.length === 4) {\n lastMatchIsFull = true;\n processedValueParts.push(part);\n }\n\n if (part.length === 3) {\n if (isLastExpectedField || !hasDelimiterAfter) {\n lastMatchIsFull = false;\n processedValueParts.push(part);\n } else {\n valueParts[index + 1] = `*${part.substring(2)}${\n valueParts[index + 1]\n }`;\n part = part.substring(0, 2);\n }\n }\n\n if (part.length === 2) {\n // Autocomplete completes 2 digit years based on rule:\n // If autocompleted year is in this millennium up to this year + 2\n // Else put it in the last millennium\n // 19 and 20 aren't autocompleted unless there is a separator after\n let autocomplete;\n\n // If user didn't enter 2 digits, don't autocomplete YYYY\n // Otherwise, 19 and 20 aren't autocompleted unless there is a separator after\n if (\n part.length === 2 &&\n (hasDelimiterAfter ||\n (isLastExpectedField && part !== \"19\" && part !== \"20\"))\n ) {\n autocomplete = `20${part}`;\n\n if (\n part > (new Date().getFullYear() + 5).toString().substring(2)\n ) {\n autocomplete = `19${part}`;\n }\n }\n\n if (autocomplete) {\n lastMatchIsFull = true;\n processedValueParts.push(autocomplete);\n } else {\n lastMatchIsFull = false;\n processedValueParts.push(part);\n }\n }\n\n if (part.length === 1 || part.length === 0) {\n lastMatchIsFull = false;\n processedValueParts.push(part);\n }\n } else if (curFormat === \"YY\") {\n if (part.length > 2) {\n valueParts[index + 1] = [\n \"*\",\n part.substring(2),\n valueParts[index + 1],\n ].join(\"\");\n part = part.substring(0, 2);\n }\n\n if (part.length === 2) {\n lastMatchIsFull = true;\n processedValueParts.push(part);\n }\n\n if (part.length === 1 || part.length === 0) {\n lastMatchIsFull = false;\n processedValueParts.push(part);\n }\n } else {\n // Only MM and DD left\n if (part.length > 2) {\n valueParts[index + 1] = [\n \"*\",\n part.substring(2),\n valueParts[index + 1],\n ].join(\"\");\n part = part.substring(0, 2);\n }\n\n if (part.length === 2) {\n // 00 isn't a valid month or day,\n // but if they typed in a delimiter,\n // let them deal with it being wrong\n if (part === \"00\" && !hasDelimiterAfter) {\n lastMatchIsFull = false;\n processedValueParts.push(\"0\");\n } else {\n lastMatchIsFull = true;\n processedValueParts.push(part);\n }\n }\n\n if (part.length === 1) {\n if (hasDelimiterAfter) {\n lastMatchIsFull = true;\n processedValueParts.push(`0${part}`);\n } else {\n lastMatchIsFull = false;\n processedValueParts.push(part);\n }\n }\n\n if (part.length === 0) {\n lastMatchIsFull = false;\n processedValueParts.push(part);\n }\n }\n }\n }\n\n return processedValueParts.join(delimiter);\n },\n};\n\nexport const currency: FormatType<\n number,\n string,\n {\n /** The symbol to use for currency */\n currencySymbol?: string;\n\n /** Use parenthesis instead of a - sign for negative values */\n useParensForNeg?: boolean;\n\n /** The number of decimal places to show */\n precision?: number;\n }\n> = {\n name: \"currency\",\n format: (_value, options) => {\n const value = typeof _value === \"number\" ? String(_value) : _value;\n const {\n currencySymbol = \"\",\n useParensForNeg = false,\n precision = 2,\n } = options ?? {};\n\n if (value === undefined || value === \"\") {\n return value;\n }\n\n if (typeof value !== \"string\") {\n return value;\n }\n\n const sign = /^\\s*-/.test(value) ? -1 : 1;\n const dotIndex = value.indexOf(\".\");\n\n let preDecimal: string;\n let postDecimal: string;\n\n // Strip out non-digits\n // Check if first non-empty character is a minus sign\n if (dotIndex >= 0) {\n preDecimal = value.substr(0, dotIndex).replace(/\\D+/g, \"\");\n postDecimal = value.substr(dotIndex + 1).replace(/\\D+/g, \"\");\n } else {\n preDecimal = value.replace(/\\D+/g, \"\");\n postDecimal = \"0\";\n }\n\n const numericalValue = sign * Number(`${preDecimal}.${postDecimal}`);\n\n const fixedString = numericalValue.toFixed(precision);\n\n // Beautify - add commas between groups of 3 digits\n // Would need to split the string first if we had more than 3 decimal places\n const prettyString = fixedString.replace(/\\B(?=(\\d{3})+(?!\\d))/g, \",\");\n\n if (prettyString.charAt(0) === \"-\") {\n if (useParensForNeg) {\n return `(${currencySymbol}${prettyString.substring(1)})`;\n }\n\n return `-${currencySymbol}${prettyString.substring(1)}`;\n }\n\n return currencySymbol + prettyString;\n },\n deformat: (value, options) => {\n if (typeof value === \"number\") {\n return value;\n }\n\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n let deformatted = value;\n\n if (options?.currencySymbol) {\n deformatted = value.replace(options.currencySymbol, \"\");\n }\n\n return commaNumber.deformat?.(deformatted);\n },\n};\n\nconst basePhoneFormatter = createMaskedNumericFormatter(\n \"phone\",\n \"(###) ###-####\",\n);\n\nexport const phone: FormatType<string> = {\n ...basePhoneFormatter,\n deformat: (value) => basePhoneFormatter.deformat?.(value),\n format: (value) =>\n basePhoneFormatter.format?.(value === \"(\" ? \"\" : value) ?? value,\n};\n","import type { FormatType } from \"@player-ui/player\";\n\nexport const PLACEHOLDER = \"#\";\n\n/**\n * Remove any formatting characters in the 'mask' from 'value'\n *\n * @param value - The string to remove the control characters from\n * @param mask - The mask to use and test against\n * @param reserved - The reserved _slots_ (these are the chars that you expect new values to be subbed into)\n *\n * @example\n * removeFormatCharactersFromMaskedString('123-456', '###-###', ['#']) => '123456'\n */\nexport const removeFormatCharactersFromMaskedString = (\n value: string,\n mask: string,\n reserved: string[] = [PLACEHOLDER],\n): string => {\n const reservedMatchesLength = mask\n .split(\"\")\n .filter((val) => reserved.includes(val)).length;\n let replacements = 0;\n\n return value.split(\"\").reduce((newString, nextChar, nextIndex) => {\n const maskedVal = mask[nextIndex];\n\n if (maskedVal === undefined) {\n return newString;\n }\n\n if (reservedMatchesLength === replacements) {\n return newString;\n }\n\n if (reserved.includes(maskedVal)) {\n replacements++;\n return newString + nextChar;\n }\n\n /**\n * Characters will match when the incoming value is formatted, but in cases\n * where it's being pulled from the model and deformatted again, ensure we\n * don't skip over characters.\n */\n if (maskedVal !== nextChar) {\n replacements++;\n return newString + nextChar;\n }\n\n return newString;\n }, \"\");\n};\n\n/**\n * Format the given string using one of the accepted values\n * Optionally, the value can be choose to ignore case when formatting, or to autocomplete if only 1 option is viable\n * If no such option is viable, undefined is returned\n */\nexport const formatAsEnum = (\n value: string,\n acceptedValues: string[],\n options?: {\n /** Ignore the case of the provided value when comparing to the acceptedValues */\n ignoreCase?: boolean;\n\n /** If only 1 option is viable, autocomplete the value to the accepted one */\n autocomplete?: boolean;\n },\n): string | undefined => {\n const autoCompletionsByOverlapCount = acceptedValues\n .reduce<\n Array<{\n /** The size of the overlap (ranking) */\n count: number;\n\n /** One of the acceptedValues */\n target: string;\n }>\n >((validCompletions, validValue) => {\n let overlap = 0;\n\n for (\n let charIndex = 0;\n charIndex < Math.min(validValue.length, value.length);\n charIndex++\n ) {\n const validChar = options?.ignoreCase\n ? validValue[charIndex].toLowerCase()\n : validValue[charIndex];\n const actualChar = options?.ignoreCase\n ? value[charIndex].toLowerCase()\n : value[charIndex];\n\n if (validChar !== actualChar) {\n break;\n }\n\n overlap += 1;\n }\n\n if (overlap === 0) {\n return validCompletions;\n }\n\n validCompletions.push({\n count: overlap,\n target: validValue,\n });\n\n return validCompletions;\n }, [])\n .sort((e) => e.count);\n\n if (autoCompletionsByOverlapCount.length === 0) {\n return undefined;\n }\n\n if (autoCompletionsByOverlapCount.length === 1 && options?.autocomplete) {\n return autoCompletionsByOverlapCount[0].target;\n }\n\n return autoCompletionsByOverlapCount[0].target.substr(\n 0,\n autoCompletionsByOverlapCount[0].count,\n );\n};\n\n/**\n * Format the given value using the mask + match\n *\n * @param value - The string value to format\n * @param valueCharMaskMatch - A regular expression that matches characters to substitute in the match. This is typically `/\\d/g` or `/\\w/g`\n * @param mask - The mask to format against. Use # as a placeholder for\n */\nexport const formatAsMasked = (\n value: string | number,\n valueCharMaskMatch: RegExp,\n mask: string,\n): string => {\n const valStr = String(value);\n let withMask = mask;\n\n if (valStr.trim() === \"\") {\n return \"\";\n }\n\n valStr.replace(valueCharMaskMatch, (match) => {\n withMask = withMask.replace(PLACEHOLDER, match);\n\n return match;\n });\n\n return withMask.split(PLACEHOLDER)[0];\n};\n\n/**\n * Creates a format definition with the given mask\n * Use the `#` char as a placeholder for a number\n */\nexport const createMaskedNumericFormatter = (\n name: string,\n mask: string,\n): FormatType<\n string,\n string,\n {\n /** An enum of values that are also acceptable, and don't fall under the mask */\n exceptions?: Array<string>;\n }\n> => {\n return {\n name,\n format: (value, options) => {\n if (typeof value !== \"string\") {\n return value;\n }\n\n if (options?.exceptions && options.exceptions.length > 0) {\n const formattedUsingExceptions = formatAsEnum(\n value,\n options.exceptions,\n {\n autocomplete: true,\n ignoreCase: true,\n },\n );\n\n if (formattedUsingExceptions !== undefined) {\n return formattedUsingExceptions;\n }\n }\n\n return formatAsMasked(value, /\\d/g, mask);\n },\n deformat: (value, options) => {\n if (typeof value !== \"string\") {\n return value;\n }\n\n if (options?.exceptions && options.exceptions.length > 0) {\n const usingExceptions = formatAsEnum(value, options.exceptions, {\n autocomplete: false,\n ignoreCase: false,\n });\n\n if (usingExceptions !== undefined) {\n return usingExceptions;\n }\n }\n\n return formatAsMasked(value, /\\d/g, mask.replace(/[^#]/g, \"\"));\n },\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mCAAoC;;;ACDpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAgC;AAKhC,IAAM;AAAA;AAAA,EAEJ;AAAA;AACF,IAAM,cAAc;AACpB,IAAM,YAAY;AAGlB,SAAS,YACP,cACsB;AACtB,SAAO,CAAC,SAAS,OAAO,YAAY;AAClC,QAAI,UAAU,QAAQ,UAAU,QAAW;AACzC;AAAA,IACF;AAEA,WAAO,aAAa,SAAS,OAAO,OAAO;AAAA,EAC7C;AACF;AAGO,IAAM,SAA4B,YAAY,CAAC,SAAS,UAAU;AACvE,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,UAAU,QAAQ,UAAU;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,YAAY;AAAA,QACV,MAAM,OAAO;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGM,IAAM,WAA8B,CAAC,YAAY;AACtD,QAAM,UAAU,QAAQ,UAAU;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ;AACnB;AAGO,IAAM,aAAgC,YAAY,CAAC,SAAS,UAAU;AAC3E,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,UAAM,UAAU,QAAQ,UAAU;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ;AAAA,EACnB;AACF,CAAC;AAGM,IAAM,UAA6B,YAAY,CAAC,SAAS,UAAU;AACxE,MACE,UACC,OAAO,UAAU,YAChB,KAAK,MAAM,KAAK,MAAM,SACtB,OAAO,KAAK,IAAI,OAAO,oBACvB,OAAO,KAAK,IAAI,OAAO,mBACzB;AACA,UAAM,UAAU,QAAQ,UAAU;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,YAAY;AAAA,QACV,MAAM,OAAO;AAAA,QACb,cAAc,KAAK,MAAM,KAAK;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGM,IAAM,QAGR,YAAY,CAAC,SAAS,OAAO,YAAY;AAC5C,MAAI,SAAS,YAAY,UAAa,QAAQ,SAAS,SAAS,KAAK,GAAG;AACtE;AAAA,EACF;AAEA,QAAM,UAAU,QAAQ,UAAU;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ;AACnB,CAAC;AAGM,IAAM,aAMR,CAAC,SAAS,OAAO,YAAa;AACjC,MAAI,SAAS,QAAQ,QAAW;AAC9B,YAAQ,OAAO,KAAK,sCAAsC;AAE1D;AAAA,EACF;AAEA,QAAM,SAAS,QAAQ,SAAS,QAAQ,GAAG;AAE3C,MAAI,CAAC,QAAQ;AACX,UAAM,UAAU,QAAQ,UAAU;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ;AAAA,EACnB;AACF;AAGO,IAAM,WAMR,CAAC,SAAS,OAAO,YAAY;AAChC,MACG,SAAS,MAAM,CAAC,QAAQ,SAAS,QAAQ,EAAE,KAC3C,SAAS,SAAS,QAAQ,SAAS,QAAQ,KAAK,GACjD;AAEA;AAAA,EACF;AAEA,MAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,IAAI;AACzD,UAAM,UAAU,QAAQ,UAAU;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,EAAE,SAAS,UAAU,QAAQ;AAAA,EACtC;AACF;AAGO,IAAM,QAMR,YAAY,CAAC,SAAS,OAAO,YAAY;AAC5C,MACE,UAAU,UACV,UAAU,QACV,UAAU,MACV,OAAO,SAAS,UAAU,UAC1B;AACA;AAAA,EACF;AAEA,QAAM,oBAAgB,+BAAgB,QAAQ,OAAO,OAAO;AAE5D,QAAM,eAAe,cAAc,MAAM,iBAAiB;AAE1D,QAAM,SAAS,eACX,IAAI,OAAO,aAAa,CAAC,GAAG,aAAa,CAAC,CAAC,IAC3C,IAAI,OAAO,aAAa;AAE5B,MAAI,CAAC,OAAO,KAAK,KAAK,GAAG;AACvB,UAAM,UAAU,QAAQ,UAAU;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ;AAAA,EACnB;AACF,CAAC;AAGM,IAAM,SAYT,YAAY,CAAC,SAAS,OAAO,YAAY;AAC3C,MAAI,OAAO,YAAY,UAAU;AAC/B,YAAQ,OAAO,KAAK,yCAAyC;AAE7D;AAAA,EACF;AAEA,MAAI;AACJ,MAAI,WAAW;AAEf,MAAI,OAAO,UAAU,UAAU;AAC7B,gBAAY,MAAM;AAClB,eAAW;AAAA,EACb,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM;AACtD,gBAAY,OAAO,KAAK,KAAK,EAAE;AAAA,EACjC;AAEA,MAAI,cAAc,QAAW;AAC3B,YAAQ,OAAO;AAAA,MACb,mDAAmD,KAAK;AAAA,IAC1D;AAEA;AAAA,EACF;AAEA,MAAI,WAAW,SAAS;AACtB,QAAI,cAAc,QAAQ,OAAO;AAC/B,aAAO;AAAA,QACL,SAAS,mBAAmB,QAAQ,KAAK,IAAI,QAAQ;AAAA,QACrD,YAAY;AAAA,UACV,kBAAkB;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ,UAAa,YAAY,QAAQ,KAAK;AACxD,UAAM,UAAU,QAAQ,UAAU;AAAA,MAChC;AAAA,MACA;AAAA,MACA,YAAY,QAAQ,GAAG,IAAI,QAAQ;AAAA,IACrC;AAEA,WAAO;AAAA,MACL;AAAA,MACA,YAAY;AAAA,QACV,kBAAkB;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ,UAAa,YAAY,QAAQ,KAAK;AACxD,UAAM,UAAU,QAAQ,UAAU;AAAA,MAChC;AAAA,MACA;AAAA,MACA,SAAS,QAAQ,GAAG,IAAI,QAAQ;AAAA,IAClC;AAEA,WAAO;AAAA,MACL;AAAA,MACA,YAAY;AAAA,QACV,kBAAkB;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAKM,IAAM,MAGR,YAAY,CAAC,SAAS,OAAO,YAAY;AAC5C,MAAI,OAAO,UAAU,YAAY,SAAS,UAAU,QAAW;AAC7D;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ,OAAO;AACzB,UAAM,UAAU,QAAQ,UAAU;AAAA,MAChC;AAAA,MACA;AAAA,MACA,oBAAoB,QAAQ,KAAK;AAAA,IACnC;AAEA,WAAO,EAAE,QAAQ;AAAA,EACnB;AACF,CAAC;AAKM,IAAM,MAGR,YAAY,CAAC,SAAS,OAAO,YAAY;AAC5C,MAAI,OAAO,UAAU,YAAY,SAAS,UAAU,QAAW;AAC7D;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ,OAAO;AACzB,UAAM,UAAU,QAAQ,UAAU;AAAA,MAChC;AAAA,MACA;AAAA,MACA,iBAAiB,QAAQ,KAAK;AAAA,IAChC;AAEA,WAAO,EAAE,QAAQ;AAAA,EACnB;AACF,CAAC;AAGD,IAAM,uBAAuB,CAC3B,MACA,aACA,mBACsB;AACtB,SAAO,YAAY,CAAC,SAAS,UAAU;AACrC,QAAI,OAAO,UAAU,YAAY,UAAU,IAAI;AAC7C;AAAA,IACF;AAEA,QAAI,OAAO,UAAU,YAAY,CAAC,KAAK,KAAK,KAAK,GAAG;AAClD,YAAM,UAAU,QAAQ,UAAU;AAAA,QAChC;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,aAAO,EAAE,QAAQ;AAAA,IACnB;AAAA,EACF,CAAC;AACH;AAGO,IAAM,QAA2B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,QAA2B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,MAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AACF;;;AC/WA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,IAAM,cAAwC;AAAA,EACnD,MAAM;AAAA,EACN,SAAS;AAAA,EACT,YAAY;AAAA,IACV;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,CAAC,MAAM,KAAK;AAAA,IACvB;AAAA,EACF;AACF;AAEO,IAAM,cAAuC;AAAA,EAClD,MAAM;AAAA,EACN,YAAY;AAAA,IACV;AAAA,MACE,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,EACR;AACF;AAEO,IAAM,iBAA0C;AAAA,EACrD,MAAM;AAAA,EACN,YAAY;AAAA,IACV;AAAA,MACE,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,EACR;AACF;AAEO,IAAM,gBAAyC;AAAA,EACpD,MAAM;AAAA,EACN,YAAY;AAAA,IACV;AAAA,MACE,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,EACR;AACF;AAEO,IAAM,aAAsC;AAAA,EACjD,MAAM;AAAA,EACN,SAAS;AAAA,EACT,YAAY;AAAA,IACV;AAAA,MACE,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,EACR;AACF;AAEO,IAAM,iBAAkD;AAAA,EAC7D,MAAM;AAAA,EACN,YAAY;AAAA,IACV;AAAA,MACE,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEO,IAAM,WAAoC;AAAA,EAC/C,MAAM;AAAA,EACN,YAAY;AAAA,IACV;AAAA,MACE,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,EACR;AACF;AAEO,IAAM,YAAqC;AAAA,EAChD,MAAM;AAAA,EACN,YAAY;AAAA,IACV;AAAA,MACE,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,EACR;AACF;;;ACtGA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAAA;AAAA,EAAA,aAAAC;AAAA;;;ACEO,IAAM,cAAc;AAYpB,IAAM,yCAAyC,CACpD,OACA,MACA,WAAqB,CAAC,WAAW,MACtB;AACX,QAAM,wBAAwB,KAC3B,MAAM,EAAE,EACR,OAAO,CAAC,QAAQ,SAAS,SAAS,GAAG,CAAC,EAAE;AAC3C,MAAI,eAAe;AAEnB,SAAO,MAAM,MAAM,EAAE,EAAE,OAAO,CAAC,WAAW,UAAU,cAAc;AAChE,UAAM,YAAY,KAAK,SAAS;AAEhC,QAAI,cAAc,QAAW;AAC3B,aAAO;AAAA,IACT;AAEA,QAAI,0BAA0B,cAAc;AAC1C,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,SAAS,SAAS,GAAG;AAChC;AACA,aAAO,YAAY;AAAA,IACrB;AAOA,QAAI,cAAc,UAAU;AAC1B;AACA,aAAO,YAAY;AAAA,IACrB;AAEA,WAAO;AAAA,EACT,GAAG,EAAE;AACP;AAOO,IAAM,eAAe,CAC1B,OACA,gBACA,YAOuB;AACvB,QAAM,gCAAgC,eACnC,OAQC,CAAC,kBAAkB,eAAe;AAClC,QAAI,UAAU;AAEd,aACM,YAAY,GAChB,YAAY,KAAK,IAAI,WAAW,QAAQ,MAAM,MAAM,GACpD,aACA;AACA,YAAM,YAAY,SAAS,aACvB,WAAW,SAAS,EAAE,YAAY,IAClC,WAAW,SAAS;AACxB,YAAM,aAAa,SAAS,aACxB,MAAM,SAAS,EAAE,YAAY,IAC7B,MAAM,SAAS;AAEnB,UAAI,cAAc,YAAY;AAC5B;AAAA,MACF;AAEA,iBAAW;AAAA,IACb;AAEA,QAAI,YAAY,GAAG;AACjB,aAAO;AAAA,IACT;AAEA,qBAAiB,KAAK;AAAA,MACpB,OAAO;AAAA,MACP,QAAQ;AAAA,IACV,CAAC;AAED,WAAO;AAAA,EACT,GAAG,CAAC,CAAC,EACJ,KAAK,CAAC,MAAM,EAAE,KAAK;AAEtB,MAAI,8BAA8B,WAAW,GAAG;AAC9C,WAAO;AAAA,EACT;AAEA,MAAI,8BAA8B,WAAW,KAAK,SAAS,cAAc;AACvE,WAAO,8BAA8B,CAAC,EAAE;AAAA,EAC1C;AAEA,SAAO,8BAA8B,CAAC,EAAE,OAAO;AAAA,IAC7C;AAAA,IACA,8BAA8B,CAAC,EAAE;AAAA,EACnC;AACF;AASO,IAAM,iBAAiB,CAC5B,OACA,oBACA,SACW;AACX,QAAM,SAAS,OAAO,KAAK;AAC3B,MAAI,WAAW;AAEf,MAAI,OAAO,KAAK,MAAM,IAAI;AACxB,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,oBAAoB,CAAC,UAAU;AAC5C,eAAW,SAAS,QAAQ,aAAa,KAAK;AAE9C,WAAO;AAAA,EACT,CAAC;AAED,SAAO,SAAS,MAAM,WAAW,EAAE,CAAC;AACtC;AAMO,IAAM,+BAA+B,CAC1C,MACA,SAQG;AACH,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,CAAC,OAAO,YAAY;AAC1B,UAAI,OAAO,UAAU,UAAU;AAC7B,eAAO;AAAA,MACT;AAEA,UAAI,SAAS,cAAc,QAAQ,WAAW,SAAS,GAAG;AACxD,cAAM,2BAA2B;AAAA,UAC/B;AAAA,UACA,QAAQ;AAAA,UACR;AAAA,YACE,cAAc;AAAA,YACd,YAAY;AAAA,UACd;AAAA,QACF;AAEA,YAAI,6BAA6B,QAAW;AAC1C,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,aAAO,eAAe,OAAO,OAAO,IAAI;AAAA,IAC1C;AAAA,IACA,UAAU,CAAC,OAAO,YAAY;AAC5B,UAAI,OAAO,UAAU,UAAU;AAC7B,eAAO;AAAA,MACT;AAEA,UAAI,SAAS,cAAc,QAAQ,WAAW,SAAS,GAAG;AACxD,cAAM,kBAAkB,aAAa,OAAO,QAAQ,YAAY;AAAA,UAC9D,cAAc;AAAA,UACd,YAAY;AAAA,QACd,CAAC;AAED,YAAI,oBAAoB,QAAW;AACjC,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,aAAO,eAAe,OAAO,OAAO,KAAK,QAAQ,SAAS,EAAE,CAAC;AAAA,IAC/D;AAAA,EACF;AACF;;;ADnNA,IAAM,oBAAoB,OAAO,OAAO,gBAAgB,EAAE,MAAM,EAAE,EAAE;AAK7D,IAAMC,WAAsC;AAAA,EACjD,MAAM;AAAA;AAAA,EAGN,QAAQ,CAAC,UAAU;AACjB,QAAI,UAAU,KAAK;AACjB,aAAO;AAAA,IACT;AAEA,UAAM,YAAYA,SAAQ,WAAW,KAAK,KAAK;AAE/C,QAAI,OAAO,cAAc,UAAU;AACjC,aAAO,OAAO,SAAS;AAAA,IACzB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,UAAU,CAAC,UAAU;AACnB,QAAI,OAAO,UAAU,UAAU;AAE7B,aAAO,KAAK,MAAM,KAAK,IAAI;AAAA,IAC7B;AAEA,QAAI,OAAO,UAAU,UAAU;AAC7B;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,QAAQ,aAAa,EAAE,EAAE,OAAO,CAAC,MAAM;AAG3D,QAAI,SAAS,MAAM,QAAQ,YAAY,EAAE;AACzC,UAAM,eAAe,OAAO,QAAQ,GAAG;AAEvC,QAAI,eAAe,IAAI;AACrB,eAAS,OAAO,UAAU,GAAG,YAAY;AAAA,IAC3C;AAEA,QAAI,OAAO,WAAW,GAAG;AACvB;AAAA,IACF;AAGA,aAAS,OAAO,OAAO,GAAG,iBAAiB;AAE3C,UAAM,MAAM,OAAO,GAAG,QAAQ,MAAM,EAAE,GAAG,MAAM,EAAE;AAGjD,WAAO,KAAK,MAAM,GAAG,IAAI;AAAA,EAC3B;AACF;AAGO,IAAM,cAOT;AAAA,EACF,MAAM;AAAA;AAAA,EAGN,QAAQ,CAAC,QAAQ,YAAY;AAC3B,QAAI,WAAW,UAAa,WAAW,IAAI;AACzC,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,WAAW,YAAY,OAAO,WAAW,UAAU;AAC5D,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,OAAO,MAAM;AAG3B,UAAM,QAAQ,MAAM,QAAQ,aAAa,EAAE,EAAE,OAAO,CAAC,MAAM;AAE3D,QAAI,kBAAkB,MAAM,QAAQ,YAAY,EAAE;AAElD,sBAAkB,gBAAgB,QAAQ,mBAAmB,IAAI;AAGjE,UAAM,eAAe,gBAAgB,QAAQ,GAAG;AAGhD,UAAM,aAAa,gBAAgB,QAAQ,WAAW,EAAE;AAExD,QAAI,eAAe;AACnB,QAAI,gBAAgB;AAEpB,QAAI,gBAAgB,GAAG;AACrB,qBAAe,WACZ,UAAU,GAAG,YAAY,EACzB,OAAO,GAAG,iBAAiB;AAC9B,sBAAgB,WAAW,UAAU,YAAY;AAAA,IACnD,OAAO;AACL,qBAAe,aAAa,OAAO,GAAG,iBAAiB;AAAA,IACzD;AAEA,QAAI,SAAS,cAAc,QAAW;AACpC,sBAAgB,cACb,UAAU,GAAG,QAAQ,SAAS,EAC9B,OAAO,QAAQ,WAAW,GAAG;AAAA,IAClC;AAGA,mBAAe,aAAa,QAAQ,yBAAyB,GAAG;AAChE,QAAI,iBAAiB,MAAM,iBAAiB,GAAG;AAC7C,qBAAe;AAAA,IACjB;AAGA,QAAI,SAAS;AAEb,QAAI,OAAO;AACT,eAAS,IAAI,MAAM;AAAA,IACrB;AAEA,SACG,gBAAgB,KAAK,SAAS,cAAc,WAC7C,kBAAkB,IAClB;AACA,gBAAU,IAAI,aAAa;AAAA,IAC7B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,UAAU,CAAC,UAAU;AACnB,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,MAAM,QAAQ,MAAM,EAAE;AAEvC,QAAI,aAAa,IAAI;AACnB,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,OAAO,QAAQ;AAE9B,WAAO,MAAM,MAAM,KACjB,SAAS,OAAO,oBAChB,SAAS,OAAO,mBACd,SACA;AAAA,EACN;AACF;AAEO,IAAM,OAOT;AAAA,EACF,MAAM;AAAA,EAEN,QAAQ,CAAC,QAAQ,YAAY;AAC3B,QAAI,QAAQ,OAAO,WAAW,WAAW,OAAO,MAAM,IAAI;AAC1D,QAAI,WAAW,QAAW;AACxB,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,UAAU,YAAY,UAAU,IAAI;AAC7C,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,MAAM,6BAA6B,GAAG;AAC9C,YAAM,UAAU,MAAM,MAAM,GAAG;AAC/B,cAAQ,GAAG,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC;AAAA,IACnD;AAEA,UAAM,aAAa,SAAS,MAAM,YAAY,KAAK;AAEnD,UAAM,YAAY,WAAW,QAAQ,WAAW,EAAE,EAAE,OAAO,CAAC;AAC5D,UAAM,cAAc,WAAW,MAAM,SAAS;AAC9C,UAAM,aAAa,MAAM,MAAM,SAAS;AACxC,UAAM,sBAAsB,CAAC;AAC7B,QAAI,kBAAkB;AAEtB,aAAS,QAAQ,GAAG,QAAQ,WAAW,QAAQ,SAAS;AACtD,UAAI,OAAO,WAAW,KAAK;AAE3B,UAAI,mBAAmB,QAAQ,YAAY,QAAQ;AAEjD,eAAO,KAAK,QAAQ,WAAW,EAAE;AACjC,cAAM,sBAAsB,YAAY,SAAS,MAAM;AACvD,cAAM,oBAAoB,WAAW,SAAS,IAAI;AAClD,cAAM,YAAY,YAAY,KAAK;AAEnC,YAAI,cAAc,QAAQ;AACxB,cAAI,KAAK,SAAS,GAAG;AACnB,uBAAW,QAAQ,CAAC,IAAI;AAAA,cACtB;AAAA,cACA,KAAK,UAAU,CAAC;AAAA,cAChB,WAAW,QAAQ,CAAC;AAAA,YACtB,EAAE,KAAK,EAAE;AACT,mBAAO,KAAK,UAAU,GAAG,CAAC;AAAA,UAC5B;AAEA,cAAI,KAAK,WAAW,GAAG;AACrB,8BAAkB;AAClB,gCAAoB,KAAK,IAAI;AAAA,UAC/B;AAEA,cAAI,KAAK,WAAW,GAAG;AACrB,gBAAI,uBAAuB,CAAC,mBAAmB;AAC7C,gCAAkB;AAClB,kCAAoB,KAAK,IAAI;AAAA,YAC/B,OAAO;AACL,yBAAW,QAAQ,CAAC,IAAI,IAAI,KAAK,UAAU,CAAC,CAAC,GAC3C,WAAW,QAAQ,CAAC,CACtB;AACA,qBAAO,KAAK,UAAU,GAAG,CAAC;AAAA,YAC5B;AAAA,UACF;AAEA,cAAI,KAAK,WAAW,GAAG;AAKrB,gBAAI;AAIJ,gBACE,KAAK,WAAW,MACf,qBACE,uBAAuB,SAAS,QAAQ,SAAS,OACpD;AACA,6BAAe,KAAK,IAAI;AAExB,kBACE,SAAQ,oBAAI,KAAK,GAAE,YAAY,IAAI,GAAG,SAAS,EAAE,UAAU,CAAC,GAC5D;AACA,+BAAe,KAAK,IAAI;AAAA,cAC1B;AAAA,YACF;AAEA,gBAAI,cAAc;AAChB,gCAAkB;AAClB,kCAAoB,KAAK,YAAY;AAAA,YACvC,OAAO;AACL,gCAAkB;AAClB,kCAAoB,KAAK,IAAI;AAAA,YAC/B;AAAA,UACF;AAEA,cAAI,KAAK,WAAW,KAAK,KAAK,WAAW,GAAG;AAC1C,8BAAkB;AAClB,gCAAoB,KAAK,IAAI;AAAA,UAC/B;AAAA,QACF,WAAW,cAAc,MAAM;AAC7B,cAAI,KAAK,SAAS,GAAG;AACnB,uBAAW,QAAQ,CAAC,IAAI;AAAA,cACtB;AAAA,cACA,KAAK,UAAU,CAAC;AAAA,cAChB,WAAW,QAAQ,CAAC;AAAA,YACtB,EAAE,KAAK,EAAE;AACT,mBAAO,KAAK,UAAU,GAAG,CAAC;AAAA,UAC5B;AAEA,cAAI,KAAK,WAAW,GAAG;AACrB,8BAAkB;AAClB,gCAAoB,KAAK,IAAI;AAAA,UAC/B;AAEA,cAAI,KAAK,WAAW,KAAK,KAAK,WAAW,GAAG;AAC1C,8BAAkB;AAClB,gCAAoB,KAAK,IAAI;AAAA,UAC/B;AAAA,QACF,OAAO;AAEL,cAAI,KAAK,SAAS,GAAG;AACnB,uBAAW,QAAQ,CAAC,IAAI;AAAA,cACtB;AAAA,cACA,KAAK,UAAU,CAAC;AAAA,cAChB,WAAW,QAAQ,CAAC;AAAA,YACtB,EAAE,KAAK,EAAE;AACT,mBAAO,KAAK,UAAU,GAAG,CAAC;AAAA,UAC5B;AAEA,cAAI,KAAK,WAAW,GAAG;AAIrB,gBAAI,SAAS,QAAQ,CAAC,mBAAmB;AACvC,gCAAkB;AAClB,kCAAoB,KAAK,GAAG;AAAA,YAC9B,OAAO;AACL,gCAAkB;AAClB,kCAAoB,KAAK,IAAI;AAAA,YAC/B;AAAA,UACF;AAEA,cAAI,KAAK,WAAW,GAAG;AACrB,gBAAI,mBAAmB;AACrB,gCAAkB;AAClB,kCAAoB,KAAK,IAAI,IAAI,EAAE;AAAA,YACrC,OAAO;AACL,gCAAkB;AAClB,kCAAoB,KAAK,IAAI;AAAA,YAC/B;AAAA,UACF;AAEA,cAAI,KAAK,WAAW,GAAG;AACrB,8BAAkB;AAClB,gCAAoB,KAAK,IAAI;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,oBAAoB,KAAK,SAAS;AAAA,EAC3C;AACF;AAEO,IAAM,WAaT;AAAA,EACF,MAAM;AAAA,EACN,QAAQ,CAAC,QAAQ,YAAY;AAC3B,UAAM,QAAQ,OAAO,WAAW,WAAW,OAAO,MAAM,IAAI;AAC5D,UAAM;AAAA,MACJ,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,YAAY;AAAA,IACd,IAAI,WAAW,CAAC;AAEhB,QAAI,UAAU,UAAa,UAAU,IAAI;AACvC,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,QAAQ,KAAK,KAAK,IAAI,KAAK;AACxC,UAAM,WAAW,MAAM,QAAQ,GAAG;AAElC,QAAI;AACJ,QAAI;AAIJ,QAAI,YAAY,GAAG;AACjB,mBAAa,MAAM,OAAO,GAAG,QAAQ,EAAE,QAAQ,QAAQ,EAAE;AACzD,oBAAc,MAAM,OAAO,WAAW,CAAC,EAAE,QAAQ,QAAQ,EAAE;AAAA,IAC7D,OAAO;AACL,mBAAa,MAAM,QAAQ,QAAQ,EAAE;AACrC,oBAAc;AAAA,IAChB;AAEA,UAAM,iBAAiB,OAAO,OAAO,GAAG,UAAU,IAAI,WAAW,EAAE;AAEnE,UAAM,cAAc,eAAe,QAAQ,SAAS;AAIpD,UAAM,eAAe,YAAY,QAAQ,yBAAyB,GAAG;AAErE,QAAI,aAAa,OAAO,CAAC,MAAM,KAAK;AAClC,UAAI,iBAAiB;AACnB,eAAO,IAAI,cAAc,GAAG,aAAa,UAAU,CAAC,CAAC;AAAA,MACvD;AAEA,aAAO,IAAI,cAAc,GAAG,aAAa,UAAU,CAAC,CAAC;AAAA,IACvD;AAEA,WAAO,iBAAiB;AAAA,EAC1B;AAAA,EACA,UAAU,CAAC,OAAO,YAAY;AAC5B,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO;AAAA,IACT;AAEA,QAAI,cAAc;AAElB,QAAI,SAAS,gBAAgB;AAC3B,oBAAc,MAAM,QAAQ,QAAQ,gBAAgB,EAAE;AAAA,IACxD;AAEA,WAAO,YAAY,WAAW,WAAW;AAAA,EAC3C;AACF;AAEA,IAAM,qBAAqB;AAAA,EACzB;AAAA,EACA;AACF;AAEO,IAAMC,SAA4B;AAAA,EACvC,GAAG;AAAA,EACH,UAAU,CAAC,UAAU,mBAAmB,WAAW,KAAK;AAAA,EACxD,QAAQ,CAAC,UACP,mBAAmB,SAAS,UAAU,MAAM,KAAK,KAAK,KAAK;AAC/D;;;AH/XO,IAAM,oBAAN,MAwCP;AAAA,EAxCO;AAyCL,gBAAO;AAAA;AAAA,EAEP,MAAM,QAAsB;AAC1B,WAAO;AAAA,MACL,IAAI,iDAAoB;AAAA,QACtB,OAAO,OAAO,OAAO,aAAS;AAAA,QAC9B,SAAS,OAAO,OAAO,eAAO;AAAA,QAC9B,YAAY,OAAO,QAAQ,kBAAU;AAAA,MACvC,CAAC;AAAA,IACH;AAAA,EACF;AACF;","names":["integer","phone","integer","phone"]}