@signaltree/ng-forms 4.0.9 → 4.0.12

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 (41) hide show
  1. package/fesm2022/signaltree-ng-forms-src-audit.mjs +20 -0
  2. package/fesm2022/signaltree-ng-forms-src-audit.mjs.map +1 -0
  3. package/fesm2022/signaltree-ng-forms-src-history.mjs +113 -0
  4. package/fesm2022/signaltree-ng-forms-src-history.mjs.map +1 -0
  5. package/fesm2022/signaltree-ng-forms-src-rxjs.mjs +21 -0
  6. package/fesm2022/signaltree-ng-forms-src-rxjs.mjs.map +1 -0
  7. package/fesm2022/signaltree-ng-forms.mjs +1038 -0
  8. package/fesm2022/signaltree-ng-forms.mjs.map +1 -0
  9. package/index.d.ts +128 -0
  10. package/package.json +27 -6
  11. package/src/audit/index.d.ts +15 -0
  12. package/src/history/index.d.ts +24 -0
  13. package/src/rxjs/index.d.ts +6 -0
  14. package/LICENSE +0 -54
  15. package/eslint.config.mjs +0 -48
  16. package/jest.config.ts +0 -21
  17. package/ng-package.json +0 -8
  18. package/project.json +0 -48
  19. package/src/audit/audit.ts +0 -75
  20. package/src/audit/index.ts +0 -1
  21. package/src/audit/ng-package.json +0 -5
  22. package/src/core/async-validators.ts +0 -80
  23. package/src/core/ng-forms.spec.ts +0 -204
  24. package/src/core/ng-forms.ts +0 -1316
  25. package/src/core/validators.ts +0 -209
  26. package/src/history/history.ts +0 -169
  27. package/src/history/index.ts +0 -1
  28. package/src/history/ng-package.json +0 -5
  29. package/src/index.ts +0 -5
  30. package/src/rxjs/index.ts +0 -1
  31. package/src/rxjs/ng-package.json +0 -5
  32. package/src/rxjs/public-api.ts +0 -5
  33. package/src/rxjs/rxjs-bridge.ts +0 -75
  34. package/src/test-setup.ts +0 -6
  35. package/src/types/signaltree-core.d.ts +0 -11
  36. package/src/wizard/index.ts +0 -1
  37. package/src/wizard/wizard.ts +0 -145
  38. package/tsconfig.json +0 -33
  39. package/tsconfig.lib.json +0 -25
  40. package/tsconfig.lib.prod.json +0 -13
  41. package/tsconfig.spec.json +0 -17
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signaltree-ng-forms.mjs","sources":["../tmp-esm2022/core/ng-forms.js","../tmp-esm2022/core/validators.js","../tmp-esm2022/core/async-validators.js","../tmp-esm2022/history/history.js"],"sourcesContent":["import { computed, effect, inject, signal, DestroyRef, Directive, ElementRef, Renderer2, HostListener, Input, Output, EventEmitter, isSignal, forwardRef, } from '@angular/core';\nimport { FormArray, FormControl, FormGroup, NG_VALUE_ACCESSOR, } from '@angular/forms';\nimport { signalTree } from '@signaltree/core';\nimport { deepClone, matchPath, mergeDeep, parsePath } from '@signaltree/shared';\nimport { firstValueFrom, isObservable } from 'rxjs';\nimport * as i0 from \"@angular/core\";\nexport class FormValidationError extends Error {\n errors;\n asyncErrors;\n constructor(errors, asyncErrors) {\n super('Form validation failed');\n this.errors = errors;\n this.asyncErrors = asyncErrors;\n this.name = 'FormValidationError';\n }\n}\nconst SYNC_ERROR_KEY = 'signaltree';\nconst ASYNC_ERROR_KEY = 'signaltreeAsync';\nexport function createFormTree(initialValues, config = {}) {\n const { validators: baseValidators = {}, asyncValidators: baseAsyncValidators = {}, destroyRef: providedDestroyRef, fieldConfigs = {}, conditionals = [], persistKey, storage, persistDebounceMs = 100, validationBatchMs = 0, ...treeConfig } = config;\n const syncValidators = normalizeSyncValidators(baseValidators, fieldConfigs);\n const asyncValidators = normalizeAsyncValidators(baseAsyncValidators, fieldConfigs);\n const { values: hydratedInitialValues } = hydrateInitialValues(initialValues, persistKey, storage);\n const initialSnapshot = deepClone(hydratedInitialValues);\n const valuesTree = signalTree(hydratedInitialValues, treeConfig);\n assertTreeNode(valuesTree.state);\n const flattenedState = valuesTree.state;\n enhanceArraysRecursively(flattenedState);\n const formGroup = createAbstractControl(hydratedInitialValues, '', syncValidators, asyncValidators);\n const destroyRef = providedDestroyRef ?? tryInjectDestroyRef();\n const cleanupCallbacks = [];\n const errors = signal({}, ...(ngDevMode ? [{ debugName: \"errors\" }] : []));\n const asyncErrors = signal({}, ...(ngDevMode ? [{ debugName: \"asyncErrors\" }] : []));\n const touched = signal({}, ...(ngDevMode ? [{ debugName: \"touched\" }] : []));\n const asyncValidating = signal({}, ...(ngDevMode ? [{ debugName: \"asyncValidating\" }] : []));\n const dirty = signal(formGroup.dirty, ...(ngDevMode ? [{ debugName: \"dirty\" }] : []));\n const valid = signal(formGroup.valid && !formGroup.pending, ...(ngDevMode ? [{ debugName: \"valid\" }] : []));\n const submitting = signal(false, ...(ngDevMode ? [{ debugName: \"submitting\" }] : []));\n const refreshRunner = () => {\n const snapshot = collectControlSnapshot(formGroup);\n errors.set(snapshot.syncErrors);\n asyncErrors.set(snapshot.asyncErrors);\n touched.set(snapshot.touched);\n asyncValidating.set(snapshot.pending);\n dirty.set(formGroup.dirty);\n valid.set(formGroup.valid && !formGroup.pending);\n };\n let refreshTimer = null;\n const refreshAggregates = (immediate = false) => {\n if (immediate || validationBatchMs <= 0) {\n if (refreshTimer) {\n clearTimeout(refreshTimer);\n refreshTimer = null;\n }\n refreshRunner();\n return;\n }\n if (refreshTimer) {\n clearTimeout(refreshTimer);\n }\n refreshTimer = setTimeout(() => {\n refreshTimer = null;\n refreshRunner();\n }, validationBatchMs);\n };\n refreshAggregates(true);\n const persistController = createPersistController(formGroup, persistKey, storage, persistDebounceMs, cleanupCallbacks);\n persistController.persistImmediately();\n const fieldErrorKeys = new Set([\n ...Object.keys(syncValidators),\n ...Object.keys(asyncValidators),\n ]);\n const fieldErrors = {};\n const fieldAsyncErrors = {};\n fieldErrorKeys.forEach((fieldPath) => {\n fieldErrors[fieldPath] = computed(() => errors()[fieldPath]);\n fieldAsyncErrors[fieldPath] = computed(() => asyncErrors()[fieldPath]);\n });\n const fieldConfigLookup = (path) => resolveFieldConfig(fieldConfigs, path);\n const connectControlRecursive = (control, path) => {\n if (control instanceof FormGroup) {\n Object.entries(control.controls).forEach(([key, child]) => {\n connectControlRecursive(child, joinPath(path, key));\n });\n return;\n }\n if (control instanceof FormArray) {\n const arraySignal = getSignalAtPath(flattenedState, path);\n if (arraySignal) {\n connectFormArrayAndSignal(control, arraySignal, path, syncValidators, asyncValidators, cleanupCallbacks, connectControlRecursive);\n }\n control.controls.forEach((child, index) => {\n connectControlRecursive(child, joinPath(path, String(index)));\n });\n return;\n }\n const signalAtPath = getSignalAtPath(flattenedState, path);\n if (signalAtPath) {\n connectControlAndSignal(control, signalAtPath, cleanupCallbacks, fieldConfigLookup(path));\n }\n };\n connectControlRecursive(formGroup, '');\n const conditionalState = new Map();\n const applyConditionals = conditionals.length > 0\n ? () => {\n const values = formGroup.getRawValue();\n conditionals.forEach(({ when, fields }) => {\n let visible = true;\n try {\n visible = when(values);\n }\n catch {\n visible = true;\n }\n fields.forEach((fieldPath) => {\n const control = formGroup.get(fieldPath);\n if (!control) {\n return;\n }\n const previous = conditionalState.get(fieldPath);\n if (previous === visible) {\n return;\n }\n conditionalState.set(fieldPath, visible);\n if (visible) {\n control.enable({ emitEvent: false });\n }\n else {\n control.disable({ emitEvent: false });\n }\n });\n });\n }\n : () => undefined;\n applyConditionals();\n const aggregateSubscriptions = [];\n aggregateSubscriptions.push(formGroup.valueChanges.subscribe(() => {\n refreshAggregates();\n persistController.schedulePersist();\n applyConditionals();\n }));\n aggregateSubscriptions.push(formGroup.statusChanges.subscribe(() => refreshAggregates()));\n if (formGroup.events) {\n aggregateSubscriptions.push(formGroup.events.subscribe(() => refreshAggregates()));\n }\n cleanupCallbacks.push(() => {\n aggregateSubscriptions.forEach((sub) => sub.unsubscribe());\n if (refreshTimer) {\n clearTimeout(refreshTimer);\n }\n });\n if (destroyRef) {\n destroyRef.onDestroy(() => {\n cleanupCallbacks.splice(0).forEach((fn) => fn());\n });\n }\n const setValue = (field, value) => {\n const targetSignal = getSignalAtPath(flattenedState, field);\n const control = formGroup.get(field);\n if (targetSignal && 'set' in targetSignal) {\n targetSignal.set(value);\n }\n else if (control) {\n control.setValue(value, { emitEvent: true });\n }\n if (control) {\n const untypedControl = control;\n untypedControl.markAsTouched();\n untypedControl.markAsDirty();\n untypedControl.updateValueAndValidity({ emitEvent: true });\n }\n refreshAggregates(true);\n persistController.schedulePersist();\n };\n const setValues = (values) => {\n Object.entries(values).forEach(([key, value]) => {\n setValue(key, value);\n });\n };\n const reset = () => {\n formGroup.reset(initialSnapshot);\n submitting.set(false);\n refreshAggregates(true);\n persistController.persistImmediately();\n applyConditionals();\n };\n const validate = async (field) => {\n if (field) {\n const control = formGroup.get(field);\n if (!control) {\n return;\n }\n control.markAsTouched();\n control.updateValueAndValidity({ emitEvent: true });\n refreshAggregates(true);\n await waitForPending(control);\n refreshAggregates(true);\n return;\n }\n formGroup.markAllAsTouched();\n formGroup.updateValueAndValidity({ emitEvent: true });\n refreshAggregates(true);\n await waitForPending(formGroup);\n refreshAggregates(true);\n };\n const submit = async (submitFn) => {\n submitting.set(true);\n try {\n await validate();\n if (!valid()) {\n throw new FormValidationError(errors(), asyncErrors());\n }\n const currentValues = formGroup.getRawValue();\n const result = await submitFn(currentValues);\n return result;\n }\n finally {\n submitting.set(false);\n refreshAggregates(true);\n }\n };\n const destroy = () => {\n cleanupCallbacks.splice(0).forEach((fn) => fn());\n };\n const formTree = {\n state: flattenedState,\n $: flattenedState,\n form: formGroup,\n errors,\n asyncErrors,\n touched,\n asyncValidating,\n dirty,\n valid,\n submitting,\n unwrap: () => valuesTree(),\n setValue,\n setValues,\n reset,\n submit,\n validate,\n getFieldError: (field) => fieldErrors[field] || computed(() => undefined),\n getFieldAsyncError: (field) => fieldAsyncErrors[field] || computed(() => undefined),\n getFieldTouched: (field) => computed(() => formGroup.get(field)?.touched ?? false),\n isFieldValid: (field) => computed(() => {\n const control = formGroup.get(field);\n return !!control && control.valid && !control.pending;\n }),\n isFieldAsyncValidating: (field) => computed(() => !!formGroup.get(field)?.pending),\n fieldErrors,\n fieldAsyncErrors,\n values: valuesTree,\n destroy,\n };\n return formTree;\n}\nexport function createVirtualFormArray(items, visibleRange, controlFactory = (value) => new FormControl(value)) {\n const start = Math.max(0, visibleRange.start);\n const end = Math.max(start, visibleRange.end);\n const controls = items\n .slice(start, end)\n .map((item, offset) => controlFactory(item, start + offset));\n return new FormArray(controls);\n}\nfunction enhanceArraysRecursively(obj, visited = new WeakSet()) {\n if (visited.has(obj)) {\n return;\n }\n visited.add(obj);\n for (const key in obj) {\n const value = obj[key];\n if (isSignal(value)) {\n const signalValue = value();\n if (Array.isArray(signalValue)) {\n obj[key] = enhanceArray(value);\n }\n }\n else if (typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)) {\n enhanceArraysRecursively(value, visited);\n }\n }\n}\nconst enhanceArray = (arraySignal) => {\n const enhanced = arraySignal;\n enhanced.push = (item) => {\n arraySignal.update((arr) => [...arr, item]);\n };\n enhanced.removeAt = (index) => {\n arraySignal.update((arr) => arr.filter((_, i) => i !== index));\n };\n enhanced.setAt = (index, value) => {\n arraySignal.update((arr) => arr.map((item, i) => (i === index ? value : item)));\n };\n enhanced.insertAt = (index, item) => {\n arraySignal.update((arr) => [\n ...arr.slice(0, index),\n item,\n ...arr.slice(index),\n ]);\n };\n enhanced.move = (from, to) => {\n arraySignal.update((arr) => {\n const newArr = [...arr];\n const [item] = newArr.splice(from, 1);\n if (item !== undefined) {\n newArr.splice(to, 0, item);\n }\n return newArr;\n });\n };\n enhanced.clear = () => {\n arraySignal.set([]);\n };\n return enhanced;\n};\nfunction getSignalAtPath(node, path) {\n if (!path) {\n return null;\n }\n const segments = parsePath(path);\n let current = node;\n for (const segment of segments) {\n if (!current || typeof current !== 'object') {\n return null;\n }\n current = current[segment];\n }\n if (isSignal(current)) {\n return current;\n }\n return null;\n}\nfunction joinPath(parent, segment) {\n return parent ? `${parent}.${segment}` : segment;\n}\nfunction wrapSyncValidator(validator) {\n return (control) => {\n const result = validator(control.value);\n return result ? { [SYNC_ERROR_KEY]: result } : null;\n };\n}\nfunction wrapAsyncValidator(validator) {\n return async (control) => {\n try {\n const maybeAsync = validator(control.value);\n const resolved = isObservable(maybeAsync)\n ? await firstValueFrom(maybeAsync)\n : await maybeAsync;\n return resolved ? { [ASYNC_ERROR_KEY]: resolved } : null;\n }\n catch {\n return { [ASYNC_ERROR_KEY]: 'Validation error' };\n }\n };\n}\nfunction createAbstractControl(value, path, validators, asyncValidators) {\n const syncValidator = findValidator(validators, path);\n const asyncValidator = findValidator(asyncValidators, path);\n const syncFns = syncValidator\n ? [wrapSyncValidator(syncValidator)]\n : undefined;\n const asyncFns = asyncValidator\n ? [wrapAsyncValidator(asyncValidator)]\n : undefined;\n if (Array.isArray(value)) {\n const controls = value.map((item, index) => createAbstractControl(item, joinPath(path, String(index)), validators, asyncValidators));\n return new FormArray(controls, syncFns, asyncFns);\n }\n if (isPlainObject(value)) {\n const controls = {};\n for (const [key, child] of Object.entries(value)) {\n controls[key] = createAbstractControl(child, joinPath(path, key), validators, asyncValidators);\n }\n return new FormGroup(controls, {\n validators: syncFns,\n asyncValidators: asyncFns,\n });\n }\n return new FormControl(value, {\n validators: syncFns,\n asyncValidators: asyncFns,\n nonNullable: false,\n });\n}\nfunction connectControlAndSignal(control, valueSignal, cleanupCallbacks, fieldConfig) {\n let updatingFromControl = false;\n let updatingFromSignal = false;\n let versionCounter = 0;\n let lastControlVersion = 0;\n let controlDebounceTimer = null;\n const debounceMs = fieldConfig?.debounceMs ?? 0;\n const originalSet = valueSignal.set.bind(valueSignal);\n const originalUpdate = valueSignal.update.bind(valueSignal);\n const applyControlValue = (value) => {\n updatingFromSignal = true;\n if (!Object.is(control.value, value)) {\n const untypedControl = control;\n untypedControl.setValue(value, { emitEvent: true });\n untypedControl.markAsDirty();\n }\n updatingFromSignal = false;\n };\n valueSignal.set = (value) => {\n const currentVersion = ++versionCounter;\n originalSet(value);\n if (updatingFromControl) {\n return;\n }\n if (lastControlVersion > currentVersion) {\n return;\n }\n applyControlValue(value);\n };\n valueSignal.update = (updater) => {\n const next = updater(valueSignal());\n valueSignal.set(next);\n };\n const pushUpdateFromControl = (value) => {\n updatingFromControl = true;\n lastControlVersion = ++versionCounter;\n originalSet(value);\n updatingFromControl = false;\n };\n const handleControlChange = (value) => {\n if (updatingFromSignal) {\n return;\n }\n if (debounceMs > 0) {\n if (controlDebounceTimer) {\n clearTimeout(controlDebounceTimer);\n }\n controlDebounceTimer = setTimeout(() => {\n controlDebounceTimer = null;\n pushUpdateFromControl(value);\n }, debounceMs);\n return;\n }\n pushUpdateFromControl(value);\n };\n const subscription = control.valueChanges.subscribe((value) => {\n handleControlChange(value);\n });\n cleanupCallbacks.push(() => {\n subscription.unsubscribe();\n valueSignal.set = originalSet;\n valueSignal.update = originalUpdate;\n if (controlDebounceTimer) {\n clearTimeout(controlDebounceTimer);\n }\n });\n}\nfunction connectFormArrayAndSignal(formArray, arraySignal, path, validators, asyncValidators, cleanupCallbacks, connectControlRecursive) {\n let updatingFromControl = false;\n let updatingFromSignal = false;\n const originalSet = arraySignal.set.bind(arraySignal);\n const originalUpdate = arraySignal.update.bind(arraySignal);\n arraySignal.set = (value) => {\n originalSet(value);\n if (updatingFromControl) {\n return;\n }\n updatingFromSignal = true;\n syncFormArrayFromValue(formArray, value, path, validators, asyncValidators, connectControlRecursive);\n formArray.markAsDirty();\n updatingFromSignal = false;\n };\n arraySignal.update = (updater) => {\n const next = updater(arraySignal());\n arraySignal.set(next);\n };\n const subscription = formArray.valueChanges.subscribe((value) => {\n if (updatingFromSignal) {\n return;\n }\n updatingFromControl = true;\n originalSet(value);\n updatingFromControl = false;\n });\n cleanupCallbacks.push(() => {\n subscription.unsubscribe();\n arraySignal.set = originalSet;\n arraySignal.update = originalUpdate;\n });\n syncFormArrayFromValue(formArray, arraySignal(), path, validators, asyncValidators, connectControlRecursive);\n}\nfunction syncFormArrayFromValue(formArray, nextValue, path, validators, asyncValidators, connectControlRecursive) {\n if (!Array.isArray(nextValue)) {\n nextValue = [];\n }\n while (formArray.length > nextValue.length) {\n formArray.removeAt(formArray.length - 1);\n }\n nextValue.forEach((item, index) => {\n const childPath = joinPath(path, String(index));\n const existing = formArray.at(index);\n if (!existing) {\n const control = createAbstractControl(item, childPath, validators, asyncValidators);\n formArray.insert(index, control);\n connectControlRecursive(control, childPath);\n return;\n }\n if (existing instanceof FormArray) {\n syncFormArrayFromValue(existing, Array.isArray(item) ? item : [], childPath, validators, asyncValidators, connectControlRecursive);\n return;\n }\n if (existing instanceof FormGroup) {\n if (isPlainObject(item)) {\n existing.setValue(item, {\n emitEvent: false,\n });\n }\n return;\n }\n if (!Object.is(existing.value, item)) {\n const untypedExisting = existing;\n untypedExisting.setValue(item, { emitEvent: false });\n }\n });\n}\nfunction collectControlSnapshot(control) {\n const snapshot = {\n syncErrors: {},\n asyncErrors: {},\n touched: {},\n pending: {},\n };\n traverseControls(control, (currentPath, currentControl) => {\n if (!currentPath) {\n return;\n }\n if (currentControl.touched) {\n snapshot.touched[currentPath] = true;\n }\n if (currentControl.pending) {\n snapshot.pending[currentPath] = true;\n }\n const errors = currentControl.errors;\n if (!errors) {\n return;\n }\n const syncMessage = errors[SYNC_ERROR_KEY];\n if (typeof syncMessage === 'string') {\n snapshot.syncErrors[currentPath] = syncMessage;\n }\n const asyncMessage = errors[ASYNC_ERROR_KEY];\n if (typeof asyncMessage === 'string') {\n snapshot.asyncErrors[currentPath] = asyncMessage;\n }\n }, '');\n return snapshot;\n}\nfunction traverseControls(control, visitor, path = '') {\n visitor(path, control);\n if (control instanceof FormGroup) {\n Object.entries(control.controls).forEach(([key, child]) => {\n traverseControls(child, visitor, joinPath(path, key));\n });\n return;\n }\n if (control instanceof FormArray) {\n control.controls.forEach((child, index) => {\n traverseControls(child, visitor, joinPath(path, String(index)));\n });\n }\n}\nfunction waitForPending(control) {\n if (!control.pending) {\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n const subscription = control.statusChanges.subscribe(() => {\n if (!control.pending) {\n subscription.unsubscribe();\n resolve();\n }\n });\n });\n}\nfunction isPlainObject(value) {\n return (!!value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n Object.prototype.toString.call(value) === '[object Object]');\n}\nfunction tryInjectDestroyRef() {\n try {\n return inject(DestroyRef);\n }\n catch {\n return null;\n }\n}\nfunction normalizeSyncValidators(base, fieldConfigs) {\n const buckets = new Map();\n for (const [path, validator] of Object.entries(base)) {\n const existing = buckets.get(path) ?? [];\n existing.push(validator);\n buckets.set(path, existing);\n }\n for (const [path, config] of Object.entries(fieldConfigs)) {\n const validators = toValidatorArray(config.validators);\n if (validators.length === 0) {\n continue;\n }\n const existing = buckets.get(path) ?? [];\n existing.push(...validators);\n buckets.set(path, existing);\n }\n const normalized = {};\n buckets.forEach((validators, path) => {\n normalized[path] = (value) => {\n for (const validator of validators) {\n const result = validator(value);\n if (result) {\n return result;\n }\n }\n return null;\n };\n });\n return { ...base, ...normalized };\n}\nfunction normalizeAsyncValidators(base, fieldConfigs) {\n const buckets = new Map();\n for (const [path, validator] of Object.entries(base)) {\n const existing = buckets.get(path) ?? [];\n existing.push(validator);\n buckets.set(path, existing);\n }\n for (const [path, config] of Object.entries(fieldConfigs)) {\n const validators = toValidatorArray(config.asyncValidators);\n if (validators.length === 0) {\n continue;\n }\n const existing = buckets.get(path) ?? [];\n existing.push(...validators);\n buckets.set(path, existing);\n }\n const normalized = {};\n buckets.forEach((validators, path) => {\n normalized[path] = async (value) => {\n for (const validator of validators) {\n const maybeAsync = validator(value);\n const result = isObservable(maybeAsync)\n ? await firstValueFrom(maybeAsync)\n : await maybeAsync;\n if (result) {\n return result;\n }\n }\n return null;\n };\n });\n return { ...base, ...normalized };\n}\nfunction toValidatorArray(input) {\n if (!input) {\n return [];\n }\n if (Array.isArray(input)) {\n return input;\n }\n return Object.values(input);\n}\nfunction hydrateInitialValues(initialValues, persistKey, storage) {\n const baseClone = deepClone(initialValues);\n if (!persistKey || !storage) {\n return { values: baseClone };\n }\n try {\n const storedRaw = storage.getItem(persistKey);\n if (!storedRaw) {\n return { values: baseClone };\n }\n const parsed = JSON.parse(storedRaw);\n const merged = mergeDeep(baseClone, parsed);\n return { values: merged };\n }\n catch {\n return { values: baseClone };\n }\n}\nfunction assertTreeNode(state) {\n if (!state || typeof state !== 'object') {\n throw new Error('Invalid state structure for form tree');\n }\n}\nfunction resolveFieldConfig(fieldConfigs, path) {\n if (fieldConfigs[path]) {\n return fieldConfigs[path];\n }\n const keys = Object.keys(fieldConfigs);\n let match;\n for (const key of keys) {\n if (!key.includes('*')) {\n continue;\n }\n if (matchPath(key, path)) {\n if (!match || match.key.length < key.length) {\n match = { key, config: fieldConfigs[key] };\n }\n }\n }\n if (match) {\n return match.config;\n }\n return fieldConfigs['*'];\n}\nfunction findValidator(map, path) {\n if (map[path]) {\n return map[path];\n }\n let candidate;\n for (const key of Object.keys(map)) {\n if (!key.includes('*')) {\n continue;\n }\n if (matchPath(key, path)) {\n if (!candidate || candidate.key.length < key.length) {\n candidate = { key, value: map[key] };\n }\n }\n }\n if (candidate) {\n return candidate.value;\n }\n return map['*'];\n}\nfunction createPersistController(formGroup, persistKey, storage, debounceMs, cleanupCallbacks) {\n if (!persistKey || !storage) {\n return {\n schedulePersist: () => undefined,\n persistImmediately: () => undefined,\n };\n }\n let timer = null;\n const persist = () => {\n try {\n const payload = JSON.stringify(formGroup.getRawValue());\n storage.setItem(persistKey, payload);\n }\n catch {\n }\n };\n const schedulePersist = () => {\n if (debounceMs <= 0) {\n persist();\n return;\n }\n if (timer) {\n clearTimeout(timer);\n }\n timer = setTimeout(() => {\n timer = null;\n persist();\n }, debounceMs);\n };\n cleanupCallbacks.push(() => {\n if (timer) {\n clearTimeout(timer);\n }\n });\n return {\n schedulePersist,\n persistImmediately: persist,\n };\n}\nexport class SignalValueDirective {\n signalTreeSignalValue;\n signalTreeSignalValueChange = new EventEmitter();\n elementRef = inject(ElementRef);\n renderer = inject(Renderer2);\n onChange = () => {\n };\n onTouched = () => {\n };\n ngOnInit() {\n effect(() => {\n const value = this.signalTreeSignalValue();\n this.renderer.setProperty(this.elementRef.nativeElement, 'value', value);\n });\n }\n handleChange(event) {\n const target = event.target;\n const value = target?.value;\n if (value !== undefined) {\n this.signalTreeSignalValue.set(value);\n this.signalTreeSignalValueChange.emit(value);\n this.onChange(value);\n }\n }\n handleBlur() {\n this.onTouched();\n }\n writeValue(value) {\n if (value !== undefined) {\n this.signalTreeSignalValue.set(value);\n }\n }\n registerOnChange(fn) {\n this.onChange = fn;\n }\n registerOnTouched(fn) {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled) {\n this.renderer.setProperty(this.elementRef.nativeElement, 'disabled', isDisabled);\n }\n static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.3.7\", ngImport: i0, type: SignalValueDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.3.7\", type: SignalValueDirective, isStandalone: true, selector: \"[signalTreeSignalValue]\", inputs: { signalTreeSignalValue: \"signalTreeSignalValue\" }, outputs: { signalTreeSignalValueChange: \"signalTreeSignalValueChange\" }, host: { listeners: { \"input\": \"handleChange($event)\", \"change\": \"handleChange($event)\", \"blur\": \"handleBlur()\" } }, providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SignalValueDirective),\n multi: true,\n },\n ], ngImport: i0 });\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.3.7\", ngImport: i0, type: SignalValueDirective, decorators: [{\n type: Directive,\n args: [{\n selector: '[signalTreeSignalValue]',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SignalValueDirective),\n multi: true,\n },\n ],\n standalone: true,\n }]\n }], propDecorators: { signalTreeSignalValue: [{\n type: Input\n }], signalTreeSignalValueChange: [{\n type: Output\n }], handleChange: [{\n type: HostListener,\n args: ['input', ['$event']]\n }, {\n type: HostListener,\n args: ['change', ['$event']]\n }], handleBlur: [{\n type: HostListener,\n args: ['blur']\n }] } });\nexport const SIGNAL_FORM_DIRECTIVES = [SignalValueDirective];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctZm9ybXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy1mb3Jtcy9zcmMvY29yZS9uZy1mb3Jtcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0wsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sTUFBTSxFQUdOLFVBQVUsRUFDVixTQUFTLEVBQ1QsVUFBVSxFQUNWLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBRVosUUFBUSxFQUNSLFVBQVUsR0FFWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBSUwsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1QsaUJBQWlCLEdBR2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRixPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBNEIsTUFBTSxNQUFNLENBQUM7O0FBc0c5RSxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsS0FBSztJQUUxQjtJQUNBO0lBRmxCLFlBQ2tCLE1BQThCLEVBQzlCLFdBQW1DO1FBRW5ELEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBSGhCLFdBQU0sR0FBTixNQUFNLENBQXdCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxDQUF3QjtRQUduRCxJQUFJLENBQUMsSUFBSSxHQUFHLHFCQUFxQixDQUFDO0lBQ3BDLENBQUM7Q0FDRjtBQUtELE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQztBQUNwQyxNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQztBQVUxQyxNQUFNLFVBQVUsY0FBYyxDQUM1QixhQUFnQixFQUNoQixTQUE2QixFQUFFO0lBRS9CLE1BQU0sRUFD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RUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHFCQUFxQixDQUFDOzRCQUNuRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtvQkFDRCxVQUFVLEVBQUUsSUFBSTtpQkFDakI7O3NCQUVFLEtBQUs7O3NCQUNMLE1BQU07O3NCQW1CTixZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQzs7c0JBQ2hDLFlBQVk7dUJBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDOztzQkFXakMsWUFBWTt1QkFBQyxNQUFNOztBQWdDdEIsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8vIDxyZWZlcmVuY2UgcGF0aD1cIi4uL3R5cGVzL3NpZ25hbHRyZWUtY29yZS5kLnRzXCIgLz5cbmltcG9ydCB7XG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgc2lnbmFsLFxuICBTaWduYWwsXG4gIFdyaXRhYmxlU2lnbmFsLFxuICBEZXN0cm95UmVmLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIFJlbmRlcmVyMixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdGFibGUsXG4gIGlzU2lnbmFsLFxuICBmb3J3YXJkUmVmLFxuICBPbkluaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBBc3luY1ZhbGlkYXRvckZuIGFzIEFuZ3VsYXJBc3luY1ZhbGlkYXRvckZuLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgRm9ybUFycmF5LFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUdyb3VwLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yRm4gYXMgQW5ndWxhclZhbGlkYXRvckZuLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBzaWduYWxUcmVlIH0gZnJvbSAnQHNpZ25hbHRyZWUvY29yZSc7XG5pbXBvcnQgeyBkZWVwQ2xvbmUsIG1hdGNoUGF0aCwgbWVyZ2VEZWVwLCBwYXJzZVBhdGggfSBmcm9tICdAc2lnbmFsdHJlZS9zaGFyZWQnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIGlzT2JzZXJ2YWJsZSwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogQGZpbGVvdmVydmlldyBBbmd1bGFyIEZvcm1zIEludGVncmF0aW9uIGZvciBTaWduYWxUcmVlXG4gKlxuICogUHJvdmlkZXMgY29tcHJlaGVuc2l2ZSBBbmd1bGFyIGZvcm0gaW50ZWdyYXRpb24gaW5jbHVkaW5nIEZvcm1UcmVlLFxuICogZGlyZWN0aXZlcywgdmFsaWRhdG9ycywgZW5oYW5jZWQgYXJyYXkgb3BlcmF0aW9ucywgYW5kIFJ4SlMgYnJpZGdlLlxuICovXG5cbi8vIFJlLWV4cG9ydCBjb3JlIHR5cGVzIG5lZWRlZCBmb3IgZm9ybXNcbmltcG9ydCB0eXBlIHsgU2lnbmFsVHJlZSwgVHJlZUNvbmZpZywgVHJlZU5vZGUgfSBmcm9tICdAc2lnbmFsdHJlZS9jb3JlJztcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBGT1JNIFRSRUUgVFlQRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIEZvcm1UcmVlQXN5bmNWYWxpZGF0b3JGbjxUPiA9IChcbiAgdmFsdWU6IFRcbikgPT4gT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPiB8IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG5cbmV4cG9ydCB0eXBlIEVuaGFuY2VkQXJyYXlTaWduYWw8VD4gPSBXcml0YWJsZVNpZ25hbDxUW10+ICYge1xuICBwdXNoOiAoaXRlbTogVCkgPT4gdm9pZDtcbiAgcmVtb3ZlQXQ6IChpbmRleDogbnVtYmVyKSA9PiB2b2lkO1xuICBzZXRBdDogKGluZGV4OiBudW1iZXIsIHZhbHVlOiBUKSA9PiB2b2lkO1xuICBpbnNlcnRBdDogKGluZGV4OiBudW1iZXIsIGl0ZW06IFQpID0+IHZvaWQ7XG4gIG1vdmU6IChmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpID0+IHZvaWQ7XG4gIGNsZWFyOiAoKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IHR5cGUgRmllbGRWYWxpZGF0b3IgPSAodmFsdWU6IHVua25vd24pID0+IHN0cmluZyB8IG51bGw7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmllbGRDb25maWcge1xuICBkZWJvdW5jZU1zPzogbnVtYmVyO1xuICB2YWxpZGF0b3JzPzogUmVjb3JkPHN0cmluZywgRmllbGRWYWxpZGF0b3I+IHwgRmllbGRWYWxpZGF0b3JbXTtcbiAgYXN5bmNWYWxpZGF0b3JzPzpcbiAgICB8IFJlY29yZDxzdHJpbmcsIEZvcm1UcmVlQXN5bmNWYWxpZGF0b3JGbjx1bmtub3duPj5cbiAgICB8IEFycmF5PEZvcm1UcmVlQXN5bmNWYWxpZGF0b3JGbjx1bmtub3duPj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZGl0aW9uYWxGaWVsZDxUPiB7XG4gIHdoZW46ICh2YWx1ZXM6IFQpID0+IGJvb2xlYW47XG4gIGZpZWxkczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybVRyZWVPcHRpb25zPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj5cbiAgZXh0ZW5kcyBUcmVlQ29uZmlnIHtcbiAgdmFsaWRhdG9ycz86IFN5bmNWYWxpZGF0b3JNYXA7XG4gIGFzeW5jVmFsaWRhdG9ycz86IEFzeW5jVmFsaWRhdG9yTWFwO1xuICBkZXN0cm95UmVmPzogRGVzdHJveVJlZjtcbiAgZmllbGRDb25maWdzPzogUmVjb3JkPHN0cmluZywgRmllbGRDb25maWc+O1xuICBjb25kaXRpb25hbHM/OiBBcnJheTxDb25kaXRpb25hbEZpZWxkPFQ+PjtcbiAgcGVyc2lzdEtleT86IHN0cmluZztcbiAgc3RvcmFnZT86IFBpY2s8U3RvcmFnZSwgJ2dldEl0ZW0nIHwgJ3NldEl0ZW0nIHwgJ3JlbW92ZUl0ZW0nPjtcbiAgcGVyc2lzdERlYm91bmNlTXM/OiBudW1iZXI7XG4gIHZhbGlkYXRpb25CYXRjaE1zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEZvcm0gdHJlZSB0eXBlIHRoYXQgZmxhdHRlbnMgdGhlIHN0YXRlIGFjY2VzcyB3aGlsZSBtYWludGFpbmluZyBmb3JtLXNwZWNpZmljIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgRm9ybVRyZWU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IHtcbiAgLy8gRmxhdHRlbmVkIHN0YXRlIGFjY2VzcyAtIGRpcmVjdCBhY2Nlc3MgdG8gZm9ybSB2YWx1ZXMgYXMgc2lnbmFsc1xuICBzdGF0ZTogVHJlZU5vZGU8VD47XG4gICQ6IFRyZWVOb2RlPFQ+OyAvLyBBbGlhcyBmb3Igc3RhdGVcblxuICAvLyBVbmRlcmx5aW5nIEFuZ3VsYXIgZm9ybSBzdHJ1Y3R1cmVcbiAgZm9ybTogRm9ybUdyb3VwO1xuXG4gIC8vIEZvcm0tc3BlY2lmaWMgc2lnbmFsc1xuICBlcnJvcnM6IFdyaXRhYmxlU2lnbmFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICBhc3luY0Vycm9yczogV3JpdGFibGVTaWduYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gIHRvdWNoZWQ6IFdyaXRhYmxlU2lnbmFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+PjtcbiAgYXN5bmNWYWxpZGF0aW5nOiBXcml0YWJsZVNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj47XG4gIGRpcnR5OiBXcml0YWJsZVNpZ25hbDxib29sZWFuPjtcbiAgdmFsaWQ6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+O1xuICBzdWJtaXR0aW5nOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPjtcblxuICAvLyBGb3JtIG1ldGhvZHNcbiAgdW53cmFwKCk6IFQ7XG4gIHNldFZhbHVlKGZpZWxkOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgc2V0VmFsdWVzKHZhbHVlczogUGFydGlhbDxUPik6IHZvaWQ7XG4gIHJlc2V0KCk6IHZvaWQ7XG4gIHN1Ym1pdDxUUmVzdWx0PihzdWJtaXRGbjogKHZhbHVlczogVCkgPT4gUHJvbWlzZTxUUmVzdWx0Pik6IFByb21pc2U8VFJlc3VsdD47XG4gIHZhbGlkYXRlKGZpZWxkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblxuICAvLyBGaWVsZC1sZXZlbCBoZWxwZXJzXG4gIGdldEZpZWxkRXJyb3IoZmllbGQ6IHN0cmluZyk6IFNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+O1xuICBnZXRGaWVsZEFzeW5jRXJyb3IoZmllbGQ6IHN0cmluZyk6IFNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+O1xuICBnZXRGaWVsZFRvdWNoZWQoZmllbGQ6IHN0cmluZyk6IFNpZ25hbDxib29sZWFuIHwgdW5kZWZpbmVkPjtcbiAgaXNGaWVsZFZhbGlkKGZpZWxkOiBzdHJpbmcpOiBTaWduYWw8Ym9vbGVhbj47XG4gIGlzRmllbGRBc3luY1ZhbGlkYXRpbmcoZmllbGQ6IHN0cmluZyk6IFNpZ25hbDxib29sZWFuIHwgdW5kZWZpbmVkPjtcblxuICAvLyBEaXJlY3QgYWNjZXNzIHRvIGZpZWxkIGVycm9yc1xuICBmaWVsZEVycm9yczogUmVjb3JkPHN0cmluZywgU2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4+O1xuICBmaWVsZEFzeW5jRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBTaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPj47XG5cbiAgLy8gS2VlcCB2YWx1ZXMgdHJlZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICB2YWx1ZXM6IFNpZ25hbFRyZWU8VD47XG5cbiAgLy8gQ2xlYW51cCBoZWxwZXJzIHRvIHRlYXIgZG93biBzdWJzY3JpcHRpb25zIGNyZWF0ZWQgZm9yIGJyaWRnZSBsYXllclxuICBkZXN0cm95KCk6IHZvaWQ7XG59O1xuXG5leHBvcnQgY2xhc3MgRm9ybVZhbGlkYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGVycm9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgICBwdWJsaWMgcmVhZG9ubHkgYXN5bmNFcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgKSB7XG4gICAgc3VwZXIoJ0Zvcm0gdmFsaWRhdGlvbiBmYWlsZWQnKTtcbiAgICB0aGlzLm5hbWUgPSAnRm9ybVZhbGlkYXRpb25FcnJvcic7XG4gIH1cbn1cblxudHlwZSBTeW5jVmFsaWRhdG9yTWFwID0gUmVjb3JkPHN0cmluZywgKHZhbHVlOiB1bmtub3duKSA9PiBzdHJpbmcgfCBudWxsPjtcbnR5cGUgQXN5bmNWYWxpZGF0b3JNYXAgPSBSZWNvcmQ8c3RyaW5nLCBGb3JtVHJlZUFzeW5jVmFsaWRhdG9yRm48dW5rbm93bj4+O1xuXG5jb25zdCBTWU5DX0VSUk9SX0tFWSA9ICdzaWduYWx0cmVlJztcbmNvbnN0IEFTWU5DX0VSUk9SX0tFWSA9ICdzaWduYWx0cmVlQXN5bmMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVVRJTElUWSBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBGT1JNIFRSRUUgSU1QTEVNRU5UQVRJT05cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtVHJlZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBpbml0aWFsVmFsdWVzOiBULFxuICBjb25maWc6IEZvcm1UcmVlT3B0aW9uczxUPiA9IHt9XG4pOiBGb3JtVHJlZTxUPiB7XG4gIGNvbnN0IHtcbiAgICB2YWxpZGF0b3JzOiBiYXNlVmFsaWRhdG9ycyA9IHt9LFxuICAgIGFzeW5jVmFsaWRhdG9yczogYmFzZUFzeW5jVmFsaWRhdG9ycyA9IHt9LFxuICAgIGRlc3Ryb3lSZWY6IHByb3ZpZGVkRGVzdHJveVJlZixcbiAgICBmaWVsZENvbmZpZ3MgPSB7fSxcbiAgICBjb25kaXRpb25hbHMgPSBbXSxcbiAgICBwZXJzaXN0S2V5LFxuICAgIHN0b3JhZ2UsXG4gICAgcGVyc2lzdERlYm91bmNlTXMgPSAxMDAsXG4gICAgdmFsaWRhdGlvbkJhdGNoTXMgPSAwLFxuICAgIC4uLnRyZWVDb25maWdcbiAgfSA9IGNvbmZpZztcblxuICBjb25zdCBzeW5jVmFsaWRhdG9ycyA9IG5vcm1hbGl6ZVN5bmNWYWxpZGF0b3JzKGJhc2VWYWxpZGF0b3JzLCBmaWVsZENvbmZpZ3MpO1xuICBjb25zdCBhc3luY1ZhbGlkYXRvcnMgPSBub3JtYWxpemVBc3luY1ZhbGlkYXRvcnMoXG4gICAgYmFzZUFzeW5jVmFsaWRhdG9ycyxcbiAgICBmaWVsZENvbmZpZ3NcbiAgKTtcblxuICBjb25zdCB7IHZhbHVlczogaHlkcmF0ZWRJbml0aWFsVmFsdWVzIH0gPSBoeWRyYXRlSW5pdGlhbFZhbHVlcyhcbiAgICBpbml0aWFsVmFsdWVzLFxuICAgIHBlcnNpc3RLZXksXG4gICAgc3RvcmFnZVxuICApO1xuICBjb25zdCBpbml0aWFsU25hcHNob3QgPSBkZWVwQ2xvbmUoaHlkcmF0ZWRJbml0aWFsVmFsdWVzKTtcblxuICBjb25zdCB2YWx1ZXNUcmVlID0gc2lnbmFsVHJlZShoeWRyYXRlZEluaXRpYWxWYWx1ZXMsIHRyZWVDb25maWcpO1xuICBhc3NlcnRUcmVlTm9kZTxUPih2YWx1ZXNUcmVlLnN0YXRlKTtcbiAgY29uc3QgZmxhdHRlbmVkU3RhdGUgPSB2YWx1ZXNUcmVlLnN0YXRlO1xuXG4gIGVuaGFuY2VBcnJheXNSZWN1cnNpdmVseShcbiAgICBmbGF0dGVuZWRTdGF0ZSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk7XG5cbiAgY29uc3QgZm9ybUdyb3VwID0gY3JlYXRlQWJzdHJhY3RDb250cm9sKFxuICAgIGh5ZHJhdGVkSW5pdGlhbFZhbHVlcyxcbiAgICAnJyxcbiAgICBzeW5jVmFsaWRhdG9ycyxcbiAgICBhc3luY1ZhbGlkYXRvcnNcbiAgKSBhcyBGb3JtR3JvdXA7XG5cbiAgY29uc3QgZGVzdHJveVJlZiA9IHByb3ZpZGVkRGVzdHJveVJlZiA/PyB0cnlJbmplY3REZXN0cm95UmVmKCk7XG4gIGNvbnN0IGNsZWFudXBDYWxsYmFja3M6IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cbiAgY29uc3QgZXJyb3JzID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KHt9KTtcbiAgY29uc3QgYXN5bmNFcnJvcnMgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oe30pO1xuICBjb25zdCB0b3VjaGVkID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+Pih7fSk7XG4gIGNvbnN0IGFzeW5jVmFsaWRhdGluZyA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oe30pO1xuICBjb25zdCBkaXJ0eSA9IHNpZ25hbChmb3JtR3JvdXAuZGlydHkpO1xuICBjb25zdCB2YWxpZCA9IHNpZ25hbChmb3JtR3JvdXAudmFsaWQgJiYgIWZvcm1Hcm91cC5wZW5kaW5nKTtcbiAgY29uc3Qgc3VibWl0dGluZyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgY29uc3QgcmVmcmVzaFJ1bm5lciA9ICgpID0+IHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IGNvbGxlY3RDb250cm9sU25hcHNob3QoZm9ybUdyb3VwKTtcbiAgICBlcnJvcnMuc2V0KHNuYXBzaG90LnN5bmNFcnJvcnMpO1xuICAgIGFzeW5jRXJyb3JzLnNldChzbmFwc2hvdC5hc3luY0Vycm9ycyk7XG4gICAgdG91Y2hlZC5zZXQoc25hcHNob3QudG91Y2hlZCk7XG4gICAgYXN5bmNWYWxpZGF0aW5nLnNldChzbmFwc2hvdC5wZW5kaW5nKTtcbiAgICBkaXJ0eS5zZXQoZm9ybUdyb3VwLmRpcnR5KTtcbiAgICB2YWxpZC5zZXQoZm9ybUdyb3VwLnZhbGlkICYmICFmb3JtR3JvdXAucGVuZGluZyk7XG4gIH07XG5cbiAgbGV0IHJlZnJlc2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgY29uc3QgcmVmcmVzaEFnZ3JlZ2F0ZXMgPSAoaW1tZWRpYXRlID0gZmFsc2UpID0+IHtcbiAgICBpZiAoaW1tZWRpYXRlIHx8IHZhbGlkYXRpb25CYXRjaE1zIDw9IDApIHtcbiAgICAgIGlmIChyZWZyZXNoVGltZXIpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHJlZnJlc2hUaW1lcik7XG4gICAgICAgIHJlZnJlc2hUaW1lciA9IG51bGw7XG4gICAgICB9XG4gICAgICByZWZyZXNoUnVubmVyKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHJlZnJlc2hUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHJlZnJlc2hUaW1lcik7XG4gICAgfVxuXG4gICAgcmVmcmVzaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICByZWZyZXNoVGltZXIgPSBudWxsO1xuICAgICAgcmVmcmVzaFJ1bm5lcigpO1xuICAgIH0sIHZhbGlkYXRpb25CYXRjaE1zKTtcbiAgfTtcblxuICByZWZyZXNoQWdncmVnYXRlcyh0cnVlKTtcblxuICBjb25zdCBwZXJzaXN0Q29udHJvbGxlciA9IGNyZWF0ZVBlcnNpc3RDb250cm9sbGVyKFxuICAgIGZvcm1Hcm91cCxcbiAgICBwZXJzaXN0S2V5LFxuICAgIHN0b3JhZ2UsXG4gICAgcGVyc2lzdERlYm91bmNlTXMsXG4gICAgY2xlYW51cENhbGxiYWNrc1xuICApO1xuICBwZXJzaXN0Q29udHJvbGxlci5wZXJzaXN0SW1tZWRpYXRlbHkoKTtcblxuICBjb25zdCBmaWVsZEVycm9yS2V5cyA9IG5ldyBTZXQoW1xuICAgIC4uLk9iamVjdC5rZXlzKHN5bmNWYWxpZGF0b3JzKSxcbiAgICAuLi5PYmplY3Qua2V5cyhhc3luY1ZhbGlkYXRvcnMpLFxuICBdKTtcblxuICBjb25zdCBmaWVsZEVycm9yczogUmVjb3JkPHN0cmluZywgU2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4+ID0ge307XG4gIGNvbnN0IGZpZWxkQXN5bmNFcnJvcnM6IFJlY29yZDxzdHJpbmcsIFNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+PiA9IHt9O1xuXG4gIGZpZWxkRXJyb3JLZXlzLmZvckVhY2goKGZpZWxkUGF0aCkgPT4ge1xuICAgIGZpZWxkRXJyb3JzW2ZpZWxkUGF0aF0gPSBjb21wdXRlZCgoKSA9PiBlcnJvcnMoKVtmaWVsZFBhdGhdKTtcbiAgICBmaWVsZEFzeW5jRXJyb3JzW2ZpZWxkUGF0aF0gPSBjb21wdXRlZCgoKSA9PiBhc3luY0Vycm9ycygpW2ZpZWxkUGF0aF0pO1xuICB9KTtcblxuICBjb25zdCBmaWVsZENvbmZpZ0xvb2t1cCA9IChwYXRoOiBzdHJpbmcpID0+XG4gICAgcmVzb2x2ZUZpZWxkQ29uZmlnKGZpZWxkQ29uZmlncywgcGF0aCk7XG5cbiAgY29uc3QgY29ubmVjdENvbnRyb2xSZWN1cnNpdmUgPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBwYXRoOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgT2JqZWN0LmVudHJpZXMoY29udHJvbC5jb250cm9scykuZm9yRWFjaCgoW2tleSwgY2hpbGRdKSA9PiB7XG4gICAgICAgIGNvbm5lY3RDb250cm9sUmVjdXJzaXZlKGNoaWxkLCBqb2luUGF0aChwYXRoLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICBjb25zdCBhcnJheVNpZ25hbCA9IGdldFNpZ25hbEF0UGF0aChmbGF0dGVuZWRTdGF0ZSwgcGF0aCk7XG4gICAgICBpZiAoYXJyYXlTaWduYWwpIHtcbiAgICAgICAgY29ubmVjdEZvcm1BcnJheUFuZFNpZ25hbChcbiAgICAgICAgICBjb250cm9sLFxuICAgICAgICAgIGFycmF5U2lnbmFsIGFzIEVuaGFuY2VkQXJyYXlTaWduYWw8dW5rbm93bj4sXG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBzeW5jVmFsaWRhdG9ycyxcbiAgICAgICAgICBhc3luY1ZhbGlkYXRvcnMsXG4gICAgICAgICAgY2xlYW51cENhbGxiYWNrcyxcbiAgICAgICAgICBjb25uZWN0Q29udHJvbFJlY3Vyc2l2ZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb250cm9sLmNvbnRyb2xzLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25uZWN0Q29udHJvbFJlY3Vyc2l2ZShjaGlsZCwgam9pblBhdGgocGF0aCwgU3RyaW5nKGluZGV4KSkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2lnbmFsQXRQYXRoID0gZ2V0U2lnbmFsQXRQYXRoKGZsYXR0ZW5lZFN0YXRlLCBwYXRoKTtcbiAgICBpZiAoc2lnbmFsQXRQYXRoKSB7XG4gICAgICBjb25uZWN0Q29udHJvbEFuZFNpZ25hbChcbiAgICAgICAgY29udHJvbCBhcyBGb3JtQ29udHJvbCxcbiAgICAgICAgc2lnbmFsQXRQYXRoIGFzIFdyaXRhYmxlU2lnbmFsPHVua25vd24+LFxuICAgICAgICBjbGVhbnVwQ2FsbGJhY2tzLFxuICAgICAgICBmaWVsZENvbmZpZ0xvb2t1cChwYXRoKVxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgY29ubmVjdENvbnRyb2xSZWN1cnNpdmUoZm9ybUdyb3VwLCAnJyk7XG5cbiAgY29uc3QgY29uZGl0aW9uYWxTdGF0ZSA9IG5ldyBNYXA8c3RyaW5nLCBib29sZWFuPigpO1xuICBjb25zdCBhcHBseUNvbmRpdGlvbmFscyA9XG4gICAgY29uZGl0aW9uYWxzLmxlbmd0aCA+IDBcbiAgICAgID8gKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IGZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpIGFzIFQ7XG4gICAgICAgICAgY29uZGl0aW9uYWxzLmZvckVhY2goKHsgd2hlbiwgZmllbGRzIH0pID0+IHtcbiAgICAgICAgICAgIGxldCB2aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHZpc2libGUgPSB3aGVuKHZhbHVlcyk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgdmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGRQYXRoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KGZpZWxkUGF0aCk7XG4gICAgICAgICAgICAgIGlmICghY29udHJvbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGNvbmRpdGlvbmFsU3RhdGUuZ2V0KGZpZWxkUGF0aCk7XG4gICAgICAgICAgICAgIGlmIChwcmV2aW91cyA9PT0gdmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25kaXRpb25hbFN0YXRlLnNldChmaWVsZFBhdGgsIHZpc2libGUpO1xuICAgICAgICAgICAgICBpZiAodmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIGNvbnRyb2wuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgOiAoKSA9PiB1bmRlZmluZWQ7XG5cbiAgYXBwbHlDb25kaXRpb25hbHMoKTtcblxuICBjb25zdCBhZ2dyZWdhdGVTdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuICBhZ2dyZWdhdGVTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgcmVmcmVzaEFnZ3JlZ2F0ZXMoKTtcbiAgICAgIHBlcnNpc3RDb250cm9sbGVyLnNjaGVkdWxlUGVyc2lzdCgpO1xuICAgICAgYXBwbHlDb25kaXRpb25hbHMoKTtcbiAgICB9KVxuICApO1xuICBhZ2dyZWdhdGVTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgZm9ybUdyb3VwLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHJlZnJlc2hBZ2dyZWdhdGVzKCkpXG4gICk7XG4gIGlmIChmb3JtR3JvdXAuZXZlbnRzKSB7XG4gICAgYWdncmVnYXRlU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgZm9ybUdyb3VwLmV2ZW50cy5zdWJzY3JpYmUoKCkgPT4gcmVmcmVzaEFnZ3JlZ2F0ZXMoKSlcbiAgICApO1xuICB9XG5cbiAgY2xlYW51cENhbGxiYWNrcy5wdXNoKCgpID0+IHtcbiAgICBhZ2dyZWdhdGVTdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YikgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgIGlmIChyZWZyZXNoVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dChyZWZyZXNoVGltZXIpO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGRlc3Ryb3lSZWYpIHtcbiAgICBkZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiB7XG4gICAgICBjbGVhbnVwQ2FsbGJhY2tzLnNwbGljZSgwKS5mb3JFYWNoKChmbikgPT4gZm4oKSk7XG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBzZXRWYWx1ZSA9IChmaWVsZDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgIGNvbnN0IHRhcmdldFNpZ25hbCA9IGdldFNpZ25hbEF0UGF0aChmbGF0dGVuZWRTdGF0ZSwgZmllbGQpO1xuICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KGZpZWxkKTtcblxuICAgIGlmICh0YXJnZXRTaWduYWwgJiYgJ3NldCcgaW4gdGFyZ2V0U2lnbmFsKSB7XG4gICAgICAodGFyZ2V0U2lnbmFsIGFzIFdyaXRhYmxlU2lnbmFsPHVua25vd24+KS5zZXQodmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoY29udHJvbCkge1xuICAgICAgKGNvbnRyb2wgYXMgQWJzdHJhY3RDb250cm9sKS5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgIGNvbnN0IHVudHlwZWRDb250cm9sID0gY29udHJvbCBhcyBBYnN0cmFjdENvbnRyb2w7XG4gICAgICB1bnR5cGVkQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICB1bnR5cGVkQ29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgdW50eXBlZENvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICByZWZyZXNoQWdncmVnYXRlcyh0cnVlKTtcbiAgICBwZXJzaXN0Q29udHJvbGxlci5zY2hlZHVsZVBlcnNpc3QoKTtcbiAgfTtcblxuICBjb25zdCBzZXRWYWx1ZXMgPSAodmFsdWVzOiBQYXJ0aWFsPFQ+KSA9PiB7XG4gICAgT2JqZWN0LmVudHJpZXModmFsdWVzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHNldFZhbHVlKGtleSwgdmFsdWUpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuICAgIGZvcm1Hcm91cC5yZXNldChpbml0aWFsU25hcHNob3QpO1xuICAgIHN1Ym1pdHRpbmcuc2V0KGZhbHNlKTtcbiAgICByZWZyZXNoQWdncmVnYXRlcyh0cnVlKTtcbiAgICBwZXJzaXN0Q29udHJvbGxlci5wZXJzaXN0SW1tZWRpYXRlbHkoKTtcbiAgICBhcHBseUNvbmRpdGlvbmFscygpO1xuICB9O1xuXG4gIGNvbnN0IHZhbGlkYXRlID0gYXN5bmMgKGZpZWxkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGZpZWxkKSB7XG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmdldChmaWVsZCk7XG4gICAgICBpZiAoIWNvbnRyb2wpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICAgIHJlZnJlc2hBZ2dyZWdhdGVzKHRydWUpO1xuICAgICAgYXdhaXQgd2FpdEZvclBlbmRpbmcoY29udHJvbCk7XG4gICAgICByZWZyZXNoQWdncmVnYXRlcyh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3JtR3JvdXAubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgIGZvcm1Hcm91cC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICAgIHJlZnJlc2hBZ2dyZWdhdGVzKHRydWUpO1xuICAgIGF3YWl0IHdhaXRGb3JQZW5kaW5nKGZvcm1Hcm91cCk7XG4gICAgcmVmcmVzaEFnZ3JlZ2F0ZXModHJ1ZSk7XG4gIH07XG5cbiAgY29uc3Qgc3VibWl0ID0gYXN5bmMgPFRSZXN1bHQ+KFxuICAgIHN1Ym1pdEZuOiAodmFsdWVzOiBUKSA9PiBQcm9taXNlPFRSZXN1bHQ+XG4gICk6IFByb21pc2U8VFJlc3VsdD4gPT4ge1xuICAgIHN1Ym1pdHRpbmcuc2V0KHRydWUpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB2YWxpZGF0ZSgpO1xuXG4gICAgICBpZiAoIXZhbGlkKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZvcm1WYWxpZGF0aW9uRXJyb3IoZXJyb3JzKCksIGFzeW5jRXJyb3JzKCkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50VmFsdWVzID0gZm9ybUdyb3VwLmdldFJhd1ZhbHVlKCkgYXMgVDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN1Ym1pdEZuKGN1cnJlbnRWYWx1ZXMpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc3VibWl0dGluZy5zZXQoZmFsc2UpO1xuICAgICAgcmVmcmVzaEFnZ3JlZ2F0ZXModHJ1ZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgY2xlYW51cENhbGxiYWNrcy5zcGxpY2UoMCkuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuICB9O1xuXG4gIGNvbnN0IGZvcm1UcmVlOiBGb3JtVHJlZTxUPiA9IHtcbiAgICBzdGF0ZTogZmxhdHRlbmVkU3RhdGUsXG4gICAgJDogZmxhdHRlbmVkU3RhdGUsXG4gICAgZm9ybTogZm9ybUdyb3VwLFxuICAgIGVycm9ycyxcbiAgICBhc3luY0Vycm9ycyxcbiAgICB0b3VjaGVkLFxuICAgIGFzeW5jVmFsaWRhdGluZyxcbiAgICBkaXJ0eSxcbiAgICB2YWxpZCxcbiAgICBzdWJtaXR0aW5nLFxuICAgIHVud3JhcDogKCkgPT4gdmFsdWVzVHJlZSgpLFxuICAgIHNldFZhbHVlLFxuICAgIHNldFZhbHVlcyxcbiAgICByZXNldCxcbiAgICBzdWJtaXQsXG4gICAgdmFsaWRhdGUsXG4gICAgZ2V0RmllbGRFcnJvcjogKGZpZWxkOiBzdHJpbmcpID0+XG4gICAgICBmaWVsZEVycm9yc1tmaWVsZF0gfHwgY29tcHV0ZWQoKCkgPT4gdW5kZWZpbmVkKSxcbiAgICBnZXRGaWVsZEFzeW5jRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PlxuICAgICAgZmllbGRBc3luY0Vycm9yc1tmaWVsZF0gfHwgY29tcHV0ZWQoKCkgPT4gdW5kZWZpbmVkKSxcbiAgICBnZXRGaWVsZFRvdWNoZWQ6IChmaWVsZDogc3RyaW5nKSA9PlxuICAgICAgY29tcHV0ZWQoKCkgPT4gZm9ybUdyb3VwLmdldChmaWVsZCk/LnRvdWNoZWQgPz8gZmFsc2UpLFxuICAgIGlzRmllbGRWYWxpZDogKGZpZWxkOiBzdHJpbmcpID0+XG4gICAgICBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KGZpZWxkKTtcbiAgICAgICAgcmV0dXJuICEhY29udHJvbCAmJiBjb250cm9sLnZhbGlkICYmICFjb250cm9sLnBlbmRpbmc7XG4gICAgICB9KSxcbiAgICBpc0ZpZWxkQXN5bmNWYWxpZGF0aW5nOiAoZmllbGQ6IHN0cmluZykgPT5cbiAgICAgIGNvbXB1dGVkKCgpID0+ICEhZm9ybUdyb3VwLmdldChmaWVsZCk/LnBlbmRpbmcpLFxuICAgIGZpZWxkRXJyb3JzLFxuICAgIGZpZWxkQXN5bmNFcnJvcnMsXG4gICAgdmFsdWVzOiB2YWx1ZXNUcmVlLFxuICAgIGRlc3Ryb3ksXG4gIH07XG5cbiAgcmV0dXJuIGZvcm1UcmVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVmlydHVhbEZvcm1BcnJheTxUPihcbiAgaXRlbXM6IFRbXSxcbiAgdmlzaWJsZVJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gIGNvbnRyb2xGYWN0b3J5OiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIpID0+IEFic3RyYWN0Q29udHJvbCA9ICh2YWx1ZSkgPT5cbiAgICBuZXcgRm9ybUNvbnRyb2wodmFsdWUpXG4pOiBGb3JtQXJyYXkge1xuICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDAsIHZpc2libGVSYW5nZS5zdGFydCk7XG4gIGNvbnN0IGVuZCA9IE1hdGgubWF4KHN0YXJ0LCB2aXNpYmxlUmFuZ2UuZW5kKTtcblxuICBjb25zdCBjb250cm9scyA9IGl0ZW1zXG4gICAgLnNsaWNlKHN0YXJ0LCBlbmQpXG4gICAgLm1hcCgoaXRlbSwgb2Zmc2V0KSA9PiBjb250cm9sRmFjdG9yeShpdGVtLCBzdGFydCArIG9mZnNldCkpO1xuXG4gIHJldHVybiBuZXcgRm9ybUFycmF5KGNvbnRyb2xzKTtcbn1cblxuZnVuY3Rpb24gZW5oYW5jZUFycmF5c1JlY3Vyc2l2ZWx5KFxuICBvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICB2aXNpdGVkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpXG4pOiB2b2lkIHtcbiAgaWYgKHZpc2l0ZWQuaGFzKG9iaikpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmlzaXRlZC5hZGQob2JqKTtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAgIGlmIChpc1NpZ25hbCh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHNpZ25hbFZhbHVlID0gKHZhbHVlIGFzIFNpZ25hbDx1bmtub3duPikoKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNpZ25hbFZhbHVlKSkge1xuICAgICAgICBvYmpba2V5XSA9IGVuaGFuY2VBcnJheSh2YWx1ZSBhcyBXcml0YWJsZVNpZ25hbDx1bmtub3duW10+KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICkge1xuICAgICAgZW5oYW5jZUFycmF5c1JlY3Vyc2l2ZWx5KHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCB2aXNpdGVkKTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgZW5oYW5jZUFycmF5ID0gPFU+KFxuICBhcnJheVNpZ25hbDogV3JpdGFibGVTaWduYWw8VVtdPlxuKTogRW5oYW5jZWRBcnJheVNpZ25hbDxVPiA9PiB7XG4gIGNvbnN0IGVuaGFuY2VkID0gYXJyYXlTaWduYWwgYXMgRW5oYW5jZWRBcnJheVNpZ25hbDxVPjtcblxuICBlbmhhbmNlZC5wdXNoID0gKGl0ZW06IFUpID0+IHtcbiAgICBhcnJheVNpZ25hbC51cGRhdGUoKGFycikgPT4gWy4uLmFyciwgaXRlbV0pO1xuICB9O1xuXG4gIGVuaGFuY2VkLnJlbW92ZUF0ID0gKGluZGV4OiBudW1iZXIpID0+IHtcbiAgICBhcnJheVNpZ25hbC51cGRhdGUoKGFycikgPT4gYXJyLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpKTtcbiAgfTtcblxuICBlbmhhbmNlZC5zZXRBdCA9IChpbmRleDogbnVtYmVyLCB2YWx1ZTogVSkgPT4ge1xuICAgIGFycmF5U2lnbmFsLnVwZGF0ZSgoYXJyKSA9PlxuICAgICAgYXJyLm1hcCgoaXRlbSwgaSkgPT4gKGkgPT09IGluZGV4ID8gdmFsdWUgOiBpdGVtKSlcbiAgICApO1xuICB9O1xuXG4gIGVuaGFuY2VkLmluc2VydEF0ID0gKGluZGV4OiBudW1iZXIsIGl0ZW06IFUpID0+IHtcbiAgICBhcnJheVNpZ25hbC51cGRhdGUoKGFycikgPT4gW1xuICAgICAgLi4uYXJyLnNsaWNlKDAsIGluZGV4KSxcbiAgICAgIGl0ZW0sXG4gICAgICAuLi5hcnIuc2xpY2UoaW5kZXgpLFxuICAgIF0pO1xuICB9O1xuXG4gIGVuaGFuY2VkLm1vdmUgPSAoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKSA9PiB7XG4gICAgYXJyYXlTaWduYWwudXBkYXRlKChhcnIpID0+IHtcbiAgICAgIGNvbnN0IG5ld0FyciA9IFsuLi5hcnJdO1xuICAgICAgY29uc3QgW2l0ZW1dID0gbmV3QXJyLnNwbGljZShmcm9tLCAxKTtcbiAgICAgIGlmIChpdGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3QXJyLnNwbGljZSh0bywgMCwgaXRlbSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3QXJyO1xuICAgIH0pO1xuICB9O1xuXG4gIGVuaGFuY2VkLmNsZWFyID0gKCkgPT4ge1xuICAgIGFycmF5U2lnbmFsLnNldChbXSk7XG4gIH07XG5cbiAgcmV0dXJuIGVuaGFuY2VkO1xufTtcblxuZnVuY3Rpb24gZ2V0U2lnbmFsQXRQYXRoPFQ+KFxuICBub2RlOiBUcmVlTm9kZTxUPixcbiAgcGF0aDogc3RyaW5nXG4pOiBXcml0YWJsZVNpZ25hbDx1bmtub3duPiB8IG51bGwge1xuICBpZiAoIXBhdGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHNlZ21lbnRzID0gcGFyc2VQYXRoKHBhdGgpO1xuICBsZXQgY3VycmVudDogdW5rbm93biA9IG5vZGU7XG5cbiAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNlZ21lbnRzKSB7XG4gICAgaWYgKCFjdXJyZW50IHx8IHR5cGVvZiBjdXJyZW50ICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY3VycmVudCA9IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtzZWdtZW50XTtcbiAgfVxuXG4gIGlmIChpc1NpZ25hbChjdXJyZW50KSkge1xuICAgIHJldHVybiBjdXJyZW50IGFzIFdyaXRhYmxlU2lnbmFsPHVua25vd24+O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGpvaW5QYXRoKHBhcmVudDogc3RyaW5nLCBzZWdtZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcGFyZW50ID8gYCR7cGFyZW50fS4ke3NlZ21lbnR9YCA6IHNlZ21lbnQ7XG59XG5cbmZ1bmN0aW9uIHdyYXBTeW5jVmFsaWRhdG9yKFxuICB2YWxpZGF0b3I6ICh2YWx1ZTogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVsbFxuKTogQW5ndWxhclZhbGlkYXRvckZuIHtcbiAgcmV0dXJuIChjb250cm9sKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdmFsaWRhdG9yKGNvbnRyb2wudmFsdWUpO1xuICAgIHJldHVybiByZXN1bHQgPyB7IFtTWU5DX0VSUk9SX0tFWV06IHJlc3VsdCB9IDogbnVsbDtcbiAgfTtcbn1cblxuZnVuY3Rpb24gd3JhcEFzeW5jVmFsaWRhdG9yKFxuICB2YWxpZGF0b3I6IEZvcm1UcmVlQXN5bmNWYWxpZGF0b3JGbjx1bmtub3duPlxuKTogQW5ndWxhckFzeW5jVmFsaWRhdG9yRm4ge1xuICByZXR1cm4gYXN5bmMgKGNvbnRyb2wpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWF5YmVBc3luYyA9IHZhbGlkYXRvcihjb250cm9sLnZhbHVlKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gaXNPYnNlcnZhYmxlKG1heWJlQXN5bmMpXG4gICAgICAgID8gYXdhaXQgZmlyc3RWYWx1ZUZyb20obWF5YmVBc3luYylcbiAgICAgICAgOiBhd2FpdCBtYXliZUFzeW5jO1xuICAgICAgcmV0dXJuIHJlc29sdmVkID8geyBbQVNZTkNfRVJST1JfS0VZXTogcmVzb2x2ZWQgfSA6IG51bGw7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4geyBbQVNZTkNfRVJST1JfS0VZXTogJ1ZhbGlkYXRpb24gZXJyb3InIH07XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBYnN0cmFjdENvbnRyb2woXG4gIHZhbHVlOiB1bmtub3duLFxuICBwYXRoOiBzdHJpbmcsXG4gIHZhbGlkYXRvcnM6IFN5bmNWYWxpZGF0b3JNYXAsXG4gIGFzeW5jVmFsaWRhdG9yczogQXN5bmNWYWxpZGF0b3JNYXBcbik6IEFic3RyYWN0Q29udHJvbCB7XG4gIGNvbnN0IHN5bmNWYWxpZGF0b3IgPSBmaW5kVmFsaWRhdG9yKHZhbGlkYXRvcnMsIHBhdGgpO1xuICBjb25zdCBhc3luY1ZhbGlkYXRvciA9IGZpbmRWYWxpZGF0b3IoYXN5bmNWYWxpZGF0b3JzLCBwYXRoKTtcblxuICBjb25zdCBzeW5jRm5zID0gc3luY1ZhbGlkYXRvclxuICAgID8gW3dyYXBTeW5jVmFsaWRhdG9yKHN5bmNWYWxpZGF0b3IpXVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBhc3luY0ZucyA9IGFzeW5jVmFsaWRhdG9yXG4gICAgPyBbd3JhcEFzeW5jVmFsaWRhdG9yKGFzeW5jVmFsaWRhdG9yKV1cbiAgICA6IHVuZGVmaW5lZDtcblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBjb25zdCBjb250cm9scyA9IHZhbHVlLm1hcCgoaXRlbSwgaW5kZXgpID0+XG4gICAgICBjcmVhdGVBYnN0cmFjdENvbnRyb2woXG4gICAgICAgIGl0ZW0sXG4gICAgICAgIGpvaW5QYXRoKHBhdGgsIFN0cmluZyhpbmRleCkpLFxuICAgICAgICB2YWxpZGF0b3JzLFxuICAgICAgICBhc3luY1ZhbGlkYXRvcnNcbiAgICAgIClcbiAgICApO1xuICAgIHJldHVybiBuZXcgRm9ybUFycmF5KGNvbnRyb2xzLCBzeW5jRm5zLCBhc3luY0Zucyk7XG4gIH1cblxuICBpZiAoaXNQbGFpbk9iamVjdCh2YWx1ZSkpIHtcbiAgICBjb25zdCBjb250cm9sczogUmVjb3JkPHN0cmluZywgQWJzdHJhY3RDb250cm9sPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgY29udHJvbHNba2V5XSA9IGNyZWF0ZUFic3RyYWN0Q29udHJvbChcbiAgICAgICAgY2hpbGQsXG4gICAgICAgIGpvaW5QYXRoKHBhdGgsIGtleSksXG4gICAgICAgIHZhbGlkYXRvcnMsXG4gICAgICAgIGFzeW5jVmFsaWRhdG9yc1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBGb3JtR3JvdXAoY29udHJvbHMsIHtcbiAgICAgIHZhbGlkYXRvcnM6IHN5bmNGbnMsXG4gICAgICBhc3luY1ZhbGlkYXRvcnM6IGFzeW5jRm5zLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBGb3JtQ29udHJvbCh2YWx1ZSwge1xuICAgIHZhbGlkYXRvcnM6IHN5bmNGbnMsXG4gICAgYXN5bmNWYWxpZGF0b3JzOiBhc3luY0ZucyxcbiAgICBub25OdWxsYWJsZTogZmFsc2UsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb25uZWN0Q29udHJvbEFuZFNpZ25hbChcbiAgY29udHJvbDogRm9ybUNvbnRyb2wsXG4gIHZhbHVlU2lnbmFsOiBXcml0YWJsZVNpZ25hbDx1bmtub3duPixcbiAgY2xlYW51cENhbGxiYWNrczogQXJyYXk8KCkgPT4gdm9pZD4sXG4gIGZpZWxkQ29uZmlnPzogRmllbGRDb25maWdcbik6IHZvaWQge1xuICBsZXQgdXBkYXRpbmdGcm9tQ29udHJvbCA9IGZhbHNlO1xuICBsZXQgdXBkYXRpbmdGcm9tU2lnbmFsID0gZmFsc2U7XG4gIGxldCB2ZXJzaW9uQ291bnRlciA9IDA7XG4gIGxldCBsYXN0Q29udHJvbFZlcnNpb24gPSAwO1xuICBsZXQgY29udHJvbERlYm91bmNlVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IGRlYm91bmNlTXMgPSBmaWVsZENvbmZpZz8uZGVib3VuY2VNcyA/PyAwO1xuXG4gIGNvbnN0IG9yaWdpbmFsU2V0ID0gdmFsdWVTaWduYWwuc2V0LmJpbmQodmFsdWVTaWduYWwpO1xuICBjb25zdCBvcmlnaW5hbFVwZGF0ZSA9IHZhbHVlU2lnbmFsLnVwZGF0ZS5iaW5kKHZhbHVlU2lnbmFsKTtcblxuICBjb25zdCBhcHBseUNvbnRyb2xWYWx1ZSA9ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgIHVwZGF0aW5nRnJvbVNpZ25hbCA9IHRydWU7XG4gICAgaWYgKCFPYmplY3QuaXMoY29udHJvbC52YWx1ZSwgdmFsdWUpKSB7XG4gICAgICBjb25zdCB1bnR5cGVkQ29udHJvbCA9IGNvbnRyb2wgYXMgQWJzdHJhY3RDb250cm9sO1xuICAgICAgdW50eXBlZENvbnRyb2wuc2V0VmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiB0cnVlIH0pO1xuICAgICAgdW50eXBlZENvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICB9XG4gICAgdXBkYXRpbmdGcm9tU2lnbmFsID0gZmFsc2U7XG4gIH07XG5cbiAgdmFsdWVTaWduYWwuc2V0ID0gKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgY29uc3QgY3VycmVudFZlcnNpb24gPSArK3ZlcnNpb25Db3VudGVyO1xuICAgIG9yaWdpbmFsU2V0KHZhbHVlKTtcbiAgICBpZiAodXBkYXRpbmdGcm9tQ29udHJvbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobGFzdENvbnRyb2xWZXJzaW9uID4gY3VycmVudFZlcnNpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXBwbHlDb250cm9sVmFsdWUodmFsdWUpO1xuICB9O1xuXG4gIHZhbHVlU2lnbmFsLnVwZGF0ZSA9ICh1cGRhdGVyKSA9PiB7XG4gICAgY29uc3QgbmV4dCA9IHVwZGF0ZXIodmFsdWVTaWduYWwoKSk7XG4gICAgdmFsdWVTaWduYWwuc2V0KG5leHQpO1xuICB9O1xuXG4gIGNvbnN0IHB1c2hVcGRhdGVGcm9tQ29udHJvbCA9ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgIHVwZGF0aW5nRnJvbUNvbnRyb2wgPSB0cnVlO1xuICAgIGxhc3RDb250cm9sVmVyc2lvbiA9ICsrdmVyc2lvbkNvdW50ZXI7XG4gICAgb3JpZ2luYWxTZXQodmFsdWUpO1xuICAgIHVwZGF0aW5nRnJvbUNvbnRyb2wgPSBmYWxzZTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVDb250cm9sQ2hhbmdlID0gKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgaWYgKHVwZGF0aW5nRnJvbVNpZ25hbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkZWJvdW5jZU1zID4gMCkge1xuICAgICAgaWYgKGNvbnRyb2xEZWJvdW5jZVRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dChjb250cm9sRGVib3VuY2VUaW1lcik7XG4gICAgICB9XG4gICAgICBjb250cm9sRGVib3VuY2VUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb250cm9sRGVib3VuY2VUaW1lciA9IG51bGw7XG4gICAgICAgIHB1c2hVcGRhdGVGcm9tQ29udHJvbCh2YWx1ZSk7XG4gICAgICB9LCBkZWJvdW5jZU1zKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwdXNoVXBkYXRlRnJvbUNvbnRyb2wodmFsdWUpO1xuICB9O1xuXG4gIGNvbnN0IHN1YnNjcmlwdGlvbiA9IGNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICBoYW5kbGVDb250cm9sQ2hhbmdlKHZhbHVlKTtcbiAgfSk7XG5cbiAgY2xlYW51cENhbGxiYWNrcy5wdXNoKCgpID0+IHtcbiAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB2YWx1ZVNpZ25hbC5zZXQgPSBvcmlnaW5hbFNldDtcbiAgICB2YWx1ZVNpZ25hbC51cGRhdGUgPSBvcmlnaW5hbFVwZGF0ZTtcbiAgICBpZiAoY29udHJvbERlYm91bmNlVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dChjb250cm9sRGVib3VuY2VUaW1lcik7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gY29ubmVjdEZvcm1BcnJheUFuZFNpZ25hbChcbiAgZm9ybUFycmF5OiBGb3JtQXJyYXksXG4gIGFycmF5U2lnbmFsOiBFbmhhbmNlZEFycmF5U2lnbmFsPHVua25vd24+LFxuICBwYXRoOiBzdHJpbmcsXG4gIHZhbGlkYXRvcnM6IFN5bmNWYWxpZGF0b3JNYXAsXG4gIGFzeW5jVmFsaWRhdG9yczogQXN5bmNWYWxpZGF0b3JNYXAsXG4gIGNsZWFudXBDYWxsYmFja3M6IEFycmF5PCgpID0+IHZvaWQ+LFxuICBjb25uZWN0Q29udHJvbFJlY3Vyc2l2ZTogKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgcGF0aDogc3RyaW5nKSA9PiB2b2lkXG4pOiB2b2lkIHtcbiAgbGV0IHVwZGF0aW5nRnJvbUNvbnRyb2wgPSBmYWxzZTtcbiAgbGV0IHVwZGF0aW5nRnJvbVNpZ25hbCA9IGZhbHNlO1xuXG4gIGNvbnN0IG9yaWdpbmFsU2V0ID0gYXJyYXlTaWduYWwuc2V0LmJpbmQoYXJyYXlTaWduYWwpO1xuICBjb25zdCBvcmlnaW5hbFVwZGF0ZSA9IGFycmF5U2lnbmFsLnVwZGF0ZS5iaW5kKGFycmF5U2lnbmFsKTtcblxuICBhcnJheVNpZ25hbC5zZXQgPSAodmFsdWU6IHVua25vd25bXSkgPT4ge1xuICAgIG9yaWdpbmFsU2V0KHZhbHVlKTtcbiAgICBpZiAodXBkYXRpbmdGcm9tQ29udHJvbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB1cGRhdGluZ0Zyb21TaWduYWwgPSB0cnVlO1xuICAgIHN5bmNGb3JtQXJyYXlGcm9tVmFsdWUoXG4gICAgICBmb3JtQXJyYXksXG4gICAgICB2YWx1ZSxcbiAgICAgIHBhdGgsXG4gICAgICB2YWxpZGF0b3JzLFxuICAgICAgYXN5bmNWYWxpZGF0b3JzLFxuICAgICAgY29ubmVjdENvbnRyb2xSZWN1cnNpdmVcbiAgICApO1xuICAgIGZvcm1BcnJheS5tYXJrQXNEaXJ0eSgpO1xuICAgIHVwZGF0aW5nRnJvbVNpZ25hbCA9IGZhbHNlO1xuICB9O1xuXG4gIGFycmF5U2lnbmFsLnVwZGF0ZSA9ICh1cGRhdGVyKSA9PiB7XG4gICAgY29uc3QgbmV4dCA9IHVwZGF0ZXIoYXJyYXlTaWduYWwoKSk7XG4gICAgYXJyYXlTaWduYWwuc2V0KG5leHQpO1xuICB9O1xuXG4gIGNvbnN0IHN1YnNjcmlwdGlvbiA9IGZvcm1BcnJheS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgIGlmICh1cGRhdGluZ0Zyb21TaWduYWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdXBkYXRpbmdGcm9tQ29udHJvbCA9IHRydWU7XG4gICAgb3JpZ2luYWxTZXQodmFsdWUgYXMgdW5rbm93bltdKTtcbiAgICB1cGRhdGluZ0Zyb21Db250cm9sID0gZmFsc2U7XG4gIH0pO1xuXG4gIGNsZWFudXBDYWxsYmFja3MucHVzaCgoKSA9PiB7XG4gICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgYXJyYXlTaWduYWwuc2V0ID0gb3JpZ2luYWxTZXQ7XG4gICAgYXJyYXlTaWduYWwudXBkYXRlID0gb3JpZ2luYWxVcGRhdGU7XG4gIH0pO1xuXG4gIHN5bmNGb3JtQXJyYXlGcm9tVmFsdWUoXG4gICAgZm9ybUFycmF5LFxuICAgIGFycmF5U2lnbmFsKCksXG4gICAgcGF0aCxcbiAgICB2YWxpZGF0b3JzLFxuICAgIGFzeW5jVmFsaWRhdG9ycyxcbiAgICBjb25uZWN0Q29udHJvbFJlY3Vyc2l2ZVxuICApO1xufVxuXG5mdW5jdGlvbiBzeW5jRm9ybUFycmF5RnJvbVZhbHVlKFxuICBmb3JtQXJyYXk6IEZvcm1BcnJheSxcbiAgbmV4dFZhbHVlOiB1bmtub3duW10sXG4gIHBhdGg6IHN0cmluZyxcbiAgdmFsaWRhdG9yczogU3luY1ZhbGlkYXRvck1hcCxcbiAgYXN5bmNWYWxpZGF0b3JzOiBBc3luY1ZhbGlkYXRvck1hcCxcbiAgY29ubmVjdENvbnRyb2xSZWN1cnNpdmU6IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIHBhdGg6IHN0cmluZykgPT4gdm9pZFxuKTogdm9pZCB7XG4gIGlmICghQXJyYXkuaXNBcnJheShuZXh0VmFsdWUpKSB7XG4gICAgbmV4dFZhbHVlID0gW107XG4gIH1cblxuICB3aGlsZSAoZm9ybUFycmF5Lmxlbmd0aCA+IG5leHRWYWx1ZS5sZW5ndGgpIHtcbiAgICBmb3JtQXJyYXkucmVtb3ZlQXQoZm9ybUFycmF5Lmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgbmV4dFZhbHVlLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgY29uc3QgY2hpbGRQYXRoID0gam9pblBhdGgocGF0aCwgU3RyaW5nKGluZGV4KSk7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBmb3JtQXJyYXkuYXQoaW5kZXgpO1xuXG4gICAgaWYgKCFleGlzdGluZykge1xuICAgICAgY29uc3QgY29udHJvbCA9IGNyZWF0ZUFic3RyYWN0Q29udHJvbChcbiAgICAgICAgaXRlbSxcbiAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICB2YWxpZGF0b3JzLFxuICAgICAgICBhc3luY1ZhbGlkYXRvcnNcbiAgICAgICk7XG4gICAgICBmb3JtQXJyYXkuaW5zZXJ0KGluZGV4LCBjb250cm9sKTtcbiAgICAgIGNvbm5lY3RDb250cm9sUmVjdXJzaXZlKGNvbnRyb2wsIGNoaWxkUGF0aCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV4aXN0aW5nIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICBzeW5jRm9ybUFycmF5RnJvbVZhbHVlKFxuICAgICAgICBleGlzdGluZyxcbiAgICAgICAgQXJyYXkuaXNBcnJheShpdGVtKSA/IGl0ZW0gOiBbXSxcbiAgICAgICAgY2hpbGRQYXRoLFxuICAgICAgICB2YWxpZGF0b3JzLFxuICAgICAgICBhc3luY1ZhbGlkYXRvcnMsXG4gICAgICAgIGNvbm5lY3RDb250cm9sUmVjdXJzaXZlXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChleGlzdGluZyBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgaWYgKGlzUGxhaW5PYmplY3QoaXRlbSkpIHtcbiAgICAgICAgZXhpc3Rpbmcuc2V0VmFsdWUoaXRlbSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwge1xuICAgICAgICAgIGVtaXRFdmVudDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghT2JqZWN0LmlzKGV4aXN0aW5nLnZhbHVlLCBpdGVtKSkge1xuICAgICAgY29uc3QgdW50eXBlZEV4aXN0aW5nID0gZXhpc3RpbmcgYXMgQWJzdHJhY3RDb250cm9sO1xuICAgICAgdW50eXBlZEV4aXN0aW5nLnNldFZhbHVlKGl0ZW0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5pbnRlcmZhY2UgQ29udHJvbFNuYXBzaG90IHtcbiAgc3luY0Vycm9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgYXN5bmNFcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHRvdWNoZWQ6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+O1xuICBwZW5kaW5nOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPjtcbn1cblxuZnVuY3Rpb24gY29sbGVjdENvbnRyb2xTbmFwc2hvdChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBDb250cm9sU25hcHNob3Qge1xuICBjb25zdCBzbmFwc2hvdDogQ29udHJvbFNuYXBzaG90ID0ge1xuICAgIHN5bmNFcnJvcnM6IHt9LFxuICAgIGFzeW5jRXJyb3JzOiB7fSxcbiAgICB0b3VjaGVkOiB7fSxcbiAgICBwZW5kaW5nOiB7fSxcbiAgfTtcblxuICB0cmF2ZXJzZUNvbnRyb2xzKFxuICAgIGNvbnRyb2wsXG4gICAgKGN1cnJlbnRQYXRoLCBjdXJyZW50Q29udHJvbCkgPT4ge1xuICAgICAgaWYgKCFjdXJyZW50UGF0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50Q29udHJvbC50b3VjaGVkKSB7XG4gICAgICAgIHNuYXBzaG90LnRvdWNoZWRbY3VycmVudFBhdGhdID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGN1cnJlbnRDb250cm9sLnBlbmRpbmcpIHtcbiAgICAgICAgc25hcHNob3QucGVuZGluZ1tjdXJyZW50UGF0aF0gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvcnMgPSBjdXJyZW50Q29udHJvbC5lcnJvcnMgYXMgVmFsaWRhdGlvbkVycm9ycyB8IG51bGw7XG4gICAgICBpZiAoIWVycm9ycykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN5bmNNZXNzYWdlID0gZXJyb3JzW1NZTkNfRVJST1JfS0VZXTtcbiAgICAgIGlmICh0eXBlb2Ygc3luY01lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHNuYXBzaG90LnN5bmNFcnJvcnNbY3VycmVudFBhdGhdID0gc3luY01lc3NhZ2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFzeW5jTWVzc2FnZSA9IGVycm9yc1tBU1lOQ19FUlJPUl9LRVldO1xuICAgICAgaWYgKHR5cGVvZiBhc3luY01lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHNuYXBzaG90LmFzeW5jRXJyb3JzW2N1cnJlbnRQYXRoXSA9IGFzeW5jTWVzc2FnZTtcbiAgICAgIH1cbiAgICB9LFxuICAgICcnXG4gICk7XG5cbiAgcmV0dXJuIHNuYXBzaG90O1xufVxuXG5mdW5jdGlvbiB0cmF2ZXJzZUNvbnRyb2xzKFxuICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsXG4gIHZpc2l0b3I6IChwYXRoOiBzdHJpbmcsIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gdm9pZCxcbiAgcGF0aCA9ICcnXG4pOiB2b2lkIHtcbiAgdmlzaXRvcihwYXRoLCBjb250cm9sKTtcblxuICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgIE9iamVjdC5lbnRyaWVzKGNvbnRyb2wuY29udHJvbHMpLmZvckVhY2goKFtrZXksIGNoaWxkXSkgPT4ge1xuICAgICAgdHJhdmVyc2VDb250cm9scyhjaGlsZCwgdmlzaXRvciwgam9pblBhdGgocGF0aCwga2V5KSk7XG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICBjb250cm9sLmNvbnRyb2xzLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgdHJhdmVyc2VDb250cm9scyhjaGlsZCwgdmlzaXRvciwgam9pblBhdGgocGF0aCwgU3RyaW5nKGluZGV4KSkpO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHdhaXRGb3JQZW5kaW5nKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWNvbnRyb2wucGVuZGluZykge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IGNvbnRyb2wuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKCFjb250cm9sLnBlbmRpbmcpIHtcbiAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiAoXG4gICAgISF2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiZcbiAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJ1xuICApO1xufVxuXG5mdW5jdGlvbiB0cnlJbmplY3REZXN0cm95UmVmKCk6IERlc3Ryb3lSZWYgfCBudWxsIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTeW5jVmFsaWRhdG9ycyhcbiAgYmFzZTogU3luY1ZhbGlkYXRvck1hcCxcbiAgZmllbGRDb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBGaWVsZENvbmZpZz5cbik6IFN5bmNWYWxpZGF0b3JNYXAge1xuICBjb25zdCBidWNrZXRzID0gbmV3IE1hcDxzdHJpbmcsIEZpZWxkVmFsaWRhdG9yW10+KCk7XG5cbiAgZm9yIChjb25zdCBbcGF0aCwgdmFsaWRhdG9yXSBvZiBPYmplY3QuZW50cmllcyhiYXNlKSkge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYnVja2V0cy5nZXQocGF0aCkgPz8gW107XG4gICAgZXhpc3RpbmcucHVzaCh2YWxpZGF0b3IpO1xuICAgIGJ1Y2tldHMuc2V0KHBhdGgsIGV4aXN0aW5nKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW3BhdGgsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoZmllbGRDb25maWdzKSkge1xuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSB0b1ZhbGlkYXRvckFycmF5KGNvbmZpZy52YWxpZGF0b3JzKTtcbiAgICBpZiAodmFsaWRhdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZyA9IGJ1Y2tldHMuZ2V0KHBhdGgpID8/IFtdO1xuICAgIGV4aXN0aW5nLnB1c2goLi4udmFsaWRhdG9ycyk7XG4gICAgYnVja2V0cy5zZXQocGF0aCwgZXhpc3RpbmcpO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZDogU3luY1ZhbGlkYXRvck1hcCA9IHt9O1xuICBidWNrZXRzLmZvckVhY2goKHZhbGlkYXRvcnMsIHBhdGgpID0+IHtcbiAgICBub3JtYWxpemVkW3BhdGhdID0gKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHZhbGlkYXRvciBvZiB2YWxpZGF0b3JzKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRvcih2YWx1ZSk7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9KTtcblxuICByZXR1cm4geyAuLi5iYXNlLCAuLi5ub3JtYWxpemVkIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFzeW5jVmFsaWRhdG9ycyhcbiAgYmFzZTogQXN5bmNWYWxpZGF0b3JNYXAsXG4gIGZpZWxkQ29uZmlnczogUmVjb3JkPHN0cmluZywgRmllbGRDb25maWc+XG4pOiBBc3luY1ZhbGlkYXRvck1hcCB7XG4gIGNvbnN0IGJ1Y2tldHMgPSBuZXcgTWFwPHN0cmluZywgQXJyYXk8Rm9ybVRyZWVBc3luY1ZhbGlkYXRvckZuPHVua25vd24+Pj4oKTtcblxuICBmb3IgKGNvbnN0IFtwYXRoLCB2YWxpZGF0b3JdIG9mIE9iamVjdC5lbnRyaWVzKGJhc2UpKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBidWNrZXRzLmdldChwYXRoKSA/PyBbXTtcbiAgICBleGlzdGluZy5wdXNoKHZhbGlkYXRvcik7XG4gICAgYnVja2V0cy5zZXQocGF0aCwgZXhpc3RpbmcpO1xuICB9XG5cbiAgZm9yIChjb25zdCBbcGF0aCwgY29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhmaWVsZENvbmZpZ3MpKSB7XG4gICAgY29uc3QgdmFsaWRhdG9ycyA9IHRvVmFsaWRhdG9yQXJyYXkoY29uZmlnLmFzeW5jVmFsaWRhdG9ycyk7XG4gICAgaWYgKHZhbGlkYXRvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSBidWNrZXRzLmdldChwYXRoKSA/PyBbXTtcbiAgICBleGlzdGluZy5wdXNoKC4uLnZhbGlkYXRvcnMpO1xuICAgIGJ1Y2tldHMuc2V0KHBhdGgsIGV4aXN0aW5nKTtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWQ6IEFzeW5jVmFsaWRhdG9yTWFwID0ge307XG4gIGJ1Y2tldHMuZm9yRWFjaCgodmFsaWRhdG9ycywgcGF0aCkgPT4ge1xuICAgIG5vcm1hbGl6ZWRbcGF0aF0gPSBhc3luYyAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgIGZvciAoY29uc3QgdmFsaWRhdG9yIG9mIHZhbGlkYXRvcnMpIHtcbiAgICAgICAgY29uc3QgbWF5YmVBc3luYyA9IHZhbGlkYXRvcih2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGlzT2JzZXJ2YWJsZShtYXliZUFzeW5jKVxuICAgICAgICAgID8gYXdhaXQgZmlyc3RWYWx1ZUZyb20obWF5YmVBc3luYylcbiAgICAgICAgICA6IGF3YWl0IG1heWJlQXN5bmM7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuICB9KTtcblxuICByZXR1cm4geyAuLi5iYXNlLCAuLi5ub3JtYWxpemVkIH07XG59XG5cbmZ1bmN0aW9uIHRvVmFsaWRhdG9yQXJyYXk8VD4oaW5wdXQ/OiBSZWNvcmQ8c3RyaW5nLCBUPiB8IFRbXSk6IFRbXSB7XG4gIGlmICghaW5wdXQpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGlucHV0KTtcbn1cblxuZnVuY3Rpb24gaHlkcmF0ZUluaXRpYWxWYWx1ZXM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgaW5pdGlhbFZhbHVlczogVCxcbiAgcGVyc2lzdEtleT86IHN0cmluZyxcbiAgc3RvcmFnZT86IFBpY2s8U3RvcmFnZSwgJ2dldEl0ZW0nIHwgJ3NldEl0ZW0nIHwgJ3JlbW92ZUl0ZW0nPlxuKTogeyB2YWx1ZXM6IFQgfSB7XG4gIGNvbnN0IGJhc2VDbG9uZSA9IGRlZXBDbG9uZShpbml0aWFsVmFsdWVzKTtcblxuICBpZiAoIXBlcnNpc3RLZXkgfHwgIXN0b3JhZ2UpIHtcbiAgICByZXR1cm4geyB2YWx1ZXM6IGJhc2VDbG9uZSB9O1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzdG9yZWRSYXcgPSBzdG9yYWdlLmdldEl0ZW0ocGVyc2lzdEtleSk7XG4gICAgaWYgKCFzdG9yZWRSYXcpIHtcbiAgICAgIHJldHVybiB7IHZhbHVlczogYmFzZUNsb25lIH07XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc3RvcmVkUmF3KSBhcyBQYXJ0aWFsPFQ+O1xuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlRGVlcChiYXNlQ2xvbmUsIHBhcnNlZCk7XG4gICAgcmV0dXJuIHsgdmFsdWVzOiBtZXJnZWQgfTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHsgdmFsdWVzOiBiYXNlQ2xvbmUgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRUcmVlTm9kZTxUPihzdGF0ZTogdW5rbm93bik6IGFzc2VydHMgc3RhdGUgaXMgVHJlZU5vZGU8VD4ge1xuICBpZiAoIXN0YXRlIHx8IHR5cGVvZiBzdGF0ZSAhPT0gJ29iamVjdCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RhdGUgc3RydWN0dXJlIGZvciBmb3JtIHRyZWUnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlRmllbGRDb25maWcoXG4gIGZpZWxkQ29uZmlnczogUmVjb3JkPHN0cmluZywgRmllbGRDb25maWc+LFxuICBwYXRoOiBzdHJpbmdcbik6IEZpZWxkQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGZpZWxkQ29uZmlnc1twYXRoXSkge1xuICAgIHJldHVybiBmaWVsZENvbmZpZ3NbcGF0aF07XG4gIH1cblxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZmllbGRDb25maWdzKTtcbiAgbGV0IG1hdGNoOiB7IGtleTogc3RyaW5nOyBjb25maWc6IEZpZWxkQ29uZmlnIH0gfCB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGlmICgha2V5LmluY2x1ZGVzKCcqJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAobWF0Y2hQYXRoKGtleSwgcGF0aCkpIHtcbiAgICAgIGlmICghbWF0Y2ggfHwgbWF0Y2gua2V5Lmxlbmd0aCA8IGtleS5sZW5ndGgpIHtcbiAgICAgICAgbWF0Y2ggPSB7IGtleSwgY29uZmlnOiBmaWVsZENvbmZpZ3Nba2V5XSB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChtYXRjaCkge1xuICAgIHJldHVybiBtYXRjaC5jb25maWc7XG4gIH1cblxuICByZXR1cm4gZmllbGRDb25maWdzWycqJ107XG59XG5cbmZ1bmN0aW9uIGZpbmRWYWxpZGF0b3I8VD4obWFwOiBSZWNvcmQ8c3RyaW5nLCBUPiwgcGF0aDogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gIGlmIChtYXBbcGF0aF0pIHtcbiAgICByZXR1cm4gbWFwW3BhdGhdO1xuICB9XG5cbiAgbGV0IGNhbmRpZGF0ZTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IFQgfSB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobWFwKSkge1xuICAgIGlmICgha2V5LmluY2x1ZGVzKCcqJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAobWF0Y2hQYXRoKGtleSwgcGF0aCkpIHtcbiAgICAgIGlmICghY2FuZGlkYXRlIHx8IGNhbmRpZGF0ZS5rZXkubGVuZ3RoIDwga2V5Lmxlbmd0aCkge1xuICAgICAgICBjYW5kaWRhdGUgPSB7IGtleSwgdmFsdWU6IG1hcFtrZXldIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGNhbmRpZGF0ZSkge1xuICAgIHJldHVybiBjYW5kaWRhdGUudmFsdWU7XG4gIH1cblxuICByZXR1cm4gbWFwWycqJ107XG59XG5cbmludGVyZmFjZSBQZXJzaXN0Q29udHJvbGxlciB7XG4gIHNjaGVkdWxlUGVyc2lzdDogKCkgPT4gdm9pZDtcbiAgcGVyc2lzdEltbWVkaWF0ZWx5OiAoKSA9PiB2b2lkO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQZXJzaXN0Q29udHJvbGxlcihcbiAgZm9ybUdyb3VwOiBGb3JtR3JvdXAsXG4gIHBlcnNpc3RLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgc3RvcmFnZTogUGljazxTdG9yYWdlLCAnZ2V0SXRlbScgfCAnc2V0SXRlbScgfCAncmVtb3ZlSXRlbSc+IHwgdW5kZWZpbmVkLFxuICBkZWJvdW5jZU1zOiBudW1iZXIsXG4gIGNsZWFudXBDYWxsYmFja3M6IEFycmF5PCgpID0+IHZvaWQ+XG4pOiBQZXJzaXN0Q29udHJvbGxlciB7XG4gIGlmICghcGVyc2lzdEtleSB8fCAhc3RvcmFnZSkge1xuICAgIHJldHVybiB7XG4gICAgICBzY2hlZHVsZVBlcnNpc3Q6ICgpID0+IHVuZGVmaW5lZCxcbiAgICAgIHBlcnNpc3RJbW1lZGlhdGVseTogKCkgPT4gdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3QgcGVyc2lzdCA9ICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KGZvcm1Hcm91cC5nZXRSYXdWYWx1ZSgpKTtcbiAgICAgIHN0b3JhZ2Uuc2V0SXRlbShwZXJzaXN0S2V5LCBwYXlsb2FkKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFN3YWxsb3cgcGVyc2lzdGVuY2UgZXJyb3JzIHRvIGF2b2lkIGJyZWFraW5nIGZvcm0gdXBkYXRlc1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBzY2hlZHVsZVBlcnNpc3QgPSAoKSA9PiB7XG4gICAgaWYgKGRlYm91bmNlTXMgPD0gMCkge1xuICAgICAgcGVyc2lzdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB9XG5cbiAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgcGVyc2lzdCgpO1xuICAgIH0sIGRlYm91bmNlTXMpO1xuICB9O1xuXG4gIGNsZWFudXBDYWxsYmFja3MucHVzaCgoKSA9PiB7XG4gICAgaWYgKHRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBzY2hlZHVsZVBlcnNpc3QsXG4gICAgcGVyc2lzdEltbWVkaWF0ZWx5OiBwZXJzaXN0LFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQU5HVUxBUiBESVJFQ1RJVkVcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogU2ltcGxlIGRpcmVjdGl2ZSBmb3IgdHdvLXdheSBiaW5kaW5nIHdpdGggc2lnbmFsc1xuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbc2lnbmFsVHJlZVNpZ25hbFZhbHVlXScsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2lnbmFsVmFsdWVEaXJlY3RpdmUpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgU2lnbmFsVmFsdWVEaXJlY3RpdmUgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0IHtcbiAgQElucHV0KCkgc2lnbmFsVHJlZVNpZ25hbFZhbHVlITogV3JpdGFibGVTaWduYWw8dW5rbm93bj47XG4gIEBPdXRwdXQoKSBzaWduYWxUcmVlU2lnbmFsVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHVua25vd24+KCk7XG5cbiAgcHJpdmF0ZSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG5cbiAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkID0gKCkgPT4ge1xuICAgIC8vIEVtcHR5IGltcGxlbWVudGF0aW9uIGZvciBDb250cm9sVmFsdWVBY2Nlc3NvclxuICB9O1xuICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHtcbiAgICAvLyBFbXB0eSBpbXBsZW1lbnRhdGlvbiBmb3IgQ29udHJvbFZhbHVlQWNjZXNzb3JcbiAgfTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnNpZ25hbFRyZWVTaWduYWxWYWx1ZSgpO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignaW5wdXQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdjaGFuZ2UnLCBbJyRldmVudCddKVxuICBoYW5kbGVDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgdmFsdWUgPSB0YXJnZXQ/LnZhbHVlO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNpZ25hbFRyZWVTaWduYWxWYWx1ZS5zZXQodmFsdWUpO1xuICAgICAgdGhpcy5zaWduYWxUcmVlU2lnbmFsVmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgaGFuZGxlQmx1cigpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNpZ25hbFRyZWVTaWduYWxWYWx1ZS5zZXQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KFxuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAnZGlzYWJsZWQnLFxuICAgICAgaXNEaXNhYmxlZFxuICAgICk7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVYUE9SVFNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjb25zdCBTSUdOQUxfRk9STV9ESVJFQ1RJVkVTID0gW1NpZ25hbFZhbHVlRGlyZWN0aXZlXTtcbiJdfQ==","export function required(message = 'Required') {\n return (value) => (!value ? message : null);\n}\nexport function email(message = 'Invalid email') {\n return (value) => {\n const strValue = value;\n return strValue && !strValue.includes('@') ? message : null;\n };\n}\nexport function minLength(min, message) {\n return (value) => {\n const strValue = value;\n const errorMsg = message ?? `Min ${min} characters`;\n return strValue && strValue.length < min ? errorMsg : null;\n };\n}\nexport function maxLength(max, message) {\n return (value) => {\n const strValue = value;\n const errorMsg = message ?? `Max ${max} characters`;\n return strValue && strValue.length > max ? errorMsg : null;\n };\n}\nexport function pattern(regex, message = 'Invalid format') {\n return (value) => {\n const strValue = value;\n return strValue && !regex.test(strValue) ? message : null;\n };\n}\nexport function min(min, message) {\n return (value) => {\n const numValue = value;\n const errorMsg = message ?? `Must be at least ${min}`;\n return numValue < min ? errorMsg : null;\n };\n}\nexport function max(max, message) {\n return (value) => {\n const numValue = value;\n const errorMsg = message ?? `Must be at most ${max}`;\n return numValue > max ? errorMsg : null;\n };\n}\nexport function compose(validators) {\n return (value) => {\n for (const validator of validators) {\n const error = validator(value);\n if (error) {\n return error;\n }\n }\n return null;\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLWZvcm1zL3NyYy9jb3JlL3ZhbGlkYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMEJBLE1BQU0sVUFBVSxRQUFRLENBQUMsT0FBTyxHQUFHLFVBQVU7SUFDM0MsT0FBTyxDQUFDLEtBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBaUJELE1BQU0sVUFBVSxLQUFLLENBQUMsT0FBTyxHQUFHLGVBQWU7SUFDN0MsT0FBTyxDQUFDLEtBQWMsRUFBRSxFQUFFO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLEtBQWUsQ0FBQztRQUNqQyxPQUFPLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzlELENBQUMsQ0FBQztBQUNKLENBQUM7QUFtQkQsTUFBTSxVQUFVLFNBQVMsQ0FBQyxHQUFXLEVBQUUsT0FBZ0I7SUFDckQsT0FBTyxDQUFDLEtBQWMsRUFBRSxFQUFFO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLEtBQWUsQ0FBQztRQUNqQyxNQUFNLFFBQVEsR0FBRyxPQUFPLElBQUksT0FBTyxHQUFHLGFBQWEsQ0FBQztRQUNwRCxPQUFPLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDN0QsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQW1CRCxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVcsRUFBRSxPQUFnQjtJQUNyRCxPQUFPLENBQUMsS0FBYyxFQUFFLEVBQUU7UUFDeEIsTUFBTSxRQUFRLEdBQUcsS0FBZSxDQUFDO1FBQ2pDLE1BQU0sUUFBUSxHQUFHLE9BQU8sSUFBSSxPQUFPLEdBQUcsYUFBYSxDQUFDO1FBQ3BELE9BQU8sUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM3RCxDQUFDLENBQUM7QUFDSixDQUFDO0FBbUJELE1BQU0sVUFBVSxPQUFPLENBQ3JCLEtBQWEsRUFDYixPQUFPLEdBQUcsZ0JBQWdCO0lBRTFCLE9BQU8sQ0FBQyxLQUFjLEVBQUUsRUFBRTtRQUN4QixNQUFNLFFBQVEsR0FBRyxLQUFlLENBQUM7UUFDakMsT0FBTyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUM1RCxDQUFDLENBQUM7QUFDSixDQUFDO0FBbUJELE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBVyxFQUFFLE9BQWdCO0lBQy9DLE9BQU8sQ0FBQyxLQUFjLEVBQUUsRUFBRTtRQUN4QixNQUFNLFFBQVEsR0FBRyxLQUFlLENBQUM7UUFDakMsTUFBTSxRQUFRLEdBQUcsT0FBTyxJQUFJLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztRQUN0RCxPQUFPLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzFDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFtQkQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFXLEVBQUUsT0FBZ0I7SUFDL0MsT0FBTyxDQUFDLEtBQWMsRUFBRSxFQUFFO1FBQ3hCLE1BQU0sUUFBUSxHQUFHLEtBQWUsQ0FBQztRQUNqQyxNQUFNLFFBQVEsR0FBRyxPQUFPLElBQUksbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQ3JELE9BQU8sUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDMUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQXFCRCxNQUFNLFVBQVUsT0FBTyxDQUFDLFVBQTRCO0lBQ2xELE9BQU8sQ0FBQyxLQUFjLEVBQUUsRUFBRTtRQUN4QixLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ25DLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQixJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlb3ZlcnZpZXcgVHJlZS1zaGFrZWFibGUgdmFsaWRhdG9yIGZ1bmN0aW9ucyBmb3IgZm9ybSBmaWVsZHNcbiAqXG4gKiBUaGVzZSB2YWxpZGF0b3JzIGFyZSBleHBvcnRlZCBhcyBpbmRpdmlkdWFsIGZ1bmN0aW9ucyB0byBlbmFibGVcbiAqIHRyZWUtc2hha2luZy4gT25seSB0aGUgdmFsaWRhdG9ycyB5b3UgYWN0dWFsbHkgdXNlIHdpbGwgYmUgaW5jbHVkZWRcbiAqIGluIHlvdXIgYnVuZGxlLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRmllbGRWYWxpZGF0b3IgfSBmcm9tICcuL25nLWZvcm1zJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVxdWlyZWQgZmllbGQgdmFsaWRhdG9yXG4gKlxuICogQHBhcmFtIG1lc3NhZ2UgLSBDdXN0b20gZXJyb3IgbWVzc2FnZSAoZGVmYXVsdDogXCJSZXF1aXJlZFwiKVxuICogQHJldHVybnMgVmFsaWRhdG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBlcnJvciBtZXNzYWdlIGlmIHZhbHVlIGlzIGZhbHN5XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNyZWF0ZUZvcm1UcmVlKGRhdGEsIHtcbiAqICAgdmFsaWRhdG9yczoge1xuICogICAgIG5hbWU6IHJlcXVpcmVkKCksXG4gKiAgICAgZW1haWw6IHJlcXVpcmVkKCdFbWFpbCBpcyByZXF1aXJlZCcpXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlZChtZXNzYWdlID0gJ1JlcXVpcmVkJyk6IEZpZWxkVmFsaWRhdG9yIHtcbiAgcmV0dXJuICh2YWx1ZTogdW5rbm93bikgPT4gKCF2YWx1ZSA/IG1lc3NhZ2UgOiBudWxsKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVtYWlsIGZvcm1hdCB2YWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIChkZWZhdWx0OiBcIkludmFsaWQgZW1haWxcIilcbiAqIEByZXR1cm5zIFZhbGlkYXRvciBmdW5jdGlvbiB0aGF0IGNoZWNrcyBmb3IgQCBzeW1ib2xcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY3JlYXRlRm9ybVRyZWUoZGF0YSwge1xuICogICB2YWxpZGF0b3JzOiB7XG4gKiAgICAgZW1haWw6IGVtYWlsKCdQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzJylcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVtYWlsKG1lc3NhZ2UgPSAnSW52YWxpZCBlbWFpbCcpOiBGaWVsZFZhbGlkYXRvciB7XG4gIHJldHVybiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBjb25zdCBzdHJWYWx1ZSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICByZXR1cm4gc3RyVmFsdWUgJiYgIXN0clZhbHVlLmluY2x1ZGVzKCdAJykgPyBtZXNzYWdlIDogbnVsbDtcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWluaW11bSBsZW5ndGggdmFsaWRhdG9yIGZvciBzdHJpbmdzXG4gKlxuICogQHBhcmFtIG1pbiAtIE1pbmltdW0gcmVxdWlyZWQgbGVuZ3RoXG4gKiBAcGFyYW0gbWVzc2FnZSAtIE9wdGlvbmFsIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBAcmV0dXJucyBWYWxpZGF0b3IgZnVuY3Rpb24gdGhhdCBjaGVja3Mgc3RyaW5nIGxlbmd0aFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjcmVhdGVGb3JtVHJlZShkYXRhLCB7XG4gKiAgIHZhbGlkYXRvcnM6IHtcbiAqICAgICBwYXNzd29yZDogbWluTGVuZ3RoKDgpLFxuICogICAgIGRlc2NyaXB0aW9uOiBtaW5MZW5ndGgoMTAsICdEZXNjcmlwdGlvbiBtdXN0IGJlIGF0IGxlYXN0IDEwIGNoYXJhY3RlcnMnKVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWluTGVuZ3RoKG1pbjogbnVtYmVyLCBtZXNzYWdlPzogc3RyaW5nKTogRmllbGRWYWxpZGF0b3Ige1xuICByZXR1cm4gKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgY29uc3Qgc3RyVmFsdWUgPSB2YWx1ZSBhcyBzdHJpbmc7XG4gICAgY29uc3QgZXJyb3JNc2cgPSBtZXNzYWdlID8/IGBNaW4gJHttaW59IGNoYXJhY3RlcnNgO1xuICAgIHJldHVybiBzdHJWYWx1ZSAmJiBzdHJWYWx1ZS5sZW5ndGggPCBtaW4gPyBlcnJvck1zZyA6IG51bGw7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1heGltdW0gbGVuZ3RoIHZhbGlkYXRvciBmb3Igc3RyaW5nc1xuICpcbiAqIEBwYXJhbSBtYXggLSBNYXhpbXVtIGFsbG93ZWQgbGVuZ3RoXG4gKiBAcGFyYW0gbWVzc2FnZSAtIE9wdGlvbmFsIGN1c3RvbSBlcnJvciBtZXNzYWdlXG4gKiBAcmV0dXJucyBWYWxpZGF0b3IgZnVuY3Rpb24gdGhhdCBjaGVja3Mgc3RyaW5nIGxlbmd0aFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjcmVhdGVGb3JtVHJlZShkYXRhLCB7XG4gKiAgIHZhbGlkYXRvcnM6IHtcbiAqICAgICB1c2VybmFtZTogbWF4TGVuZ3RoKDIwKSxcbiAqICAgICBiaW86IG1heExlbmd0aCg1MDAsICdCaW8gbXVzdCBiZSB1bmRlciA1MDAgY2hhcmFjdGVycycpXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXhMZW5ndGgobWF4OiBudW1iZXIsIG1lc3NhZ2U/OiBzdHJpbmcpOiBGaWVsZFZhbGlkYXRvciB7XG4gIHJldHVybiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBjb25zdCBzdHJWYWx1ZSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICBjb25zdCBlcnJvck1zZyA9IG1lc3NhZ2UgPz8gYE1heCAke21heH0gY2hhcmFjdGVyc2A7XG4gICAgcmV0dXJuIHN0clZhbHVlICYmIHN0clZhbHVlLmxlbmd0aCA+IG1heCA/IGVycm9yTXNnIDogbnVsbDtcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVnZXggcGF0dGVybiB2YWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0gcmVnZXggLSBSZWd1bGFyIGV4cHJlc3Npb24gdG8gdGVzdCBhZ2FpbnN0XG4gKiBAcGFyYW0gbWVzc2FnZSAtIEN1c3RvbSBlcnJvciBtZXNzYWdlIChkZWZhdWx0OiBcIkludmFsaWQgZm9ybWF0XCIpXG4gKiBAcmV0dXJucyBWYWxpZGF0b3IgZnVuY3Rpb24gdGhhdCB0ZXN0cyB2YWx1ZSBhZ2FpbnN0IHJlZ2V4XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNyZWF0ZUZvcm1UcmVlKGRhdGEsIHtcbiAqICAgdmFsaWRhdG9yczoge1xuICogICAgIHBob25lOiBwYXR0ZXJuKC9eXFxkezN9LVxcZHszfS1cXGR7NH0kLywgJ1Bob25lIG11c3QgYmUgaW4gZm9ybWF0OiAxMjMtNDU2LTc4OTAnKSxcbiAqICAgICB6aXBDb2RlOiBwYXR0ZXJuKC9eXFxkezV9JC8sICdaaXAgY29kZSBtdXN0IGJlIDUgZGlnaXRzJylcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdHRlcm4oXG4gIHJlZ2V4OiBSZWdFeHAsXG4gIG1lc3NhZ2UgPSAnSW52YWxpZCBmb3JtYXQnXG4pOiBGaWVsZFZhbGlkYXRvciB7XG4gIHJldHVybiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBjb25zdCBzdHJWYWx1ZSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICByZXR1cm4gc3RyVmFsdWUgJiYgIXJlZ2V4LnRlc3Qoc3RyVmFsdWUpID8gbWVzc2FnZSA6IG51bGw7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1pbmltdW0gdmFsdWUgdmFsaWRhdG9yIGZvciBudW1iZXJzXG4gKlxuICogQHBhcmFtIG1pbiAtIE1pbmltdW0gYWxsb3dlZCB2YWx1ZVxuICogQHBhcmFtIG1lc3NhZ2UgLSBPcHRpb25hbCBjdXN0b20gZXJyb3IgbWVzc2FnZVxuICogQHJldHVybnMgVmFsaWRhdG9yIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIG51bWVyaWMgbWluaW11bVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjcmVhdGVGb3JtVHJlZShkYXRhLCB7XG4gKiAgIHZhbGlkYXRvcnM6IHtcbiAqICAgICBhZ2U6IG1pbigxOCwgJ011c3QgYmUgYXQgbGVhc3QgMTggeWVhcnMgb2xkJyksXG4gKiAgICAgcXVhbnRpdHk6IG1pbigxKVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWluKG1pbjogbnVtYmVyLCBtZXNzYWdlPzogc3RyaW5nKTogRmllbGRWYWxpZGF0b3Ige1xuICByZXR1cm4gKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgY29uc3QgbnVtVmFsdWUgPSB2YWx1ZSBhcyBudW1iZXI7XG4gICAgY29uc3QgZXJyb3JNc2cgPSBtZXNzYWdlID8/IGBNdXN0IGJlIGF0IGxlYXN0ICR7bWlufWA7XG4gICAgcmV0dXJuIG51bVZhbHVlIDwgbWluID8gZXJyb3JNc2cgOiBudWxsO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXhpbXVtIHZhbHVlIHZhbGlkYXRvciBmb3IgbnVtYmVyc1xuICpcbiAqIEBwYXJhbSBtYXggLSBNYXhpbXVtIGFsbG93ZWQgdmFsdWVcbiAqIEBwYXJhbSBtZXNzYWdlIC0gT3B0aW9uYWwgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAqIEByZXR1cm5zIFZhbGlkYXRvciBmdW5jdGlvbiB0aGF0IGNoZWNrcyBudW1lcmljIG1heGltdW1cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY3JlYXRlRm9ybVRyZWUoZGF0YSwge1xuICogICB2YWxpZGF0b3JzOiB7XG4gKiAgICAgYWdlOiBtYXgoMTIwLCAnTXVzdCBiZSB1bmRlciAxMjAgeWVhcnMgb2xkJyksXG4gKiAgICAgcXVhbnRpdHk6IG1heCgxMDApXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXgobWF4OiBudW1iZXIsIG1lc3NhZ2U/OiBzdHJpbmcpOiBGaWVsZFZhbGlkYXRvciB7XG4gIHJldHVybiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBjb25zdCBudW1WYWx1ZSA9IHZhbHVlIGFzIG51bWJlcjtcbiAgICBjb25zdCBlcnJvck1zZyA9IG1lc3NhZ2UgPz8gYE11c3QgYmUgYXQgbW9zdCAke21heH1gO1xuICAgIHJldHVybiBudW1WYWx1ZSA+IG1heCA/IGVycm9yTXNnIDogbnVsbDtcbiAgfTtcbn1cblxuLyoqXG4gKiBDb21iaW5lcyBtdWx0aXBsZSB2YWxpZGF0b3JzIGludG8gYSBzaW5nbGUgdmFsaWRhdG9yIGZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHZhbGlkYXRvcnMgLSBBcnJheSBvZiB2YWxpZGF0b3IgZnVuY3Rpb25zIHRvIGNvbWJpbmVcbiAqIEByZXR1cm5zIENvbWJpbmVkIHZhbGlkYXRvciB0aGF0IHJldHVybnMgdGhlIGZpcnN0IGVycm9yIGVuY291bnRlcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNyZWF0ZUZvcm1UcmVlKGRhdGEsIHtcbiAqICAgdmFsaWRhdG9yczoge1xuICogICAgIGVtYWlsOiBjb21wb3NlKFtcbiAqICAgICAgIHJlcXVpcmVkKCdFbWFpbCBpcyByZXF1aXJlZCcpLFxuICogICAgICAgZW1haWwoJ0ludmFsaWQgZW1haWwgZm9ybWF0JyksXG4gKiAgICAgICBwYXR0ZXJuKC9AY29tcGFueVxcLmNvbSQvLCAnTXVzdCBiZSBhIGNvbXBhbnkgZW1haWwnKVxuICogICAgIF0pXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb3NlKHZhbGlkYXRvcnM6IEZpZWxkVmFsaWRhdG9yW10pOiBGaWVsZFZhbGlkYXRvciB7XG4gIHJldHVybiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBmb3IgKGNvbnN0IHZhbGlkYXRvciBvZiB2YWxpZGF0b3JzKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHZhbGlkYXRvcih2YWx1ZSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbn1cbiJdfQ==","import { firstValueFrom, isObservable } from 'rxjs';\nexport function unique(checkFn, message = 'Already exists') {\n return async (value) => {\n if (!value)\n return null;\n const exists = await checkFn(value);\n return exists ? message : null;\n };\n}\nexport function debounce(validator, delayMs) {\n let timeoutId;\n return async (value) => {\n return new Promise((resolve) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(async () => {\n const maybeAsync = validator(value);\n const result = isObservable(maybeAsync)\n ? await firstValueFrom(maybeAsync)\n : await maybeAsync;\n resolve(result);\n }, delayMs);\n });\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtdmFsaWRhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLWZvcm1zL3NyYy9jb3JlL2FzeW5jLXZhbGlkYXRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUErQnBELE1BQU0sVUFBVSxNQUFNLENBQ3BCLE9BQTZDLEVBQzdDLE9BQU8sR0FBRyxnQkFBZ0I7SUFFMUIsT0FBTyxLQUFLLEVBQUUsS0FBYyxFQUFFLEVBQUU7UUFDOUIsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN4QixNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDakMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQXFCRCxNQUFNLFVBQVUsUUFBUSxDQUN0QixTQUE0QyxFQUM1QyxPQUFlO0lBRWYsSUFBSSxTQUF3QyxDQUFDO0lBRTdDLE9BQU8sS0FBSyxFQUFFLEtBQWMsRUFBRSxFQUFFO1FBQzlCLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM3QixZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDeEIsU0FBUyxHQUFHLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDaEMsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwQyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDO29CQUNyQyxDQUFDLENBQUMsTUFBTSxjQUFjLENBQUMsVUFBVSxDQUFDO29CQUNsQyxDQUFDLENBQUMsTUFBTSxVQUFVLENBQUM7Z0JBQ3JCLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsQixDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgaXNPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogQGZpbGVvdmVydmlldyBUcmVlLXNoYWtlYWJsZSBhc3luYyB2YWxpZGF0b3IgZnVuY3Rpb25zIGZvciBmb3JtIGZpZWxkc1xuICovXG5cbmltcG9ydCB0eXBlIHsgRm9ybVRyZWVBc3luY1ZhbGlkYXRvckZuIH0gZnJvbSAnLi9uZy1mb3Jtcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhc3luYyB1bmlxdWVuZXNzIHZhbGlkYXRvclxuICpcbiAqIEBwYXJhbSBjaGVja0ZuIC0gQXN5bmMgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdmFsdWUgYWxyZWFkeSBleGlzdHNcbiAqIEBwYXJhbSBtZXNzYWdlIC0gQ3VzdG9tIGVycm9yIG1lc3NhZ2UgKGRlZmF1bHQ6IFwiQWxyZWFkeSBleGlzdHNcIilcbiAqIEByZXR1cm5zIEFzeW5jIHZhbGlkYXRvciBmdW5jdGlvblxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjcmVhdGVGb3JtVHJlZShkYXRhLCB7XG4gKiAgIGFzeW5jVmFsaWRhdG9yczoge1xuICogICAgIGVtYWlsOiB1bmlxdWUoXG4gKiAgICAgICBhc3luYyAoZW1haWwpID0+IHtcbiAqICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS9jaGVjay1lbWFpbD9lbWFpbD0ke2VtYWlsfWApO1xuICogICAgICAgICBjb25zdCB7IGV4aXN0cyB9ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICogICAgICAgICByZXR1cm4gZXhpc3RzO1xuICogICAgICAgfSxcbiAqICAgICAgICdUaGlzIGVtYWlsIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCdcbiAqICAgICApXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWUoXG4gIGNoZWNrRm46ICh2YWx1ZTogdW5rbm93bikgPT4gUHJvbWlzZTxib29sZWFuPixcbiAgbWVzc2FnZSA9ICdBbHJlYWR5IGV4aXN0cydcbik6IEZvcm1UcmVlQXN5bmNWYWxpZGF0b3JGbjx1bmtub3duPiB7XG4gIHJldHVybiBhc3luYyAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBleGlzdHMgPSBhd2FpdCBjaGVja0ZuKHZhbHVlKTtcbiAgICByZXR1cm4gZXhpc3RzID8gbWVzc2FnZSA6IG51bGw7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlYm91bmNlZCBhc3luYyB2YWxpZGF0b3JcbiAqXG4gKiBAcGFyYW0gdmFsaWRhdG9yIC0gVGhlIGFzeW5jIHZhbGlkYXRvciB0byBkZWJvdW5jZVxuICogQHBhcmFtIGRlbGF5TXMgLSBEZWxheSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHJ1bm5pbmcgdmFsaWRhdGlvblxuICogQHJldHVybnMgRGVib3VuY2VkIGFzeW5jIHZhbGlkYXRvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjcmVhdGVGb3JtVHJlZShkYXRhLCB7XG4gKiAgIGFzeW5jVmFsaWRhdG9yczoge1xuICogICAgIHVzZXJuYW1lOiBkZWJvdW5jZShcbiAqICAgICAgIHVuaXF1ZShjaGVja1VzZXJuYW1lLCAnVXNlcm5hbWUgdGFrZW4nKSxcbiAqICAgICAgIDUwMCAvLyBXYWl0IDUwMG1zIGFmdGVyIHVzZXIgc3RvcHMgdHlwaW5nXG4gKiAgICAgKVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVib3VuY2UoXG4gIHZhbGlkYXRvcjogRm9ybVRyZWVBc3luY1ZhbGlkYXRvckZuPHVua25vd24+LFxuICBkZWxheU1zOiBudW1iZXJcbik6IEZvcm1UcmVlQXN5bmNWYWxpZGF0b3JGbjx1bmtub3duPiB7XG4gIGxldCB0aW1lb3V0SWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuXG4gIHJldHVybiBhc3luYyAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgdGltZW91dElkID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1heWJlQXN5bmMgPSB2YWxpZGF0b3IodmFsdWUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBpc09ic2VydmFibGUobWF5YmVBc3luYylcbiAgICAgICAgICA/IGF3YWl0IGZpcnN0VmFsdWVGcm9tKG1heWJlQXN5bmMpXG4gICAgICAgICAgOiBhd2FpdCBtYXliZUFzeW5jO1xuICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9LCBkZWxheU1zKTtcbiAgICB9KTtcbiAgfTtcbn1cbiJdfQ==","import { signal } from '@angular/core';\nimport { deepClone, snapshotsEqual } from '@signaltree/shared';\nexport function withFormHistory(formTree, options = {}) {\n const capacity = Math.max(1, options.capacity ?? 10);\n const historySignal = signal({\n past: [],\n present: deepClone(formTree.form.getRawValue()),\n future: [],\n }, ...(ngDevMode ? [{ debugName: \"historySignal\" }] : []));\n let recording = true;\n let suppressUpdates = 0;\n let internalHistory = {\n past: [],\n present: deepClone(formTree.form.getRawValue()),\n future: [],\n };\n const subscription = formTree.form.valueChanges.subscribe(() => {\n if (suppressUpdates > 0) {\n suppressUpdates--;\n return;\n }\n if (!recording) {\n internalHistory = {\n ...internalHistory,\n present: deepClone(formTree.form.getRawValue()),\n };\n return;\n }\n const snapshot = deepClone(formTree.form.getRawValue());\n if (snapshotsEqual(internalHistory.present, snapshot)) {\n internalHistory = {\n ...internalHistory,\n present: snapshot,\n };\n historySignal.set(cloneHistory(internalHistory));\n return;\n }\n const updatedPast = [...internalHistory.past, internalHistory.present];\n if (updatedPast.length > capacity) {\n updatedPast.shift();\n }\n internalHistory = {\n past: updatedPast,\n present: snapshot,\n future: [],\n };\n historySignal.set(cloneHistory(internalHistory));\n });\n const originalDestroy = formTree.destroy;\n formTree.destroy = () => {\n subscription.unsubscribe();\n originalDestroy();\n };\n const undo = () => {\n const history = historySignal();\n if (history.past.length === 0) {\n return;\n }\n const previous = deepClone(history.past[history.past.length - 1]);\n recording = false;\n suppressUpdates++;\n formTree.setValues(previous);\n recording = true;\n internalHistory = {\n past: history.past.slice(0, -1),\n present: previous,\n future: [history.present, ...history.future],\n };\n historySignal.set(cloneHistory(internalHistory));\n };\n const redo = () => {\n const history = historySignal();\n if (history.future.length === 0) {\n return;\n }\n const next = deepClone(history.future[0]);\n recording = false;\n suppressUpdates++;\n formTree.setValues(next);\n recording = true;\n internalHistory = {\n past: [...history.past, history.present],\n present: next,\n future: history.future.slice(1),\n };\n historySignal.set(cloneHistory(internalHistory));\n };\n const clearHistory = () => {\n internalHistory = {\n past: [],\n present: deepClone(formTree.form.getRawValue()),\n future: [],\n };\n historySignal.set(cloneHistory(internalHistory));\n };\n function cloneHistory(state) {\n return {\n past: state.past.map((entry) => deepClone(entry)),\n present: deepClone(state.present),\n future: state.future.map((entry) => deepClone(entry)),\n };\n }\n return Object.assign(formTree, {\n undo,\n redo,\n clearHistory,\n history: historySignal.asReadonly(),\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLWZvcm1zL3NyYy9oaXN0b3J5L2hpc3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBNEMvRCxNQUFNLFVBQVUsZUFBZSxDQUM3QixRQUFxQixFQUNyQixVQUFpQyxFQUFFO0lBT25DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7SUFDckQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFpQjtRQUMzQyxJQUFJLEVBQUUsRUFBRTtRQUNSLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQU8sQ0FBQztRQUNwRCxNQUFNLEVBQUUsRUFBRTtLQUNYLHlEQUFDLENBQUM7SUFFSCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDckIsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLElBQUksZUFBZSxHQUFtQjtRQUNwQyxJQUFJLEVBQUUsRUFBRTtRQUNSLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQU8sQ0FBQztRQUNwRCxNQUFNLEVBQUUsRUFBRTtLQUNYLENBQUM7SUFFRixNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQzdELElBQUksZUFBZSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDO1lBQ2xCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2Ys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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTaWduYWwsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZGVlcENsb25lLCBzbmFwc2hvdHNFcXVhbCB9IGZyb20gJ0BzaWduYWx0cmVlL3NoYXJlZCc7XG5cbi8vIExvY2FsIHR5cGUgZGVmaW5pdGlvbiB0byBhdm9pZCBjaXJjdWxhciBpbXBvcnRzIGluIHNlY29uZGFyeSBlbnRyeSBwb2ludHNcbmludGVyZmFjZSBGb3JtVHJlZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZm9ybTogYW55OyAvLyBGb3JtR3JvdXBcbiAgdW53cmFwKCk6IFQ7XG4gIGRlc3Ryb3koKTogdm9pZDtcbiAgc2V0VmFsdWVzKHZhbHVlczogUGFydGlhbDxUPik6IHZvaWQ7XG59XG5cbi8qKlxuICogRm9ybSBoaXN0b3J5IHN0YXRlIHN0cnVjdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1IaXN0b3J5PFQ+IHtcbiAgcGFzdDogVFtdO1xuICBwcmVzZW50OiBUO1xuICBmdXR1cmU6IFRbXTtcbn1cblxuLyoqXG4gKiBFbmhhbmNlcyBhIEZvcm1UcmVlIHdpdGggdW5kby9yZWRvIGNhcGFiaWxpdGllcy5cbiAqIFByb3ZpZGVzIGZvcm0tc3BlY2lmaWMgaGlzdG9yeSBtYW5hZ2VtZW50IHdpdGggY2FwYWNpdHkgbGltaXRzIGFuZCBjaGFuZ2UgdHJhY2tpbmcuXG4gKlxuICogQHBhcmFtIGZvcm1UcmVlIC0gVGhlIGZvcm0gdHJlZSB0byBlbmhhbmNlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHBhcmFtIG9wdGlvbnMuY2FwYWNpdHkgLSBNYXhpbXVtIG51bWJlciBvZiBoaXN0b3J5IGVudHJpZXMgKGRlZmF1bHQ6IDEwKVxuICogQHJldHVybnMgRXh0ZW5kZWQgRm9ybVRyZWUgd2l0aCB1bmRvLCByZWRvLCBhbmQgaGlzdG9yeSBhY2Nlc3NcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZm9ybSA9IGNyZWF0ZUZvcm1UcmVlKHsgbmFtZTogJycsIGVtYWlsOiAnJyB9KTtcbiAqIGNvbnN0IGZvcm1XaXRoSGlzdG9yeSA9IHdpdGhGb3JtSGlzdG9yeShmb3JtLCB7IGNhcGFjaXR5OiAyMCB9KTtcbiAqXG4gKiBmb3JtLiQubmFtZS5zZXQoJ0pvaG4nKTtcbiAqIGZvcm0uJC5lbWFpbC5zZXQoJ2pvaG5AZXhhbXBsZS5jb20nKTtcbiAqXG4gKiBmb3JtV2l0aEhpc3RvcnkudW5kbygpOyAvLyBSZXZlcnRzIGVtYWlsIGNoYW5nZVxuICogZm9ybVdpdGhIaXN0b3J5LnVuZG8oKTsgLy8gUmV2ZXJ0cyBuYW1lIGNoYW5nZVxuICogZm9ybVdpdGhIaXN0b3J5LnJlZG8oKTsgLy8gUmVhcHBsaWVzIG5hbWUgY2hhbmdlXG4gKlxuICogY29uc29sZS5sb2coZm9ybVdpdGhIaXN0b3J5Lmhpc3RvcnkoKS5wYXN0Lmxlbmd0aCk7IC8vIDFcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aEZvcm1IaXN0b3J5PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gIGZvcm1UcmVlOiBGb3JtVHJlZTxUPixcbiAgb3B0aW9uczogeyBjYXBhY2l0eT86IG51bWJlciB9ID0ge31cbik6IEZvcm1UcmVlPFQ+ICYge1xuICB1bmRvOiAoKSA9PiB2b2lkO1xuICByZWRvOiAoKSA9PiB2b2lkO1xuICBjbGVhckhpc3Rvcnk6ICgpID0+IHZvaWQ7XG4gIGhpc3Rvcnk6IFNpZ25hbDxGb3JtSGlzdG9yeTxUPj47XG59IHtcbiAgY29uc3QgY2FwYWNpdHkgPSBNYXRoLm1heCgxLCBvcHRpb25zLmNhcGFjaXR5ID8/IDEwKTtcbiAgY29uc3QgaGlzdG9yeVNpZ25hbCA9IHNpZ25hbDxGb3JtSGlzdG9yeTxUPj4oe1xuICAgIHBhc3Q6IFtdLFxuICAgIHByZXNlbnQ6IGRlZXBDbG9uZShmb3JtVHJlZS5mb3JtLmdldFJhd1ZhbHVlKCkgYXMgVCksXG4gICAgZnV0dXJlOiBbXSxcbiAgfSk7XG5cbiAgbGV0IHJlY29yZGluZyA9IHRydWU7XG4gIGxldCBzdXBwcmVzc1VwZGF0ZXMgPSAwO1xuICBsZXQgaW50ZXJuYWxIaXN0b3J5OiBGb3JtSGlzdG9yeTxUPiA9IHtcbiAgICBwYXN0OiBbXSxcbiAgICBwcmVzZW50OiBkZWVwQ2xvbmUoZm9ybVRyZWUuZm9ybS5nZXRSYXdWYWx1ZSgpIGFzIFQpLFxuICAgIGZ1dHVyZTogW10sXG4gIH07XG5cbiAgY29uc3Qgc3Vic2NyaXB0aW9uID0gZm9ybVRyZWUuZm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICBpZiAoc3VwcHJlc3NVcGRhdGVzID4gMCkge1xuICAgICAgc3VwcHJlc3NVcGRhdGVzLS07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFyZWNvcmRpbmcpIHtcbiAgICAgIGludGVybmFsSGlzdG9yeSA9IHtcbiAgICAgICAgLi4uaW50ZXJuYWxIaXN0b3J5LFxuICAgICAgICBwcmVzZW50OiBkZWVwQ2xvbmUoZm9ybVRyZWUuZm9ybS5nZXRSYXdWYWx1ZSgpIGFzIFQpLFxuICAgICAgfTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc25hcHNob3QgPSBkZWVwQ2xvbmUoZm9ybVRyZWUuZm9ybS5nZXRSYXdWYWx1ZSgpIGFzIFQpO1xuICAgIGlmIChzbmFwc2hvdHNFcXVhbChpbnRlcm5hbEhpc3RvcnkucHJlc2VudCwgc25hcHNob3QpKSB7XG4gICAgICBpbnRlcm5hbEhpc3RvcnkgPSB7XG4gICAgICAgIC4uLmludGVybmFsSGlzdG9yeSxcbiAgICAgICAgcHJlc2VudDogc25hcHNob3QsXG4gICAgICB9O1xuICAgICAgaGlzdG9yeVNpZ25hbC5zZXQoY2xvbmVIaXN0b3J5KGludGVybmFsSGlzdG9yeSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGVkUGFzdCA9IFsuLi5pbnRlcm5hbEhpc3RvcnkucGFzdCwgaW50ZXJuYWxIaXN0b3J5LnByZXNlbnRdO1xuICAgIGlmICh1cGRhdGVkUGFzdC5sZW5ndGggPiBjYXBhY2l0eSkge1xuICAgICAgdXBkYXRlZFBhc3Quc2hpZnQoKTtcbiAgICB9XG4gICAgaW50ZXJuYWxIaXN0b3J5ID0ge1xuICAgICAgcGFzdDogdXBkYXRlZFBhc3QsXG4gICAgICBwcmVzZW50OiBzbmFwc2hvdCxcbiAgICAgIGZ1dHVyZTogW10sXG4gICAgfTtcbiAgICBoaXN0b3J5U2lnbmFsLnNldChjbG9uZUhpc3RvcnkoaW50ZXJuYWxIaXN0b3J5KSk7XG4gIH0pO1xuXG4gIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGZvcm1UcmVlLmRlc3Ryb3k7XG4gIGZvcm1UcmVlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgb3JpZ2luYWxEZXN0cm95KCk7XG4gIH07XG5cbiAgY29uc3QgdW5kbyA9ICgpID0+IHtcbiAgICBjb25zdCBoaXN0b3J5ID0gaGlzdG9yeVNpZ25hbCgpO1xuICAgIGlmIChoaXN0b3J5LnBhc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHByZXZpb3VzID0gZGVlcENsb25lKGhpc3RvcnkucGFzdFtoaXN0b3J5LnBhc3QubGVuZ3RoIC0gMV0pO1xuICAgIHJlY29yZGluZyA9IGZhbHNlO1xuICAgIHN1cHByZXNzVXBkYXRlcysrO1xuICAgIGZvcm1UcmVlLnNldFZhbHVlcyhwcmV2aW91cyk7XG4gICAgcmVjb3JkaW5nID0gdHJ1ZTtcbiAgICBpbnRlcm5hbEhpc3RvcnkgPSB7XG4gICAgICBwYXN0OiBoaXN0b3J5LnBhc3Quc2xpY2UoMCwgLTEpLFxuICAgICAgcHJlc2VudDogcHJldmlvdXMsXG4gICAgICBmdXR1cmU6IFtoaXN0b3J5LnByZXNlbnQsIC4uLmhpc3RvcnkuZnV0dXJlXSxcbiAgICB9O1xuICAgIGhpc3RvcnlTaWduYWwuc2V0KGNsb25lSGlzdG9yeShpbnRlcm5hbEhpc3RvcnkpKTtcbiAgfTtcblxuICBjb25zdCByZWRvID0gKCkgPT4ge1xuICAgIGNvbnN0IGhpc3RvcnkgPSBoaXN0b3J5U2lnbmFsKCk7XG4gICAgaWYgKGhpc3RvcnkuZnV0dXJlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gZGVlcENsb25lKGhpc3RvcnkuZnV0dXJlWzBdKTtcbiAgICByZWNvcmRpbmcgPSBmYWxzZTtcbiAgICBzdXBwcmVzc1VwZGF0ZXMrKztcbiAgICBmb3JtVHJlZS5zZXRWYWx1ZXMobmV4dCk7XG4gICAgcmVjb3JkaW5nID0gdHJ1ZTtcbiAgICBpbnRlcm5hbEhpc3RvcnkgPSB7XG4gICAgICBwYXN0OiBbLi4uaGlzdG9yeS5wYXN0LCBoaXN0b3J5LnByZXNlbnRdLFxuICAgICAgcHJlc2VudDogbmV4dCxcbiAgICAgIGZ1dHVyZTogaGlzdG9yeS5mdXR1cmUuc2xpY2UoMSksXG4gICAgfTtcbiAgICBoaXN0b3J5U2lnbmFsLnNldChjbG9uZUhpc3RvcnkoaW50ZXJuYWxIaXN0b3J5KSk7XG4gIH07XG5cbiAgY29uc3QgY2xlYXJIaXN0b3J5ID0gKCkgPT4ge1xuICAgIGludGVybmFsSGlzdG9yeSA9IHtcbiAgICAgIHBhc3Q6IFtdLFxuICAgICAgcHJlc2VudDogZGVlcENsb25lKGZvcm1UcmVlLmZvcm0uZ2V0UmF3VmFsdWUoKSBhcyBUKSxcbiAgICAgIGZ1dHVyZTogW10sXG4gICAgfTtcbiAgICBoaXN0b3J5U2lnbmFsLnNldChjbG9uZUhpc3RvcnkoaW50ZXJuYWxIaXN0b3J5KSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gY2xvbmVIaXN0b3J5KHN0YXRlOiBGb3JtSGlzdG9yeTxUPik6IEZvcm1IaXN0b3J5PFQ+IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGFzdDogc3RhdGUucGFzdC5tYXAoKGVudHJ5KSA9PiBkZWVwQ2xvbmUoZW50cnkpKSxcbiAgICAgIHByZXNlbnQ6IGRlZXBDbG9uZShzdGF0ZS5wcmVzZW50KSxcbiAgICAgIGZ1dHVyZTogc3RhdGUuZnV0dXJlLm1hcCgoZW50cnkpID0+IGRlZXBDbG9uZShlbnRyeSkpLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbihmb3JtVHJlZSwge1xuICAgIHVuZG8sXG4gICAgcmVkbyxcbiAgICBjbGVhckhpc3RvcnksXG4gICAgaGlzdG9yeTogaGlzdG9yeVNpZ25hbC5hc1JlYWRvbmx5KCksXG4gIH0pO1xufVxuIl19"],"names":[],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,128 @@
1
+ import * as i0 from '@angular/core';
2
+ import { WritableSignal, DestroyRef, Signal, OnInit, EventEmitter } from '@angular/core';
3
+ import { FormGroup, AbstractControl, FormArray, ControlValueAccessor } from '@angular/forms';
4
+ import { Observable } from 'rxjs';
5
+ import { TreeConfig, TreeNode, SignalTree } from '@signaltree/core';
6
+
7
+ type FormTreeAsyncValidatorFn<T> = (value: T) => Observable<string | null> | Promise<string | null>;
8
+ type EnhancedArraySignal<T> = WritableSignal<T[]> & {
9
+ push: (item: T) => void;
10
+ removeAt: (index: number) => void;
11
+ setAt: (index: number, value: T) => void;
12
+ insertAt: (index: number, item: T) => void;
13
+ move: (from: number, to: number) => void;
14
+ clear: () => void;
15
+ };
16
+ type FieldValidator = (value: unknown) => string | null;
17
+ interface FieldConfig {
18
+ debounceMs?: number;
19
+ validators?: Record<string, FieldValidator> | FieldValidator[];
20
+ asyncValidators?: Record<string, FormTreeAsyncValidatorFn<unknown>> | Array<FormTreeAsyncValidatorFn<unknown>>;
21
+ }
22
+ interface ConditionalField<T> {
23
+ when: (values: T) => boolean;
24
+ fields: string[];
25
+ }
26
+ interface FormTreeOptions<T extends Record<string, unknown>> extends TreeConfig {
27
+ validators?: SyncValidatorMap;
28
+ asyncValidators?: AsyncValidatorMap;
29
+ destroyRef?: DestroyRef;
30
+ fieldConfigs?: Record<string, FieldConfig>;
31
+ conditionals?: Array<ConditionalField<T>>;
32
+ persistKey?: string;
33
+ storage?: Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;
34
+ persistDebounceMs?: number;
35
+ validationBatchMs?: number;
36
+ }
37
+ type FormTree$1<T extends Record<string, unknown>> = {
38
+ state: TreeNode<T>;
39
+ $: TreeNode<T>;
40
+ form: FormGroup;
41
+ errors: WritableSignal<Record<string, string>>;
42
+ asyncErrors: WritableSignal<Record<string, string>>;
43
+ touched: WritableSignal<Record<string, boolean>>;
44
+ asyncValidating: WritableSignal<Record<string, boolean>>;
45
+ dirty: WritableSignal<boolean>;
46
+ valid: WritableSignal<boolean>;
47
+ submitting: WritableSignal<boolean>;
48
+ unwrap(): T;
49
+ setValue(field: string, value: unknown): void;
50
+ setValues(values: Partial<T>): void;
51
+ reset(): void;
52
+ submit<TResult>(submitFn: (values: T) => Promise<TResult>): Promise<TResult>;
53
+ validate(field?: string): Promise<void>;
54
+ getFieldError(field: string): Signal<string | undefined>;
55
+ getFieldAsyncError(field: string): Signal<string | undefined>;
56
+ getFieldTouched(field: string): Signal<boolean | undefined>;
57
+ isFieldValid(field: string): Signal<boolean>;
58
+ isFieldAsyncValidating(field: string): Signal<boolean | undefined>;
59
+ fieldErrors: Record<string, Signal<string | undefined>>;
60
+ fieldAsyncErrors: Record<string, Signal<string | undefined>>;
61
+ values: SignalTree<T>;
62
+ destroy(): void;
63
+ };
64
+ declare class FormValidationError extends Error {
65
+ readonly errors: Record<string, string>;
66
+ readonly asyncErrors: Record<string, string>;
67
+ constructor(errors: Record<string, string>, asyncErrors: Record<string, string>);
68
+ }
69
+ type SyncValidatorMap = Record<string, (value: unknown) => string | null>;
70
+ type AsyncValidatorMap = Record<string, FormTreeAsyncValidatorFn<unknown>>;
71
+ declare function createFormTree<T extends Record<string, unknown>>(initialValues: T, config?: FormTreeOptions<T>): FormTree$1<T>;
72
+ declare function createVirtualFormArray<T>(items: T[], visibleRange: {
73
+ start: number;
74
+ end: number;
75
+ }, controlFactory?: (value: T, index: number) => AbstractControl): FormArray;
76
+ declare class SignalValueDirective implements ControlValueAccessor, OnInit {
77
+ signalTreeSignalValue: WritableSignal<unknown>;
78
+ signalTreeSignalValueChange: EventEmitter<unknown>;
79
+ private elementRef;
80
+ private renderer;
81
+ private onChange;
82
+ private onTouched;
83
+ ngOnInit(): void;
84
+ handleChange(event: Event): void;
85
+ handleBlur(): void;
86
+ writeValue(value: unknown): void;
87
+ registerOnChange(fn: (value: unknown) => void): void;
88
+ registerOnTouched(fn: () => void): void;
89
+ setDisabledState?(isDisabled: boolean): void;
90
+ static ɵfac: i0.ɵɵFactoryDeclaration<SignalValueDirective, never>;
91
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SignalValueDirective, "[signalTreeSignalValue]", never, { "signalTreeSignalValue": { "alias": "signalTreeSignalValue"; "required": false; }; }, { "signalTreeSignalValueChange": "signalTreeSignalValueChange"; }, never, never, true, never>;
92
+ }
93
+ declare const SIGNAL_FORM_DIRECTIVES: (typeof SignalValueDirective)[];
94
+
95
+ declare function required(message?: string): FieldValidator;
96
+ declare function email(message?: string): FieldValidator;
97
+ declare function minLength(min: number, message?: string): FieldValidator;
98
+ declare function maxLength(max: number, message?: string): FieldValidator;
99
+ declare function pattern(regex: RegExp, message?: string): FieldValidator;
100
+ declare function min(min: number, message?: string): FieldValidator;
101
+ declare function max(max: number, message?: string): FieldValidator;
102
+ declare function compose(validators: FieldValidator[]): FieldValidator;
103
+
104
+ declare function unique(checkFn: (value: unknown) => Promise<boolean>, message?: string): FormTreeAsyncValidatorFn<unknown>;
105
+ declare function debounce(validator: FormTreeAsyncValidatorFn<unknown>, delayMs: number): FormTreeAsyncValidatorFn<unknown>;
106
+
107
+ interface FormTree<T extends Record<string, unknown>> {
108
+ form: any;
109
+ unwrap(): T;
110
+ destroy(): void;
111
+ setValues(values: Partial<T>): void;
112
+ }
113
+ interface FormHistory<T> {
114
+ past: T[];
115
+ present: T;
116
+ future: T[];
117
+ }
118
+ declare function withFormHistory<T extends Record<string, unknown>>(formTree: FormTree<T>, options?: {
119
+ capacity?: number;
120
+ }): FormTree<T> & {
121
+ undo: () => void;
122
+ redo: () => void;
123
+ clearHistory: () => void;
124
+ history: Signal<FormHistory<T>>;
125
+ };
126
+
127
+ export { FormValidationError, SIGNAL_FORM_DIRECTIVES, SignalValueDirective, compose, createFormTree, createVirtualFormArray, debounce, email, max, maxLength, min, minLength, pattern, required, unique, withFormHistory };
128
+ export type { ConditionalField, EnhancedArraySignal, FieldConfig, FieldValidator, FormHistory, FormTree$1 as FormTree, FormTreeAsyncValidatorFn, FormTreeOptions };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signaltree/ng-forms",
3
- "version": "4.0.9",
3
+ "version": "4.0.12",
4
4
  "description": "Complete Angular forms integration for SignalTree. FormTree creation, custom directives, validators, form state tracking, and RxJS bridge.",
5
5
  "peerDependencies": {
6
6
  "@angular/core": "^20.3.0",
@@ -9,10 +9,31 @@
9
9
  "rxjs": "^7.0.0"
10
10
  },
11
11
  "dependencies": {
12
- "@signaltree/shared": "0.0.1"
12
+ "@signaltree/shared": "workspace:*",
13
+ "tslib": "^2.3.0"
13
14
  },
14
- "devDependencies": {
15
- "@signaltree/core": "4.0.9"
16
- },
17
- "sideEffects": false
15
+ "sideEffects": false,
16
+ "module": "fesm2022/signaltree-ng-forms.mjs",
17
+ "typings": "index.d.ts",
18
+ "exports": {
19
+ "./package.json": {
20
+ "default": "./package.json"
21
+ },
22
+ ".": {
23
+ "types": "./index.d.ts",
24
+ "default": "./fesm2022/signaltree-ng-forms.mjs"
25
+ },
26
+ "./src/audit": {
27
+ "types": "./src/audit/index.d.ts",
28
+ "default": "./fesm2022/signaltree-ng-forms-src-audit.mjs"
29
+ },
30
+ "./src/history": {
31
+ "types": "./src/history/index.d.ts",
32
+ "default": "./fesm2022/signaltree-ng-forms-src-history.mjs"
33
+ },
34
+ "./src/rxjs": {
35
+ "types": "./src/rxjs/index.d.ts",
36
+ "default": "./fesm2022/signaltree-ng-forms-src-rxjs.mjs"
37
+ }
38
+ }
18
39
  }