{"version":3,"file":"index.js","sources":["../../../../../src/sheep/helper/index.js"],"sourcesContent":["import test from './test.js'\r\nimport { round } from './digit.js'\r\n/**\r\n * @description 如果value小于min,取min;如果value大于max,取max\r\n * @param {number} min\r\n * @param {number} max\r\n * @param {number} value\r\n */\r\nfunction range(min = 0, max = 0, value = 0) {\r\n return Math.max(min, Math.min(max, Number(value)))\r\n}\r\n\r\n/**\r\n * @description 用于获取用户传递值的px值 如果用户传递了\"xxpx\"或者\"xxrpx\",取出其数值部分,如果是\"xxxrpx\"还需要用过uni.upx2px进行转换\r\n * @param {number|string} value 用户传递值的px值\r\n * @param {boolean} unit\r\n * @returns {number|string}\r\n */\r\nexport function getPx(value, unit = false) {\r\n if (test.number(value)) {\r\n return unit ? `${value}px` : Number(value)\r\n }\r\n // 如果带有rpx,先取出其数值部分,再转为px值\r\n if (/(rpx|upx)$/.test(value)) {\r\n return unit ? `${uni.upx2px(parseInt(value))}px` : Number(uni.upx2px(parseInt(value)))\r\n }\r\n return unit ? `${parseInt(value)}px` : parseInt(value)\r\n}\r\n\r\n/**\r\n * @description 进行延时,以达到可以简写代码的目的\r\n * @param {number} value 堵塞时间 单位ms 毫秒\r\n * @returns {Promise} 返回promise\r\n */\r\nexport function sleep(value = 30) {\r\n return new Promise((resolve) => {\r\n setTimeout(() => {\r\n resolve()\r\n }, value)\r\n })\r\n}\r\n/**\r\n * @description 运行期判断平台\r\n * @returns {string} 返回所在平台(小写)\r\n * @link 运行期判断平台 https://uniapp.dcloud.io/frame?id=判断平台\r\n */\r\nexport function os() {\r\n return uni.getSystemInfoSync().platform.toLowerCase()\r\n}\r\n/**\r\n * @description 获取系统信息同步接口\r\n * @link 获取系统信息同步接口 https://uniapp.dcloud.io/api/system/info?id=getsysteminfosync\r\n */\r\nexport function sys() {\r\n return uni.getSystemInfoSync()\r\n}\r\n\r\n/**\r\n * @description 取一个区间数\r\n * @param {Number} min 最小值\r\n * @param {Number} max 最大值\r\n */\r\nfunction random(min, max) {\r\n if (min >= 0 && max > 0 && max >= min) {\r\n const gab = max - min + 1\r\n return Math.floor(Math.random() * gab + min)\r\n }\r\n return 0\r\n}\r\n\r\n/**\r\n * @param {Number} len uuid的长度\r\n * @param {Boolean} firstU 将返回的首字母置为\"u\"\r\n * @param {Nubmer} radix 生成uuid的基数(意味着返回的字符串都是这个基数),2-二进制,8-八进制,10-十进制,16-十六进制\r\n */\r\nexport function guid(len = 32, firstU = true, radix = null) {\r\n const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')\r\n const uuid = []\r\n radix = radix || chars.length\r\n\r\n if (len) {\r\n // 如果指定uuid长度,只是取随机的字符,0|x为位运算,能去掉x的小数位,返回整数位\r\n for (let i = 0; i < len; i++) uuid[i] = chars[0 | (Math.random() * radix)]\r\n } else {\r\n let r\r\n // rfc4122标准要求返回的uuid中,某些位为固定的字符\r\n uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'\r\n uuid[14] = '4'\r\n\r\n for (let i = 0; i < 36; i++) {\r\n if (!uuid[i]) {\r\n r = 0 | (Math.random() * 16)\r\n uuid[i] = chars[i == 19 ? (r & 0x3) | 0x8 : r]\r\n }\r\n }\r\n }\r\n // 移除第一个字符,并用u替代,因为第一个字符为数值时,该guuid不能用作id或者class\r\n if (firstU) {\r\n uuid.shift()\r\n return `u${uuid.join('')}`\r\n }\r\n return uuid.join('')\r\n}\r\n\r\n/**\r\n* @description 获取父组件的参数,因为支付宝小程序不支持provide/inject的写法\r\n this.$parent在非H5中,可以准确获取到父组件,但是在H5中,需要多次this.$parent.$parent.xxx\r\n 这里默认值等于undefined有它的含义,因为最顶层元素(组件)的$parent就是undefined,意味着不传name\r\n 值(默认为undefined),就是查找最顶层的$parent\r\n* @param {string|undefined} name 父组件的参数名\r\n*/\r\nexport function $parent(name = undefined) {\r\n let parent = this.$parent\r\n // 通过while历遍,这里主要是为了H5需要多层解析的问题\r\n while (parent) {\r\n // 父组件\r\n if (parent.$options && parent.$options.name !== name) {\r\n // 如果组件的name不相等,继续上一级寻找\r\n parent = parent.$parent\r\n } else {\r\n return parent\r\n }\r\n }\r\n return false\r\n}\r\n\r\n/**\r\n * @description 样式转换\r\n * 对象转字符串,或者字符串转对象\r\n * @param {object | string} customStyle 需要转换的目标\r\n * @param {String} target 转换的目的,object-转为对象,string-转为字符串\r\n * @returns {object|string}\r\n */\r\nexport function addStyle(customStyle, target = 'object') {\r\n // 字符串转字符串,对象转对象情形,直接返回\r\n if (\r\n test.empty(customStyle) ||\r\n (typeof customStyle === 'object' && target === 'object') ||\r\n (target === 'string' && typeof customStyle === 'string')\r\n ) {\r\n return customStyle\r\n }\r\n // 字符串转对象\r\n if (target === 'object') {\r\n // 去除字符串样式中的两端空格(中间的空格不能去掉,比如padding: 20px 0如果去掉了就错了),空格是无用的\r\n customStyle = trim(customStyle)\r\n // 根据\";\"将字符串转为数组形式\r\n const styleArray = customStyle.split(';')\r\n const style = {}\r\n // 历遍数组,拼接成对象\r\n for (let i = 0; i < styleArray.length; i++) {\r\n // 'font-size:20px;color:red;',如此最后字符串有\";\"的话,会导致styleArray最后一个元素为空字符串,这里需要过滤\r\n if (styleArray[i]) {\r\n const item = styleArray[i].split(':')\r\n style[trim(item[0])] = trim(item[1])\r\n }\r\n }\r\n return style\r\n }\r\n // 这里为对象转字符串形式\r\n let string = ''\r\n for (const i in customStyle) {\r\n // 驼峰转为中划线的形式,否则css内联样式,无法识别驼峰样式属性名\r\n const key = i.replace(/([A-Z])/g, '-$1').toLowerCase()\r\n string += `${key}:${customStyle[i]};`\r\n }\r\n // 去除两端空格\r\n return trim(string)\r\n}\r\n\r\n/**\r\n * @description 添加单位,如果有rpx,upx,%,px等单位结尾或者值为auto,直接返回,否则加上px单位结尾\r\n * @param {string|number} value 需要添加单位的值\r\n * @param {string} unit 添加的单位名 比如px\r\n */\r\nexport function addUnit(value = 'auto', unit = 'px') {\r\n value = String(value)\r\n return test.number(value) ? `${value}${unit}` : value\r\n}\r\n\r\n/**\r\n * @description 深度克隆\r\n * @param {object} obj 需要深度克隆的对象\r\n * @returns {*} 克隆后的对象或者原值(不是对象)\r\n */\r\nfunction deepClone(obj) {\r\n // 对常见的“非”值,直接返回原来值\r\n if ([null, undefined, NaN, false].includes(obj)) return obj\r\n if (typeof obj !== 'object' && typeof obj !== 'function') {\r\n // 原始类型直接返回\r\n return obj\r\n }\r\n const o = test.array(obj) ? [] : {}\r\n for (const i in obj) {\r\n if (obj.hasOwnProperty(i)) {\r\n o[i] = typeof obj[i] === 'object' ? deepClone(obj[i]) : obj[i]\r\n }\r\n }\r\n return o\r\n}\r\n\r\n/**\r\n * @description JS对象深度合并\r\n * @param {object} target 需要拷贝的对象\r\n * @param {object} source 拷贝的来源对象\r\n * @returns {object|boolean} 深度合并后的对象或者false(入参有不是对象)\r\n */\r\nexport function deepMerge(target = {}, source = {}) {\r\n target = deepClone(target)\r\n if (typeof target !== 'object' || typeof source !== 'object') return false\r\n for (const prop in source) {\r\n if (!source.hasOwnProperty(prop)) continue\r\n if (prop in target) {\r\n if (typeof target[prop] !== 'object') {\r\n target[prop] = source[prop]\r\n } else if (typeof source[prop] !== 'object') {\r\n target[prop] = source[prop]\r\n } else if (target[prop].concat && source[prop].concat) {\r\n target[prop] = target[prop].concat(source[prop])\r\n } else {\r\n target[prop] = deepMerge(target[prop], source[prop])\r\n }\r\n } else {\r\n target[prop] = source[prop]\r\n }\r\n }\r\n return target\r\n}\r\n\r\n/**\r\n * @description error提示\r\n * @param {*} err 错误内容\r\n */\r\nfunction error(err) {\r\n // 开发环境才提示,生产环境不会提示\r\n if (process.env.NODE_ENV === 'development') {\r\n console.error(`SheepJS:${err}`)\r\n }\r\n}\r\n\r\n/**\r\n * @description 打乱数组\r\n * @param {array} array 需要打乱的数组\r\n * @returns {array} 打乱后的数组\r\n */\r\nfunction randomArray(array = []) {\r\n // 原理是sort排序,Math.random()产生0<= x < 1之间的数,会导致x-0.05大于或者小于0\r\n return array.sort(() => Math.random() - 0.5)\r\n}\r\n\r\n// padStart 的 polyfill,因为某些机型或情况,还无法支持es7的padStart,比如电脑版的微信小程序\r\n// 所以这里做一个兼容polyfill的兼容处理\r\nif (!String.prototype.padStart) {\r\n // 为了方便表示这里 fillString 用了ES6 的默认参数,不影响理解\r\n String.prototype.padStart = function (maxLength, fillString = ' ') {\r\n if (Object.prototype.toString.call(fillString) !== '[object String]') {\r\n throw new TypeError('fillString must be String')\r\n }\r\n const str = this\r\n // 返回 String(str) 这里是为了使返回的值是字符串字面量,在控制台中更符合直觉\r\n if (str.length >= maxLength) return String(str)\r\n\r\n const fillLength = maxLength - str.length\r\n let times = Math.ceil(fillLength / fillString.length)\r\n while ((times >>= 1)) {\r\n fillString += fillString\r\n if (times === 1) {\r\n fillString += fillString\r\n }\r\n }\r\n return fillString.slice(0, fillLength) + str\r\n }\r\n}\r\n\r\n/**\r\n * @description 格式化时间\r\n * @param {String|Number} dateTime 需要格式化的时间戳\r\n * @param {String} fmt 格式化规则 yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合 默认yyyy-mm-dd\r\n * @returns {string} 返回格式化后的字符串\r\n */\r\nfunction timeFormat(dateTime = null, formatStr = 'yyyy-mm-dd') {\r\n let date\r\n // 若传入时间为假值,则取当前时间\r\n if (!dateTime) {\r\n date = new Date()\r\n }\r\n // 若为unix秒时间戳,则转为毫秒时间戳(逻辑有点奇怪,但不敢改,以保证历史兼容)\r\n else if (/^\\d{10}$/.test(dateTime?.toString().trim())) {\r\n date = new Date(dateTime * 1000)\r\n }\r\n // 若用户传入字符串格式时间戳,new Date无法解析,需做兼容\r\n else if (typeof dateTime === 'string' && /^\\d+$/.test(dateTime.trim())) {\r\n date = new Date(Number(dateTime))\r\n }\r\n // 其他都认为符合 RFC 2822 规范\r\n else {\r\n // 处理平台性差异,在Safari/Webkit中,new Date仅支持/作为分割符的字符串时间\r\n date = new Date(typeof dateTime === 'string' ? dateTime.replace(/-/g, '/') : dateTime)\r\n }\r\n\r\n const timeSource = {\r\n y: date.getFullYear().toString(), // 年\r\n m: (date.getMonth() + 1).toString().padStart(2, '0'), // 月\r\n d: date.getDate().toString().padStart(2, '0'), // 日\r\n h: date.getHours().toString().padStart(2, '0'), // 时\r\n M: date.getMinutes().toString().padStart(2, '0'), // 分\r\n s: date.getSeconds().toString().padStart(2, '0'), // 秒\r\n // 有其他格式化字符需求可以继续添加,必须转化成字符串\r\n }\r\n\r\n for (const key in timeSource) {\r\n const [ret] = new RegExp(`${key}+`).exec(formatStr) || []\r\n if (ret) {\r\n // 年可能只需展示两位\r\n const beginIndex = key === 'y' && ret.length === 2 ? 2 : 0\r\n formatStr = formatStr.replace(ret, timeSource[key].slice(beginIndex))\r\n }\r\n }\r\n\r\n return formatStr\r\n}\r\n\r\n/**\r\n * @description 时间戳转为多久之前\r\n * @param {String|Number} timestamp 时间戳\r\n * @param {String|Boolean} format\r\n * 格式化规则如果为时间格式字符串,超出一定时间范围,返回固定的时间格式;\r\n * 如果为布尔值false,无论什么时间,都返回多久以前的格式\r\n * @returns {string} 转化后的内容\r\n */\r\nfunction timeFrom(timestamp = null, format = 'yyyy-mm-dd') {\r\n if (timestamp == null) timestamp = Number(new Date())\r\n timestamp = parseInt(timestamp)\r\n // 判断用户输入的时间戳是秒还是毫秒,一般前端js获取的时间戳是毫秒(13位),后端传过来的为秒(10位)\r\n if (timestamp.toString().length == 10) timestamp *= 1000\r\n let timer = new Date().getTime() - timestamp\r\n timer = parseInt(timer / 1000)\r\n // 如果小于5分钟,则返回\"刚刚\",其他以此类推\r\n let tips = ''\r\n switch (true) {\r\n case timer < 300:\r\n tips = '刚刚'\r\n break\r\n case timer >= 300 && timer < 3600:\r\n tips = `${parseInt(timer / 60)}分钟前`\r\n break\r\n case timer >= 3600 && timer < 86400:\r\n tips = `${parseInt(timer / 3600)}小时前`\r\n break\r\n case timer >= 86400 && timer < 2592000:\r\n tips = `${parseInt(timer / 86400)}天前`\r\n break\r\n default:\r\n // 如果format为false,则无论什么时间戳,都显示xx之前\r\n if (format === false) {\r\n if (timer >= 2592000 && timer < 365 * 86400) {\r\n tips = `${parseInt(timer / (86400 * 30))}个月前`\r\n } else {\r\n tips = `${parseInt(timer / (86400 * 365))}年前`\r\n }\r\n } else {\r\n tips = timeFormat(timestamp, format)\r\n }\r\n }\r\n return tips\r\n}\r\n\r\n/**\r\n * @description 去除空格\r\n * @param String str 需要去除空格的字符串\r\n * @param String pos both(左右)|left|right|all 默认both\r\n */\r\nfunction trim(str, pos = 'both') {\r\n str = String(str)\r\n if (pos == 'both') {\r\n return str.replace(/^\\s+|\\s+$/g, '')\r\n }\r\n if (pos == 'left') {\r\n return str.replace(/^\\s*/, '')\r\n }\r\n if (pos == 'right') {\r\n return str.replace(/(\\s*$)/g, '')\r\n }\r\n if (pos == 'all') {\r\n return str.replace(/\\s+/g, '')\r\n }\r\n return str\r\n}\r\n\r\n/**\r\n * @description 对象转url参数\r\n * @param {object} data,对象\r\n * @param {Boolean} isPrefix,是否自动加上\"?\"\r\n * @param {string} arrayFormat 规则 indices|brackets|repeat|comma\r\n */\r\nfunction queryParams(data = {}, isPrefix = true, arrayFormat = 'brackets') {\r\n const prefix = isPrefix ? '?' : ''\r\n const _result = []\r\n if (['indices', 'brackets', 'repeat', 'comma'].indexOf(arrayFormat) == -1)\r\n arrayFormat = 'brackets'\r\n for (const key in data) {\r\n const value = data[key]\r\n // 去掉为空的参数\r\n if (['', undefined, null].indexOf(value) >= 0) {\r\n continue\r\n }\r\n // 如果值为数组,另行处理\r\n if (value.constructor === Array) {\r\n // e.g. {ids: [1, 2, 3]}\r\n switch (arrayFormat) {\r\n case 'indices':\r\n // 结果: ids[0]=1&ids[1]=2&ids[2]=3\r\n for (let i = 0; i < value.length; i++) {\r\n _result.push(`${key}[${i}]=${value[i]}`)\r\n }\r\n break\r\n case 'brackets':\r\n // 结果: ids[]=1&ids[]=2&ids[]=3\r\n value.forEach((_value) => {\r\n _result.push(`${key}[]=${_value}`)\r\n })\r\n break\r\n case 'repeat':\r\n // 结果: ids=1&ids=2&ids=3\r\n value.forEach((_value) => {\r\n _result.push(`${key}=${_value}`)\r\n })\r\n break\r\n case 'comma':\r\n // 结果: ids=1,2,3\r\n let commaStr = ''\r\n value.forEach((_value) => {\r\n commaStr += (commaStr ? ',' : '') + _value\r\n })\r\n _result.push(`${key}=${commaStr}`)\r\n break\r\n default:\r\n value.forEach((_value) => {\r\n _result.push(`${key}[]=${_value}`)\r\n })\r\n }\r\n } else {\r\n _result.push(`${key}=${value}`)\r\n }\r\n }\r\n return _result.length ? prefix + _result.join('&') : ''\r\n}\r\n\r\n/**\r\n * 显示消息提示框\r\n * @param {String} title 提示的内容,长度与 icon 取值有关。\r\n * @param {Number} duration 提示的延迟时间,单位毫秒,默认:2000\r\n */\r\nfunction toast(title, duration = 2000) {\r\n uni.showToast({\r\n title: String(title),\r\n icon: 'none',\r\n duration,\r\n })\r\n}\r\n\r\n/**\r\n * @description 根据主题type值,获取对应的图标\r\n * @param {String} type 主题名称,primary|info|error|warning|success\r\n * @param {boolean} fill 是否使用fill填充实体的图标\r\n */\r\nfunction type2icon(type = 'success', fill = false) {\r\n // 如果非预置值,默认为success\r\n if (['primary', 'info', 'error', 'warning', 'success'].indexOf(type) == -1) type = 'success'\r\n let iconName = ''\r\n // 目前(2019-12-12),info和primary使用同一个图标\r\n switch (type) {\r\n case 'primary':\r\n iconName = 'info-circle'\r\n break\r\n case 'info':\r\n iconName = 'info-circle'\r\n break\r\n case 'error':\r\n iconName = 'close-circle'\r\n break\r\n case 'warning':\r\n iconName = 'error-circle'\r\n break\r\n case 'success':\r\n iconName = 'checkmark-circle'\r\n break\r\n default:\r\n iconName = 'checkmark-circle'\r\n }\r\n // 是否是实体类型,加上-fill,在icon组件库中,实体的类名是后面加-fill的\r\n if (fill) iconName += '-fill'\r\n return iconName\r\n}\r\n\r\n/**\r\n * @description 数字格式化\r\n * @param {number|string} number 要格式化的数字\r\n * @param {number} decimals 保留几位小数\r\n * @param {string} decimalPoint 小数点符号\r\n * @param {string} thousandsSeparator 千分位符号\r\n * @returns {string} 格式化后的数字\r\n */\r\nfunction priceFormat(number, decimals = 0, decimalPoint = '.', thousandsSeparator = ',') {\r\n number = `${number}`.replace(/[^0-9+-Ee.]/g, '')\r\n const n = !isFinite(+number) ? 0 : +number\r\n const prec = !isFinite(+decimals) ? 0 : Math.abs(decimals)\r\n const sep = typeof thousandsSeparator === 'undefined' ? ',' : thousandsSeparator\r\n const dec = typeof decimalPoint === 'undefined' ? '.' : decimalPoint\r\n let s = ''\r\n\r\n s = (prec ? round(n, prec) + '' : `${Math.round(n)}`).split('.')\r\n const re = /(-?\\d+)(\\d{3})/\r\n while (re.test(s[0])) {\r\n s[0] = s[0].replace(re, `$1${sep}$2`)\r\n }\r\n\r\n if ((s[1] || '').length < prec) {\r\n s[1] = s[1] || ''\r\n s[1] += new Array(prec - s[1].length + 1).join('0')\r\n }\r\n return s.join(dec)\r\n}\r\n\r\n/**\r\n * @description 获取duration值\r\n * 如果带有ms或者s直接返回,如果大于一定值,认为是ms单位,小于一定值,认为是s单位\r\n * 比如以30位阈值,那么300大于30,可以理解为用户想要的是300ms,而不是想花300s去执行一个动画\r\n * @param {String|number} value 比如: \"1s\"|\"100ms\"|1|100\r\n * @param {boolean} unit 提示: 如果是false 默认返回number\r\n * @return {string|number}\r\n */\r\nfunction getDuration(value, unit = true) {\r\n const valueNum = parseInt(value)\r\n if (unit) {\r\n if (/s$/.test(value)) return value\r\n return value > 30 ? `${value}ms` : `${value}s`\r\n }\r\n if (/ms$/.test(value)) return valueNum\r\n if (/s$/.test(value)) return valueNum > 30 ? valueNum : valueNum * 1000\r\n return valueNum\r\n}\r\n\r\n/**\r\n * @description 日期的月或日补零操作\r\n * @param {String} value 需要补零的值\r\n */\r\nfunction padZero(value) {\r\n return `00${value}`.slice(-2)\r\n}\r\n\r\n/**\r\n * @description 获取某个对象下的属性,用于通过类似'a.b.c'的形式去获取一个对象的的属性的形式\r\n * @param {object} obj 对象\r\n * @param {string} key 需要获取的属性字段\r\n * @returns {*}\r\n */\r\nfunction getProperty(obj, key) {\r\n if (!obj) {\r\n return\r\n }\r\n if (typeof key !== 'string' || key === '') {\r\n return ''\r\n }\r\n if (key.indexOf('.') !== -1) {\r\n const keys = key.split('.')\r\n let firstObj = obj[keys[0]] || {}\r\n\r\n for (let i = 1; i < keys.length; i++) {\r\n if (firstObj) {\r\n firstObj = firstObj[keys[i]]\r\n }\r\n }\r\n return firstObj\r\n }\r\n return obj[key]\r\n}\r\n\r\n/**\r\n * @description 设置对象的属性值,如果'a.b.c'的形式进行设置\r\n * @param {object} obj 对象\r\n * @param {string} key 需要设置的属性\r\n * @param {string} value 设置的值\r\n */\r\nfunction setProperty(obj, key, value) {\r\n if (!obj) {\r\n return\r\n }\r\n // 递归赋值\r\n const inFn = function (_obj, keys, v) {\r\n // 最后一个属性key\r\n if (keys.length === 1) {\r\n _obj[keys[0]] = v\r\n return\r\n }\r\n // 0~length-1个key\r\n while (keys.length > 1) {\r\n const k = keys[0]\r\n if (!_obj[k] || typeof _obj[k] !== 'object') {\r\n _obj[k] = {}\r\n }\r\n const key = keys.shift()\r\n // 自调用判断是否存在属性,不存在则自动创建对象\r\n inFn(_obj[k], keys, v)\r\n }\r\n }\r\n\r\n if (typeof key !== 'string' || key === '') {\r\n } else if (key.indexOf('.') !== -1) {\r\n // 支持多层级赋值操作\r\n const keys = key.split('.')\r\n inFn(obj, keys, value)\r\n } else {\r\n obj[key] = value\r\n }\r\n}\r\n\r\n/**\r\n * @description 获取当前页面路径\r\n */\r\nfunction page() {\r\n const pages = getCurrentPages()\r\n // 某些特殊情况下(比如页面进行redirectTo时的一些时机),pages可能为空数组\r\n return `/${pages[pages.length - 1]?.route ?? ''}`\r\n}\r\n\r\n/**\r\n * @description 获取当前路由栈实例数组\r\n */\r\nfunction pages() {\r\n const pages = getCurrentPages()\r\n return pages\r\n}\r\n\r\n/**\r\n * 获取H5-真实根地址 兼容hash+history模式\r\n */\r\nexport function getRootUrl() {\r\n let url = ''\r\n // #ifdef H5\r\n url = location.origin + '/'\r\n\r\n if (location.hash !== '') {\r\n url += '#/'\r\n }\r\n // #endif\r\n return url\r\n}\r\n\r\n/**\r\n * copyText 多端复制文本\r\n */\r\nexport function copyText(text) {\r\n // #ifndef H5\r\n uni.setClipboardData({\r\n data: text,\r\n success: function () {\r\n toast('复制成功!')\r\n },\r\n fail: function () {\r\n toast('复制失败!')\r\n },\r\n })\r\n // #endif\r\n // #ifdef H5\r\n const createInput = document.createElement('textarea')\r\n createInput.value = text\r\n document.body.appendChild(createInput)\r\n createInput.select()\r\n document.execCommand('Copy')\r\n createInput.className = 'createInput'\r\n createInput.style.display = 'none'\r\n toast('复制成功')\r\n // #endif\r\n}\r\n\r\nexport default {\r\n range,\r\n getPx,\r\n sleep,\r\n os,\r\n sys,\r\n random,\r\n guid,\r\n $parent,\r\n addStyle,\r\n addUnit,\r\n deepClone,\r\n deepMerge,\r\n error,\r\n randomArray,\r\n timeFormat,\r\n timeFrom,\r\n trim,\r\n queryParams,\r\n toast,\r\n type2icon,\r\n priceFormat,\r\n getDuration,\r\n padZero,\r\n getProperty,\r\n setProperty,\r\n page,\r\n pages,\r\n test,\r\n getRootUrl,\r\n copyText,\r\n}\r\n"],"names":["test","uni","round","pages"],"mappings":";;;;AAQA,SAAS,MAAM,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG;AACnC,SAAA,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,OAAO,KAAK,CAAC,CAAC;AACnD;AAQgB,SAAA,MAAM,OAAO,OAAO,OAAO;AACrC,MAAAA,kBAAA,KAAK,OAAO,KAAK,GAAG;AACtB,WAAO,OAAO,GAAG,KAAK,OAAO,OAAO,KAAK;AAAA,EAC3C;AAEI,MAAA,aAAa,KAAK,KAAK,GAAG;AAC5B,WAAO,OAAO,GAAGC,cAAAA,MAAI,OAAO,SAAS,KAAK,CAAC,CAAC,OAAO,OAAOA,cAAAA,MAAI,OAAO,SAAS,KAAK,CAAC,CAAC;AAAA,EACvF;AACA,SAAO,OAAO,GAAG,SAAS,KAAK,CAAC,OAAO,SAAS,KAAK;AACvD;AAOgB,SAAA,MAAM,QAAQ,IAAI;AACzB,SAAA,IAAI,QAAQ,CAAC,YAAY;AAC9B,eAAW,MAAM;AACP;OACP,KAAK;AAAA,EAAA,CACT;AACH;AAMO,SAAS,KAAK;AACnB,SAAOA,cAAI,MAAA,kBAAA,EAAoB,SAAS,YAAY;AACtD;AAKO,SAAS,MAAM;AACpB,SAAOA,cAAAA,MAAI;AACb;AAOA,SAAS,OAAO,KAAK,KAAK;AACxB,MAAI,OAAO,KAAK,MAAM,KAAK,OAAO,KAAK;AAC/B,UAAA,MAAM,MAAM,MAAM;AACxB,WAAO,KAAK,MAAM,KAAK,OAAO,IAAI,MAAM,GAAG;AAAA,EAC7C;AACO,SAAA;AACT;AAOO,SAAS,KAAK,MAAM,IAAI,SAAS,MAAM,QAAQ,MAAM;AACpD,QAAA,QAAQ,iEAAiE,MAAM,EAAE;AACvF,QAAM,OAAO,CAAA;AACb,UAAQ,SAAS,MAAM;AAEvB,MAAI,KAAK;AAEE,aAAA,IAAI,GAAG,IAAI,KAAK;AAAK,WAAK,CAAC,IAAI,MAAM,IAAK,KAAK,OAAA,IAAW,KAAM;AAAA,EAAA,OACpE;AACD,QAAA;AAEC,SAAA,CAAC,IAAI,KAAK,EAAE,IAAI,KAAK,EAAE,IAAI,KAAK,EAAE,IAAI;AAC3C,SAAK,EAAE,IAAI;AAEX,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AACvB,UAAA,CAAC,KAAK,CAAC,GAAG;AACR,YAAA,IAAK,KAAK,OAAA,IAAW;AACpB,aAAA,CAAC,IAAI,MAAM,KAAK,KAAM,IAAI,IAAO,IAAM,CAAC;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ;AACV,SAAK,MAAM;AACX,WAAO,IAAI,KAAK,KAAK,EAAE,CAAC;AAAA,EAC1B;AACO,SAAA,KAAK,KAAK,EAAE;AACrB;AASgB,SAAA,QAAQ,OAAO,QAAW;AACxC,MAAI,SAAS,KAAK;AAElB,SAAO,QAAQ;AAEb,QAAI,OAAO,YAAY,OAAO,SAAS,SAAS,MAAM;AAEpD,eAAS,OAAO;AAAA,IAAA,OACX;AACE,aAAA;AAAA,IACT;AAAA,EACF;AACO,SAAA;AACT;AASgB,SAAA,SAAS,aAAa,SAAS,UAAU;AAEvD,MACED,kBAAK,KAAA,MAAM,WAAW,KACrB,OAAO,gBAAgB,YAAY,WAAW,YAC9C,WAAW,YAAY,OAAO,gBAAgB,UAC/C;AACO,WAAA;AAAA,EACT;AAEA,MAAI,WAAW,UAAU;AAEvB,kBAAc,KAAK,WAAW;AAExB,UAAA,aAAa,YAAY,MAAM,GAAG;AACxC,UAAM,QAAQ,CAAA;AAEd,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAEtC,UAAA,WAAW,CAAC,GAAG;AACjB,cAAM,OAAO,WAAW,CAAC,EAAE,MAAM,GAAG;AAC9B,cAAA,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;AAAA,MACrC;AAAA,IACF;AACO,WAAA;AAAA,EACT;AAEA,MAAI,SAAS;AACb,aAAW,KAAK,aAAa;AAE3B,UAAM,MAAM,EAAE,QAAQ,YAAY,KAAK,EAAE;AACzC,cAAU,GAAG,GAAG,IAAI,YAAY,CAAC,CAAC;AAAA,EACpC;AAEA,SAAO,KAAK,MAAM;AACpB;AAOO,SAAS,QAAQ,QAAQ,QAAQ,OAAO,MAAM;AACnD,UAAQ,OAAO,KAAK;AACb,SAAAA,kBAAA,KAAK,OAAO,KAAK,IAAI,GAAG,KAAK,GAAG,IAAI,KAAK;AAClD;AAOA,SAAS,UAAU,KAAK;AAEtB,MAAI,CAAC,MAAM,QAAW,KAAK,KAAK,EAAE,SAAS,GAAG;AAAU,WAAA;AACxD,MAAI,OAAO,QAAQ,YAAY,OAAO,QAAQ,YAAY;AAEjD,WAAA;AAAA,EACT;AACA,QAAM,IAAIA,kBAAAA,KAAK,MAAM,GAAG,IAAI,KAAK;AACjC,aAAW,KAAK,KAAK;AACf,QAAA,IAAI,eAAe,CAAC,GAAG;AACzB,QAAE,CAAC,IAAI,OAAO,IAAI,CAAC,MAAM,WAAW,UAAU,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC;AAAA,IAC/D;AAAA,EACF;AACO,SAAA;AACT;AAQO,SAAS,UAAU,SAAS,IAAI,SAAS,CAAA,GAAI;AAClD,WAAS,UAAU,MAAM;AACzB,MAAI,OAAO,WAAW,YAAY,OAAO,WAAW;AAAiB,WAAA;AACrE,aAAW,QAAQ,QAAQ;AACrB,QAAA,CAAC,OAAO,eAAe,IAAI;AAAG;AAClC,QAAI,QAAQ,QAAQ;AAClB,UAAI,OAAO,OAAO,IAAI,MAAM,UAAU;AAC7B,eAAA,IAAI,IAAI,OAAO,IAAI;AAAA,MACjB,WAAA,OAAO,OAAO,IAAI,MAAM,UAAU;AACpC,eAAA,IAAI,IAAI,OAAO,IAAI;AAAA,MAAA,WACjB,OAAO,IAAI,EAAE,UAAU,OAAO,IAAI,EAAE,QAAQ;AAC9C,eAAA,IAAI,IAAI,OAAO,IAAI,EAAE,OAAO,OAAO,IAAI,CAAC;AAAA,MAAA,OAC1C;AACE,eAAA,IAAI,IAAI,UAAU,OAAO,IAAI,GAAG,OAAO,IAAI,CAAC;AAAA,MACrD;AAAA,IAAA,OACK;AACE,aAAA,IAAI,IAAI,OAAO,IAAI;AAAA,IAC5B;AAAA,EACF;AACO,SAAA;AACT;AAMA,SAAS,MAAM,KAAK;AAE0B;AAClC,YAAA,MAAM,WAAW,GAAG,EAAE;AAAA,EAChC;AACF;AAOA,SAAS,YAAY,QAAQ,IAAI;AAE/B,SAAO,MAAM,KAAK,MAAM,KAAK,OAAA,IAAW,GAAG;AAC7C;AAIA,IAAI,CAAC,OAAO,UAAU,UAAU;AAE9B,SAAO,UAAU,WAAW,SAAU,WAAW,aAAa,KAAK;AACjE,QAAI,OAAO,UAAU,SAAS,KAAK,UAAU,MAAM,mBAAmB;AAC9D,YAAA,IAAI,UAAU,2BAA2B;AAAA,IACjD;AACA,UAAM,MAAM;AAEZ,QAAI,IAAI,UAAU;AAAW,aAAO,OAAO,GAAG;AAExC,UAAA,aAAa,YAAY,IAAI;AACnC,QAAI,QAAQ,KAAK,KAAK,aAAa,WAAW,MAAM;AACpD,WAAQ,UAAU,GAAI;AACN,oBAAA;AACd,UAAI,UAAU,GAAG;AACD,sBAAA;AAAA,MAChB;AAAA,IACF;AACA,WAAO,WAAW,MAAM,GAAG,UAAU,IAAI;AAAA,EAAA;AAE7C;AAQA,SAAS,WAAW,WAAW,MAAM,YAAY,cAAc;AACzD,MAAA;AAEJ,MAAI,CAAC,UAAU;AACb,+BAAW;EAAK,WAGT,WAAW,KAAK,qCAAU,WAAW,MAAM,GAAG;AAC9C,WAAA,IAAI,KAAK,WAAW,GAAI;AAAA,EAAA,WAGxB,OAAO,aAAa,YAAY,QAAQ,KAAK,SAAS,KAAK,CAAC,GAAG;AACtE,WAAO,IAAI,KAAK,OAAO,QAAQ,CAAC;AAAA,EAAA,OAG7B;AAEI,WAAA,IAAI,KAAK,OAAO,aAAa,WAAW,SAAS,QAAQ,MAAM,GAAG,IAAI,QAAQ;AAAA,EACvF;AAEA,QAAM,aAAa;AAAA,IACjB,GAAG,KAAK,YAAY,EAAE,SAAS;AAAA;AAAA,IAC/B,IAAI,KAAK,aAAa,GAAG,WAAW,SAAS,GAAG,GAAG;AAAA;AAAA,IACnD,GAAG,KAAK,QAAQ,EAAE,WAAW,SAAS,GAAG,GAAG;AAAA;AAAA,IAC5C,GAAG,KAAK,SAAS,EAAE,WAAW,SAAS,GAAG,GAAG;AAAA;AAAA,IAC7C,GAAG,KAAK,WAAW,EAAE,WAAW,SAAS,GAAG,GAAG;AAAA;AAAA,IAC/C,GAAG,KAAK,WAAW,EAAE,WAAW,SAAS,GAAG,GAAG;AAAA;AAAA;AAAA,EAAA;AAIjD,aAAW,OAAO,YAAY;AAC5B,UAAM,CAAC,GAAG,IAAI,IAAI,OAAO,GAAG,GAAG,GAAG,EAAE,KAAK,SAAS,KAAK,CAAA;AACvD,QAAI,KAAK;AAEP,YAAM,aAAa,QAAQ,OAAO,IAAI,WAAW,IAAI,IAAI;AAC7C,kBAAA,UAAU,QAAQ,KAAK,WAAW,GAAG,EAAE,MAAM,UAAU,CAAC;AAAA,IACtE;AAAA,EACF;AAEO,SAAA;AACT;AAUA,SAAS,SAAS,YAAY,MAAM,SAAS,cAAc;AACzD,MAAI,aAAa;AAAkB,gBAAA,OAAW,oBAAA,KAAA,CAAM;AACpD,cAAY,SAAS,SAAS;AAE1B,MAAA,UAAU,WAAW,UAAU;AAAiB,iBAAA;AACpD,MAAI,SAAQ,oBAAI,KAAK,GAAE,YAAY;AAC3B,UAAA,SAAS,QAAQ,GAAI;AAE7B,MAAI,OAAO;AACX,UAAQ,MAAM;AAAA,IACZ,KAAK,QAAQ;AACJ,aAAA;AACP;AAAA,IACF,MAAK,SAAS,OAAO,QAAQ;AAC3B,aAAO,GAAG,SAAS,QAAQ,EAAE,CAAC;AAC9B;AAAA,IACF,MAAK,SAAS,QAAQ,QAAQ;AAC5B,aAAO,GAAG,SAAS,QAAQ,IAAI,CAAC;AAChC;AAAA,IACF,MAAK,SAAS,SAAS,QAAQ;AAC7B,aAAO,GAAG,SAAS,QAAQ,KAAK,CAAC;AACjC;AAAA,IACF;AAEE,UAAI,WAAW,OAAO;AACpB,YAAI,SAAS,UAAW,QAAQ,MAAM,OAAO;AAC3C,iBAAO,GAAG,SAAS,SAAS,QAAQ,GAAG,CAAC;AAAA,QAAA,OACnC;AACL,iBAAO,GAAG,SAAS,SAAS,QAAQ,IAAI,CAAC;AAAA,QAC3C;AAAA,MAAA,OACK;AACE,eAAA,WAAW,WAAW,MAAM;AAAA,MACrC;AAAA,EACJ;AACO,SAAA;AACT;AAOA,SAAS,KAAK,KAAK,MAAM,QAAQ;AAC/B,QAAM,OAAO,GAAG;AAChB,MAAI,OAAO,QAAQ;AACV,WAAA,IAAI,QAAQ,cAAc,EAAE;AAAA,EACrC;AACA,MAAI,OAAO,QAAQ;AACV,WAAA,IAAI,QAAQ,QAAQ,EAAE;AAAA,EAC/B;AACA,MAAI,OAAO,SAAS;AACX,WAAA,IAAI,QAAQ,WAAW,EAAE;AAAA,EAClC;AACA,MAAI,OAAO,OAAO;AACT,WAAA,IAAI,QAAQ,QAAQ,EAAE;AAAA,EAC/B;AACO,SAAA;AACT;AAQA,SAAS,YAAY,OAAO,IAAI,WAAW,MAAM,cAAc,YAAY;AACnE,QAAA,SAAS,WAAW,MAAM;AAChC,QAAM,UAAU,CAAA;AACZ,MAAA,CAAC,WAAW,YAAY,UAAU,OAAO,EAAE,QAAQ,WAAW,KAAK;AACvD,kBAAA;AAChB,aAAW,OAAO,MAAM;AAChB,UAAA,QAAQ,KAAK,GAAG;AAElB,QAAA,CAAC,IAAI,QAAW,IAAI,EAAE,QAAQ,KAAK,KAAK,GAAG;AAC7C;AAAA,IACF;AAEI,QAAA,MAAM,gBAAgB,OAAO;AAE/B,cAAQ,aAAa;AAAA,QACnB,KAAK;AAEH,mBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AAC7B,oBAAA,KAAK,GAAG,GAAG,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC,EAAE;AAAA,UACzC;AACA;AAAA,QACF,KAAK;AAEG,gBAAA,QAAQ,CAAC,WAAW;AACxB,oBAAQ,KAAK,GAAG,GAAG,MAAM,MAAM,EAAE;AAAA,UAAA,CAClC;AACD;AAAA,QACF,KAAK;AAEG,gBAAA,QAAQ,CAAC,WAAW;AACxB,oBAAQ,KAAK,GAAG,GAAG,IAAI,MAAM,EAAE;AAAA,UAAA,CAChC;AACD;AAAA,QACF,KAAK;AAEH,cAAI,WAAW;AACT,gBAAA,QAAQ,CAAC,WAAW;AACX,yBAAA,WAAW,MAAM,MAAM;AAAA,UAAA,CACrC;AACD,kBAAQ,KAAK,GAAG,GAAG,IAAI,QAAQ,EAAE;AACjC;AAAA,QACF;AACQ,gBAAA,QAAQ,CAAC,WAAW;AACxB,oBAAQ,KAAK,GAAG,GAAG,MAAM,MAAM,EAAE;AAAA,UAAA,CAClC;AAAA,MACL;AAAA,IAAA,OACK;AACL,cAAQ,KAAK,GAAG,GAAG,IAAI,KAAK,EAAE;AAAA,IAChC;AAAA,EACF;AACA,SAAO,QAAQ,SAAS,SAAS,QAAQ,KAAK,GAAG,IAAI;AACvD;AAOA,SAAS,MAAM,OAAO,WAAW,KAAM;AACrCC,gBAAAA,MAAI,UAAU;AAAA,IACZ,OAAO,OAAO,KAAK;AAAA,IACnB,MAAM;AAAA,IACN;AAAA,EAAA,CACD;AACH;AAOA,SAAS,UAAU,OAAO,WAAW,OAAO,OAAO;AAE7C,MAAA,CAAC,WAAW,QAAQ,SAAS,WAAW,SAAS,EAAE,QAAQ,IAAI,KAAK;AAAW,WAAA;AACnF,MAAI,WAAW;AAEf,UAAQ,MAAM;AAAA,IACZ,KAAK;AACQ,iBAAA;AACX;AAAA,IACF,KAAK;AACQ,iBAAA;AACX;AAAA,IACF,KAAK;AACQ,iBAAA;AACX;AAAA,IACF,KAAK;AACQ,iBAAA;AACX;AAAA,IACF,KAAK;AACQ,iBAAA;AACX;AAAA,IACF;AACa,iBAAA;AAAA,EACf;AAEI,MAAA;AAAkB,gBAAA;AACf,SAAA;AACT;AAUA,SAAS,YAAY,QAAQ,WAAW,GAAG,eAAe,KAAK,qBAAqB,KAAK;AACvF,WAAS,GAAG,MAAM,GAAG,QAAQ,gBAAgB,EAAE;AAC/C,QAAM,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC;AAC9B,QAAA,OAAO,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI,KAAK,IAAI,QAAQ;AACzD,QAAM,MAAM,OAAO,uBAAuB,cAAc,MAAM;AAC9D,QAAM,MAAM,OAAO,iBAAiB,cAAc,MAAM;AACxD,MAAI,IAAI;AAER,OAAK,OAAOC,mBAAAA,MAAM,GAAG,IAAI,IAAI,KAAK,GAAG,KAAK,MAAM,CAAC,CAAC,IAAI,MAAM,GAAG;AAC/D,QAAM,KAAK;AACX,SAAO,GAAG,KAAK,EAAE,CAAC,CAAC,GAAG;AAClB,MAAA,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,IAAI,KAAK,GAAG,IAAI;AAAA,EACtC;AAEA,OAAK,EAAE,CAAC,KAAK,IAAI,SAAS,MAAM;AAC9B,MAAE,CAAC,IAAI,EAAE,CAAC,KAAK;AACf,MAAE,CAAC,KAAK,IAAI,MAAM,OAAO,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,KAAK,GAAG;AAAA,EACpD;AACO,SAAA,EAAE,KAAK,GAAG;AACnB;AAUA,SAAS,YAAY,OAAO,OAAO,MAAM;AACjC,QAAA,WAAW,SAAS,KAAK;AAC/B,MAAI,MAAM;AACJ,QAAA,KAAK,KAAK,KAAK;AAAU,aAAA;AAC7B,WAAO,QAAQ,KAAK,GAAG,KAAK,OAAO,GAAG,KAAK;AAAA,EAC7C;AACI,MAAA,MAAM,KAAK,KAAK;AAAU,WAAA;AAC1B,MAAA,KAAK,KAAK,KAAK;AAAU,WAAA,WAAW,KAAK,WAAW,WAAW;AAC5D,SAAA;AACT;AAMA,SAAS,QAAQ,OAAO;AACtB,SAAO,KAAK,KAAK,GAAG,MAAM,EAAE;AAC9B;AAQA,SAAS,YAAY,KAAK,KAAK;AAC7B,MAAI,CAAC,KAAK;AACR;AAAA,EACF;AACA,MAAI,OAAO,QAAQ,YAAY,QAAQ,IAAI;AAClC,WAAA;AAAA,EACT;AACA,MAAI,IAAI,QAAQ,GAAG,MAAM,IAAI;AACrB,UAAA,OAAO,IAAI,MAAM,GAAG;AAC1B,QAAI,WAAW,IAAI,KAAK,CAAC,CAAC,KAAK,CAAA;AAE/B,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAI,UAAU;AACD,mBAAA,SAAS,KAAK,CAAC,CAAC;AAAA,MAC7B;AAAA,IACF;AACO,WAAA;AAAA,EACT;AACA,SAAO,IAAI,GAAG;AAChB;AAQA,SAAS,YAAY,KAAK,KAAK,OAAO;AACpC,MAAI,CAAC,KAAK;AACR;AAAA,EACF;AAEA,QAAM,OAAO,SAAU,MAAM,MAAM,GAAG;AAEhC,QAAA,KAAK,WAAW,GAAG;AAChB,WAAA,KAAK,CAAC,CAAC,IAAI;AAChB;AAAA,IACF;AAEO,WAAA,KAAK,SAAS,GAAG;AAChB,YAAA,IAAI,KAAK,CAAC;AACZ,UAAA,CAAC,KAAK,CAAC,KAAK,OAAO,KAAK,CAAC,MAAM,UAAU;AACtC,aAAA,CAAC,IAAI;MACZ;AACY,WAAK,MAAM;AAEvB,WAAK,KAAK,CAAC,GAAG,MAAM,CAAC;AAAA,IACvB;AAAA,EAAA;AAGF,MAAI,OAAO,QAAQ,YAAY,QAAQ;AAAI;AAAA,WAChC,IAAI,QAAQ,GAAG,MAAM,IAAI;AAE5B,UAAA,OAAO,IAAI,MAAM,GAAG;AACrB,SAAA,KAAK,MAAM,KAAK;AAAA,EAAA,OAChB;AACL,QAAI,GAAG,IAAI;AAAA,EACb;AACF;AAKA,SAAS,OAAO;;AACd,QAAMC,SAAQ;AAEd,SAAO,KAAIA,kBAAMA,OAAM,SAAS,CAAC,MAAtBA,mBAAyB,UAAzBA,YAAkC,EAAE;AACjD;AAKA,SAAS,QAAQ;AACf,QAAMA,SAAQ;AACPA,SAAAA;AACT;AAKO,SAAS,aAAa;AAC3B,MAAI,MAAM;AAQH,SAAA;AACT;AAKO,SAAS,SAAS,MAAM;AAE7BF,gBAAAA,MAAI,iBAAiB;AAAA,IACnB,MAAM;AAAA,IACN,SAAS,WAAY;AACnB,YAAM,OAAO;AAAA,IACf;AAAA,IACA,MAAM,WAAY;AAChB,YAAM,OAAO;AAAA,IACf;AAAA,EAAA,CACD;AAYH;AAEA,MAAe,UAAA;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAAA,MACAD,kBAAA;AAAA,EACA;AAAA,EACA;AACF;;;;;;;;;;;"}