{"version":3,"file":"fieldReducer.mjs","sources":["../../../src/transformations/fieldReducer.ts"],"sourcesContent":["// Libraries\nimport { isNumber } from 'lodash';\n\nimport { NullValueMode } from '../types/data';\nimport { Field, FieldCalcs, FieldType } from '../types/dataFrame';\nimport { Registry, RegistryItem } from '../utils/Registry';\n\nexport enum ReducerID {\n  sum = 'sum',\n  max = 'max',\n  min = 'min',\n  logmin = 'logmin',\n  mean = 'mean',\n  variance = 'variance',\n  stdDev = 'stdDev',\n  last = 'last',\n  median = 'median',\n  first = 'first',\n  count = 'count',\n  countAll = 'countAll',\n  range = 'range',\n  diff = 'diff',\n  diffperc = 'diffperc',\n  delta = 'delta',\n  step = 'step',\n  firstNotNull = 'firstNotNull',\n  lastNotNull = 'lastNotNull',\n  changeCount = 'changeCount',\n  distinctCount = 'distinctCount',\n  allIsZero = 'allIsZero',\n  allIsNull = 'allIsNull',\n  allValues = 'allValues',\n  uniqueValues = 'uniqueValues',\n  p1 = 'p1',\n  p2 = 'p2',\n  p3 = 'p3',\n  p4 = 'p4',\n  p5 = 'p5',\n  p6 = 'p6',\n  p7 = 'p7',\n  p8 = 'p8',\n  p9 = 'p9',\n  p10 = 'p10',\n  p11 = 'p11',\n  p12 = 'p12',\n  p13 = 'p13',\n  p14 = 'p14',\n  p15 = 'p15',\n  p16 = 'p16',\n  p17 = 'p17',\n  p18 = 'p18',\n  p19 = 'p19',\n  p20 = 'p20',\n  p21 = 'p21',\n  p22 = 'p22',\n  p23 = 'p23',\n  p24 = 'p24',\n  p25 = 'p25',\n  p26 = 'p26',\n  p27 = 'p27',\n  p28 = 'p28',\n  p29 = 'p29',\n  p30 = 'p30',\n  p31 = 'p31',\n  p32 = 'p32',\n  p33 = 'p33',\n  p34 = 'p34',\n  p35 = 'p35',\n  p36 = 'p36',\n  p37 = 'p37',\n  p38 = 'p38',\n  p39 = 'p39',\n  p40 = 'p40',\n  p41 = 'p41',\n  p42 = 'p42',\n  p43 = 'p43',\n  p44 = 'p44',\n  p45 = 'p45',\n  p46 = 'p46',\n  p47 = 'p47',\n  p48 = 'p48',\n  p49 = 'p49',\n  p50 = 'p50',\n  p51 = 'p51',\n  p52 = 'p52',\n  p53 = 'p53',\n  p54 = 'p54',\n  p55 = 'p55',\n  p56 = 'p56',\n  p57 = 'p57',\n  p58 = 'p58',\n  p59 = 'p59',\n  p60 = 'p60',\n  p61 = 'p61',\n  p62 = 'p62',\n  p63 = 'p63',\n  p64 = 'p64',\n  p65 = 'p65',\n  p66 = 'p66',\n  p67 = 'p67',\n  p68 = 'p68',\n  p69 = 'p69',\n  p70 = 'p70',\n  p71 = 'p71',\n  p72 = 'p72',\n  p73 = 'p73',\n  p74 = 'p74',\n  p75 = 'p75',\n  p76 = 'p76',\n  p77 = 'p77',\n  p78 = 'p78',\n  p79 = 'p79',\n  p80 = 'p80',\n  p81 = 'p81',\n  p82 = 'p82',\n  p83 = 'p83',\n  p84 = 'p84',\n  p85 = 'p85',\n  p86 = 'p86',\n  p87 = 'p87',\n  p88 = 'p88',\n  p89 = 'p89',\n  p90 = 'p90',\n  p91 = 'p91',\n  p92 = 'p92',\n  p93 = 'p93',\n  p94 = 'p94',\n  p95 = 'p95',\n  p96 = 'p96',\n  p97 = 'p97',\n  p98 = 'p98',\n  p99 = 'p99',\n}\n\nexport function getFieldTypeForReducer(id: ReducerID, fallback: FieldType): FieldType {\n  return id === ReducerID.count ||\n    id === ReducerID.distinctCount ||\n    id === ReducerID.changeCount ||\n    id === ReducerID.countAll\n    ? FieldType.number\n    : id === ReducerID.allIsNull || id === ReducerID.allIsZero\n      ? FieldType.boolean\n      : fallback;\n}\n\nexport function isReducerID(id: string): id is ReducerID {\n  return Object.keys(ReducerID).includes(id);\n}\n\n// Internal function\ntype FieldReducer = (field: Field, ignoreNulls: boolean, nullAsZero: boolean) => FieldCalcs;\n\nexport interface FieldReducerInfo extends RegistryItem {\n  // Internal details\n  emptyInputResult?: unknown; // typically null, but some things like 'count' & 'sum' should be zero\n  standard: boolean; // The most common stats can all be calculated in a single pass\n  preservesUnits: boolean; // Whether this reducer preserves units, certain ones don't e.g. count, distinct count, etc,\n  reduce?: FieldReducer;\n}\n\ninterface ReduceFieldOptions {\n  field: Field;\n  reducers: string[]; // The stats to calculate\n}\n\n/**\n * @returns an object with a key for each selected stat\n * NOTE: This will also modify the 'field.state' object,\n * leaving values in a cache until cleared.\n */\nexport function reduceField(options: ReduceFieldOptions): FieldCalcs {\n  const { field, reducers } = options;\n\n  if (!field || !reducers || reducers.length < 1) {\n    return {};\n  }\n\n  if (field.state?.calcs) {\n    // Find the values we need to calculate\n    const missing: string[] = [];\n    for (const s of reducers) {\n      if (!field.state.calcs.hasOwnProperty(s)) {\n        missing.push(s);\n      }\n    }\n    if (missing.length < 1) {\n      return {\n        ...field.state.calcs,\n      };\n    }\n  }\n  if (!field.state) {\n    field.state = {};\n  }\n\n  const queue = fieldReducers.list(reducers);\n\n  // Return early for empty series\n  // This lets the concrete implementations assume at least one row\n  const data = field.values;\n  if (data && data.length < 1) {\n    const calcs: FieldCalcs = { ...field.state.calcs };\n    for (const reducer of queue) {\n      calcs[reducer.id] = reducer.emptyInputResult !== null ? reducer.emptyInputResult : null;\n    }\n    return (field.state.calcs = calcs);\n  }\n\n  // Default to Ignore for nullValueMode.\n  const { nullValueMode = NullValueMode.Ignore } = field.config;\n\n  const ignoreNulls = nullValueMode === NullValueMode.Ignore;\n  const nullAsZero = nullValueMode === NullValueMode.AsZero;\n\n  // Avoid calculating all the standard stats if possible\n  if (queue.length === 1 && queue[0].reduce) {\n    const values = queue[0].reduce(field, ignoreNulls, nullAsZero);\n    field.state.calcs = {\n      ...field.state.calcs,\n      ...values,\n    };\n    return values;\n  }\n\n  // For now everything can use the standard stats\n  let values = doStandardCalcs(field, ignoreNulls, nullAsZero);\n\n  for (const reducer of queue) {\n    if (!values.hasOwnProperty(reducer.id) && reducer.reduce) {\n      values = {\n        ...values,\n        ...reducer.reduce(field, ignoreNulls, nullAsZero),\n      };\n    }\n  }\n\n  field.state.calcs = {\n    ...field.state.calcs,\n    ...values,\n  };\n  return values;\n}\n\n// ------------------------------------------------------------------------------\n//\n//  No Exported symbols below here.\n//\n// ------------------------------------------------------------------------------\n\nexport const fieldReducers = new Registry<FieldReducerInfo>(() => [\n  {\n    id: ReducerID.lastNotNull,\n    name: 'Last *',\n    description: 'Last non-null value (also excludes NaNs)',\n    standard: true,\n    aliasIds: ['current'],\n    reduce: calculateLastNotNull,\n    preservesUnits: true,\n  },\n  {\n    id: ReducerID.last,\n    name: 'Last',\n    description: 'Last value',\n    standard: true,\n    reduce: calculateLast,\n    preservesUnits: true,\n  },\n  {\n    id: ReducerID.firstNotNull,\n    name: 'First *',\n    description: 'First non-null value (also excludes NaNs)',\n    standard: true,\n    reduce: calculateFirstNotNull,\n    preservesUnits: true,\n  },\n  {\n    id: ReducerID.first,\n    name: 'First',\n    description: 'First Value',\n    standard: true,\n    reduce: calculateFirst,\n    preservesUnits: true,\n  },\n  { id: ReducerID.min, name: 'Min', description: 'Minimum Value', standard: true, preservesUnits: true },\n  { id: ReducerID.max, name: 'Max', description: 'Maximum Value', standard: true, preservesUnits: true },\n  {\n    id: ReducerID.mean,\n    name: 'Mean',\n    description: 'Average Value',\n    standard: true,\n    aliasIds: ['avg'],\n    preservesUnits: true,\n  },\n  {\n    id: ReducerID.median,\n    name: 'Median',\n    description: 'Median Value',\n    standard: false,\n    reduce: calculateMedian,\n    aliasIds: ['median'],\n    preservesUnits: true,\n  },\n  {\n    id: ReducerID.variance,\n    name: 'Variance',\n    description: 'Variance of all values in a field',\n    standard: false,\n    reduce: calculateStdDev,\n    preservesUnits: true,\n  },\n  {\n    id: ReducerID.stdDev,\n    name: 'StdDev',\n    description: 'Standard deviation of all values in a field',\n    standard: false,\n    reduce: calculateStdDev,\n    preservesUnits: true,\n  },\n  {\n    id: ReducerID.sum,\n    name: 'Total',\n    description: 'The sum of all values',\n    emptyInputResult: 0,\n    standard: true,\n    aliasIds: ['total'],\n    preservesUnits: true,\n  },\n  {\n    id: ReducerID.count,\n    name: 'Count',\n    description: 'Number of values in response',\n    emptyInputResult: 0,\n    standard: true,\n    preservesUnits: false,\n  },\n  {\n    id: ReducerID.countAll,\n    name: 'Count all',\n    description: 'Number of values (including empty)',\n    emptyInputResult: 0,\n    standard: false,\n    reduce: (field: Field): FieldCalcs => ({ countAll: field.values.length }),\n    preservesUnits: false,\n  },\n  {\n    id: ReducerID.range,\n    name: 'Range',\n    description: 'Difference between minimum and maximum values',\n    standard: true,\n    preservesUnits: true,\n  },\n  {\n    id: ReducerID.delta,\n    name: 'Delta',\n    description: 'Cumulative change in value',\n    standard: true,\n    preservesUnits: true,\n  },\n  {\n    id: ReducerID.step,\n    name: 'Step',\n    description: 'Minimum interval between values',\n    standard: true,\n    preservesUnits: true,\n  },\n  {\n    id: ReducerID.diff,\n    name: 'Difference',\n    description: 'Difference between first and last values',\n    standard: true,\n    preservesUnits: true,\n  },\n  {\n    id: ReducerID.logmin,\n    name: 'Min (above zero)',\n    description: 'Used for log min scale',\n    standard: true,\n    preservesUnits: true,\n  },\n  {\n    id: ReducerID.allIsZero,\n    name: 'All Zeros',\n    description: 'All values are zero',\n    emptyInputResult: false,\n    standard: true,\n    preservesUnits: true,\n  },\n  {\n    id: ReducerID.allIsNull,\n    name: 'All Nulls',\n    description: 'All values are null',\n    emptyInputResult: true,\n    standard: true,\n    preservesUnits: false,\n  },\n  {\n    id: ReducerID.changeCount,\n    name: 'Change Count',\n    description: 'Number of times the value changes',\n    standard: false,\n    reduce: calculateChangeCount,\n    preservesUnits: false,\n  },\n  {\n    id: ReducerID.distinctCount,\n    name: 'Distinct Count',\n    description: 'Number of distinct values',\n    standard: false,\n    reduce: calculateDistinctCount,\n    preservesUnits: false,\n  },\n  {\n    id: ReducerID.diffperc,\n    name: 'Difference percent',\n    description: 'Percentage difference between first and last values',\n    standard: true,\n    preservesUnits: false,\n  },\n  {\n    id: ReducerID.allValues,\n    name: 'All values',\n    description: 'Returns an array with all values',\n    standard: false,\n    reduce: (field: Field) => ({ allValues: [...field.values] }),\n    preservesUnits: false,\n  },\n  {\n    id: ReducerID.uniqueValues,\n    name: 'All unique values',\n    description: 'Returns an array with all unique values',\n    standard: false,\n    reduce: (field: Field) => ({\n      uniqueValues: [...new Set(field.values)],\n    }),\n    preservesUnits: false,\n  },\n  ...buildPercentileReducers(),\n]);\n\n// This `Array.from` will build an array of elements from 1 to 99\nconst buildPercentileReducers = (percentiles = [...Array.from({ length: 99 }, (_, i) => i + 1)]) => {\n  const percentileReducers: FieldReducerInfo[] = [];\n  const nth = (n: number) =>\n    n > 3 && n < 21 ? 'th' : n % 10 === 1 ? 'st' : n % 10 === 2 ? 'nd' : n % 10 === 3 ? 'rd' : 'th';\n\n  percentiles.forEach((p) => {\n    const percentile = p / 100;\n    const id = `p${p}`;\n    const name = `${p}${nth(p)} %`;\n    const description = `${p}${nth(p)} percentile value`;\n\n    percentileReducers.push({\n      id: id,\n      name: name,\n      description: description,\n      standard: false,\n      reduce: (field: Field, ignoreNulls: boolean, nullAsZero: boolean): FieldCalcs => {\n        return { [id]: calculatePercentile(field, percentile, ignoreNulls, nullAsZero) };\n      },\n      preservesUnits: true,\n    });\n  });\n  return percentileReducers;\n};\n\n// Used for test cases\nexport const defaultCalcs: FieldCalcs = {\n  sum: 0,\n  max: -Number.MAX_VALUE,\n  min: Number.MAX_VALUE,\n  logmin: Number.MAX_VALUE,\n  mean: null,\n  last: null,\n  first: null,\n  lastNotNull: null,\n  firstNotNull: null,\n  count: 0,\n  nonNullCount: 0,\n  allIsNull: true,\n  allIsZero: true,\n  range: null,\n  diff: null,\n  delta: 0,\n  step: Number.MAX_VALUE,\n  diffperc: 0,\n  // Just used for calculations -- not exposed as a stat\n  previousDeltaUp: true,\n};\n\nexport function doStandardCalcs(field: Field, ignoreNulls: boolean, nullAsZero: boolean): FieldCalcs {\n  const calcs: FieldCalcs = { ...defaultCalcs };\n\n  const data = field.values;\n\n  // early return for undefined / empty series\n  if (!data) {\n    return calcs;\n  }\n\n  const isNumberField = field.type === FieldType.number || field.type === FieldType.time;\n\n  for (let i = 0; i < data.length; i++) {\n    let currentValue = data[i];\n\n    if (i === 0) {\n      calcs.first = currentValue;\n    }\n\n    calcs.last = currentValue;\n\n    if (currentValue == null) {\n      if (ignoreNulls) {\n        continue;\n      }\n      if (nullAsZero) {\n        currentValue = 0;\n      }\n    }\n\n    calcs.count++;\n\n    if (currentValue != null && !Number.isNaN(currentValue)) {\n      // null || undefined || NaN\n      const isFirst = calcs.firstNotNull === null;\n      if (isFirst) {\n        calcs.firstNotNull = currentValue;\n      }\n\n      if (isNumberField) {\n        calcs.sum += currentValue || 0;\n        calcs.allIsNull = false;\n        calcs.nonNullCount++;\n\n        if (!isFirst) {\n          const step = currentValue - calcs.lastNotNull!;\n          if (calcs.step > step) {\n            calcs.step = step; // the minimum interval\n          }\n\n          if (calcs.lastNotNull! > currentValue) {\n            // counter reset\n            calcs.previousDeltaUp = false;\n          } else {\n            if (calcs.previousDeltaUp) {\n              calcs.delta += step; // normal increment\n            }\n            calcs.previousDeltaUp = true;\n          }\n        }\n\n        if (currentValue > calcs.max) {\n          calcs.max = currentValue;\n        }\n\n        if (currentValue < calcs.min) {\n          calcs.min = currentValue;\n        }\n\n        if (currentValue < calcs.logmin && currentValue > 0) {\n          calcs.logmin = currentValue;\n        }\n      }\n\n      if (currentValue !== 0) {\n        calcs.allIsZero = false;\n      }\n\n      calcs.lastNotNull = currentValue;\n    }\n  }\n\n  if (calcs.max === -Number.MAX_VALUE) {\n    calcs.max = null;\n  }\n\n  if (calcs.min === Number.MAX_VALUE) {\n    calcs.min = null;\n  }\n\n  if (calcs.step === Number.MAX_VALUE) {\n    calcs.step = null;\n  }\n\n  if (calcs.nonNullCount > 0) {\n    calcs.mean = calcs.sum! / calcs.nonNullCount;\n  }\n\n  if (calcs.allIsNull) {\n    calcs.allIsZero = false;\n  }\n\n  if (calcs.max !== null && calcs.min !== null) {\n    calcs.range = calcs.max - calcs.min;\n  }\n\n  if (isNumber(calcs.firstNotNull) && isNumber(calcs.lastNotNull)) {\n    calcs.diff = calcs.lastNotNull - calcs.firstNotNull;\n  }\n\n  if (isNumber(calcs.firstNotNull) && isNumber(calcs.diff)) {\n    calcs.diffperc = (calcs.diff / calcs.firstNotNull) * 100;\n  }\n\n  return calcs;\n}\n\nfunction calculateFirst(field: Field, ignoreNulls: boolean, nullAsZero: boolean): FieldCalcs {\n  return { first: field.values[0] };\n}\n\nfunction calculateFirstNotNull(field: Field, ignoreNulls: boolean, nullAsZero: boolean): FieldCalcs {\n  const data = field.values;\n  for (let idx = 0; idx < data.length; idx++) {\n    const v = data[idx];\n    if (v != null && !Number.isNaN(v)) {\n      return { firstNotNull: v };\n    }\n  }\n  return { firstNotNull: null };\n}\n\nfunction calculateLast(field: Field, ignoreNulls: boolean, nullAsZero: boolean): FieldCalcs {\n  const data = field.values;\n  return { last: data[data.length - 1] };\n}\n\nfunction calculateLastNotNull(field: Field, ignoreNulls: boolean, nullAsZero: boolean): FieldCalcs {\n  const data = field.values;\n  let idx = data.length - 1;\n  while (idx >= 0) {\n    const v = data[idx--];\n    if (v != null && !Number.isNaN(v)) {\n      return { lastNotNull: v };\n    }\n  }\n  return { lastNotNull: null };\n}\n\n/** Calculates standard deviation and variance */\nfunction calculateStdDev(field: Field, ignoreNulls: boolean, nullAsZero: boolean): FieldCalcs {\n  // Only support number fields\n  if (!(field.type === FieldType.number || field.type === FieldType.time)) {\n    return { variance: 0, stdDev: 0 };\n  }\n\n  let squareSum = 0;\n  let runningMean = 0;\n  let runningNonNullCount = 0;\n  const data = field.values;\n  for (let i = 0; i < data.length; i++) {\n    const currentValue = data[i];\n    if (currentValue != null) {\n      runningNonNullCount++;\n      let _oldMean = runningMean;\n      runningMean += (currentValue - _oldMean) / runningNonNullCount;\n      squareSum += (currentValue - _oldMean) * (currentValue - runningMean);\n    }\n  }\n  if (runningNonNullCount > 0) {\n    const variance = squareSum / runningNonNullCount;\n    return { variance, stdDev: Math.sqrt(variance) };\n  }\n  return { variance: 0, stdDev: 0 };\n}\n\nfunction calculateChangeCount(field: Field, ignoreNulls: boolean, nullAsZero: boolean): FieldCalcs {\n  const data = field.values;\n  let count = 0;\n  let first = true;\n  let last = null;\n  for (let i = 0; i < data.length; i++) {\n    let currentValue = data[i];\n    if (currentValue === null) {\n      if (ignoreNulls) {\n        continue;\n      }\n      if (nullAsZero) {\n        currentValue = 0;\n      }\n    }\n    if (!first && last !== currentValue) {\n      count++;\n    }\n    first = false;\n    last = currentValue;\n  }\n\n  return { changeCount: count };\n}\n\nfunction calculateDistinctCount(field: Field, ignoreNulls: boolean, nullAsZero: boolean): FieldCalcs {\n  const data = field.values;\n  const distinct = new Set();\n  for (let i = 0; i < data.length; i++) {\n    let currentValue = data[i];\n    if (currentValue === null) {\n      if (ignoreNulls) {\n        continue;\n      }\n      if (nullAsZero) {\n        currentValue = 0;\n      }\n    }\n    distinct.add(currentValue);\n  }\n  return { distinctCount: distinct.size };\n}\n\nfunction calculatePercentile(field: Field, percentile: number, ignoreNulls: boolean, nullAsZero: boolean): number {\n  let data = field.values;\n\n  if (ignoreNulls) {\n    data = data.filter((value) => value !== null);\n  }\n  if (nullAsZero) {\n    data = data.map((value) => (value === null ? 0 : value));\n  }\n\n  const sorted = data.slice().sort((a, b) => a - b);\n  const index = Math.round((sorted.length - 1) * percentile);\n  return sorted[index];\n}\n\nfunction calculateMedian(field: Field<number>, ignoreNulls: boolean, nullAsZero: boolean): FieldCalcs {\n  const numbers: number[] = [];\n\n  for (let i = 0; i < field.values.length; i++) {\n    let currentValue = field.values[i];\n\n    if (currentValue == null) {\n      if (ignoreNulls) {\n        continue;\n      }\n      if (nullAsZero) {\n        currentValue = 0;\n      }\n    }\n\n    numbers.push(currentValue);\n  }\n\n  numbers.sort((a, b) => a - b);\n\n  const mid = Math.floor(numbers.length / 2);\n\n  if (numbers.length % 2 === 0) {\n    return { median: (numbers[mid - 1] + numbers[mid]) / 2 };\n  } else {\n    return { median: numbers[mid] };\n  }\n}\n"],"names":["ReducerID","values"],"mappings":";;;;;;AAOO,IAAK,SAAA,qBAAAA,UAAAA,KAAL;AACL,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,WAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,WAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,WAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,WAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,WAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,WAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,WAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,WAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,WAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,WAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,WAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,WAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,WAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,WAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,WAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,WAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,WAAA,eAAA,CAAA,GAAgB,eAAA;AAChB,EAAAA,WAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,WAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,WAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,WAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,WAAA,IAAA,CAAA,GAAK,IAAA;AACL,EAAAA,WAAA,IAAA,CAAA,GAAK,IAAA;AACL,EAAAA,WAAA,IAAA,CAAA,GAAK,IAAA;AACL,EAAAA,WAAA,IAAA,CAAA,GAAK,IAAA;AACL,EAAAA,WAAA,IAAA,CAAA,GAAK,IAAA;AACL,EAAAA,WAAA,IAAA,CAAA,GAAK,IAAA;AACL,EAAAA,WAAA,IAAA,CAAA,GAAK,IAAA;AACL,EAAAA,WAAA,IAAA,CAAA,GAAK,IAAA;AACL,EAAAA,WAAA,IAAA,CAAA,GAAK,IAAA;AACL,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,KAAA,CAAA,GAAM,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"}