@signaltree/ng-forms 1.1.7 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
Angular Forms integration for SignalTree featuring reactive forms binding, validation, form state management, and seamless Angular integration.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**Bundle size: 3.38KB gzipped**
|
|
6
|
+
|
|
7
|
+
## What is @signaltree/ng-forms?
|
|
6
8
|
|
|
7
9
|
The ng-forms package provides deep Angular Forms integration:
|
|
8
10
|
|
|
@@ -13,13 +15,13 @@ The ng-forms package provides deep Angular Forms integration:
|
|
|
13
15
|
- **Dynamic form generation** from SignalTree state
|
|
14
16
|
- **Cross-field validation** and complex form logic
|
|
15
17
|
|
|
16
|
-
##
|
|
18
|
+
## Installation
|
|
17
19
|
|
|
18
20
|
```bash
|
|
19
21
|
npm install @signaltree/core @signaltree/ng-forms
|
|
20
22
|
```
|
|
21
23
|
|
|
22
|
-
##
|
|
24
|
+
## Basic usage
|
|
23
25
|
|
|
24
26
|
```typescript
|
|
25
27
|
import { signalTree } from '@signaltree/core';
|
|
@@ -35,7 +37,7 @@ const tree = signalTree({
|
|
|
35
37
|
newsletter: false,
|
|
36
38
|
theme: 'light',
|
|
37
39
|
},
|
|
38
|
-
}).
|
|
40
|
+
}).with(withForms());
|
|
39
41
|
|
|
40
42
|
// Automatic form generation
|
|
41
43
|
const userForm = tree.createForm('user');
|
|
@@ -44,7 +46,7 @@ const preferencesForm = tree.createForm('preferences');
|
|
|
44
46
|
// Forms automatically sync with SignalTree state
|
|
45
47
|
```
|
|
46
48
|
|
|
47
|
-
##
|
|
49
|
+
## Core features
|
|
48
50
|
|
|
49
51
|
### Reactive Forms Integration
|
|
50
52
|
|
|
@@ -78,7 +80,7 @@ class UserFormComponent {
|
|
|
78
80
|
email: '',
|
|
79
81
|
age: 0,
|
|
80
82
|
},
|
|
81
|
-
}).
|
|
83
|
+
}).with(withForms());
|
|
82
84
|
|
|
83
85
|
// Create form with automatic binding
|
|
84
86
|
userForm = this.tree.createForm('user', {
|
|
@@ -120,7 +122,7 @@ class TemplateFormComponent {
|
|
|
120
122
|
name: '',
|
|
121
123
|
email: '',
|
|
122
124
|
},
|
|
123
|
-
}).
|
|
125
|
+
}).with(withForms());
|
|
124
126
|
|
|
125
127
|
onSubmit(form: NgForm) {
|
|
126
128
|
if (form.valid) {
|
|
@@ -141,11 +143,11 @@ const tree = signalTree({
|
|
|
141
143
|
confirmPassword: '',
|
|
142
144
|
agreeToTerms: false,
|
|
143
145
|
},
|
|
144
|
-
}).
|
|
146
|
+
}).with(withForms());
|
|
145
147
|
|
|
146
148
|
// Custom validators that can access SignalTree state
|
|
147
149
|
const usernameAsyncValidator = (control: AbstractControl) => {
|
|
148
|
-
return of(control.value).
|
|
150
|
+
return of(control.value).with(
|
|
149
151
|
delay(300), // Debounce
|
|
150
152
|
switchMap((username) =>
|
|
151
153
|
// Check if username exists (can access tree state)
|
|
@@ -257,7 +259,7 @@ const tree = signalTree({
|
|
|
257
259
|
formConfig: {
|
|
258
260
|
fields: [] as FormField[],
|
|
259
261
|
},
|
|
260
|
-
}).
|
|
262
|
+
}).with(withForms());
|
|
261
263
|
|
|
262
264
|
@Injectable()
|
|
263
265
|
class DynamicFormService {
|
|
@@ -325,10 +327,10 @@ class DynamicFormComponent {
|
|
|
325
327
|
}
|
|
326
328
|
```
|
|
327
329
|
|
|
328
|
-
##
|
|
330
|
+
## Advanced configuration
|
|
329
331
|
|
|
330
332
|
```typescript
|
|
331
|
-
const tree = signalTree(state).
|
|
333
|
+
const tree = signalTree(state).with(
|
|
332
334
|
withForms({
|
|
333
335
|
// Automatic synchronization settings
|
|
334
336
|
autoSync: true,
|
|
@@ -371,7 +373,7 @@ const tree = signalTree(state).pipe(
|
|
|
371
373
|
);
|
|
372
374
|
```
|
|
373
375
|
|
|
374
|
-
##
|
|
376
|
+
## Real-world examples
|
|
375
377
|
|
|
376
378
|
### Multi-Step Form Wizard
|
|
377
379
|
|
|
@@ -430,7 +432,7 @@ const wizardTree = signalTree<WizardState>({
|
|
|
430
432
|
addressValid: false,
|
|
431
433
|
preferencesValid: false,
|
|
432
434
|
},
|
|
433
|
-
}).
|
|
435
|
+
}).with(withForms());
|
|
434
436
|
|
|
435
437
|
@Component({
|
|
436
438
|
template: `
|
|
@@ -617,7 +619,7 @@ const surveyTree = signalTree({
|
|
|
617
619
|
currentQuestion: 0,
|
|
618
620
|
isSubmitting: false,
|
|
619
621
|
submitError: null as string | null,
|
|
620
|
-
}).
|
|
622
|
+
}).with(withForms());
|
|
621
623
|
|
|
622
624
|
@Component({
|
|
623
625
|
template: `
|
|
@@ -835,18 +837,18 @@ class SurveyComponent implements OnInit {
|
|
|
835
837
|
}
|
|
836
838
|
```
|
|
837
839
|
|
|
838
|
-
##
|
|
840
|
+
## When to use ng-forms
|
|
839
841
|
|
|
840
842
|
Perfect for:
|
|
841
843
|
|
|
842
|
-
-
|
|
843
|
-
-
|
|
844
|
-
-
|
|
845
|
-
-
|
|
846
|
-
-
|
|
847
|
-
-
|
|
844
|
+
- Angular applications with complex forms
|
|
845
|
+
- Real-time form validation and feedback
|
|
846
|
+
- Multi-step forms and wizards
|
|
847
|
+
- Dynamic form generation
|
|
848
|
+
- Forms with cross-field validation
|
|
849
|
+
- Applications requiring form state persistence
|
|
848
850
|
|
|
849
|
-
##
|
|
851
|
+
## Composition with other packages
|
|
850
852
|
|
|
851
853
|
```typescript
|
|
852
854
|
import { signalTree } from '@signaltree/core';
|
|
@@ -854,14 +856,14 @@ import { withForms } from '@signaltree/ng-forms';
|
|
|
854
856
|
import { withValidation } from '@signaltree/validation';
|
|
855
857
|
import { withDevtools } from '@signaltree/devtools';
|
|
856
858
|
|
|
857
|
-
const tree = signalTree(state).
|
|
859
|
+
const tree = signalTree(state).with(
|
|
858
860
|
withValidation(), // Enhanced validation rules
|
|
859
861
|
withForms(), // Angular forms integration
|
|
860
|
-
|
|
862
|
+
withDevTools() // Debug form state changes
|
|
861
863
|
);
|
|
862
864
|
```
|
|
863
865
|
|
|
864
|
-
##
|
|
866
|
+
## Performance benefits
|
|
865
867
|
|
|
866
868
|
- **Automatic synchronization** between forms and state
|
|
867
869
|
- **Debounced updates** prevent excessive state changes
|
|
@@ -869,16 +871,16 @@ const tree = signalTree(state).pipe(
|
|
|
869
871
|
- **Tree-shakeable** - only includes what you use
|
|
870
872
|
- **Memory efficient** form state management
|
|
871
873
|
|
|
872
|
-
##
|
|
874
|
+
## Links
|
|
873
875
|
|
|
874
876
|
- [SignalTree Documentation](https://signaltree.io)
|
|
875
877
|
- [Core Package](https://www.npmjs.com/package/@signaltree/core)
|
|
876
878
|
- [GitHub Repository](https://github.com/JBorgia/signaltree)
|
|
877
879
|
- [ng-forms Examples](https://signaltree.io/examples/ng-forms)
|
|
878
880
|
|
|
879
|
-
##
|
|
881
|
+
## License
|
|
880
882
|
|
|
881
|
-
MIT License - see the [LICENSE](../../LICENSE) file for details.
|
|
883
|
+
MIT License with AI Training Restriction - see the [LICENSE](../../LICENSE) file for details.
|
|
882
884
|
|
|
883
885
|
---
|
|
884
886
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { signal, isSignal, computed, EventEmitter, inject, ElementRef, Renderer2, effect, forwardRef, HostListener, Output, Input, Directive } from '@angular/core';
|
|
3
3
|
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
|
-
import { Observable } from 'rxjs';
|
|
5
4
|
import { signalTree, parsePath } from '@signaltree/core';
|
|
5
|
+
import { Observable } from 'rxjs';
|
|
6
6
|
|
|
7
7
|
function createFormTree(initialValues, config = {}) {
|
|
8
8
|
const { validators = {}, asyncValidators = {}, ...treeConfig } = config;
|
|
@@ -179,7 +179,7 @@ function createFormTree(initialValues, config = {}) {
|
|
|
179
179
|
state: flattenedState,
|
|
180
180
|
$: flattenedState,
|
|
181
181
|
...formSignals,
|
|
182
|
-
unwrap: () => valuesTree
|
|
182
|
+
unwrap: () => valuesTree(),
|
|
183
183
|
setValue: (field, value) => {
|
|
184
184
|
setNestedValue(field, value);
|
|
185
185
|
formSignals.touched.update((t) => ({ ...t, [field]: true }));
|
|
@@ -187,7 +187,7 @@ function createFormTree(initialValues, config = {}) {
|
|
|
187
187
|
void validate(field);
|
|
188
188
|
},
|
|
189
189
|
setValues: (values) => {
|
|
190
|
-
valuesTree
|
|
190
|
+
valuesTree((v) => ({ ...v, ...values }));
|
|
191
191
|
markDirty();
|
|
192
192
|
void validate();
|
|
193
193
|
},
|
|
@@ -224,7 +224,7 @@ function createFormTree(initialValues, config = {}) {
|
|
|
224
224
|
if (!formSignals.valid()) {
|
|
225
225
|
throw new Error('Form is invalid');
|
|
226
226
|
}
|
|
227
|
-
const currentValues = valuesTree
|
|
227
|
+
const currentValues = valuesTree();
|
|
228
228
|
const result = await submitFn(currentValues);
|
|
229
229
|
return result;
|
|
230
230
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signaltree-ng-forms.mjs","sources":["../tmp-esm2022/lib/ng-forms.js"],"sourcesContent":["import { isSignal, signal, computed, effect, inject, Directive, Input, Output, EventEmitter, forwardRef, ElementRef, Renderer2, HostListener, } from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { Observable } from 'rxjs';\nimport { signalTree, parsePath } from '@signaltree/core';\nimport * as i0 from \"@angular/core\";\nexport function createFormTree(initialValues, config = {}) {\n const { validators = {}, asyncValidators = {}, ...treeConfig } = config;\n const valuesTree = signalTree(initialValues, treeConfig);\n const flattenedState = valuesTree.state;\n const formSignals = {\n errors: signal({}),\n asyncErrors: signal({}),\n touched: signal({}),\n asyncValidating: signal({}),\n dirty: signal(false),\n valid: signal(true),\n submitting: signal(false),\n };\n const markDirty = () => formSignals.dirty.set(true);\n const enhanceArray = (arraySignal) => {\n const enhanced = arraySignal;\n enhanced.push = (item) => {\n arraySignal.update((arr) => [...arr, item]);\n markDirty();\n };\n enhanced.removeAt = (index) => {\n arraySignal.update((arr) => arr.filter((_, i) => i !== index));\n markDirty();\n };\n enhanced.setAt = (index, value) => {\n arraySignal.update((arr) => arr.map((item, i) => (i === index ? value : item)));\n markDirty();\n };\n enhanced.insertAt = (index, item) => {\n arraySignal.update((arr) => [\n ...arr.slice(0, index),\n item,\n ...arr.slice(index),\n ]);\n markDirty();\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 markDirty();\n };\n enhanced.clear = () => {\n arraySignal.set([]);\n markDirty();\n };\n return enhanced;\n };\n const enhanceArraysRecursively = (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);\n }\n }\n };\n enhanceArraysRecursively(flattenedState);\n const getNestedValue = (obj, path) => {\n const keys = parsePath(path);\n let current = obj;\n for (const key of keys) {\n if (current && typeof current === 'object') {\n current = current[key];\n if (isSignal(current)) {\n current = current();\n }\n }\n else {\n return undefined;\n }\n }\n return current;\n };\n const setNestedValue = (path, value) => {\n const keys = parsePath(path);\n let current = flattenedState;\n for (let i = 0; i < keys.length - 1; i++) {\n current = current[keys[i]];\n if (!current)\n return;\n }\n const lastKey = keys[keys.length - 1];\n const target = current[lastKey];\n if (isSignal(target) && 'set' in target) {\n target.set(value);\n }\n };\n const validate = async (field) => {\n const errors = {};\n const asyncErrors = {};\n const fieldsToValidate = field ? [field] : Object.keys(validators);\n for (const fieldPath of fieldsToValidate) {\n const validator = validators[fieldPath];\n if (validator) {\n const value = getNestedValue(flattenedState, fieldPath);\n const error = validator(value);\n if (error) {\n errors[fieldPath] = error;\n }\n }\n }\n formSignals.errors.set(errors);\n const asyncFieldsToValidate = field\n ? [field]\n : Object.keys(asyncValidators);\n for (const fieldPath of asyncFieldsToValidate) {\n const asyncValidator = asyncValidators[fieldPath];\n if (asyncValidator && (!field || field === fieldPath)) {\n formSignals.asyncValidating.update((v) => ({\n ...v,\n [fieldPath]: true,\n }));\n try {\n const value = getNestedValue(flattenedState, fieldPath);\n const result = asyncValidator(value);\n let error;\n if (result instanceof Observable) {\n error = await new Promise((resolve) => {\n result.subscribe({\n next: (val) => resolve(val),\n error: () => resolve('Validation error'),\n });\n });\n }\n else {\n error = await result;\n }\n if (error) {\n asyncErrors[fieldPath] = error;\n }\n }\n catch {\n asyncErrors[fieldPath] = 'Validation error';\n }\n formSignals.asyncValidating.update((v) => ({\n ...v,\n [fieldPath]: false,\n }));\n }\n }\n formSignals.asyncErrors.set(asyncErrors);\n const hasErrors = Object.keys(errors).length > 0;\n const hasAsyncErrors = Object.keys(asyncErrors).length > 0;\n const isValidating = Object.values(formSignals.asyncValidating()).some((v) => v);\n formSignals.valid.set(!hasErrors && !hasAsyncErrors && !isValidating);\n };\n const fieldErrors = {};\n const fieldAsyncErrors = {};\n [...Object.keys(validators), ...Object.keys(asyncValidators)].forEach((fieldPath) => {\n fieldErrors[fieldPath] = computed(() => {\n const errors = formSignals.errors();\n return errors[fieldPath];\n });\n fieldAsyncErrors[fieldPath] = computed(() => {\n const errors = formSignals.asyncErrors();\n return errors[fieldPath];\n });\n });\n const formTree = {\n state: flattenedState,\n $: flattenedState,\n ...formSignals,\n unwrap: () => valuesTree.unwrap(),\n setValue: (field, value) => {\n setNestedValue(field, value);\n formSignals.touched.update((t) => ({ ...t, [field]: true }));\n markDirty();\n void validate(field);\n },\n setValues: (values) => {\n valuesTree.update((v) => ({ ...v, ...values }));\n markDirty();\n void validate();\n },\n reset: () => {\n const resetSignals = (current, initial) => {\n for (const [key, initialValue] of Object.entries(initial)) {\n const currentValue = current[key];\n if (isSignal(currentValue) && 'set' in currentValue) {\n currentValue.set(initialValue);\n }\n else if (typeof initialValue === 'object' &&\n initialValue !== null &&\n !Array.isArray(initialValue) &&\n typeof currentValue === 'object' &&\n currentValue !== null &&\n !isSignal(currentValue)) {\n resetSignals(currentValue, initialValue);\n }\n }\n };\n resetSignals(flattenedState, initialValues);\n formSignals.errors.set({});\n formSignals.asyncErrors.set({});\n formSignals.touched.set({});\n formSignals.asyncValidating.set({});\n formSignals.dirty.set(false);\n formSignals.valid.set(true);\n formSignals.submitting.set(false);\n },\n submit: async (submitFn) => {\n formSignals.submitting.set(true);\n try {\n await validate();\n if (!formSignals.valid()) {\n throw new Error('Form is invalid');\n }\n const currentValues = valuesTree.unwrap();\n const result = await submitFn(currentValues);\n return result;\n }\n finally {\n formSignals.submitting.set(false);\n }\n },\n validate,\n getFieldError: (field) => fieldErrors[field] || computed(() => undefined),\n getFieldAsyncError: (field) => fieldAsyncErrors[field] || computed(() => undefined),\n getFieldTouched: (field) => computed(() => {\n const touched = formSignals.touched();\n return touched[field];\n }),\n isFieldValid: (field) => computed(() => {\n const errors = formSignals.errors();\n const asyncErrors = formSignals.asyncErrors();\n const asyncValidating = formSignals.asyncValidating();\n return !errors[field] && !asyncErrors[field] && !asyncValidating[field];\n }),\n isFieldAsyncValidating: (field) => computed(() => {\n const asyncValidating = formSignals.asyncValidating();\n return asyncValidating[field];\n }),\n fieldErrors,\n fieldAsyncErrors,\n values: valuesTree,\n };\n return formTree;\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.1.4\", ngImport: i0, type: SignalValueDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.1.4\", 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.1.4\", 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 validators = {\n required: (message = 'Required') => (value) => !value ? message : null,\n email: (message = 'Invalid email') => (value) => {\n const strValue = value;\n return strValue && !strValue.includes('@') ? message : null;\n },\n minLength: (min) => (value) => {\n const strValue = value;\n return strValue && strValue.length < min ? `Min ${min} characters` : null;\n },\n pattern: (regex, message = 'Invalid format') => (value) => {\n const strValue = value;\n return strValue && !regex.test(strValue) ? message : null;\n },\n};\nexport const asyncValidators = {\n unique: (checkFn, message = 'Already exists') => async (value) => {\n if (!value)\n return null;\n const exists = await checkFn(value);\n return exists ? message : null;\n },\n};\nexport function toObservable(signal) {\n return new Observable((subscriber) => {\n try {\n const effectRef = effect(() => {\n subscriber.next(signal());\n }, ...(ngDevMode ? [{ debugName: \"effectRef\" }] : []));\n return () => effectRef.destroy();\n }\n catch {\n subscriber.next(signal());\n return () => {\n };\n }\n });\n}\nexport function createAuditMiddleware(auditLog, getMetadata) {\n return {\n id: 'audit',\n after: (action, payload, oldState, newState) => {\n const changes = getChanges(oldState, newState);\n if (Object.keys(changes).length > 0) {\n auditLog.push({\n timestamp: Date.now(),\n changes,\n metadata: getMetadata?.(),\n });\n }\n },\n };\n}\nfunction getChanges(oldState, newState) {\n const changes = {};\n for (const key in newState) {\n if (oldState[key] !== newState[key]) {\n changes[key] = newState[key];\n }\n }\n return changes;\n}\nexport const SIGNAL_FORM_DIRECTIVES = [SignalValueDirective];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctZm9ybXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy1mb3Jtcy9zcmMvbGliL25nLWZvcm1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE9BQU8sRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixVQUFVLEVBQ1YsVUFBVSxFQUNWLFNBQVMsRUFDVCxZQUFZLEdBRWIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFTbEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7QUFtRXpELE1BQU0sVUFBVSxjQUFjLENBQzVCLGFBQWdCLEVBQ2hCLFNBR2lCLEVBQUU7SUFFbkIsTUFBTSxFQUFFLFVBQVUsR0FBRyxFQUFFLEVBQUUsZUFBZSxHQUFHLEVBQUUsRUFBRSxHQUFHLFVBQVUsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUd4RSxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBR3pELE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxLQUF5QixDQUFDO0lBRzVELE1BQU0sV0FBVyxHQUFHO1FBQ2xCLE1BQU0sRUFBRSxNQUFNLENBQXlCLEVBQUUsQ0FBQztRQUMxQyxXQUFXLEVBQUUsTUFBTSxDQUF5QixFQUFFLENBQUM7UUFDL0MsT0FBTyxFQUFFLE1BQU0sQ0FBMEIsRUFBRSxDQUFDO1FBQzVDLGVBQWUsRUFBRSxNQUFNLENBQTBCLEVBQUUsQ0FBQztRQUNwRCxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNwQixLQUFLLEVBQUUsTUFB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RUFBRTtvQkFDckIsT0FBTztvQkFDUCxRQUFRLEVBQUUsV0FBVyxFQUFFLEVBQUU7aUJBQzFCLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBSSxRQUFXLEVBQUUsUUFBVztJQUM3QyxNQUFNLE9BQU8sR0FBNEIsRUFBRSxDQUFDO0lBRTVDLEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7UUFDM0IsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sT0FBcUIsQ0FBQztBQUMvQixDQUFDO0FBTUQsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IEFuZ3VsYXIgRm9ybXMgSW50ZWdyYXRpb24gZm9yIFNpZ25hbFRyZWVcbiAqXG4gKiBQcm92aWRlcyBjb21wcmVoZW5zaXZlIEFuZ3VsYXIgZm9ybSBpbnRlZ3JhdGlvbiBpbmNsdWRpbmcgRm9ybVRyZWUsXG4gKiBkaXJlY3RpdmVzLCB2YWxpZGF0b3JzLCBlbmhhbmNlZCBhcnJheSBvcGVyYXRpb25zLCBhbmQgUnhKUyBicmlkZ2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgU2lnbmFsLFxuICBXcml0YWJsZVNpZ25hbCxcbiAgaXNTaWduYWwsXG4gIHNpZ25hbCxcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgRWxlbWVudFJlZixcbiAgUmVuZGVyZXIyLFxuICBIb3N0TGlzdGVuZXIsXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbi8vIFJlLWV4cG9ydCBjb3JlIHR5cGVzIG5lZWRlZCBmb3IgZm9ybXNcbmltcG9ydCB0eXBlIHtcbiAgU2lnbmFsVHJlZSxcbiAgVHJlZUNvbmZpZyxcbiAgRGVlcFNpZ25hbGlmeSxcbiAgTWlkZGxld2FyZSxcbn0gZnJvbSAnQHNpZ25hbHRyZWUvY29yZSc7XG5pbXBvcnQgeyBzaWduYWxUcmVlLCBwYXJzZVBhdGggfSBmcm9tICdAc2lnbmFsdHJlZS9jb3JlJztcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEZPUk0gVFJFRSBUWVBFU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IHR5cGUgQXN5bmNWYWxpZGF0b3JGbjxUPiA9IChcbiAgdmFsdWU6IFRcbikgPT4gT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPiB8IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG5cbmV4cG9ydCB0eXBlIEVuaGFuY2VkQXJyYXlTaWduYWw8VD4gPSBXcml0YWJsZVNpZ25hbDxUW10+ICYge1xuICBwdXNoOiAoaXRlbTogVCkgPT4gdm9pZDtcbiAgcmVtb3ZlQXQ6IChpbmRleDogbnVtYmVyKSA9PiB2b2lkO1xuICBzZXRBdDogKGluZGV4OiBudW1iZXIsIHZhbHVlOiBUKSA9PiB2b2lkO1xuICBpbnNlcnRBdDogKGluZGV4OiBudW1iZXIsIGl0ZW06IFQpID0+IHZvaWQ7XG4gIG1vdmU6IChmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpID0+IHZvaWQ7XG4gIGNsZWFyOiAoKSA9PiB2b2lkO1xufTtcblxuLyoqXG4gKiBGb3JtIHRyZWUgdHlwZSB0aGF0IGZsYXR0ZW5zIHRoZSBzdGF0ZSBhY2Nlc3Mgd2hpbGUgbWFpbnRhaW5pbmcgZm9ybS1zcGVjaWZpYyBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCB0eXBlIEZvcm1UcmVlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPSB7XG4gIC8vIEZsYXR0ZW5lZCBzdGF0ZSBhY2Nlc3MgLSBkaXJlY3QgYWNjZXNzIHRvIGZvcm0gdmFsdWVzIGFzIHNpZ25hbHNcbiAgc3RhdGU6IERlZXBTaWduYWxpZnk8VD47XG4gICQ6IERlZXBTaWduYWxpZnk8VD47IC8vIEFsaWFzIGZvciBzdGF0ZVxuXG4gIC8vIEZvcm0tc3BlY2lmaWMgc2lnbmFsc1xuICBlcnJvcnM6IFdyaXRhYmxlU2lnbmFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICBhc3luY0Vycm9yczogV3JpdGFibGVTaWduYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gIHRvdWNoZWQ6IFdyaXRhYmxlU2lnbmFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+PjtcbiAgYXN5bmNWYWxpZGF0aW5nOiBXcml0YWJsZVNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj47XG4gIGRpcnR5OiBXcml0YWJsZVNpZ25hbDxib29sZWFuPjtcbiAgdmFsaWQ6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+O1xuICBzdWJtaXR0aW5nOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPjtcblxuICAvLyBGb3JtIG1ldGhvZHNcbiAgdW53cmFwKCk6IFQ7XG4gIHNldFZhbHVlKGZpZWxkOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZDtcbiAgc2V0VmFsdWVzKHZhbHVlczogUGFydGlhbDxUPik6IHZvaWQ7XG4gIHJlc2V0KCk6IHZvaWQ7XG4gIHN1Ym1pdDxUUmVzdWx0PihzdWJtaXRGbjogKHZhbHVlczogVCkgPT4gUHJvbWlzZTxUUmVzdWx0Pik6IFByb21pc2U8VFJlc3VsdD47XG4gIHZhbGlkYXRlKGZpZWxkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblxuICAvLyBGaWVsZC1sZXZlbCBoZWxwZXJzXG4gIGdldEZpZWxkRXJyb3IoZmllbGQ6IHN0cmluZyk6IFNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+O1xuICBnZXRGaWVsZEFzeW5jRXJyb3IoZmllbGQ6IHN0cmluZyk6IFNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+O1xuICBnZXRGaWVsZFRvdWNoZWQoZmllbGQ6IHN0cmluZyk6IFNpZ25hbDxib29sZWFuIHwgdW5kZWZpbmVkPjtcbiAgaXNGaWVsZFZhbGlkKGZpZWxkOiBzdHJpbmcpOiBTaWduYWw8Ym9vbGVhbj47XG4gIGlzRmllbGRBc3luY1ZhbGlkYXRpbmcoZmllbGQ6IHN0cmluZyk6IFNpZ25hbDxib29sZWFuIHwgdW5kZWZpbmVkPjtcblxuICAvLyBEaXJlY3QgYWNjZXNzIHRvIGZpZWxkIGVycm9yc1xuICBmaWVsZEVycm9yczogUmVjb3JkPHN0cmluZywgU2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4+O1xuICBmaWVsZEFzeW5jRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBTaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPj47XG5cbiAgLy8gS2VlcCB2YWx1ZXMgdHJlZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICB2YWx1ZXM6IFNpZ25hbFRyZWU8VD47XG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVVRJTElUWSBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBGT1JNIFRSRUUgSU1QTEVNRU5UQVRJT05cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGb3JtVHJlZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICBpbml0aWFsVmFsdWVzOiBULFxuICBjb25maWc6IHtcbiAgICB2YWxpZGF0b3JzPzogUmVjb3JkPHN0cmluZywgKHZhbHVlOiB1bmtub3duKSA9PiBzdHJpbmcgfCBudWxsPjtcbiAgICBhc3luY1ZhbGlkYXRvcnM/OiBSZWNvcmQ8c3RyaW5nLCBBc3luY1ZhbGlkYXRvckZuPHVua25vd24+PjtcbiAgfSAmIFRyZWVDb25maWcgPSB7fVxuKTogRm9ybVRyZWU8VD4ge1xuICBjb25zdCB7IHZhbGlkYXRvcnMgPSB7fSwgYXN5bmNWYWxpZGF0b3JzID0ge30sIC4uLnRyZWVDb25maWcgfSA9IGNvbmZpZztcblxuICAvLyBDcmVhdGUgdGhlIHVuZGVybHlpbmcgc2lnbmFsIHRyZWVcbiAgY29uc3QgdmFsdWVzVHJlZSA9IHNpZ25hbFRyZWUoaW5pdGlhbFZhbHVlcywgdHJlZUNvbmZpZyk7XG5cbiAgLy8gRW5zdXJlIHRoZSBzdGF0ZSBoYXMgdGhlIGNvcnJlY3QgdHlwZSAtIHRoaXMgaXMgdGhlIGtleSBmaXhcbiAgY29uc3QgZmxhdHRlbmVkU3RhdGUgPSB2YWx1ZXNUcmVlLnN0YXRlIGFzIERlZXBTaWduYWxpZnk8VD47XG5cbiAgLy8gQ3JlYXRlIGZvcm0tc3BlY2lmaWMgc2lnbmFsc1xuICBjb25zdCBmb3JtU2lnbmFscyA9IHtcbiAgICBlcnJvcnM6IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pih7fSksXG4gICAgYXN5bmNFcnJvcnM6IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pih7fSksXG4gICAgdG91Y2hlZDogc2lnbmFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+Pih7fSksXG4gICAgYXN5bmNWYWxpZGF0aW5nOiBzaWduYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+KHt9KSxcbiAgICBkaXJ0eTogc2lnbmFsKGZhbHNlKSxcbiAgICB2YWxpZDogc2lnbmFsKHRydWUpLFxuICAgIHN1Ym1pdHRpbmc6IHNpZ25hbChmYWxzZSksXG4gIH07XG5cbiAgY29uc3QgbWFya0RpcnR5ID0gKCkgPT4gZm9ybVNpZ25hbHMuZGlydHkuc2V0KHRydWUpO1xuXG4gIC8vIEVuaGFuY2UgYXJyYXlzIHdpdGggbmF0dXJhbCBvcGVyYXRpb25zXG4gIGNvbnN0IGVuaGFuY2VBcnJheSA9IDxVPihcbiAgICBhcnJheVNpZ25hbDogV3JpdGFibGVTaWduYWw8VVtdPlxuICApOiBFbmhhbmNlZEFycmF5U2lnbmFsPFU+ID0+IHtcbiAgICBjb25zdCBlbmhhbmNlZCA9IGFycmF5U2lnbmFsIGFzIEVuaGFuY2VkQXJyYXlTaWduYWw8VT47XG5cbiAgICBlbmhhbmNlZC5wdXNoID0gKGl0ZW06IFUpID0+IHtcbiAgICAgIGFycmF5U2lnbmFsLnVwZGF0ZSgoYXJyKSA9PiBbLi4uYXJyLCBpdGVtXSk7XG4gICAgICBtYXJrRGlydHkoKTtcbiAgICB9O1xuXG4gICAgZW5oYW5jZWQucmVtb3ZlQXQgPSAoaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgYXJyYXlTaWduYWwudXBkYXRlKChhcnIpID0+IGFyci5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KSk7XG4gICAgICBtYXJrRGlydHkoKTtcbiAgICB9O1xuXG4gICAgZW5oYW5jZWQuc2V0QXQgPSAoaW5kZXg6IG51bWJlciwgdmFsdWU6IFUpID0+IHtcbiAgICAgIGFycmF5U2lnbmFsLnVwZGF0ZSgoYXJyKSA9PlxuICAgICAgICBhcnIubWFwKChpdGVtLCBpKSA9PiAoaSA9PT0gaW5kZXggPyB2YWx1ZSA6IGl0ZW0pKVxuICAgICAgKTtcbiAgICAgIG1hcmtEaXJ0eSgpO1xuICAgIH07XG5cbiAgICBlbmhhbmNlZC5pbnNlcnRBdCA9IChpbmRleDogbnVtYmVyLCBpdGVtOiBVKSA9PiB7XG4gICAgICBhcnJheVNpZ25hbC51cGRhdGUoKGFycikgPT4gW1xuICAgICAgICAuLi5hcnIuc2xpY2UoMCwgaW5kZXgpLFxuICAgICAgICBpdGVtLFxuICAgICAgICAuLi5hcnIuc2xpY2UoaW5kZXgpLFxuICAgICAgXSk7XG4gICAgICBtYXJrRGlydHkoKTtcbiAgICB9O1xuXG4gICAgZW5oYW5jZWQubW92ZSA9IChmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIpID0+IHtcbiAgICAgIGFycmF5U2lnbmFsLnVwZGF0ZSgoYXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0FyciA9IFsuLi5hcnJdO1xuICAgICAgICBjb25zdCBbaXRlbV0gPSBuZXdBcnIuc3BsaWNlKGZyb20sIDEpO1xuICAgICAgICBpZiAoaXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbmV3QXJyLnNwbGljZSh0bywgMCwgaXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ld0FycjtcbiAgICAgIH0pO1xuICAgICAgbWFya0RpcnR5KCk7XG4gICAgfTtcblxuICAgIGVuaGFuY2VkLmNsZWFyID0gKCkgPT4ge1xuICAgICAgYXJyYXlTaWduYWwuc2V0KFtdKTtcbiAgICAgIG1hcmtEaXJ0eSgpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZW5oYW5jZWQ7XG4gIH07XG5cbiAgLy8gUmVjdXJzaXZlbHkgZW5oYW5jZSBhbGwgYXJyYXlzIGluIHRoZSBzdGF0ZVxuICBjb25zdCBlbmhhbmNlQXJyYXlzUmVjdXJzaXZlbHkgPSAob2JqOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQgPT4ge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgIGlmIChpc1NpZ25hbCh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3Qgc2lnbmFsVmFsdWUgPSAodmFsdWUgYXMgU2lnbmFsPHVua25vd24+KSgpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzaWduYWxWYWx1ZSkpIHtcbiAgICAgICAgICBvYmpba2V5XSA9IGVuaGFuY2VBcnJheSh2YWx1ZSBhcyBXcml0YWJsZVNpZ25hbDx1bmtub3duW10+KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICkge1xuICAgICAgICBlbmhhbmNlQXJyYXlzUmVjdXJzaXZlbHkodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBFbmhhbmNlIGFycmF5cyBpbiB0aGUgc3RhdGVcbiAgZW5oYW5jZUFycmF5c1JlY3Vyc2l2ZWx5KGZsYXR0ZW5lZFN0YXRlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcblxuICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBuZXN0ZWQgcGF0aHNcbiAgY29uc3QgZ2V0TmVzdGVkVmFsdWUgPSAob2JqOiBEZWVwU2lnbmFsaWZ5PFQ+LCBwYXRoOiBzdHJpbmcpOiB1bmtub3duID0+IHtcbiAgICBjb25zdCBrZXlzID0gcGFyc2VQYXRoKHBhdGgpO1xuICAgIGxldCBjdXJyZW50OiB1bmtub3duID0gb2JqO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKGN1cnJlbnQgJiYgdHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGN1cnJlbnQgPSAoY3VycmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcbiAgICAgICAgaWYgKGlzU2lnbmFsKGN1cnJlbnQpKSB7XG4gICAgICAgICAgY3VycmVudCA9IChjdXJyZW50IGFzIFNpZ25hbDx1bmtub3duPikoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudDtcbiAgfTtcblxuICBjb25zdCBzZXROZXN0ZWRWYWx1ZSA9IChwYXRoOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgY29uc3Qga2V5cyA9IHBhcnNlUGF0aChwYXRoKTtcbiAgICBsZXQgY3VycmVudDogdW5rbm93biA9IGZsYXR0ZW5lZFN0YXRlO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY3VycmVudCA9IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXlzW2ldXTtcbiAgICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxhc3RLZXkgPSBrZXlzW2tleXMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgdGFyZ2V0ID0gKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2xhc3RLZXldO1xuXG4gICAgaWYgKGlzU2lnbmFsKHRhcmdldCkgJiYgJ3NldCcgaW4gdGFyZ2V0KSB7XG4gICAgICAodGFyZ2V0IGFzIFdyaXRhYmxlU2lnbmFsPHVua25vd24+KS5zZXQodmFsdWUpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB2YWxpZGF0ZSA9IGFzeW5jIChmaWVsZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGVycm9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGNvbnN0IGFzeW5jRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICBjb25zdCBmaWVsZHNUb1ZhbGlkYXRlID0gZmllbGQgPyBbZmllbGRdIDogT2JqZWN0LmtleXModmFsaWRhdG9ycyk7XG5cbiAgICAvLyBTeW5jIHZhbGlkYXRpb25cbiAgICBmb3IgKGNvbnN0IGZpZWxkUGF0aCBvZiBmaWVsZHNUb1ZhbGlkYXRlKSB7XG4gICAgICBjb25zdCB2YWxpZGF0b3IgPSB2YWxpZGF0b3JzW2ZpZWxkUGF0aF07XG4gICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TmVzdGVkVmFsdWUoZmxhdHRlbmVkU3RhdGUsIGZpZWxkUGF0aCk7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdG9yKHZhbHVlKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgZXJyb3JzW2ZpZWxkUGF0aF0gPSBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvcm1TaWduYWxzLmVycm9ycy5zZXQoZXJyb3JzKTtcblxuICAgIC8vIEFzeW5jIHZhbGlkYXRpb25cbiAgICBjb25zdCBhc3luY0ZpZWxkc1RvVmFsaWRhdGUgPSBmaWVsZFxuICAgICAgPyBbZmllbGRdXG4gICAgICA6IE9iamVjdC5rZXlzKGFzeW5jVmFsaWRhdG9ycyk7XG5cbiAgICBmb3IgKGNvbnN0IGZpZWxkUGF0aCBvZiBhc3luY0ZpZWxkc1RvVmFsaWRhdGUpIHtcbiAgICAgIGNvbnN0IGFzeW5jVmFsaWRhdG9yID0gYXN5bmNWYWxpZGF0b3JzW2ZpZWxkUGF0aF07XG4gICAgICBpZiAoYXN5bmNWYWxpZGF0b3IgJiYgKCFmaWVsZCB8fCBmaWVsZCA9PT0gZmllbGRQYXRoKSkge1xuICAgICAgICBmb3JtU2lnbmFscy5hc3luY1ZhbGlkYXRpbmcudXBkYXRlKCh2KSA9PiAoe1xuICAgICAgICAgIC4uLnYsXG4gICAgICAgICAgW2ZpZWxkUGF0aF06IHRydWUsXG4gICAgICAgIH0pKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TmVzdGVkVmFsdWUoZmxhdHRlbmVkU3RhdGUsIGZpZWxkUGF0aCk7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXN5bmNWYWxpZGF0b3IodmFsdWUpO1xuXG4gICAgICAgICAgbGV0IGVycm9yOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgT2JzZXJ2YWJsZVxuICAgICAgICAgICAgZXJyb3IgPSBhd2FpdCBuZXcgUHJvbWlzZTxzdHJpbmcgfCBudWxsPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICByZXN1bHQuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiAodmFsKSA9PiByZXNvbHZlKHZhbCksXG4gICAgICAgICAgICAgICAgZXJyb3I6ICgpID0+IHJlc29sdmUoJ1ZhbGlkYXRpb24gZXJyb3InKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSGFuZGxlIFByb21pc2VcbiAgICAgICAgICAgIGVycm9yID0gYXdhaXQgcmVzdWx0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgYXN5bmNFcnJvcnNbZmllbGRQYXRoXSA9IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgYXN5bmNFcnJvcnNbZmllbGRQYXRoXSA9ICdWYWxpZGF0aW9uIGVycm9yJztcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1TaWduYWxzLmFzeW5jVmFsaWRhdGluZy51cGRhdGUoKHYpID0+ICh7XG4gICAgICAgICAgLi4udixcbiAgICAgICAgICBbZmllbGRQYXRoXTogZmFsc2UsXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3JtU2lnbmFscy5hc3luY0Vycm9ycy5zZXQoYXN5bmNFcnJvcnMpO1xuXG4gICAgLy8gVXBkYXRlIHZhbGlkaXR5XG4gICAgY29uc3QgaGFzRXJyb3JzID0gT2JqZWN0LmtleXMoZXJyb3JzKS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IGhhc0FzeW5jRXJyb3JzID0gT2JqZWN0LmtleXMoYXN5bmNFcnJvcnMpLmxlbmd0aCA+IDA7XG4gICAgY29uc3QgaXNWYWxpZGF0aW5nID0gT2JqZWN0LnZhbHVlcyhmb3JtU2lnbmFscy5hc3luY1ZhbGlkYXRpbmcoKSkuc29tZShcbiAgICAgICh2KSA9PiB2XG4gICAgKTtcblxuICAgIGZvcm1TaWduYWxzLnZhbGlkLnNldCghaGFzRXJyb3JzICYmICFoYXNBc3luY0Vycm9ycyAmJiAhaXNWYWxpZGF0aW5nKTtcbiAgfTtcblxuICAvLyBDcmVhdGUgY29tcHV0ZWQgc2lnbmFscyBmb3IgZmllbGQgZXJyb3JzXG4gIGNvbnN0IGZpZWxkRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBTaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPj4gPSB7fTtcbiAgY29uc3QgZmllbGRBc3luY0Vycm9yczogUmVjb3JkPHN0cmluZywgU2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4+ID0ge307XG5cbiAgLy8gQ3JlYXRlIGVycm9yIHNpZ25hbHMgZm9yIGFsbCBkZWZpbmVkIHZhbGlkYXRvcnNcbiAgWy4uLk9iamVjdC5rZXlzKHZhbGlkYXRvcnMpLCAuLi5PYmplY3Qua2V5cyhhc3luY1ZhbGlkYXRvcnMpXS5mb3JFYWNoKFxuICAgIChmaWVsZFBhdGgpID0+IHtcbiAgICAgIGZpZWxkRXJyb3JzW2ZpZWxkUGF0aF0gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVycm9ycyA9IGZvcm1TaWduYWxzLmVycm9ycygpO1xuICAgICAgICByZXR1cm4gZXJyb3JzW2ZpZWxkUGF0aF07XG4gICAgICB9KTtcbiAgICAgIGZpZWxkQXN5bmNFcnJvcnNbZmllbGRQYXRoXSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gZm9ybVNpZ25hbHMuYXN5bmNFcnJvcnMoKTtcbiAgICAgICAgcmV0dXJuIGVycm9yc1tmaWVsZFBhdGhdO1xuICAgICAgfSk7XG4gICAgfVxuICApO1xuXG4gIC8vIENyZWF0ZSB0aGUgZm9ybSB0cmVlIG9iamVjdFxuICBjb25zdCBmb3JtVHJlZTogRm9ybVRyZWU8VD4gPSB7XG4gICAgLy8gRmxhdHRlbmVkIHN0YXRlIGFjY2Vzc1xuICAgIHN0YXRlOiBmbGF0dGVuZWRTdGF0ZSxcbiAgICAkOiBmbGF0dGVuZWRTdGF0ZSxcblxuICAgIC8vIEZvcm0gc2lnbmFsc1xuICAgIC4uLmZvcm1TaWduYWxzLFxuXG4gICAgLy8gQ29yZSBtZXRob2RzXG4gICAgdW53cmFwOiAoKSA9PiB2YWx1ZXNUcmVlLnVud3JhcCgpLFxuXG4gICAgc2V0VmFsdWU6IChmaWVsZDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgc2V0TmVzdGVkVmFsdWUoZmllbGQsIHZhbHVlKTtcbiAgICAgIGZvcm1TaWduYWxzLnRvdWNoZWQudXBkYXRlKCh0KSA9PiAoeyAuLi50LCBbZmllbGRdOiB0cnVlIH0pKTtcbiAgICAgIG1hcmtEaXJ0eSgpO1xuICAgICAgdm9pZCB2YWxpZGF0ZShmaWVsZCk7XG4gICAgfSxcblxuICAgIHNldFZhbHVlczogKHZhbHVlczogUGFydGlhbDxUPikgPT4ge1xuICAgICAgdmFsdWVzVHJlZS51cGRhdGUoKHYpID0+ICh7IC4uLnYsIC4uLnZhbHVlcyB9KSk7XG4gICAgICBtYXJrRGlydHkoKTtcbiAgICAgIHZvaWQgdmFsaWRhdGUoKTtcbiAgICB9LFxuXG4gICAgcmVzZXQ6ICgpID0+IHtcbiAgICAgIC8vIFJlc2V0IGVhY2ggZmllbGQgaW5kaXZpZHVhbGx5IHRvIG1haW50YWluIHNpZ25hbCByZWFjdGl2aXR5XG4gICAgICBjb25zdCByZXNldFNpZ25hbHMgPSA8VFJlc2V0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgICAgICBjdXJyZW50OiBEZWVwU2lnbmFsaWZ5PFRSZXNldD4sXG4gICAgICAgIGluaXRpYWw6IFRSZXNldFxuICAgICAgKTogdm9pZCA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgaW5pdGlhbFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbml0aWFsKSkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldO1xuXG4gICAgICAgICAgaWYgKGlzU2lnbmFsKGN1cnJlbnRWYWx1ZSkgJiYgJ3NldCcgaW4gY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAoY3VycmVudFZhbHVlIGFzIFdyaXRhYmxlU2lnbmFsPHVua25vd24+KS5zZXQoaW5pdGlhbFZhbHVlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGluaXRpYWxWYWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIGluaXRpYWxWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoaW5pdGlhbFZhbHVlKSAmJlxuICAgICAgICAgICAgdHlwZW9mIGN1cnJlbnRWYWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgIWlzU2lnbmFsKGN1cnJlbnRWYWx1ZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJlc2V0U2lnbmFscyhcbiAgICAgICAgICAgICAgY3VycmVudFZhbHVlIGFzIERlZXBTaWduYWxpZnk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuICAgICAgICAgICAgICBpbml0aWFsVmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXNldFNpZ25hbHMoZmxhdHRlbmVkU3RhdGUsIGluaXRpYWxWYWx1ZXMpO1xuXG4gICAgICBmb3JtU2lnbmFscy5lcnJvcnMuc2V0KHt9KTtcbiAgICAgIGZvcm1TaWduYWxzLmFzeW5jRXJyb3JzLnNldCh7fSk7XG4gICAgICBmb3JtU2lnbmFscy50b3VjaGVkLnNldCh7fSk7XG4gICAgICBmb3JtU2lnbmFscy5hc3luY1ZhbGlkYXRpbmcuc2V0KHt9KTtcbiAgICAgIGZvcm1TaWduYWxzLmRpcnR5LnNldChmYWxzZSk7XG4gICAgICBmb3JtU2lnbmFscy52YWxpZC5zZXQodHJ1ZSk7XG4gICAgICBmb3JtU2lnbmFscy5zdWJtaXR0aW5nLnNldChmYWxzZSk7XG4gICAgfSxcblxuICAgIHN1Ym1pdDogYXN5bmMgPFRSZXN1bHQ+KFxuICAgICAgc3VibWl0Rm46ICh2YWx1ZXM6IFQpID0+IFByb21pc2U8VFJlc3VsdD5cbiAgICApOiBQcm9taXNlPFRSZXN1bHQ+ID0+IHtcbiAgICAgIGZvcm1TaWduYWxzLnN1Ym1pdHRpbmcuc2V0KHRydWUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB2YWxpZGF0ZSgpO1xuXG4gICAgICAgIGlmICghZm9ybVNpZ25hbHMudmFsaWQoKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRm9ybSBpcyBpbnZhbGlkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50VmFsdWVzID0gdmFsdWVzVHJlZS51bndyYXAoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3VibWl0Rm4oY3VycmVudFZhbHVlcyk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBmb3JtU2lnbmFscy5zdWJtaXR0aW5nLnNldChmYWxzZSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHZhbGlkYXRlLFxuXG4gICAgLy8gRmllbGQgaGVscGVyc1xuICAgIGdldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PlxuICAgICAgZmllbGRFcnJvcnNbZmllbGRdIHx8IGNvbXB1dGVkKCgpID0+IHVuZGVmaW5lZCksXG5cbiAgICBnZXRGaWVsZEFzeW5jRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PlxuICAgICAgZmllbGRBc3luY0Vycm9yc1tmaWVsZF0gfHwgY29tcHV0ZWQoKCkgPT4gdW5kZWZpbmVkKSxcblxuICAgIGdldEZpZWxkVG91Y2hlZDogKGZpZWxkOiBzdHJpbmcpID0+XG4gICAgICBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRvdWNoZWQgPSBmb3JtU2lnbmFscy50b3VjaGVkKCk7XG4gICAgICAgIHJldHVybiB0b3VjaGVkW2ZpZWxkXTtcbiAgICAgIH0pLFxuXG4gICAgaXNGaWVsZFZhbGlkOiAoZmllbGQ6IHN0cmluZykgPT5cbiAgICAgIGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gZm9ybVNpZ25hbHMuZXJyb3JzKCk7XG4gICAgICAgIGNvbnN0IGFzeW5jRXJyb3JzID0gZm9ybVNpZ25hbHMuYXN5bmNFcnJvcnMoKTtcbiAgICAgICAgY29uc3QgYXN5bmNWYWxpZGF0aW5nID0gZm9ybVNpZ25hbHMuYXN5bmNWYWxpZGF0aW5nKCk7XG4gICAgICAgIHJldHVybiAhZXJyb3JzW2ZpZWxkXSAmJiAhYXN5bmNFcnJvcnNbZmllbGRdICYmICFhc3luY1ZhbGlkYXRpbmdbZmllbGRdO1xuICAgICAgfSksXG5cbiAgICBpc0ZpZWxkQXN5bmNWYWxpZGF0aW5nOiAoZmllbGQ6IHN0cmluZykgPT5cbiAgICAgIGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgYXN5bmNWYWxpZGF0aW5nID0gZm9ybVNpZ25hbHMuYXN5bmNWYWxpZGF0aW5nKCk7XG4gICAgICAgIHJldHVybiBhc3luY1ZhbGlkYXRpbmdbZmllbGRdO1xuICAgICAgfSksXG5cbiAgICAvLyBEaXJlY3QgYWNjZXNzXG4gICAgZmllbGRFcnJvcnMsXG4gICAgZmllbGRBc3luY0Vycm9ycyxcblxuICAgIC8vIEtlZXAgdmFsdWVzIHRyZWUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICB2YWx1ZXM6IHZhbHVlc1RyZWUsXG4gIH07XG5cbiAgcmV0dXJuIGZvcm1UcmVlO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQU5HVUxBUiBESVJFQ1RJVkVcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogU2ltcGxlIGRpcmVjdGl2ZSBmb3IgdHdvLXdheSBiaW5kaW5nIHdpdGggc2lnbmFsc1xuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbc2lnbmFsVHJlZVNpZ25hbFZhbHVlXScsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2lnbmFsVmFsdWVEaXJlY3RpdmUpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgU2lnbmFsVmFsdWVEaXJlY3RpdmUgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0IHtcbiAgQElucHV0KCkgc2lnbmFsVHJlZVNpZ25hbFZhbHVlITogV3JpdGFibGVTaWduYWw8dW5rbm93bj47XG4gIEBPdXRwdXQoKSBzaWduYWxUcmVlU2lnbmFsVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHVua25vd24+KCk7XG5cbiAgcHJpdmF0ZSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG5cbiAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiB1bmtub3duKSA9PiB2b2lkID0gKCkgPT4ge1xuICAgIC8vIEVtcHR5IGltcGxlbWVudGF0aW9uIGZvciBDb250cm9sVmFsdWVBY2Nlc3NvclxuICB9O1xuICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHtcbiAgICAvLyBFbXB0eSBpbXBsZW1lbnRhdGlvbiBmb3IgQ29udHJvbFZhbHVlQWNjZXNzb3JcbiAgfTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnNpZ25hbFRyZWVTaWduYWxWYWx1ZSgpO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignaW5wdXQnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdjaGFuZ2UnLCBbJyRldmVudCddKVxuICBoYW5kbGVDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgdmFsdWUgPSB0YXJnZXQ/LnZhbHVlO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNpZ25hbFRyZWVTaWduYWxWYWx1ZS5zZXQodmFsdWUpO1xuICAgICAgdGhpcy5zaWduYWxUcmVlU2lnbmFsVmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgaGFuZGxlQmx1cigpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNpZ25hbFRyZWVTaWduYWxWYWx1ZS5zZXQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KFxuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAnZGlzYWJsZWQnLFxuICAgICAgaXNEaXNhYmxlZFxuICAgICk7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFZBTElEQVRPUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0b3JzID0ge1xuICByZXF1aXJlZDpcbiAgICAobWVzc2FnZSA9ICdSZXF1aXJlZCcpID0+XG4gICAgKHZhbHVlOiB1bmtub3duKSA9PlxuICAgICAgIXZhbHVlID8gbWVzc2FnZSA6IG51bGwsXG5cbiAgZW1haWw6XG4gICAgKG1lc3NhZ2UgPSAnSW52YWxpZCBlbWFpbCcpID0+XG4gICAgKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBzdHJWYWx1ZSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICAgIHJldHVybiBzdHJWYWx1ZSAmJiAhc3RyVmFsdWUuaW5jbHVkZXMoJ0AnKSA/IG1lc3NhZ2UgOiBudWxsO1xuICAgIH0sXG5cbiAgbWluTGVuZ3RoOiAobWluOiBudW1iZXIpID0+ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgIGNvbnN0IHN0clZhbHVlID0gdmFsdWUgYXMgc3RyaW5nO1xuICAgIHJldHVybiBzdHJWYWx1ZSAmJiBzdHJWYWx1ZS5sZW5ndGggPCBtaW4gPyBgTWluICR7bWlufSBjaGFyYWN0ZXJzYCA6IG51bGw7XG4gIH0sXG5cbiAgcGF0dGVybjpcbiAgICAocmVnZXg6IFJlZ0V4cCwgbWVzc2FnZSA9ICdJbnZhbGlkIGZvcm1hdCcpID0+XG4gICAgKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBzdHJWYWx1ZSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICAgIHJldHVybiBzdHJWYWx1ZSAmJiAhcmVnZXgudGVzdChzdHJWYWx1ZSkgPyBtZXNzYWdlIDogbnVsbDtcbiAgICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGFzeW5jVmFsaWRhdG9ycyA9IHtcbiAgdW5pcXVlOlxuICAgIChcbiAgICAgIGNoZWNrRm46ICh2YWx1ZTogdW5rbm93bikgPT4gUHJvbWlzZTxib29sZWFuPixcbiAgICAgIG1lc3NhZ2UgPSAnQWxyZWFkeSBleGlzdHMnXG4gICAgKSA9PlxuICAgIGFzeW5jICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgICBjb25zdCBleGlzdHMgPSBhd2FpdCBjaGVja0ZuKHZhbHVlKTtcbiAgICAgIHJldHVybiBleGlzdHMgPyBtZXNzYWdlIDogbnVsbDtcbiAgICB9LFxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFJYSlMgQlJJREdFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgZnVuY3Rpb24gdG9PYnNlcnZhYmxlPFQ+KHNpZ25hbDogU2lnbmFsPFQ+KTogT2JzZXJ2YWJsZTxUPiB7XG4gIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoc3Vic2NyaWJlcikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlZmZlY3RSZWYgPSBlZmZlY3QoKCkgPT4ge1xuICAgICAgICBzdWJzY3JpYmVyLm5leHQoc2lnbmFsKCkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gKCkgPT4gZWZmZWN0UmVmLmRlc3Ryb3koKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEZhbGxiYWNrIGZvciB0ZXN0IGVudmlyb25tZW50IHdpdGhvdXQgaW5qZWN0aW9uIGNvbnRleHRcbiAgICAgIHN1YnNjcmliZXIubmV4dChzaWduYWwoKSk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAvLyBObyBjbGVhbnVwIG5lZWRlZCBmb3Igc2luZ2xlIGVtaXNzaW9uXG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBVURJVCBNSURETEVXQVJFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGl0RW50cnk8VCA9IHVua25vd24+IHtcbiAgdGltZXN0YW1wOiBudW1iZXI7XG4gIGNoYW5nZXM6IFBhcnRpYWw8VD47XG4gIG1ldGFkYXRhPzoge1xuICAgIHVzZXJJZD86IHN0cmluZztcbiAgICBzb3VyY2U/OiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBdWRpdE1pZGRsZXdhcmU8VD4oXG4gIGF1ZGl0TG9nOiBBdWRpdEVudHJ5PFQ+W10sXG4gIGdldE1ldGFkYXRhPzogKCkgPT4gQXVkaXRFbnRyeTxUPlsnbWV0YWRhdGEnXVxuKTogTWlkZGxld2FyZTxUPiB7XG4gIHJldHVybiB7XG4gICAgaWQ6ICdhdWRpdCcsXG4gICAgYWZ0ZXI6IChhY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93biwgb2xkU3RhdGU6IFQsIG5ld1N0YXRlOiBUKSA9PiB7XG4gICAgICBjb25zdCBjaGFuZ2VzID0gZ2V0Q2hhbmdlcyhvbGRTdGF0ZSwgbmV3U3RhdGUpO1xuICAgICAgaWYgKE9iamVjdC5rZXlzKGNoYW5nZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXVkaXRMb2cucHVzaCh7XG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgIGNoYW5nZXMsXG4gICAgICAgICAgbWV0YWRhdGE6IGdldE1ldGFkYXRhPy4oKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2hhbmdlczxUPihvbGRTdGF0ZTogVCwgbmV3U3RhdGU6IFQpOiBQYXJ0aWFsPFQ+IHtcbiAgY29uc3QgY2hhbmdlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBuZXdTdGF0ZSkge1xuICAgIGlmIChvbGRTdGF0ZVtrZXldICE9PSBuZXdTdGF0ZVtrZXldKSB7XG4gICAgICBjaGFuZ2VzW2tleV0gPSBuZXdTdGF0ZVtrZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBjaGFuZ2VzIGFzIFBhcnRpYWw8VD47XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFWFBPUlRTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3QgU0lHTkFMX0ZPUk1fRElSRUNUSVZFUyA9IFtTaWduYWxWYWx1ZURpcmVjdGl2ZV07XG4iXX0="],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"signaltree-ng-forms.mjs","sources":["../tmp-esm2022/lib/ng-forms.js"],"sourcesContent":["import { computed, Directive, effect, ElementRef, EventEmitter, forwardRef, HostListener, inject, Input, isSignal, Output, Renderer2, signal, } from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { parsePath, signalTree } from '@signaltree/core';\nimport { Observable } from 'rxjs';\nimport * as i0 from \"@angular/core\";\nexport function createFormTree(initialValues, config = {}) {\n const { validators = {}, asyncValidators = {}, ...treeConfig } = config;\n const valuesTree = signalTree(initialValues, treeConfig);\n const flattenedState = valuesTree.state;\n const formSignals = {\n errors: signal({}),\n asyncErrors: signal({}),\n touched: signal({}),\n asyncValidating: signal({}),\n dirty: signal(false),\n valid: signal(true),\n submitting: signal(false),\n };\n const markDirty = () => formSignals.dirty.set(true);\n const enhanceArray = (arraySignal) => {\n const enhanced = arraySignal;\n enhanced.push = (item) => {\n arraySignal.update((arr) => [...arr, item]);\n markDirty();\n };\n enhanced.removeAt = (index) => {\n arraySignal.update((arr) => arr.filter((_, i) => i !== index));\n markDirty();\n };\n enhanced.setAt = (index, value) => {\n arraySignal.update((arr) => arr.map((item, i) => (i === index ? value : item)));\n markDirty();\n };\n enhanced.insertAt = (index, item) => {\n arraySignal.update((arr) => [\n ...arr.slice(0, index),\n item,\n ...arr.slice(index),\n ]);\n markDirty();\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 markDirty();\n };\n enhanced.clear = () => {\n arraySignal.set([]);\n markDirty();\n };\n return enhanced;\n };\n const enhanceArraysRecursively = (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);\n }\n }\n };\n enhanceArraysRecursively(flattenedState);\n const getNestedValue = (obj, path) => {\n const keys = parsePath(path);\n let current = obj;\n for (const key of keys) {\n if (current && typeof current === 'object') {\n current = current[key];\n if (isSignal(current)) {\n current = current();\n }\n }\n else {\n return undefined;\n }\n }\n return current;\n };\n const setNestedValue = (path, value) => {\n const keys = parsePath(path);\n let current = flattenedState;\n for (let i = 0; i < keys.length - 1; i++) {\n current = current[keys[i]];\n if (!current)\n return;\n }\n const lastKey = keys[keys.length - 1];\n const target = current[lastKey];\n if (isSignal(target) && 'set' in target) {\n target.set(value);\n }\n };\n const validate = async (field) => {\n const errors = {};\n const asyncErrors = {};\n const fieldsToValidate = field ? [field] : Object.keys(validators);\n for (const fieldPath of fieldsToValidate) {\n const validator = validators[fieldPath];\n if (validator) {\n const value = getNestedValue(flattenedState, fieldPath);\n const error = validator(value);\n if (error) {\n errors[fieldPath] = error;\n }\n }\n }\n formSignals.errors.set(errors);\n const asyncFieldsToValidate = field\n ? [field]\n : Object.keys(asyncValidators);\n for (const fieldPath of asyncFieldsToValidate) {\n const asyncValidator = asyncValidators[fieldPath];\n if (asyncValidator && (!field || field === fieldPath)) {\n formSignals.asyncValidating.update((v) => ({\n ...v,\n [fieldPath]: true,\n }));\n try {\n const value = getNestedValue(flattenedState, fieldPath);\n const result = asyncValidator(value);\n let error;\n if (result instanceof Observable) {\n error = await new Promise((resolve) => {\n result.subscribe({\n next: (val) => resolve(val),\n error: () => resolve('Validation error'),\n });\n });\n }\n else {\n error = await result;\n }\n if (error) {\n asyncErrors[fieldPath] = error;\n }\n }\n catch {\n asyncErrors[fieldPath] = 'Validation error';\n }\n formSignals.asyncValidating.update((v) => ({\n ...v,\n [fieldPath]: false,\n }));\n }\n }\n formSignals.asyncErrors.set(asyncErrors);\n const hasErrors = Object.keys(errors).length > 0;\n const hasAsyncErrors = Object.keys(asyncErrors).length > 0;\n const isValidating = Object.values(formSignals.asyncValidating()).some((v) => v);\n formSignals.valid.set(!hasErrors && !hasAsyncErrors && !isValidating);\n };\n const fieldErrors = {};\n const fieldAsyncErrors = {};\n [...Object.keys(validators), ...Object.keys(asyncValidators)].forEach((fieldPath) => {\n fieldErrors[fieldPath] = computed(() => {\n const errors = formSignals.errors();\n return errors[fieldPath];\n });\n fieldAsyncErrors[fieldPath] = computed(() => {\n const errors = formSignals.asyncErrors();\n return errors[fieldPath];\n });\n });\n const formTree = {\n state: flattenedState,\n $: flattenedState,\n ...formSignals,\n unwrap: () => valuesTree(),\n setValue: (field, value) => {\n setNestedValue(field, value);\n formSignals.touched.update((t) => ({ ...t, [field]: true }));\n markDirty();\n void validate(field);\n },\n setValues: (values) => {\n valuesTree((v) => ({ ...v, ...values }));\n markDirty();\n void validate();\n },\n reset: () => {\n const resetSignals = (current, initial) => {\n for (const [key, initialValue] of Object.entries(initial)) {\n const currentValue = current[key];\n if (isSignal(currentValue) && 'set' in currentValue) {\n currentValue.set(initialValue);\n }\n else if (typeof initialValue === 'object' &&\n initialValue !== null &&\n !Array.isArray(initialValue) &&\n typeof currentValue === 'object' &&\n currentValue !== null &&\n !isSignal(currentValue)) {\n resetSignals(currentValue, initialValue);\n }\n }\n };\n resetSignals(flattenedState, initialValues);\n formSignals.errors.set({});\n formSignals.asyncErrors.set({});\n formSignals.touched.set({});\n formSignals.asyncValidating.set({});\n formSignals.dirty.set(false);\n formSignals.valid.set(true);\n formSignals.submitting.set(false);\n },\n submit: async (submitFn) => {\n formSignals.submitting.set(true);\n try {\n await validate();\n if (!formSignals.valid()) {\n throw new Error('Form is invalid');\n }\n const currentValues = valuesTree();\n const result = await submitFn(currentValues);\n return result;\n }\n finally {\n formSignals.submitting.set(false);\n }\n },\n validate,\n getFieldError: (field) => fieldErrors[field] || computed(() => undefined),\n getFieldAsyncError: (field) => fieldAsyncErrors[field] || computed(() => undefined),\n getFieldTouched: (field) => computed(() => {\n const touched = formSignals.touched();\n return touched[field];\n }),\n isFieldValid: (field) => computed(() => {\n const errors = formSignals.errors();\n const asyncErrors = formSignals.asyncErrors();\n const asyncValidating = formSignals.asyncValidating();\n return !errors[field] && !asyncErrors[field] && !asyncValidating[field];\n }),\n isFieldAsyncValidating: (field) => computed(() => {\n const asyncValidating = formSignals.asyncValidating();\n return asyncValidating[field];\n }),\n fieldErrors,\n fieldAsyncErrors,\n values: valuesTree,\n };\n return formTree;\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.1.4\", ngImport: i0, type: SignalValueDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });\n static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"20.1.4\", 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.1.4\", 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 validators = {\n required: (message = 'Required') => (value) => !value ? message : null,\n email: (message = 'Invalid email') => (value) => {\n const strValue = value;\n return strValue && !strValue.includes('@') ? message : null;\n },\n minLength: (min) => (value) => {\n const strValue = value;\n return strValue && strValue.length < min ? `Min ${min} characters` : null;\n },\n pattern: (regex, message = 'Invalid format') => (value) => {\n const strValue = value;\n return strValue && !regex.test(strValue) ? message : null;\n },\n};\nexport const asyncValidators = {\n unique: (checkFn, message = 'Already exists') => async (value) => {\n if (!value)\n return null;\n const exists = await checkFn(value);\n return exists ? message : null;\n },\n};\nexport function toObservable(signal) {\n return new Observable((subscriber) => {\n try {\n const effectRef = effect(() => {\n subscriber.next(signal());\n }, ...(ngDevMode ? [{ debugName: \"effectRef\" }] : []));\n return () => effectRef.destroy();\n }\n catch {\n subscriber.next(signal());\n return () => {\n };\n }\n });\n}\nexport function createAuditMiddleware(auditLog, getMetadata) {\n return {\n id: 'audit',\n after: (action, payload, oldState, newState) => {\n const changes = getChanges(oldState, newState);\n if (Object.keys(changes).length > 0) {\n auditLog.push({\n timestamp: Date.now(),\n changes,\n metadata: getMetadata?.(),\n });\n }\n },\n };\n}\nfunction getChanges(oldState, newState) {\n const changes = {};\n for (const key in newState) {\n if (oldState[key] !== newState[key]) {\n changes[key] = newState[key];\n }\n }\n return changes;\n}\nexport const SIGNAL_FORM_DIRECTIVES = [SignalValueDirective];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctZm9ybXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy1mb3Jtcy9zcmMvbGliL25nLWZvcm1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxRQUFRLEVBQ1IsU0FBUyxFQUNULE1BQU0sRUFDTixVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxRQUFRLEVBRVIsTUFBTSxFQUNOLFNBQVMsRUFFVCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFpRmxDLE1BQU0sVUFBVSxjQUFjLENBQzVCLGFBQWdCLEVBQ2hCLFNBR2lCLEVBQUU7SUFFbkIsTUFBTSxFQUFFLFVBQVUsR0FBRyxFQUFFLEVBQUUsZUFBZSxHQUFHLEVBQUUsRUFBRSxHQUFHLFVBQVUsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUd4RSxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBR3pELE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxLQUF5QixDQUFDO0lBRzVELE1BQU0sV0FBVyxHQUFHO1FBQ2xCLE1BQU0sRUFBRSxNQUFNLENBQXlCLEVBQUUsQ0FBQztRQUMxQyxXQUFXLEVBQUUsTUFBTSxDQUF5QixFQUFFLENBQUM7UUFDL0MsT0FBTyxFQUFFLE1BQU0sQ0FBMEIsRUFBRSxDQUFDO1FBQzVDLGVBQWUsRUFBRSxNQUFNLENBQTBCLEVBQUUsQ0FBQztRQUNwRCxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNwQixLQUFLLEVBQUUsTUFB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QUUsV0FBVyxFQUFFLEVBQUU7aUJBQzFCLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBSSxRQUFXLEVBQUUsUUFBVztJQUM3QyxNQUFNLE9BQU8sR0FBNEIsRUFBRSxDQUFDO0lBRTVDLEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7UUFDM0IsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDcEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sT0FBcUIsQ0FBQztBQUMvQixDQUFDO0FBTUQsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgY29tcHV0ZWQsXG4gIERpcmVjdGl2ZSxcbiAgZWZmZWN0LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgaXNTaWduYWwsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFNpZ25hbCxcbiAgc2lnbmFsLFxuICBXcml0YWJsZVNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBwYXJzZVBhdGgsIHNpZ25hbFRyZWUgfSBmcm9tICdAc2lnbmFsdHJlZS9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IEFuZ3VsYXIgRm9ybXMgSW50ZWdyYXRpb24gZm9yIFNpZ25hbFRyZWVcbiAqXG4gKiBQcm92aWRlcyBjb21wcmVoZW5zaXZlIEFuZ3VsYXIgZm9ybSBpbnRlZ3JhdGlvbiBpbmNsdWRpbmcgRm9ybVRyZWUsXG4gKiBkaXJlY3RpdmVzLCB2YWxpZGF0b3JzLCBlbmhhbmNlZCBhcnJheSBvcGVyYXRpb25zLCBhbmQgUnhKUyBicmlkZ2UuXG4gKi9cblxuLy8gUmUtZXhwb3J0IGNvcmUgdHlwZXMgbmVlZGVkIGZvciBmb3Jtc1xuaW1wb3J0IHR5cGUge1xuICBTaWduYWxUcmVlLFxuICBUcmVlQ29uZmlnLFxuICBEZWVwU2lnbmFsaWZ5LFxuICBNaWRkbGV3YXJlLFxufSBmcm9tICdAc2lnbmFsdHJlZS9jb3JlJztcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBGT1JNIFRSRUUgVFlQRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCB0eXBlIEFzeW5jVmFsaWRhdG9yRm48VD4gPSAoXG4gIHZhbHVlOiBUXG4pID0+IE9ic2VydmFibGU8c3RyaW5nIHwgbnVsbD4gfCBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuXG5leHBvcnQgdHlwZSBFbmhhbmNlZEFycmF5U2lnbmFsPFQ+ID0gV3JpdGFibGVTaWduYWw8VFtdPiAmIHtcbiAgcHVzaDogKGl0ZW06IFQpID0+IHZvaWQ7XG4gIHJlbW92ZUF0OiAoaW5kZXg6IG51bWJlcikgPT4gdm9pZDtcbiAgc2V0QXQ6IChpbmRleDogbnVtYmVyLCB2YWx1ZTogVCkgPT4gdm9pZDtcbiAgaW5zZXJ0QXQ6IChpbmRleDogbnVtYmVyLCBpdGVtOiBUKSA9PiB2b2lkO1xuICBtb3ZlOiAoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKSA9PiB2b2lkO1xuICBjbGVhcjogKCkgPT4gdm9pZDtcbn07XG5cbi8qKlxuICogRm9ybSB0cmVlIHR5cGUgdGhhdCBmbGF0dGVucyB0aGUgc3RhdGUgYWNjZXNzIHdoaWxlIG1haW50YWluaW5nIGZvcm0tc3BlY2lmaWMgcHJvcGVydGllc1xuICovXG5leHBvcnQgdHlwZSBGb3JtVHJlZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID0ge1xuICAvLyBGbGF0dGVuZWQgc3RhdGUgYWNjZXNzIC0gZGlyZWN0IGFjY2VzcyB0byBmb3JtIHZhbHVlcyBhcyBzaWduYWxzXG4gIHN0YXRlOiBEZWVwU2lnbmFsaWZ5PFQ+O1xuICAkOiBEZWVwU2lnbmFsaWZ5PFQ+OyAvLyBBbGlhcyBmb3Igc3RhdGVcblxuICAvLyBGb3JtLXNwZWNpZmljIHNpZ25hbHNcbiAgZXJyb3JzOiBXcml0YWJsZVNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcbiAgYXN5bmNFcnJvcnM6IFdyaXRhYmxlU2lnbmFsPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuICB0b3VjaGVkOiBXcml0YWJsZVNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj47XG4gIGFzeW5jVmFsaWRhdGluZzogV3JpdGFibGVTaWduYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+O1xuICBkaXJ0eTogV3JpdGFibGVTaWduYWw8Ym9vbGVhbj47XG4gIHZhbGlkOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPjtcbiAgc3VibWl0dGluZzogV3JpdGFibGVTaWduYWw8Ym9vbGVhbj47XG5cbiAgLy8gRm9ybSBtZXRob2RzXG4gIHVud3JhcCgpOiBUO1xuICBzZXRWYWx1ZShmaWVsZDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQ7XG4gIHNldFZhbHVlcyh2YWx1ZXM6IFBhcnRpYWw8VD4pOiB2b2lkO1xuICByZXNldCgpOiB2b2lkO1xuICBzdWJtaXQ8VFJlc3VsdD4oc3VibWl0Rm46ICh2YWx1ZXM6IFQpID0+IFByb21pc2U8VFJlc3VsdD4pOiBQcm9taXNlPFRSZXN1bHQ+O1xuICB2YWxpZGF0ZShmaWVsZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG5cbiAgLy8gRmllbGQtbGV2ZWwgaGVscGVyc1xuICBnZXRGaWVsZEVycm9yKGZpZWxkOiBzdHJpbmcpOiBTaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgZ2V0RmllbGRBc3luY0Vycm9yKGZpZWxkOiBzdHJpbmcpOiBTaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgZ2V0RmllbGRUb3VjaGVkKGZpZWxkOiBzdHJpbmcpOiBTaWduYWw8Ym9vbGVhbiB8IHVuZGVmaW5lZD47XG4gIGlzRmllbGRWYWxpZChmaWVsZDogc3RyaW5nKTogU2lnbmFsPGJvb2xlYW4+O1xuICBpc0ZpZWxkQXN5bmNWYWxpZGF0aW5nKGZpZWxkOiBzdHJpbmcpOiBTaWduYWw8Ym9vbGVhbiB8IHVuZGVmaW5lZD47XG5cbiAgLy8gRGlyZWN0IGFjY2VzcyB0byBmaWVsZCBlcnJvcnNcbiAgZmllbGRFcnJvcnM6IFJlY29yZDxzdHJpbmcsIFNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+PjtcbiAgZmllbGRBc3luY0Vycm9yczogUmVjb3JkPHN0cmluZywgU2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4+O1xuXG4gIC8vIEtlZXAgdmFsdWVzIHRyZWUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgdmFsdWVzOiBTaWduYWxUcmVlPFQ+O1xufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVUSUxJVFkgRlVOQ1RJT05TXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRk9STSBUUkVFIElNUExFTUVOVEFUSU9OXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRm9ybVRyZWU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgaW5pdGlhbFZhbHVlczogVCxcbiAgY29uZmlnOiB7XG4gICAgdmFsaWRhdG9ycz86IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVsbD47XG4gICAgYXN5bmNWYWxpZGF0b3JzPzogUmVjb3JkPHN0cmluZywgQXN5bmNWYWxpZGF0b3JGbjx1bmtub3duPj47XG4gIH0gJiBUcmVlQ29uZmlnID0ge31cbik6IEZvcm1UcmVlPFQ+IHtcbiAgY29uc3QgeyB2YWxpZGF0b3JzID0ge30sIGFzeW5jVmFsaWRhdG9ycyA9IHt9LCAuLi50cmVlQ29uZmlnIH0gPSBjb25maWc7XG5cbiAgLy8gQ3JlYXRlIHRoZSB1bmRlcmx5aW5nIHNpZ25hbCB0cmVlXG4gIGNvbnN0IHZhbHVlc1RyZWUgPSBzaWduYWxUcmVlKGluaXRpYWxWYWx1ZXMsIHRyZWVDb25maWcpO1xuXG4gIC8vIEVuc3VyZSB0aGUgc3RhdGUgaGFzIHRoZSBjb3JyZWN0IHR5cGUgLSB0aGlzIGlzIHRoZSBrZXkgZml4XG4gIGNvbnN0IGZsYXR0ZW5lZFN0YXRlID0gdmFsdWVzVHJlZS5zdGF0ZSBhcyBEZWVwU2lnbmFsaWZ5PFQ+O1xuXG4gIC8vIENyZWF0ZSBmb3JtLXNwZWNpZmljIHNpZ25hbHNcbiAgY29uc3QgZm9ybVNpZ25hbHMgPSB7XG4gICAgZXJyb3JzOiBzaWduYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oe30pLFxuICAgIGFzeW5jRXJyb3JzOiBzaWduYWw8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oe30pLFxuICAgIHRvdWNoZWQ6IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oe30pLFxuICAgIGFzeW5jVmFsaWRhdGluZzogc2lnbmFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+Pih7fSksXG4gICAgZGlydHk6IHNpZ25hbChmYWxzZSksXG4gICAgdmFsaWQ6IHNpZ25hbCh0cnVlKSxcbiAgICBzdWJtaXR0aW5nOiBzaWduYWwoZmFsc2UpLFxuICB9O1xuXG4gIGNvbnN0IG1hcmtEaXJ0eSA9ICgpID0+IGZvcm1TaWduYWxzLmRpcnR5LnNldCh0cnVlKTtcblxuICAvLyBFbmhhbmNlIGFycmF5cyB3aXRoIG5hdHVyYWwgb3BlcmF0aW9uc1xuICBjb25zdCBlbmhhbmNlQXJyYXkgPSA8VT4oXG4gICAgYXJyYXlTaWduYWw6IFdyaXRhYmxlU2lnbmFsPFVbXT5cbiAgKTogRW5oYW5jZWRBcnJheVNpZ25hbDxVPiA9PiB7XG4gICAgY29uc3QgZW5oYW5jZWQgPSBhcnJheVNpZ25hbCBhcyBFbmhhbmNlZEFycmF5U2lnbmFsPFU+O1xuXG4gICAgZW5oYW5jZWQucHVzaCA9IChpdGVtOiBVKSA9PiB7XG4gICAgICBhcnJheVNpZ25hbC51cGRhdGUoKGFycikgPT4gWy4uLmFyciwgaXRlbV0pO1xuICAgICAgbWFya0RpcnR5KCk7XG4gICAgfTtcblxuICAgIGVuaGFuY2VkLnJlbW92ZUF0ID0gKGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGFycmF5U2lnbmFsLnVwZGF0ZSgoYXJyKSA9PiBhcnIuZmlsdGVyKChfLCBpKSA9PiBpICE9PSBpbmRleCkpO1xuICAgICAgbWFya0RpcnR5KCk7XG4gICAgfTtcblxuICAgIGVuaGFuY2VkLnNldEF0ID0gKGluZGV4OiBudW1iZXIsIHZhbHVlOiBVKSA9PiB7XG4gICAgICBhcnJheVNpZ25hbC51cGRhdGUoKGFycikgPT5cbiAgICAgICAgYXJyLm1hcCgoaXRlbSwgaSkgPT4gKGkgPT09IGluZGV4ID8gdmFsdWUgOiBpdGVtKSlcbiAgICAgICk7XG4gICAgICBtYXJrRGlydHkoKTtcbiAgICB9O1xuXG4gICAgZW5oYW5jZWQuaW5zZXJ0QXQgPSAoaW5kZXg6IG51bWJlciwgaXRlbTogVSkgPT4ge1xuICAgICAgYXJyYXlTaWduYWwudXBkYXRlKChhcnIpID0+IFtcbiAgICAgICAgLi4uYXJyLnNsaWNlKDAsIGluZGV4KSxcbiAgICAgICAgaXRlbSxcbiAgICAgICAgLi4uYXJyLnNsaWNlKGluZGV4KSxcbiAgICAgIF0pO1xuICAgICAgbWFya0RpcnR5KCk7XG4gICAgfTtcblxuICAgIGVuaGFuY2VkLm1vdmUgPSAoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKSA9PiB7XG4gICAgICBhcnJheVNpZ25hbC51cGRhdGUoKGFycikgPT4ge1xuICAgICAgICBjb25zdCBuZXdBcnIgPSBbLi4uYXJyXTtcbiAgICAgICAgY29uc3QgW2l0ZW1dID0gbmV3QXJyLnNwbGljZShmcm9tLCAxKTtcbiAgICAgICAgaWYgKGl0ZW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG5ld0Fyci5zcGxpY2UodG8sIDAsIGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdBcnI7XG4gICAgICB9KTtcbiAgICAgIG1hcmtEaXJ0eSgpO1xuICAgIH07XG5cbiAgICBlbmhhbmNlZC5jbGVhciA9ICgpID0+IHtcbiAgICAgIGFycmF5U2lnbmFsLnNldChbXSk7XG4gICAgICBtYXJrRGlydHkoKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGVuaGFuY2VkO1xuICB9O1xuXG4gIC8vIFJlY3Vyc2l2ZWx5IGVuaGFuY2UgYWxsIGFycmF5cyBpbiB0aGUgc3RhdGVcbiAgY29uc3QgZW5oYW5jZUFycmF5c1JlY3Vyc2l2ZWx5ID0gKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkID0+IHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gICAgICBpZiAoaXNTaWduYWwodmFsdWUpKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hbFZhbHVlID0gKHZhbHVlIGFzIFNpZ25hbDx1bmtub3duPikoKTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2lnbmFsVmFsdWUpKSB7XG4gICAgICAgICAgb2JqW2tleV0gPSBlbmhhbmNlQXJyYXkodmFsdWUgYXMgV3JpdGFibGVTaWduYWw8dW5rbm93bltdPik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgZW5oYW5jZUFycmF5c1JlY3Vyc2l2ZWx5KHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gRW5oYW5jZSBhcnJheXMgaW4gdGhlIHN0YXRlXG4gIGVuaGFuY2VBcnJheXNSZWN1cnNpdmVseShmbGF0dGVuZWRTdGF0ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG5cbiAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgbmVzdGVkIHBhdGhzXG4gIGNvbnN0IGdldE5lc3RlZFZhbHVlID0gKG9iajogRGVlcFNpZ25hbGlmeTxUPiwgcGF0aDogc3RyaW5nKTogdW5rbm93biA9PiB7XG4gICAgY29uc3Qga2V5cyA9IHBhcnNlUGF0aChwYXRoKTtcbiAgICBsZXQgY3VycmVudDogdW5rbm93biA9IG9iajtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmIChjdXJyZW50ICYmIHR5cGVvZiBjdXJyZW50ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjdXJyZW50ID0gKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG4gICAgICAgIGlmIChpc1NpZ25hbChjdXJyZW50KSkge1xuICAgICAgICAgIGN1cnJlbnQgPSAoY3VycmVudCBhcyBTaWduYWw8dW5rbm93bj4pKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH07XG5cbiAgY29uc3Qgc2V0TmVzdGVkVmFsdWUgPSAocGF0aDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGtleXMgPSBwYXJzZVBhdGgocGF0aCk7XG4gICAgbGV0IGN1cnJlbnQ6IHVua25vd24gPSBmbGF0dGVuZWRTdGF0ZTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGN1cnJlbnQgPSAoY3VycmVudCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5c1tpXV07XG4gICAgICBpZiAoIWN1cnJlbnQpIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsYXN0S2V5ID0ga2V5c1trZXlzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IHRhcmdldCA9IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtsYXN0S2V5XTtcblxuICAgIGlmIChpc1NpZ25hbCh0YXJnZXQpICYmICdzZXQnIGluIHRhcmdldCkge1xuICAgICAgKHRhcmdldCBhcyBXcml0YWJsZVNpZ25hbDx1bmtub3duPikuc2V0KHZhbHVlKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgdmFsaWRhdGUgPSBhc3luYyAoZmllbGQ/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBlcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBjb25zdCBhc3luY0Vycm9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgY29uc3QgZmllbGRzVG9WYWxpZGF0ZSA9IGZpZWxkID8gW2ZpZWxkXSA6IE9iamVjdC5rZXlzKHZhbGlkYXRvcnMpO1xuXG4gICAgLy8gU3luYyB2YWxpZGF0aW9uXG4gICAgZm9yIChjb25zdCBmaWVsZFBhdGggb2YgZmllbGRzVG9WYWxpZGF0ZSkge1xuICAgICAgY29uc3QgdmFsaWRhdG9yID0gdmFsaWRhdG9yc1tmaWVsZFBhdGhdO1xuICAgICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGdldE5lc3RlZFZhbHVlKGZsYXR0ZW5lZFN0YXRlLCBmaWVsZFBhdGgpO1xuICAgICAgICBjb25zdCBlcnJvciA9IHZhbGlkYXRvcih2YWx1ZSk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIGVycm9yc1tmaWVsZFBhdGhdID0gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3JtU2lnbmFscy5lcnJvcnMuc2V0KGVycm9ycyk7XG5cbiAgICAvLyBBc3luYyB2YWxpZGF0aW9uXG4gICAgY29uc3QgYXN5bmNGaWVsZHNUb1ZhbGlkYXRlID0gZmllbGRcbiAgICAgID8gW2ZpZWxkXVxuICAgICAgOiBPYmplY3Qua2V5cyhhc3luY1ZhbGlkYXRvcnMpO1xuXG4gICAgZm9yIChjb25zdCBmaWVsZFBhdGggb2YgYXN5bmNGaWVsZHNUb1ZhbGlkYXRlKSB7XG4gICAgICBjb25zdCBhc3luY1ZhbGlkYXRvciA9IGFzeW5jVmFsaWRhdG9yc1tmaWVsZFBhdGhdO1xuICAgICAgaWYgKGFzeW5jVmFsaWRhdG9yICYmICghZmllbGQgfHwgZmllbGQgPT09IGZpZWxkUGF0aCkpIHtcbiAgICAgICAgZm9ybVNpZ25hbHMuYXN5bmNWYWxpZGF0aW5nLnVwZGF0ZSgodikgPT4gKHtcbiAgICAgICAgICAuLi52LFxuICAgICAgICAgIFtmaWVsZFBhdGhdOiB0cnVlLFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldE5lc3RlZFZhbHVlKGZsYXR0ZW5lZFN0YXRlLCBmaWVsZFBhdGgpO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGFzeW5jVmFsaWRhdG9yKHZhbHVlKTtcblxuICAgICAgICAgIGxldCBlcnJvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgICAgICAgLy8gSGFuZGxlIE9ic2VydmFibGVcbiAgICAgICAgICAgIGVycm9yID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nIHwgbnVsbD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgcmVzdWx0LnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogKHZhbCkgPT4gcmVzb2x2ZSh2YWwpLFxuICAgICAgICAgICAgICAgIGVycm9yOiAoKSA9PiByZXNvbHZlKCdWYWxpZGF0aW9uIGVycm9yJyksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBQcm9taXNlXG4gICAgICAgICAgICBlcnJvciA9IGF3YWl0IHJlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGFzeW5jRXJyb3JzW2ZpZWxkUGF0aF0gPSBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGFzeW5jRXJyb3JzW2ZpZWxkUGF0aF0gPSAnVmFsaWRhdGlvbiBlcnJvcic7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtU2lnbmFscy5hc3luY1ZhbGlkYXRpbmcudXBkYXRlKCh2KSA9PiAoe1xuICAgICAgICAgIC4uLnYsXG4gICAgICAgICAgW2ZpZWxkUGF0aF06IGZhbHNlLFxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9ybVNpZ25hbHMuYXN5bmNFcnJvcnMuc2V0KGFzeW5jRXJyb3JzKTtcblxuICAgIC8vIFVwZGF0ZSB2YWxpZGl0eVxuICAgIGNvbnN0IGhhc0Vycm9ycyA9IE9iamVjdC5rZXlzKGVycm9ycykubGVuZ3RoID4gMDtcbiAgICBjb25zdCBoYXNBc3luY0Vycm9ycyA9IE9iamVjdC5rZXlzKGFzeW5jRXJyb3JzKS5sZW5ndGggPiAwO1xuICAgIGNvbnN0IGlzVmFsaWRhdGluZyA9IE9iamVjdC52YWx1ZXMoZm9ybVNpZ25hbHMuYXN5bmNWYWxpZGF0aW5nKCkpLnNvbWUoXG4gICAgICAodikgPT4gdlxuICAgICk7XG5cbiAgICBmb3JtU2lnbmFscy52YWxpZC5zZXQoIWhhc0Vycm9ycyAmJiAhaGFzQXN5bmNFcnJvcnMgJiYgIWlzVmFsaWRhdGluZyk7XG4gIH07XG5cbiAgLy8gQ3JlYXRlIGNvbXB1dGVkIHNpZ25hbHMgZm9yIGZpZWxkIGVycm9yc1xuICBjb25zdCBmaWVsZEVycm9yczogUmVjb3JkPHN0cmluZywgU2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4+ID0ge307XG4gIGNvbnN0IGZpZWxkQXN5bmNFcnJvcnM6IFJlY29yZDxzdHJpbmcsIFNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+PiA9IHt9O1xuXG4gIC8vIENyZWF0ZSBlcnJvciBzaWduYWxzIGZvciBhbGwgZGVmaW5lZCB2YWxpZGF0b3JzXG4gIFsuLi5PYmplY3Qua2V5cyh2YWxpZGF0b3JzKSwgLi4uT2JqZWN0LmtleXMoYXN5bmNWYWxpZGF0b3JzKV0uZm9yRWFjaChcbiAgICAoZmllbGRQYXRoKSA9PiB7XG4gICAgICBmaWVsZEVycm9yc1tmaWVsZFBhdGhdID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBlcnJvcnMgPSBmb3JtU2lnbmFscy5lcnJvcnMoKTtcbiAgICAgICAgcmV0dXJuIGVycm9yc1tmaWVsZFBhdGhdO1xuICAgICAgfSk7XG4gICAgICBmaWVsZEFzeW5jRXJyb3JzW2ZpZWxkUGF0aF0gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVycm9ycyA9IGZvcm1TaWduYWxzLmFzeW5jRXJyb3JzKCk7XG4gICAgICAgIHJldHVybiBlcnJvcnNbZmllbGRQYXRoXTtcbiAgICAgIH0pO1xuICAgIH1cbiAgKTtcblxuICAvLyBDcmVhdGUgdGhlIGZvcm0gdHJlZSBvYmplY3RcbiAgY29uc3QgZm9ybVRyZWU6IEZvcm1UcmVlPFQ+ID0ge1xuICAgIC8vIEZsYXR0ZW5lZCBzdGF0ZSBhY2Nlc3NcbiAgICBzdGF0ZTogZmxhdHRlbmVkU3RhdGUsXG4gICAgJDogZmxhdHRlbmVkU3RhdGUsXG5cbiAgICAvLyBGb3JtIHNpZ25hbHNcbiAgICAuLi5mb3JtU2lnbmFscyxcblxuICAgIC8vIENvcmUgbWV0aG9kc1xuICAgIHVud3JhcDogKCkgPT4gdmFsdWVzVHJlZSgpLFxuXG4gICAgc2V0VmFsdWU6IChmaWVsZDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgc2V0TmVzdGVkVmFsdWUoZmllbGQsIHZhbHVlKTtcbiAgICAgIGZvcm1TaWduYWxzLnRvdWNoZWQudXBkYXRlKCh0KSA9PiAoeyAuLi50LCBbZmllbGRdOiB0cnVlIH0pKTtcbiAgICAgIG1hcmtEaXJ0eSgpO1xuICAgICAgdm9pZCB2YWxpZGF0ZShmaWVsZCk7XG4gICAgfSxcblxuICAgIHNldFZhbHVlczogKHZhbHVlczogUGFydGlhbDxUPikgPT4ge1xuICAgICAgdmFsdWVzVHJlZSgodjogVCkgPT4gKHsgLi4udiwgLi4udmFsdWVzIH0pKTtcbiAgICAgIG1hcmtEaXJ0eSgpO1xuICAgICAgdm9pZCB2YWxpZGF0ZSgpO1xuICAgIH0sXG5cbiAgICByZXNldDogKCkgPT4ge1xuICAgICAgLy8gUmVzZXQgZWFjaCBmaWVsZCBpbmRpdmlkdWFsbHkgdG8gbWFpbnRhaW4gc2lnbmFsIHJlYWN0aXZpdHlcbiAgICAgIGNvbnN0IHJlc2V0U2lnbmFscyA9IDxUUmVzZXQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgICAgIGN1cnJlbnQ6IERlZXBTaWduYWxpZnk8VFJlc2V0PixcbiAgICAgICAgaW5pdGlhbDogVFJlc2V0XG4gICAgICApOiB2b2lkID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBpbml0aWFsVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluaXRpYWwpKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gKGN1cnJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV07XG5cbiAgICAgICAgICBpZiAoaXNTaWduYWwoY3VycmVudFZhbHVlKSAmJiAnc2V0JyBpbiBjdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgIChjdXJyZW50VmFsdWUgYXMgV3JpdGFibGVTaWduYWw8dW5rbm93bj4pLnNldChpbml0aWFsVmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgaW5pdGlhbFZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgaW5pdGlhbFZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheShpbml0aWFsVmFsdWUpICYmXG4gICAgICAgICAgICB0eXBlb2YgY3VycmVudFZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgY3VycmVudFZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgICAhaXNTaWduYWwoY3VycmVudFZhbHVlKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmVzZXRTaWduYWxzKFxuICAgICAgICAgICAgICBjdXJyZW50VmFsdWUgYXMgRGVlcFNpZ25hbGlmeTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4gICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJlc2V0U2lnbmFscyhmbGF0dGVuZWRTdGF0ZSwgaW5pdGlhbFZhbHVlcyk7XG5cbiAgICAgIGZvcm1TaWduYWxzLmVycm9ycy5zZXQoe30pO1xuICAgICAgZm9ybVNpZ25hbHMuYXN5bmNFcnJvcnMuc2V0KHt9KTtcbiAgICAgIGZvcm1TaWduYWxzLnRvdWNoZWQuc2V0KHt9KTtcbiAgICAgIGZvcm1TaWduYWxzLmFzeW5jVmFsaWRhdGluZy5zZXQoe30pO1xuICAgICAgZm9ybVNpZ25hbHMuZGlydHkuc2V0KGZhbHNlKTtcbiAgICAgIGZvcm1TaWduYWxzLnZhbGlkLnNldCh0cnVlKTtcbiAgICAgIGZvcm1TaWduYWxzLnN1Ym1pdHRpbmcuc2V0KGZhbHNlKTtcbiAgICB9LFxuXG4gICAgc3VibWl0OiBhc3luYyA8VFJlc3VsdD4oXG4gICAgICBzdWJtaXRGbjogKHZhbHVlczogVCkgPT4gUHJvbWlzZTxUUmVzdWx0PlxuICAgICk6IFByb21pc2U8VFJlc3VsdD4gPT4ge1xuICAgICAgZm9ybVNpZ25hbHMuc3VibWl0dGluZy5zZXQodHJ1ZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHZhbGlkYXRlKCk7XG5cbiAgICAgICAgaWYgKCFmb3JtU2lnbmFscy52YWxpZCgpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3JtIGlzIGludmFsaWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZXMgPSB2YWx1ZXNUcmVlKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN1Ym1pdEZuKGN1cnJlbnRWYWx1ZXMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZm9ybVNpZ25hbHMuc3VibWl0dGluZy5zZXQoZmFsc2UpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICB2YWxpZGF0ZSxcblxuICAgIC8vIEZpZWxkIGhlbHBlcnNcbiAgICBnZXRGaWVsZEVycm9yOiAoZmllbGQ6IHN0cmluZykgPT5cbiAgICAgIGZpZWxkRXJyb3JzW2ZpZWxkXSB8fCBjb21wdXRlZCgoKSA9PiB1bmRlZmluZWQpLFxuXG4gICAgZ2V0RmllbGRBc3luY0Vycm9yOiAoZmllbGQ6IHN0cmluZykgPT5cbiAgICAgIGZpZWxkQXN5bmNFcnJvcnNbZmllbGRdIHx8IGNvbXB1dGVkKCgpID0+IHVuZGVmaW5lZCksXG5cbiAgICBnZXRGaWVsZFRvdWNoZWQ6IChmaWVsZDogc3RyaW5nKSA9PlxuICAgICAgY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCB0b3VjaGVkID0gZm9ybVNpZ25hbHMudG91Y2hlZCgpO1xuICAgICAgICByZXR1cm4gdG91Y2hlZFtmaWVsZF07XG4gICAgICB9KSxcblxuICAgIGlzRmllbGRWYWxpZDogKGZpZWxkOiBzdHJpbmcpID0+XG4gICAgICBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVycm9ycyA9IGZvcm1TaWduYWxzLmVycm9ycygpO1xuICAgICAgICBjb25zdCBhc3luY0Vycm9ycyA9IGZvcm1TaWduYWxzLmFzeW5jRXJyb3JzKCk7XG4gICAgICAgIGNvbnN0IGFzeW5jVmFsaWRhdGluZyA9IGZvcm1TaWduYWxzLmFzeW5jVmFsaWRhdGluZygpO1xuICAgICAgICByZXR1cm4gIWVycm9yc1tmaWVsZF0gJiYgIWFzeW5jRXJyb3JzW2ZpZWxkXSAmJiAhYXN5bmNWYWxpZGF0aW5nW2ZpZWxkXTtcbiAgICAgIH0pLFxuXG4gICAgaXNGaWVsZEFzeW5jVmFsaWRhdGluZzogKGZpZWxkOiBzdHJpbmcpID0+XG4gICAgICBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFzeW5jVmFsaWRhdGluZyA9IGZvcm1TaWduYWxzLmFzeW5jVmFsaWRhdGluZygpO1xuICAgICAgICByZXR1cm4gYXN5bmNWYWxpZGF0aW5nW2ZpZWxkXTtcbiAgICAgIH0pLFxuXG4gICAgLy8gRGlyZWN0IGFjY2Vzc1xuICAgIGZpZWxkRXJyb3JzLFxuICAgIGZpZWxkQXN5bmNFcnJvcnMsXG5cbiAgICAvLyBLZWVwIHZhbHVlcyB0cmVlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgdmFsdWVzOiB2YWx1ZXNUcmVlLFxuICB9O1xuXG4gIHJldHVybiBmb3JtVHJlZTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEFOR1VMQVIgRElSRUNUSVZFXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFNpbXBsZSBkaXJlY3RpdmUgZm9yIHR3by13YXkgYmluZGluZyB3aXRoIHNpZ25hbHNcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3NpZ25hbFRyZWVTaWduYWxWYWx1ZV0nLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNpZ25hbFZhbHVlRGlyZWN0aXZlKSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIFNpZ25hbFZhbHVlRGlyZWN0aXZlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHNpZ25hbFRyZWVTaWduYWxWYWx1ZSE6IFdyaXRhYmxlU2lnbmFsPHVua25vd24+O1xuICBAT3V0cHV0KCkgc2lnbmFsVHJlZVNpZ25hbFZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx1bmtub3duPigpO1xuXG4gIHByaXZhdGUgZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgcHJpdmF0ZSByZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuXG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCA9ICgpID0+IHtcbiAgICAvLyBFbXB0eSBpbXBsZW1lbnRhdGlvbiBmb3IgQ29udHJvbFZhbHVlQWNjZXNzb3JcbiAgfTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgLy8gRW1wdHkgaW1wbGVtZW50YXRpb24gZm9yIENvbnRyb2xWYWx1ZUFjY2Vzc29yXG4gIH07XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zaWduYWxUcmVlU2lnbmFsVmFsdWUoKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2lucHV0JywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcignY2hhbmdlJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlQ2hhbmdlKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0Py52YWx1ZTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zaWduYWxUcmVlU2lnbmFsVmFsdWUuc2V0KHZhbHVlKTtcbiAgICAgIHRoaXMuc2lnbmFsVHJlZVNpZ25hbFZhbHVlQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignYmx1cicpXG4gIGhhbmRsZUJsdXIoKSB7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zaWduYWxUcmVlU2lnbmFsVmFsdWUuc2V0KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eShcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgJ2Rpc2FibGVkJyxcbiAgICAgIGlzRGlzYWJsZWRcbiAgICApO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBWQUxJREFUT1JTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgY29uc3QgdmFsaWRhdG9ycyA9IHtcbiAgcmVxdWlyZWQ6XG4gICAgKG1lc3NhZ2UgPSAnUmVxdWlyZWQnKSA9PlxuICAgICh2YWx1ZTogdW5rbm93bikgPT5cbiAgICAgICF2YWx1ZSA/IG1lc3NhZ2UgOiBudWxsLFxuXG4gIGVtYWlsOlxuICAgIChtZXNzYWdlID0gJ0ludmFsaWQgZW1haWwnKSA9PlxuICAgICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3Qgc3RyVmFsdWUgPSB2YWx1ZSBhcyBzdHJpbmc7XG4gICAgICByZXR1cm4gc3RyVmFsdWUgJiYgIXN0clZhbHVlLmluY2x1ZGVzKCdAJykgPyBtZXNzYWdlIDogbnVsbDtcbiAgICB9LFxuXG4gIG1pbkxlbmd0aDogKG1pbjogbnVtYmVyKSA9PiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICBjb25zdCBzdHJWYWx1ZSA9IHZhbHVlIGFzIHN0cmluZztcbiAgICByZXR1cm4gc3RyVmFsdWUgJiYgc3RyVmFsdWUubGVuZ3RoIDwgbWluID8gYE1pbiAke21pbn0gY2hhcmFjdGVyc2AgOiBudWxsO1xuICB9LFxuXG4gIHBhdHRlcm46XG4gICAgKHJlZ2V4OiBSZWdFeHAsIG1lc3NhZ2UgPSAnSW52YWxpZCBmb3JtYXQnKSA9PlxuICAgICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3Qgc3RyVmFsdWUgPSB2YWx1ZSBhcyBzdHJpbmc7XG4gICAgICByZXR1cm4gc3RyVmFsdWUgJiYgIXJlZ2V4LnRlc3Qoc3RyVmFsdWUpID8gbWVzc2FnZSA6IG51bGw7XG4gICAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBhc3luY1ZhbGlkYXRvcnMgPSB7XG4gIHVuaXF1ZTpcbiAgICAoXG4gICAgICBjaGVja0ZuOiAodmFsdWU6IHVua25vd24pID0+IFByb21pc2U8Ym9vbGVhbj4sXG4gICAgICBtZXNzYWdlID0gJ0FscmVhZHkgZXhpc3RzJ1xuICAgICkgPT5cbiAgICBhc3luYyAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgY2hlY2tGbih2YWx1ZSk7XG4gICAgICByZXR1cm4gZXhpc3RzID8gbWVzc2FnZSA6IG51bGw7XG4gICAgfSxcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSWEpTIEJSSURHRVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvT2JzZXJ2YWJsZTxUPihzaWduYWw6IFNpZ25hbDxUPik6IE9ic2VydmFibGU8VD4ge1xuICByZXR1cm4gbmV3IE9ic2VydmFibGUoKHN1YnNjcmliZXIpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZWZmZWN0UmVmID0gZWZmZWN0KCgpID0+IHtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KHNpZ25hbCgpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICgpID0+IGVmZmVjdFJlZi5kZXN0cm95KCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGYWxsYmFjayBmb3IgdGVzdCBlbnZpcm9ubWVudCB3aXRob3V0IGluamVjdGlvbiBjb250ZXh0XG4gICAgICBzdWJzY3JpYmVyLm5leHQoc2lnbmFsKCkpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgLy8gTm8gY2xlYW51cCBuZWVkZWQgZm9yIHNpbmdsZSBlbWlzc2lvblxuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQVVESVQgTUlERExFV0FSRVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBBdWRpdEVudHJ5PFQgPSB1bmtub3duPiB7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xuICBjaGFuZ2VzOiBQYXJ0aWFsPFQ+O1xuICBtZXRhZGF0YT86IHtcbiAgICB1c2VySWQ/OiBzdHJpbmc7XG4gICAgc291cmNlPzogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXVkaXRNaWRkbGV3YXJlPFQ+KFxuICBhdWRpdExvZzogQXVkaXRFbnRyeTxUPltdLFxuICBnZXRNZXRhZGF0YT86ICgpID0+IEF1ZGl0RW50cnk8VD5bJ21ldGFkYXRhJ11cbik6IE1pZGRsZXdhcmU8VD4ge1xuICByZXR1cm4ge1xuICAgIGlkOiAnYXVkaXQnLFxuICAgIGFmdGVyOiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24sIG9sZFN0YXRlOiBULCBuZXdTdGF0ZTogVCkgPT4ge1xuICAgICAgY29uc3QgY2hhbmdlcyA9IGdldENoYW5nZXMob2xkU3RhdGUsIG5ld1N0YXRlKTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyhjaGFuZ2VzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF1ZGl0TG9nLnB1c2goe1xuICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICBjaGFuZ2VzLFxuICAgICAgICAgIG1ldGFkYXRhOiBnZXRNZXRhZGF0YT8uKCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldENoYW5nZXM8VD4ob2xkU3RhdGU6IFQsIG5ld1N0YXRlOiBUKTogUGFydGlhbDxUPiB7XG4gIGNvbnN0IGNoYW5nZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gbmV3U3RhdGUpIHtcbiAgICBpZiAob2xkU3RhdGVba2V5XSAhPT0gbmV3U3RhdGVba2V5XSkge1xuICAgICAgY2hhbmdlc1trZXldID0gbmV3U3RhdGVba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2hhbmdlcyBhcyBQYXJ0aWFsPFQ+O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRVhQT1JUU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGNvbnN0IFNJR05BTF9GT1JNX0RJUkVDVElWRVMgPSBbU2lnbmFsVmFsdWVEaXJlY3RpdmVdO1xuIl19"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@signaltree/ng-forms",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
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.1.0",
|