@sumaris-net/ngx-components 18.22.17 → 18.22.19

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.
@@ -1,4 +1,4 @@
1
- import { FormArray, FormGroup, UntypedFormArray, UntypedFormControl, UntypedFormGroup, Validators, } from '@angular/forms';
1
+ import { FormArray, FormControl, FormGroup, UntypedFormArray, UntypedFormControl, UntypedFormGroup, Validators, } from '@angular/forms';
2
2
  import { isMoment } from 'moment';
3
3
  import { isEmptyArray, isNilOrBlank, isNotEmptyArray, isNotNil, isNotNilOrNaN, nullIfUndefined } from './functions';
4
4
  import { toDateISOString } from './dates';
@@ -28,7 +28,7 @@ export function getFormValueFromEntity(entity, form) {
28
28
  export function adaptValueToControl(source, control, path) {
29
29
  const pathPrefix = path ? path + '.' : '';
30
30
  // Form group
31
- if (control instanceof UntypedFormGroup) {
31
+ if (control instanceof FormGroup) {
32
32
  const result = {};
33
33
  // eslint-disable-next-line guard-for-in
34
34
  for (const key in control.controls) {
@@ -37,7 +37,7 @@ export function adaptValueToControl(source, control, path) {
37
37
  return result;
38
38
  }
39
39
  // Array
40
- if (control instanceof UntypedFormArray) {
40
+ if (control instanceof FormArray) {
41
41
  // Split, if many values in a string
42
42
  if (typeof source === 'string') {
43
43
  source = source.split('|');
@@ -89,17 +89,15 @@ export function adaptValueToControl(source, control, path) {
89
89
  }
90
90
  }
91
91
  // Form control
92
- if (control instanceof UntypedFormControl) {
92
+ if (control instanceof FormControl) {
93
93
  // Date
94
94
  if (isMoment(source)) {
95
95
  return toDateISOString(source);
96
96
  }
97
- // Any other control: replace undefined by null value
98
- // because Undefined is not authorized as control value
99
- else {
100
- return nullIfUndefined(source);
101
- }
102
97
  }
98
+ // Any other control: replace undefined by null value
99
+ // because Undefined is not authorized as control value
100
+ return nullIfUndefined(source);
103
101
  }
104
102
  export function logFormErrors(control, logPrefix, path) {
105
103
  if (!control || control.valid)
@@ -592,4 +590,4 @@ export function filterFormErrors(errors, filter) {
592
590
  return res;
593
591
  }, undefined);
594
592
  }
595
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9mb3Jtcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUVoQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxPQUFPLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBR3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQU03RDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLE1BQVcsRUFBRSxNQUF3QixFQUFFLElBQWtEO0lBQ3ZILE1BQU0sSUFBSSxHQUFHLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwRCxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUFDLE1BQXVCLEVBQUUsSUFBc0I7SUFDcEYsT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUEyQixDQUFDO0FBQ3JFLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsTUFBdUIsRUFBRSxPQUF3QixFQUFFLElBQWE7SUFDbEcsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxD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QztRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQzFDLE9BQU8sc0JBQXNCLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2RyxDQUFDO0FBRUQsTUFBTSxVQUFVLHNCQUFzQixDQUFDLE1BQWtCLEVBQUUsTUFBeUI7SUFDbEYsSUFBSSxPQUFPLE1BQU0sS0FBSyxVQUFVO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDaEQsT0FBTyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUFrQixFQUFFLE1BQWdDO0lBQ25GLElBQUksT0FBTyxNQUFNLEtBQUssVUFBVTtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ2hELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7U0FDMUIsTUFBTSxDQUFDLE1BQU0sQ0FBQztTQUNkLE1BQU0sQ0FDTCxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1FBQ3JCLGlCQUFpQjtRQUNqQixHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUNoQixvQkFBb0I7UUFDcEIsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNsQixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUMsRUFDVyxTQUFTLENBQ3RCLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBGb3JtQXJyYXksXG4gIEZvcm1Hcm91cCxcbiAgVW50eXBlZEZvcm1BcnJheSxcbiAgVW50eXBlZEZvcm1Db250cm9sLFxuICBVbnR5cGVkRm9ybUdyb3VwLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBpc01vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBpc0VtcHR5QXJyYXksIGlzTmlsT3JCbGFuaywgaXNOb3RFbXB0eUFycmF5LCBpc05vdE5pbCwgaXNOb3ROaWxPck5hTiwgbnVsbElmVW5kZWZpbmVkIH0gZnJvbSAnLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgdG9EYXRlSVNPU3RyaW5nIH0gZnJvbSAnLi9kYXRlcyc7XG5pbXBvcnQgeyB3YWl0Rm9yLCBXYWl0Rm9yT3B0aW9ucyB9IGZyb20gJy4vb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHsgUHJlZGljYXRlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFwcEZvcm1BcnJheSB9IGZyb20gJy4uL2NvcmUvZm9ybS9hcnJheS9mb3JtLWFycmF5JztcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtRXJyb3JzIHtcbiAgW2tleTogc3RyaW5nXTogVmFsaWRhdGlvbkVycm9ycztcbn1cblxuLyoqXG4gKiBGaWxsIGEgZm9ybSB1c2luZyBhIHNvdXJjZSBlbnRpdHlcbiAqXG4gKiBAcGFyYW0gdGFyZ2V0XG4gKiBAcGFyYW0gZW50aXR5XG4gKiBAcGFyYW0gb3B0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29weUVudGl0eTJGb3JtKGVudGl0eTogYW55LCB0YXJnZXQ6IFVudHlwZWRGb3JtR3JvdXAsIG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gIGNvbnN0IGpzb24gPSBnZXRGb3JtVmFsdWVGcm9tRW50aXR5KGVudGl0eSwgdGFyZ2V0KTtcbiAgdGFyZ2V0LnBhdGNoVmFsdWUoanNvbiwgb3B0cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtVmFsdWVGcm9tRW50aXR5KGVudGl0eTogYW55IHwgdW5kZWZpbmVkLCBmb3JtOiBVbnR5cGVkRm9ybUdyb3VwKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gIHJldHVybiBhZGFwdFZhbHVlVG9Db250cm9sKGVudGl0eSwgZm9ybSkgYXMgeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYW4gZW50aXR5IGludG8gYSBzaW1wbGUgb2JqZWN0LCBjb21wYXRpYmxlIHdpdGggdGhlIGdpdmVuIGZvcm1cbiAqXG4gKiBAcGFyYW0gc291cmNlIGFuIGVudGl0eSAob3Igc3ViZW50aXR5KVxuICogQHBhcmFtIGNvbnRyb2xcbiAqIEBwYXJhbSBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGFwdFZhbHVlVG9Db250cm9sKHNvdXJjZTogYW55IHwgdW5kZWZpbmVkLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIHBhdGg/OiBzdHJpbmcpOiBhbnkge1xuICBjb25zdCBwYXRoUHJlZml4ID0gcGF0aCA/IHBhdGggKyAnLicgOiAnJztcblxuICAvLyBGb3JtIGdyb3VwXG4gIGlmIChjb250cm9sIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Hcm91cCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBndWFyZC1mb3ItaW5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBjb250cm9sLmNvbnRyb2xzKSB7XG4gICAgICByZXN1bHRba2V5XSA9IGFkYXB0VmFsdWVUb0NvbnRyb2woc291cmNlICYmIHNvdXJjZVtrZXldLCBjb250cm9sLmNvbnRyb2xzW2tleV0sIHBhdGhQcmVmaXggKyBrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gQXJyYXlcbiAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBVbnR5cGVkRm9ybUFycmF5KSB7XG4gICAgLy8gU3BsaXQsIGlmIG1hbnkgdmFsdWVzIGluIGEgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBzb3VyY2UgPSBzb3VyY2Uuc3BsaXQoJ3wnKTtcbiAgICB9XG4gICAgLy8gU2tpcCBpZiB2YWx1ZSBpcyBub3QgYW4gYXJyYXlcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIFJlc2l6YWJsZSBhcnJheVxuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgQXBwRm9ybUFycmF5KSB7XG4gICAgICAvLyBNYWtlIHN1cmUgdG8gaGF2ZSBvbmUgdmFsdWUsIGlmIGVtcHR5IGFycmF5IGFyZSBub3QgYWxsb3dlZFxuICAgICAgaWYgKGNvbnRyb2wuYWxsb3dFbXB0eUFycmF5ID09PSBmYWxzZSAmJiBzb3VyY2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHNvdXJjZSA9IFtudWxsXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhhbXBsZUNvbnRyb2wgPSBjb250cm9sLmNyZWF0ZUNvbnRyb2wodW5kZWZpbmVkLCBjb250cm9sLmxlbmd0aCk7XG4gICAgICByZXR1cm4gc291cmNlLm1hcCgoaXRlbSwgaW5kZXgpID0+IGFkYXB0VmFsdWVUb0NvbnRyb2woaXRlbSwgZXhhbXBsZUNvbnRyb2wsIHBhdGhQcmVmaXggKyAnIycgKyBpbmRleCkpIGFzIGFueVtdO1xuICAgIH1cblxuICAgIC8vIExlZ2FjeSBhcnJheVxuICAgIGVsc2UgaWYgKGNvbnRyb2wubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZmlyc3RDb250cm9sID0gY29udHJvbC5hdCgwKTtcbiAgICAgIC8vIFVzZSB0aGUgZmlyc3QgZm9ybSBncm91cCwgYXMgbW9kZWxcbiAgICAgIGxldCByZXN1bHQgPSBzb3VyY2UubWFwKChpdGVtLCBpbmRleCkgPT4gYWRhcHRWYWx1ZVRvQ29udHJvbChpdGVtLCBmaXJzdENvbnRyb2wsIHBhdGhQcmVmaXggKyAnIycgKyBpbmRleCkpIGFzIGFueVtdO1xuXG4gICAgICAvLyBUcnVuY2F0ZSBpZiB0b28gbWFueSB2YWx1ZXNcbiAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gY29udHJvbC5sZW5ndGgpIHtcbiAgICAgICAgaWYgKGZpcnN0Q29udHJvbCBpbnN0YW5jZW9mIFVudHlwZWRGb3JtQ29udHJvbCkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSBjb250cm9sLmxlbmd0aDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29udHJvbC5wdXNoKG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wobnVsbCwgZmlyc3RDb250cm9sLnZhbGlkYXRvcikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFdBUk46IHBsZWFzZSByZXNpemUgdGhlIEZvcm1BcnJheSAnJHtwYXRoIHx8ICcnfScgdG8gdGhlIHNhbWUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBhcnJheWApO1xuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBjb250cm9sLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHZhbHVlcyBpZiBub3QgZW5vdWdodFxuICAgICAgZWxzZSBpZiAocmVzdWx0Lmxlbmd0aCA8IGNvbnRyb2wubGVuZ3RoKSB7XG4gICAgICAgIC8vY29uc29sZS53YXJuKGBXQVJOOiBBZGRpbmcgbnVsbCB2YWx1ZSB0byBhcnJheSB2YWx1ZXNgKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHJlc3VsdC5sZW5ndGg7IGkgPCBjb250cm9sLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2gobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8vIFNraXAgaWYgdW5hYmxlIHRvIGZpbmQgYSBjb250cm9sIGluIHRoZSBhcnJheVxuICAgIGVsc2Uge1xuICAgICAgaWYgKGlzTm90RW1wdHlBcnJheShzb3VyY2UpKSBjb25zb2xlLndhcm4oYFdBUk46IHBsZWFzZSByZXNpemUgdGhlIEZvcm1BcnJheSAnJHtwYXRofScgdG8gdGhlIHNhbWUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBhcnJheWApO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZvcm0gY29udHJvbFxuICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVudHlwZWRGb3JtQ29udHJvbCkge1xuICAgIC8vIERhdGVcbiAgICBpZiAoaXNNb21lbnQoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHRvRGF0ZUlTT1N0cmluZyhzb3VyY2UpO1xuICAgIH1cbiAgICAvLyBBbnkgb3RoZXIgY29udHJvbDogcmVwbGFjZSB1bmRlZmluZWQgYnkgbnVsbCB2YWx1ZVxuICAgIC8vIGJlY2F1c2UgVW5kZWZpbmVkIGlzIG5vdCBhdXRob3JpemVkIGFzIGNvbnRyb2wgdmFsdWVcbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsSWZVbmRlZmluZWQoc291cmNlKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvZ0Zvcm1FcnJvcnMoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBsb2dQcmVmaXg/OiBzdHJpbmcsIHBhdGg/OiBzdHJpbmcpIHtcbiAgaWYgKCFjb250cm9sIHx8IGNvbnRyb2wudmFsaWQpIHJldHVybjtcbiAgbG9nUHJlZml4ID0gbG9nUHJlZml4IHx8ICcnO1xuICAvLyBGb3JtIGdyb3VwXG4gIGlmIChjb250cm9sIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Hcm91cCkge1xuICAgIGlmICghcGF0aCkgY29uc29sZS53YXJuKGAke2xvZ1ByZWZpeH0gRm9ybSBlcnJvcnM6YCk7XG4gICAgaWYgKGNvbnRyb2wuZXJyb3JzKSB7XG4gICAgICBPYmplY3Qua2V5cyhjb250cm9sLmVycm9ycykuZm9yRWFjaCgoZXJyb3IpID0+IGNvbnNvbGUud2FybihgJHtsb2dQcmVmaXh9IC0+ICR7cGF0aCB8fCAnJ30gKCR7ZXJyb3J9KWApKTtcbiAgICB9XG4gICAgaWYgKGNvbnRyb2wuY29udHJvbHMpIHtcbiAgICAgIE9iamVjdC5rZXlzKGNvbnRyb2wuY29udHJvbHMpLmZvckVhY2goXG4gICAgICAgIChjaGlsZCkgPT4gbG9nRm9ybUVycm9ycyhjb250cm9sLmNvbnRyb2xzW2NoaWxkXSwgbG9nUHJlZml4LCBwYXRoID8gYCR7cGF0aH0uJHtjaGlsZH1gIDogY2hpbGQpIC8vIFJlY3Vyc2l2ZSBjYWxsXG4gICAgICApO1xuICAgIH1cbiAgfVxuICAvLyBGb3JtIGFycmF5XG4gIGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBVbnR5cGVkRm9ybUFycmF5KSB7XG4gICAgaWYgKGNvbnRyb2wuZXJyb3JzKSB7XG4gICAgICBPYmplY3Qua2V5cyhjb250cm9sLmVycm9ycykuZm9yRWFjaCgoZXJyb3IpID0+IGNvbnNvbGUud2FybihgJHtsb2dQcmVmaXh9IC0+ICR7cGF0aCB8fCAnJ30gKCR7ZXJyb3J9KWApKTtcbiAgICB9XG4gICAgY29udHJvbC5jb250cm9scy5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgIGxvZ0Zvcm1FcnJvcnMoY2hpbGQsIGxvZ1ByZWZpeCwgcGF0aCA/IGAke3BhdGh9LiR7aW5kZXh9YCA6IGAke2luZGV4fWApOyAvLyBSZWN1cnNpdmUgY2FsbFxuICAgIH0pO1xuICB9XG4gIC8vIE90aGVyIGNvbnRyb2wncyBlcnJvcnNcbiAgZWxzZSBpZiAoY29udHJvbC5lcnJvcnMpIHtcbiAgICBPYmplY3Qua2V5cyhjb250cm9sLmVycm9ycykuZm9yRWFjaCgoZXJyb3IpID0+IGNvbnNvbGUud2FybihgJHtsb2dQcmVmaXh9IC0+ICR7cGF0aCB8fCAnJ30gKCR7ZXJyb3J9KWApKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbGwgdmFsaWRhdGlvbiBlcnJvcnMgZnJvbSBhIGdpdmVuIGZvcm0gY29udHJvbCwgaW5jbHVkaW5nIGl0cyBjaGlsZCBjb250cm9scyBpZiBpdCBpcyBhIGZvcm0gZ3JvdXAgb3IgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdENvbnRyb2x9IGNvbnRyb2wgLSBUaGUgZm9ybSBjb250cm9sIHRvIHJldHJpZXZlIGVycm9ycyBmcm9tLiBUaGlzIGNhbiBiZSBhIGZvcm0gZ3JvdXAsIGEgZm9ybSBhcnJheSwgb3IgYSBzaW1wbGUgZm9ybSBjb250cm9sLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzXSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb25zIGZvciBlcnJvciByZXRyaWV2YWwuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuY29udHJvbE5hbWVdIC0gVGhlIG5hbWUgb3IgcGF0aCBvZiB0aGUgY29udHJvbCBiZWluZyBwcm9jZXNzZWQsIHVzZWQgZm9yIHN0cnVjdHVyaW5nIGVycm9yIGtleXMgaW4gdGhlIHJlc3VsdC5cbiAqIEBwYXJhbSB7Rm9ybUVycm9yc30gW29wdHMucmVzdWx0XSAtIFRoZSBvYmplY3QgdG8gd2hpY2ggZXJyb3JzIHdpbGwgYmUgYWRkZWQsIGFsbG93aW5nIGZvciBhZ2dyZWdhdGlvbiBhbmQgcGVyc2lzdGVuY2UgYmV0d2VlbiBjYWxscy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMucmVjdXJzaXZlPXRydWVdIC0gV2hldGhlciB0byByZWN1cnNpdmVseSBjb2xsZWN0IGVycm9ycyBmcm9tIGNoaWxkIGNvbnRyb2xzIHdpdGhpbiBhIGZvcm0gZ3JvdXAgb3IgYXJyYXkuIERlZmF1bHRzIHRvIHRydWUuXG4gKiBAcmV0dXJuIHtGb3JtRXJyb3JzfSBUaGUgY29sbGVjdGVkIGVycm9ycyBhcyBhIGtleS12YWx1ZSBvYmplY3Qgd2hlcmUga2V5cyByZXByZXNlbnQgY29udHJvbCBuYW1lcyBvciBwYXRocyBhbmQgdmFsdWVzIHJlcHJlc2VudCB0aGVpciByZXNwZWN0aXZlIGVycm9ycy4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUgcHJvdmlkZWQgY29udHJvbCBpcyB2YWxpZCBhbmQgaGFzIG5vIGVycm9ycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1FcnJvcnMoXG4gIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCxcbiAgb3B0cz86IHtcbiAgICBjb250cm9sTmFtZT86IHN0cmluZztcbiAgICByZXN1bHQ/OiBGb3JtRXJyb3JzO1xuICAgIHJlY3Vyc2l2ZT86IGJvb2xlYW47XG4gIH1cbik6IEZvcm1FcnJvcnMge1xuICBpZiAoIWNvbnRyb2wgfHwgY29udHJvbC52YWxpZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgb3B0cy5yZXN1bHQgPSBvcHRzLnJlc3VsdCB8fCB7fTtcblxuICAvLyBGb3JtIGdyb3VwXG4gIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgLy8gQ29weSBlcnJvcnNcbiAgICBpZiAoY29udHJvbC5lcnJvcnMpIHtcbiAgICAgIGlmIChvcHRzLmNvbnRyb2xOYW1lKSB7XG4gICAgICAgIG9wdHMucmVzdWx0W29wdHMuY29udHJvbE5hbWVdID0ge1xuICAgICAgICAgIC4uLmNvbnRyb2wuZXJyb3JzLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0cy5yZXN1bHQgPSB7XG4gICAgICAgICAgLi4ub3B0cy5yZXN1bHQsXG4gICAgICAgICAgLi4uY29udHJvbC5lcnJvcnMsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFvcHRzIHx8IG9wdHMucmVjdXJzaXZlICE9PSBmYWxzZSkge1xuICAgICAgLy8gTG9vcCBvbiBjaGlsZHJlbiBjb250cm9sc1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gY29udHJvbC5jb250cm9scykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IGNvbnRyb2wuY29udHJvbHNba2V5XTtcbiAgICAgICAgaWYgKGNoaWxkPy5lbmFibGVkKSB7XG4gICAgICAgICAgZ2V0Rm9ybUVycm9ycyhjaGlsZCwge1xuICAgICAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgICAgIGNvbnRyb2xOYW1lOiBvcHRzLmNvbnRyb2xOYW1lID8gW29wdHMuY29udHJvbE5hbWUsIGtleV0uam9pbignLicpIDoga2V5LFxuICAgICAgICAgICAgcmVzdWx0OiBvcHRzLnJlc3VsdCwgLy8gTWFrZSBzdXJlIHRvIGtlZXAgdGhlIHNhbWUgcmVzdWx0IG9iamVjdFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gRm9ybSBhcnJheVxuICBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgLy8gQ29weSBlcnJvcnNcbiAgICBpZiAoY29udHJvbC5lcnJvcnMpIHtcbiAgICAgIGlmIChvcHRzLmNvbnRyb2xOYW1lKSB7XG4gICAgICAgIG9wdHMucmVzdWx0W29wdHMuY29udHJvbE5hbWVdID0ge1xuICAgICAgICAgIC4uLmNvbnRyb2wuZXJyb3JzLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0cy5yZXN1bHQgPSB7XG4gICAgICAgICAgLi4ub3B0cy5yZXN1bHQsXG4gICAgICAgICAgLi4uY29udHJvbC5lcnJvcnMsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29udHJvbC5jb250cm9scy5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgIGdldEZvcm1FcnJvcnMoY2hpbGQsIHtcbiAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgY29udHJvbE5hbWU6IChvcHRzLmNvbnRyb2xOYW1lIHx8ICcnKSArICcuJyArIGluZGV4LFxuICAgICAgICByZXN1bHQ6IG9wdHMucmVzdWx0LCAvLyBNYWtlIHN1cmUgdG8ga2VlcCB0aGUgc2FtZSByZXN1bHQgb2JqZWN0XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIE90aGVyIHR5cGUgb2YgY29udHJvbCAoZS5nIHNpbXBsZSBjb250cm9sKVxuICBlbHNlIGlmIChjb250cm9sLmVycm9ycykge1xuICAgIGlmIChvcHRzLmNvbnRyb2xOYW1lKSB7XG4gICAgICBvcHRzLnJlc3VsdFtvcHRzLmNvbnRyb2xOYW1lXSA9IHtcbiAgICAgICAgLi4uY29udHJvbC5lcnJvcnMsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBvcHRzLnJlc3VsdCA9IHtcbiAgICAgICAgLi4ub3B0cy5yZXN1bHQsXG4gICAgICAgIC4uLmNvbnRyb2wuZXJyb3JzLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9wdHMucmVzdWx0O1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhIGNvbnRyb2wgZnJvbSB0aGUgcHJvdmlkZWQgZm9ybS9jb250cm9sIHN0cnVjdHVyZSB1c2luZyBhIGRvdC1zZXBhcmF0ZWQgcGF0aC5cbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0Q29udHJvbH0gZm9ybSAtIFRoZSByb290IGZvcm0gZ3JvdXAsIGZvcm0gYXJyYXksIG9yIGNvbnRyb2wgdG8gc3RhcnQgc2VhcmNoaW5nIGZyb20uXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBkb3Qtc2VwYXJhdGVkIHBhdGggc3BlY2lmeWluZyB0aGUgY29udHJvbC4gRm9yIGV4YW1wbGUsICdncm91cE5hbWUuY29udHJvbE5hbWUnIG9yICdhcnJheU5hbWUuMC5jb250cm9sTmFtZScuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtzdHJpY3Q9dHJ1ZV0gLSBJZiB0cnVlLCB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGZ1bGwgcGF0aCBjYW5ub3QgYmUgcmVzb2x2ZWQ7IGlmIGZhbHNlLCByZXR1cm5zIHRoZSBsYXN0IHZhbGlkIGNvbnRyb2wgZW5jb3VudGVyZWQuXG4gKiBAcGFyYW0gZmFpbElmTWlzc2luZyAtIElmIHRydWUsIHRocm93IGFuIGVycm9yIGlmIHRoZSBjb250cm9sIG5vdCBleGlzdHMuXG4gKiBAcmV0dXJuIHtBYnN0cmFjdENvbnRyb2x9IC0gVGhlIGNvbnRyb2wgYXQgdGhlIHNwZWNpZmllZCBwYXRoIG9yIHRoZSBjbG9zZXN0IHZhbGlkIGNvbnRyb2wgaWYgc3RyaWN0IG1vZGUgaXMgZGlzYWJsZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHBhdGggY2Fubm90IGJlIHJlc29sdmVkIGFuZCBzdHJpY3QgbW9kZSBpcyBlbmFibGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29udHJvbEZyb21QYXRoKGZvcm06IEFic3RyYWN0Q29udHJvbCwgcGF0aDogc3RyaW5nLCBzdHJpY3Q6IGJvb2xlYW4gPSB0cnVlLCBmYWlsSWZNaXNzaW5nOiBib29sZWFuID0gZmFsc2UpOiBBYnN0cmFjdENvbnRyb2wge1xuICBpZiAoaXNOaWxPckJsYW5rKHBhdGgpKSByZXR1cm4gZm9ybTsgLy8gbm90IHBhdGggPSB0aGUgaW5wdXQgY29udHJvbCBpdHNlbGZcblxuICAvLyBGb3JtIGdyb3VwXG4gIGlmIChmb3JtIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgY29uc3QgaSA9IHBhdGguaW5kZXhPZignLicpO1xuICAgIGlmIChpID09PSAtMSkge1xuICAgICAgcmV0dXJuIGZvcm0uZ2V0KHBhdGgpO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBwYXRoLnN1YnN0cmluZygwLCBpKTtcbiAgICBpZiAoZm9ybS5jb250YWlucyhrZXkpKSB7XG4gICAgICByZXR1cm4gZ2V0Q29udHJvbEZyb21QYXRoKGZvcm0uZ2V0KGtleSksIHBhdGguc3Vic3RyaW5nKGkgKyAxKSwgc3RyaWN0LCBmYWlsSWZNaXNzaW5nKTtcbiAgICB9XG4gIH1cblxuICAvLyBGb3JtIGFycmF5XG4gIGVsc2UgaWYgKGZvcm0gaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICBjb25zdCBpID0gcGF0aC5pbmRleE9mKCcuJyk7XG4gICAgaWYgKGkgPT09IC0xKSB7XG4gICAgICByZXR1cm4gZm9ybS5hdCgrcGF0aCk7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gK3BhdGguc3Vic3RyaW5nKDAsIGkpO1xuICAgIGlmIChpbmRleCA8IGZvcm0ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZ2V0Q29udHJvbEZyb21QYXRoKGZvcm0uYXQoaW5kZXgpLCBwYXRoLnN1YnN0cmluZyhpICsgMSksIHN0cmljdCwgZmFpbElmTWlzc2luZyk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIHBhdGggaWYgbm90IGJsYW5rLCBidXQgd2UgY2Fubm90IGdvIGRlZXBlciBpbnNpZGUgdGhlIGNvbnRyb2xcbiAgLy8gUmV0dXJuIHRoZSBjdXJyZW50IGNvbnRyb2wsIGlmIE5PVCBzdHJpY3QgbW9kZSAocGF0aCBpcyB0b28gbG9uZywgYnV0IHRoaXMgaXMgT0spXG4gIGVsc2UgaWYgKCFzdHJpY3QpIHtcbiAgICByZXR1cm4gZm9ybTtcbiAgfVxuXG4gIGlmIChmYWlsSWZNaXNzaW5nKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY29udHJvbCBwYXRoOiAnJHtwYXRofScgc2hvdWxkIGJlIGFuIGV4aXN0aW5nIGNvbnRyb2wuYCk7XG5cbiAgcmV0dXJuIG51bGw7IC8vIE5vdCBmb3VuZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGlzYWJsZUNvbnRyb2xzKGZvcm06IFVudHlwZWRGb3JtR3JvdXAsIHBhdGhzOiBzdHJpbmdbXSwgb3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuOyByZXF1aXJlZD86IGJvb2xlYW4gfSkge1xuICAocGF0aHMgfHwgW10pLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICBjb25zdCBjb250cm9sID0gZ2V0Q29udHJvbEZyb21QYXRoKGZvcm0sIHBhdGgpO1xuICAgIGlmIChjb250cm9sKSBkaXNhYmxlQ29udHJvbChjb250cm9sLCBvcHRzKTtcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGlzYWJsZUFuZENsZWFyQ29udHJvbHMoXG4gIGZvcm06IFVudHlwZWRGb3JtR3JvdXAsXG4gIHBhdGhzOiBzdHJpbmdbXSxcbiAgb3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuOyByZXF1aXJlZD86IGJvb2xlYW4gfVxuKSB7XG4gIChwYXRocyB8fCBbXSkuZm9yRWFjaCgocGF0aCkgPT4ge1xuICAgIGNvbnN0IGNvbnRyb2wgPSBnZXRDb250cm9sRnJvbVBhdGgoZm9ybSwgcGF0aCk7XG4gICAgaWYgKGNvbnRyb2wpIGRpc2FibGVBbmRDbGVhckNvbnRyb2woY29udHJvbCwgb3B0cyk7XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZUNvbnRyb2xzKGZvcm06IFVudHlwZWRGb3JtR3JvdXAsIHBhdGhzOiBzdHJpbmdbXSwgb3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuOyByZXF1aXJlZD86IGJvb2xlYW4gfSkge1xuICAocGF0aHMgfHwgW10pLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICBjb25zdCBjb250cm9sID0gZ2V0Q29udHJvbEZyb21QYXRoKGZvcm0sIHBhdGgpO1xuICAgIGlmIChjb250cm9sKSBlbmFibGVDb250cm9sKGNvbnRyb2wsIG9wdHMpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldENvbnRyb2xzRW5hYmxlZChcbiAgZm9ybTogVW50eXBlZEZvcm1Hcm91cCxcbiAgZW5hYmxlZDogYm9vbGVhbixcbiAgcGF0aHM6IHN0cmluZ1tdLFxuICBvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW47IHJlcXVpcmVkPzogYm9vbGVhbiB9XG4pIHtcbiAgKHBhdGhzIHx8IFtdKS5mb3JFYWNoKChwYXRoKSA9PiB7XG4gICAgY29uc3QgY29udHJvbCA9IGdldENvbnRyb2xGcm9tUGF0aChmb3JtLCBwYXRoKTtcbiAgICBpZiAoY29udHJvbCkgc2V0Q29udHJvbEVuYWJsZWQoY29udHJvbCwgZW5hYmxlZCwgb3B0cyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q29udHJvbFJlcXVpcmVkKFxuICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsXG4gIHJlcXVpcmVkOiBib29sZWFuXG4pIHtcbiAgaWYgKCFjb250cm9sKSByZXR1cm47XG4gIGlmIChyZXF1aXJlZCAmJiAhY29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCkpIHtcbiAgICBjb250cm9sLmFkZFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gIH0gZWxzZSBpZiAoIXJlcXVpcmVkICYmIGNvbnRyb2wuaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpKSB7XG4gICAgY29udHJvbC5yZW1vdmVWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICB9XG59XG5cblxuLyoqXG4gKiBTZXRzIGZvcm0gZXJyb3JzIG9uIGFuIEFic3RyYWN0Q29udHJvbCwgaW5jbHVkaW5nIG5lc3RlZCBjb250cm9scyB3aXRoaW4gZm9ybSBncm91cHMgb3IgYXJyYXlzLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RDb250cm9sfSBjb250cm9sIC0gVGhlIGZvcm0gY29udHJvbCwgZm9ybSBncm91cCwgb3IgZm9ybSBhcnJheSB0byBhcHBseSB0aGUgZXJyb3JzIHRvLlxuICogQHBhcmFtIHtGb3JtRXJyb3JzfSBlcnJvcnMgLSBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlcnJvcnMgdG8gYmUgc2V0IG9uIHRoZSBjb250cm9sIG9yIGl0cyBjaGlsZHJlbi5cbiAqIEByZXR1cm4ge3ZvaWR9IERvZXMgbm90IHJldHVybiBhIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0Rm9ybUVycm9ycyhjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIGVycm9yczogRm9ybUVycm9ycyk6IHZvaWQge1xuICBpZiAoIWNvbnRyb2wgfHwgIWVycm9ycykgcmV0dXJuO1xuXG4gIC8vIEZvcm0gZ3JvdXAgb3IgYXJyYXlcbiAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXAgfHwgY29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgIE9iamVjdC5lbnRyaWVzKGVycm9ycykuZm9yRWFjaCgoW2NoaWxkUGF0aCwgY2hpbGRFcnJvcl0pID0+IHtcbiAgICAgIGNvbnN0IGNoaWxkQ29udHJvbCA9IGdldENvbnRyb2xGcm9tUGF0aChjb250cm9sLCBjaGlsZFBhdGgpO1xuICAgICAgaWYgKGNoaWxkQ29udHJvbCkgY2hpbGRDb250cm9sLnNldEVycm9ycyhjaGlsZEVycm9yKTtcbiAgICB9KTtcbiAgfVxuICAvLyBTaW1wbGUgY29udHJvbFxuICBlbHNlIHtcbiAgICBjb250cm9sLnNldEVycm9ycyhlcnJvcnMpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVDb250cm9sKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgb3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuOyByZXF1aXJlZD86IGJvb2xlYW4gfSkge1xuICBzZXRDb250cm9sRW5hYmxlZChjb250cm9sLCB0cnVlLCBvcHRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc2FibGVDb250cm9sKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgb3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuOyByZXF1aXJlZD86IGJvb2xlYW4gfSkge1xuICBzZXRDb250cm9sRW5hYmxlZChjb250cm9sLCBmYWxzZSwgeyByZXF1aXJlZDogZmFsc2UsIC4uLm9wdHMgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNhYmxlQW5kQ2xlYXJDb250cm9sKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgb3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuOyByZXF1aXJlZD86IGJvb2xlYW4gfSkge1xuICBjb25zdCB3YXNEaXNhYmxlZCA9IGNvbnRyb2wuZGlzYWJsZWQ7XG5cbiAgLy8gQXBwbHkgZGlzYWJsZVxuICBzZXRDb250cm9sRW5hYmxlZChjb250cm9sLCBmYWxzZSwgeyByZXF1aXJlZDogZmFsc2UsIC4uLm9wdHMgfSk7XG5cbiAgLy8gSW1wb3J0YW50LCBzaG91bGQgbm90IHVzZSByZXNldCgpIHRvIG1hcmsgdGhlIGNvbnRyb2wgYXMgZGlydHkuXG4gIC8vIE90aGVyd2lzZSwgb3B0aW1pemF0aW9uIHVzaW5nIGRpcnR5ICguZS5nIE1lYXN1cmVtZW50Rm9ybSkgd2lsbCBub3QgYmUgbm90aWZpZWQgYnkgdGhpcyBjaGFuZ2VkXG4gIGlmIChpc05vdE5pbChjb250cm9sLnZhbHVlKSkge1xuICAgIGlmICh3YXNEaXNhYmxlZCkge1xuICAgICAgY29udHJvbC5yZXNldChudWxsLCBvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udHJvbC5zZXRWYWx1ZShudWxsLCBvcHRzKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldENvbnRyb2xFbmFibGVkKFxuICBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsXG4gIGVuYWJsZWQ6IGJvb2xlYW4sXG4gIG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbjsgcmVxdWlyZWQ/OiBib29sZWFuIH1cbikge1xuICBpZiAoIWNvbnRyb2wpIHJldHVybjsgLy8gU0tpcCBpZiBubyBjb250cm9sXG4gIGlmIChlbmFibGVkKSB7XG4gICAgaWYgKGlzTm90TmlsKG9wdHM/LnJlcXVpcmVkKSAmJiBvcHRzLnJlcXVpcmVkICYmICFjb250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSkge1xuICAgICAgY29udHJvbC5hZGRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgIH1cbiAgICBjb250cm9sLmVuYWJsZShvcHRzKTtcbiAgfSBlbHNlIHtcbiAgICBjb250cm9sLmRpc2FibGUob3B0cyk7XG4gICAgaWYgKGlzTm90TmlsKG9wdHM/LnJlcXVpcmVkKSAmJiAhb3B0cy5yZXF1aXJlZCAmJiBjb250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSkge1xuICAgICAgY29udHJvbC5yZW1vdmVWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWRkVmFsdWVJbkFycmF5KFxuICBhcnJheUNvbnRyb2w6IFVudHlwZWRGb3JtQXJyYXksXG4gIGNyZWF0ZUNvbnRyb2w6ICh2YWx1ZTogYW55IHwgdW5kZWZpbmVkLCBpbmRleDogbnVtYmVyKSA9PiBBYnN0cmFjdENvbnRyb2wsXG4gIGVxdWFsczogKHYxOiBhbnksIHYyOiBhbnkpID0+IGJvb2xlYW4sXG4gIGlzRW1wdHk6ICh2YWx1ZTogYW55KSA9PiBib29sZWFuLFxuICB2YWx1ZTogYW55LFxuICBvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW47IGluc2VydEF0PzogbnVtYmVyOyBhbGxvd01hbnlOdWxsVmFsdWVzPzogYm9vbGVhbjsgYWxsb3dEdXBsaWNhdGVWYWx1ZT86IGJvb2xlYW4gfVxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRpc2FibGVkID0gYXJyYXlDb250cm9sLmRpc2FibGVkO1xuXG4gIGxldCBoYXNDaGFuZ2VkID0gZmFsc2U7XG4gIGxldCBpbmRleCA9IC0xO1xuICBsZXQgaXNFbXB0eVZhbHVlID0gaXNFbXB0eSh2YWx1ZSk7XG5cbiAgLy8gU2VhcmNoIGlmIHZhbHVlIGFscmVhZHkgZXhpc3RzXG4gIGlmICghaXNFbXB0eVZhbHVlICYmIG9wdHM/LmFsbG93RHVwbGljYXRlVmFsdWUgIT09IHRydWUpIHtcbiAgICBpbmRleCA9IChhcnJheUNvbnRyb2wudmFsdWUgfHwgW10pLmZpbmRJbmRleCgodikgPT4gZXF1YWxzKHZhbHVlLCB2KSk7XG4gIH1cblxuICAvLyBJZiB2YWx1ZSBub3QgZXhpc3RzLCBidXQgbGFzdCB2YWx1ZSBpcyBlbXB0eTogcmV1c2UgbGFzdCB2YWx1ZVxuICBpZiAoaW5kZXggPT09IC0xICYmIG9wdHM/LmFsbG93TWFueU51bGxWYWx1ZXMgIT09IHRydWUgJiYgYXJyYXlDb250cm9sLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBsYXN0VmFsdWUgPSBhcnJheUNvbnRyb2wuYXQoYXJyYXlDb250cm9sLmxlbmd0aCAtIDEpLnZhbHVlO1xuICAgIGlmIChpc0VtcHR5KGxhc3RWYWx1ZSkpIHtcbiAgICAgIGluZGV4ID0gYXJyYXlDb250cm9sLmxlbmd0aCAtIDE7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVwbGFjZSB0aGUgZXhpc3RpbmcgdmFsdWVcbiAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgIGlmICghaXNFbXB0eVZhbHVlKSB7XG4gICAgICBhcnJheUNvbnRyb2wuYXQoaW5kZXgpLnBhdGNoVmFsdWUodmFsdWUsIG9wdHMpO1xuICAgICAgaGFzQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGNvbnRyb2wgPSBjcmVhdGVDb250cm9sKHZhbHVlLCBhcnJheUNvbnRyb2wubGVuZ3RoKTtcblxuICAgIC8vIEFwcGx5IHBhcmVudCBkaXNhYmxlZCBzdGF0ZSwgYmVmb3JlIHRvIHB1c2ggaXQgaW50byB0aGUgYXJyYXlcbiAgICAvLyBUaGlzIGlzIG5lZWQgdG8gYXZvaWQgcGFyZW50IGZvcm0gdG8gYmUgZW5hYmxlZFxuICAgIGlmIChkaXNhYmxlZCAmJiBjb250cm9sLmVuYWJsZWQpIGNvbnRyb2wuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgZWxzZSBpZiAoIWRpc2FibGVkICYmIGNvbnRyb2wuZGlzYWJsZWQpIGNvbnRyb2wuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgIGlmIChpc05vdE5pbE9yTmFOKG9wdHM/Lmluc2VydEF0KSkge1xuICAgICAgYXJyYXlDb250cm9sLmluc2VydChvcHRzLmluc2VydEF0LCBjb250cm9sLCBvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXJyYXlDb250cm9sLnB1c2goY29udHJvbCwgb3B0cyk7XG4gICAgfVxuICAgIGhhc0NoYW5nZWQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKGhhc0NoYW5nZWQpIHtcbiAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICAvLyBNYXJrIGFycmF5IGNvbnRyb2wgZGlydHlcbiAgICAgIGlmICghaXNFbXB0eVZhbHVlKSB7XG4gICAgICAgIGFycmF5Q29udHJvbC5tYXJrQXNEaXJ0eShvcHRzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gaGFzQ2hhbmdlZDtcbn1cblxuLyoqXG4gKiBTZXQgYW4gYXJyYXkgdXNpbmcgZ2l2ZW4gZGVmYXVsdCB2YWx1ZXMuIEVhY2ggZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHBhc3MgdG8gdGhlICdjcmVhdGVDb250cm9sKCknIGZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIGFycmF5Q29udHJvbFxuICogQHBhcmFtIGNyZWF0ZUNvbnRyb2xcbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWVzXG4gKiBAcGFyYW0gb3B0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdEFycmF5Q29udHJvbHNGcm9tVmFsdWVzKFxuICBhcnJheUNvbnRyb2w6IFVudHlwZWRGb3JtQXJyYXksXG4gIGNyZWF0ZUNvbnRyb2w6ICh2YWx1ZT86IGFueSwgaW5kZXg/OiBudW1iZXIpID0+IEFic3RyYWN0Q29udHJvbCxcbiAgZGVmYXVsdFZhbHVlczogYW55W10sXG4gIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfVxuKTogYm9vbGVhbiB7XG4gIGlmIChhcnJheUNvbnRyb2wubGVuZ3RoID09PSAwICYmICghZGVmYXVsdFZhbHVlcyB8fCBkZWZhdWx0VmFsdWVzLmxlbmd0aCA9PT0gMCkpIHJldHVybiBmYWxzZTsgLy8gTm8gY2hhbmdlcyBuZWVkXG5cbiAgY29uc3QgZGlzYWJsZWQgPSBhcnJheUNvbnRyb2wuZGlzYWJsZWQ7XG5cbiAgd2hpbGUgKGFycmF5Q29udHJvbC5sZW5ndGggPiAwKSB7XG4gICAgYXJyYXlDb250cm9sLnJlbW92ZUF0KGFycmF5Q29udHJvbC5sZW5ndGggLSAxLCBvcHRzKTtcbiAgfVxuXG4gIChkZWZhdWx0VmFsdWVzIHx8IFtdKS5mb3JFYWNoKCh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBjb250cm9sID0gY3JlYXRlQ29udHJvbCh2YWx1ZSwgaW5kZXgpO1xuXG4gICAgLy8gQXBwbHkgcGFyZW50IGRpc2FibGVkIHN0YXRlLCBiZWZvcmUgdG8gcHVzaCBpdCBpbnRvIHRoZSBhcnJheVxuICAgIC8vIFRoaXMgaXMgbmVlZCB0byBhdm9pZCBwYXJlbnQgZm9ybSB0byBiZSBlbmFibGVkXG4gICAgaWYgKGRpc2FibGVkICYmIGNvbnRyb2wuZW5hYmxlZCkgY29udHJvbC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICBlbHNlIGlmICghZGlzYWJsZWQgJiYgY29udHJvbC5kaXNhYmxlZCkgY29udHJvbC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXG4gICAgYXJyYXlDb250cm9sLnB1c2goY29udHJvbCwgb3B0cyk7XG4gIH0pO1xuXG4gIHJldHVybiB0cnVlOyAvLyBIYXMgc29tZSBjaGFuZ2VzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNpemVBcnJheShcbiAgYXJyYXlDb250cm9sOiBVbnR5cGVkRm9ybUFycmF5LFxuICBjcmVhdGVDb250cm9sOiAodmFsdWU/OiBhbnkgfCB1bmRlZmluZWQsIGluZGV4PzogbnVtYmVyKSA9PiBBYnN0cmFjdENvbnRyb2wsXG4gIGxlbmd0aDogbnVtYmVyLFxuICBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH1cbik6IGJvb2xlYW4ge1xuICBpZiAoYXJyYXlDb250cm9sLmxlbmd0aCA9PT0gbGVuZ3RoIHx8IGxlbmd0aCA8IDApIHJldHVybiBmYWxzZTsgLy8gTm8gY2hhbmdlcyBuZWVkXG5cbiAgY29uc3QgZGlzYWJsZWQgPSBhcnJheUNvbnRyb2wuZGlzYWJsZWQ7XG5cbiAgLy8gUmVkdWNlIHNpemVcbiAgbGV0IGN1cnJlbnRMZW5ndGggPSBhcnJheUNvbnRyb2wubGVuZ3RoO1xuICB3aGlsZSAoY3VycmVudExlbmd0aCA+IGxlbmd0aCkge1xuICAgIGFycmF5Q29udHJvbC5yZW1vdmVBdChjdXJyZW50TGVuZ3RoIC0gMSwgb3B0cyk7XG5cbiAgICAvLyBJZiBkZWxldGlvbiB3YXMgbm90IGRvbmU7IHN0b3AgKEF2b2lkIGluZmluaXRlIGxvb3Agd2hlbiBBcHBGb3JtQXJyYXkgcmVmdXNlZCBkZWxldGlvbiAtIGZpeCBpc3N1ZSBzdW1hcmlzLWFwcCMxMzg5KVxuICAgIGlmIChhcnJheUNvbnRyb2wubGVuZ3RoID09PSBjdXJyZW50TGVuZ3RoKSBicmVhazsgLy8gU3RvcCAoYXZvaWQgaW5maW5pdGUgbG9vcClcbiAgICBjdXJyZW50TGVuZ3RoID0gYXJyYXlDb250cm9sLmxlbmd0aDtcbiAgfVxuXG4gIC8vIEluY3JlYXNlIHNpemVcbiAgd2hpbGUgKGFycmF5Q29udHJvbC5sZW5ndGggPCBsZW5ndGgpIHtcbiAgICBjb25zdCBjb250cm9sID0gY3JlYXRlQ29udHJvbCh1bmRlZmluZWQsIGFycmF5Q29udHJvbC5sZW5ndGgpO1xuXG4gICAgLy8gQXBwbHkgcGFyZW50IGRpc2FibGVkIHN0YXRlLCBiZWZvcmUgdG8gcHVzaCBpdCBpbnRvIHRoZSBhcnJheVxuICAgIC8vIFRoaXMgaXMgbmVlZCB0byBhdm9pZCBwYXJlbnQgZm9ybSB0byBiZSBlbmFibGVkLCBhZnRlciBjYWxsaW5nIHJlc2l6ZUFycmF5KClcbiAgICBpZiAoZGlzYWJsZWQgJiYgY29udHJvbC5lbmFibGVkKSBjb250cm9sLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIGVsc2UgaWYgKCFkaXNhYmxlZCAmJiBjb250cm9sLmRpc2FibGVkKSBjb250cm9sLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG5cbiAgICBhcnJheUNvbnRyb2wucHVzaChjb250cm9sLCBvcHRzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlOyAvLyBIYXMgc29tZSBjaGFuZ2VzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVWYWx1ZUluQXJyYXkoYXJyYXlDb250cm9sOiBVbnR5cGVkRm9ybUFycmF5LCBpbmRleDogbnVtYmVyLCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pOiBib29sZWFuIHtcbiAgYXJyYXlDb250cm9sLnJlbW92ZUF0KGluZGV4LCBvcHRzKTtcbiAgYXJyYXlDb250cm9sLm1hcmtBc0RpcnR5KG9wdHMpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyVmFsdWVJbkFycmF5KFxuICBhcnJheUNvbnRyb2w6IFVudHlwZWRGb3JtQXJyYXksXG4gIGlzRW1wdHk6ICh2YWx1ZTogYW55KSA9PiBib29sZWFuLFxuICBpbmRleDogbnVtYmVyLFxuICBvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW4gfVxuKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbnRyb2wgPSBhcnJheUNvbnRyb2wuYXQoaW5kZXgpO1xuICBpZiAoaXNFbXB0eShjb250cm9sLnZhbHVlKSkgcmV0dXJuIGZhbHNlOyAvLyBza2lwIChub3QgbmVlZCB0byBjbGVhcilcblxuICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVudHlwZWRGb3JtR3JvdXApIHtcbiAgICBjb3B5RW50aXR5MkZvcm0oe30sIGNvbnRyb2wsIG9wdHMpO1xuICB9IGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBVbnR5cGVkRm9ybUFycmF5KSB7XG4gICAgY29udHJvbC5zZXRWYWx1ZShbXSwgb3B0cyk7XG4gIH0gZWxzZSB7XG4gICAgY29udHJvbC5zZXRWYWx1ZShudWxsLCBvcHRzKTtcbiAgfVxuICBhcnJheUNvbnRyb2wubWFya0FzRGlydHkob3B0cyk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFya0FsbEFzVG91Y2hlZChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gIGlmICghY29udHJvbCkgcmV0dXJuO1xuICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVudHlwZWRGb3JtR3JvdXApIHtcbiAgICBtYXJrRm9ybUdyb3VwQXNUb3VjaGVkKGNvbnRyb2wsIHsgLi4ub3B0cywgb25seVNlbGY6IHRydWUgfSk7IC8vIHJlY3Vyc2l2ZSBjYWxsXG4gIH0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVudHlwZWRGb3JtQXJyYXkpIHtcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAoY29udHJvbC5jb250cm9scyB8fCBbXSkuZm9yRWFjaCgoYykgPT4gbWFya0NvbnRyb2xBc1RvdWNoZWQoYywgeyAuLi5vcHRzLCBvbmx5U2VsZjogdHJ1ZSB9KSk7IC8vIHJlY3Vyc2l2ZSBjYWxsXG4gIH0gZWxzZSB7XG4gICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgLi4ub3B0cywgb25seVNlbGY6IHRydWUgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcmtGb3JtR3JvdXBBc1RvdWNoZWQoZm9ybTogVW50eXBlZEZvcm1Hcm91cCwgb3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgaWYgKCFmb3JtKSByZXR1cm47XG4gIGZvcm0ubWFya0FzVG91Y2hlZChvcHRzKTtcbiAgT2JqZWN0LmtleXMoZm9ybS5jb250cm9scylcbiAgICAubWFwKChrZXkpID0+IGZvcm0uY29udHJvbHNba2V5XSlcbiAgICAuZmlsdGVyKChjb250cm9sKSA9PiBjb250cm9sLmVuYWJsZWQpXG4gICAgLmZvckVhY2goKGNvbnRyb2wpID0+IG1hcmtDb250cm9sQXNUb3VjaGVkKGNvbnRyb2wsIG9wdHMpKTtcbiAgZm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgLi4ub3B0cywgb25seVNlbGY6IHRydWUgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXJrQ29udHJvbEFzVG91Y2hlZChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gIGlmICghY29udHJvbCkgcmV0dXJuO1xuICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVudHlwZWRGb3JtR3JvdXApIHtcbiAgICBtYXJrQWxsQXNUb3VjaGVkKGNvbnRyb2wsIHsgLi4ub3B0cywgb25seVNlbGY6IHRydWUgfSk7IC8vIHJlY3Vyc2l2ZSBjYWxsXG4gIH0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVudHlwZWRGb3JtQXJyYXkpIHtcbiAgICAoY29udHJvbC5jb250cm9scyB8fCBbXSkuZm9yRWFjaCgoYykgPT4gbWFya0NvbnRyb2xBc1RvdWNoZWQoYywgeyAuLi5vcHRzLCBvbmx5U2VsZjogdHJ1ZSB9KSk7IC8vIHJlY3Vyc2l2ZSBjYWxsXG4gIH0gZWxzZSB7XG4gICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgLi4ub3B0cywgb25seVNlbGY6IHRydWUgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoZm9ybTogVW50eXBlZEZvcm1Hcm91cCwgb3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgaWYgKCFmb3JtKSByZXR1cm47XG4gIGZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eShvcHRzKTtcbiAgT2JqZWN0LmtleXMoZm9ybS5jb250cm9scylcbiAgICAubWFwKChrZXkpID0+IGZvcm0uY29udHJvbHNba2V5XSlcbiAgICAuZmlsdGVyKChjb250cm9sKSA9PiBjb250cm9sLmVuYWJsZWQpXG4gICAgLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Hcm91cCkge1xuICAgICAgICB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KGNvbnRyb2wsIHsgLi4ub3B0cywgb25seVNlbGY6IHRydWUgfSk7IC8vIHJlY3Vyc2l2ZSBjYWxsXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyAuLi5vcHRzLCBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcmtBc1VudG91Y2hlZChmb3JtOiBVbnR5cGVkRm9ybUdyb3VwLCBvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW4gfSkge1xuICBpZiAoIWZvcm0pIHJldHVybjtcbiAgZm9ybS5tYXJrQXNVbnRvdWNoZWQob3B0cyk7XG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGZvcm0uY29udHJvbHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtLmdldChrZXkpO1xuICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Hcm91cCkge1xuICAgICAgbWFya0FzVW50b3VjaGVkKGNvbnRyb2wsIHsgb25seVNlbGY6IHRydWUgfSk7IC8vIHJlY3Vyc2l2ZSBjYWxsXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRyb2wubWFya0FzVW50b3VjaGVkKHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICBjb250cm9sLnNldEVycm9ycyhudWxsKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFdhaXQgZW5kIG9mIGFzeW5jIHZhbGlkYXRpb24gKG5vdCBwZW5kaW5nKS4gVGhpcyBuZWVkIHRvIGltcGxlbWVudCB7cGVuZGluZzogYm9vbGVhbn1cbiAqIHJldHVybiBmYWxzZVxuICovXG5leHBvcnQgZnVuY3Rpb24gd2FpdFdoaWxlUGVuZGluZzxUIGV4dGVuZHMgeyBwZW5kaW5nOiBib29sZWFuIH0+KGZvcm06IFQsIG9wdHM/OiBXYWl0Rm9yT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcmVkaWNhdGU6IFByZWRpY2F0ZTx2b2lkPiA9ICgpID0+IGZvcm0ucGVuZGluZyAhPT0gdHJ1ZTtcbiAgcmV0dXJuIHdhaXRGb3IocHJlZGljYXRlLCBvcHRzKTtcbn1cblxuLyoqXG4gKiBXYWl0IGZvcm0gaXMgaWRsZSAobm90IGxvYWRpbmcpLiBUaGlzIG5lZWQgdG8gaW1wbGVtZW50IHtsb2FkaW5nOiBib29sZWFufVxuICpcbiAqIEBwYXJhbSBmb3JtXG4gKiBAcGFyYW0gb3B0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gd2FpdElkbGU8VCBleHRlbmRzIHsgbG9hZGluZzogYm9vbGVhbiB9Pihmb3JtOiBULCBvcHRzPzogV2FpdEZvck9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJlZGljYXRlOiBQcmVkaWNhdGU8dm9pZD4gPSAoKSA9PiBmb3JtLmxvYWRpbmcgIT09IHRydWU7XG4gIHJldHVybiB3YWl0Rm9yKHByZWRpY2F0ZSwgb3B0cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJGb3JtRXJyb3JzQnlQcmVmaXgoZXJyb3JzOiBGb3JtRXJyb3JzLCAuLi5wcmVmaXhlczogc3RyaW5nW10pOiBGb3JtRXJyb3JzIHtcbiAgaWYgKGlzRW1wdHlBcnJheShwcmVmaXhlcykpIHJldHVybiBlcnJvcnM7XG4gIHJldHVybiBmaWx0ZXJGb3JtRXJyb3JzQnlQYXRoKGVycm9ycywgKHBhdGgpID0+IHByZWZpeGVzPy5zb21lKChwcmVmaXgpID0+IHBhdGguc3RhcnRzV2l0aChwcmVmaXgpKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJGb3JtRXJyb3JzQnlQYXRoKGVycm9yczogRm9ybUVycm9ycywgZmlsdGVyOiBQcmVkaWNhdGU8c3RyaW5nPik6IEZvcm1FcnJvcnMge1xuICBpZiAodHlwZW9mIGZpbHRlciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGVycm9ycztcbiAgcmV0dXJuIGZpbHRlckZvcm1FcnJvcnMoZXJyb3JzLCAoW3BhdGgsIF9dKSA9PiBmaWx0ZXIocGF0aCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyRm9ybUVycm9ycyhlcnJvcnM6IEZvcm1FcnJvcnMsIGZpbHRlcjogUHJlZGljYXRlPFtzdHJpbmcsIGFueV0+KTogRm9ybUVycm9ycyB7XG4gIGlmICh0eXBlb2YgZmlsdGVyICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZXJyb3JzO1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZXJyb3JzKVxuICAgIC5maWx0ZXIoZmlsdGVyKVxuICAgIC5yZWR1Y2UoXG4gICAgICAocmVzLCBbcGF0aCwgZXJyb3JdKSA9PiB7XG4gICAgICAgIC8vIEluaXQgZXJyb3IgbWFwXG4gICAgICAgIHJlcyA9IHJlcyB8fCB7fTtcbiAgICAgICAgLy8gQWRkIGN1cnJlbnQgZXJyb3JcbiAgICAgICAgcmVzW3BhdGhdID0gZXJyb3I7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgICB9LFxuICAgICAgPEZvcm1FcnJvcnM+dW5kZWZpbmVkXG4gICAgKTtcbn1cbiJdfQ==
593
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9mb3Jtcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFdBQVcsRUFDWCxTQUFTLEVBQ1QsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFFaEIsVUFBVSxHQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNsQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsT0FBTyxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUd4RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFNN0Q7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFXLEVBQUUsTUFBd0IsRUFBRSxJQUFrRDtJQUN2SCxNQUFNLElBQUksR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUVELE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxNQUF1QixFQUFFLElBQXNCO0lBQ3BGLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBMkIsQ0FBQztBQUNyRSxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLE1BQXVCLEVBQUUsT0FBd0IsRUFBRSxJQUFhO0lBQ2xHLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxH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LENBQUM7SUFDMUMsT0FBTyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZHLENBQUM7QUFFRCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsTUFBa0IsRUFBRSxNQUF5QjtJQUNsRixJQUFJLE9BQU8sTUFBTSxLQUFLLFVBQVU7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUNoRCxPQUFPLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQWtCLEVBQUUsTUFBZ0M7SUFDbkYsSUFBSSxPQUFPLE1BQU0sS0FBSyxVQUFVO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDaEQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztTQUMxQixNQUFNLENBQUMsTUFBTSxDQUFDO1NBQ2QsTUFBTSxDQUNMLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7UUFDckIsaUJBQWlCO1FBQ2pCLEdBQUcsR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDO1FBQ2hCLG9CQUFvQjtRQUNwQixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxFQUNXLFNBQVMsQ0FDdEIsQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIEZvcm1BcnJheSxcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Hcm91cCxcbiAgVW50eXBlZEZvcm1BcnJheSxcbiAgVW50eXBlZEZvcm1Db250cm9sLFxuICBVbnR5cGVkRm9ybUdyb3VwLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3JzLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBpc01vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBpc0VtcHR5QXJyYXksIGlzTmlsT3JCbGFuaywgaXNOb3RFbXB0eUFycmF5LCBpc05vdE5pbCwgaXNOb3ROaWxPck5hTiwgbnVsbElmVW5kZWZpbmVkIH0gZnJvbSAnLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgdG9EYXRlSVNPU3RyaW5nIH0gZnJvbSAnLi9kYXRlcyc7XG5pbXBvcnQgeyB3YWl0Rm9yLCBXYWl0Rm9yT3B0aW9ucyB9IGZyb20gJy4vb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHsgUHJlZGljYXRlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFwcEZvcm1BcnJheSB9IGZyb20gJy4uL2NvcmUvZm9ybS9hcnJheS9mb3JtLWFycmF5JztcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtRXJyb3JzIHtcbiAgW2tleTogc3RyaW5nXTogVmFsaWRhdGlvbkVycm9ycztcbn1cblxuLyoqXG4gKiBGaWxsIGEgZm9ybSB1c2luZyBhIHNvdXJjZSBlbnRpdHlcbiAqXG4gKiBAcGFyYW0gdGFyZ2V0XG4gKiBAcGFyYW0gZW50aXR5XG4gKiBAcGFyYW0gb3B0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29weUVudGl0eTJGb3JtKGVudGl0eTogYW55LCB0YXJnZXQ6IFVudHlwZWRGb3JtR3JvdXAsIG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gIGNvbnN0IGpzb24gPSBnZXRGb3JtVmFsdWVGcm9tRW50aXR5KGVudGl0eSwgdGFyZ2V0KTtcbiAgdGFyZ2V0LnBhdGNoVmFsdWUoanNvbiwgb3B0cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtVmFsdWVGcm9tRW50aXR5KGVudGl0eTogYW55IHwgdW5kZWZpbmVkLCBmb3JtOiBVbnR5cGVkRm9ybUdyb3VwKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gIHJldHVybiBhZGFwdFZhbHVlVG9Db250cm9sKGVudGl0eSwgZm9ybSkgYXMgeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYW4gZW50aXR5IGludG8gYSBzaW1wbGUgb2JqZWN0LCBjb21wYXRpYmxlIHdpdGggdGhlIGdpdmVuIGZvcm1cbiAqXG4gKiBAcGFyYW0gc291cmNlIGFuIGVudGl0eSAob3Igc3ViZW50aXR5KVxuICogQHBhcmFtIGNvbnRyb2xcbiAqIEBwYXJhbSBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGFwdFZhbHVlVG9Db250cm9sKHNvdXJjZTogYW55IHwgdW5kZWZpbmVkLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIHBhdGg/OiBzdHJpbmcpOiBhbnkge1xuICBjb25zdCBwYXRoUHJlZml4ID0gcGF0aCA/IHBhdGggKyAnLicgOiAnJztcblxuICAvLyBGb3JtIGdyb3VwXG4gIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGd1YXJkLWZvci1pblxuICAgIGZvciAoY29uc3Qga2V5IGluIGNvbnRyb2wuY29udHJvbHMpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gYWRhcHRWYWx1ZVRvQ29udHJvbChzb3VyY2UgJiYgc291cmNlW2tleV0sIGNvbnRyb2wuY29udHJvbHNba2V5XSwgcGF0aFByZWZpeCArIGtleSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBBcnJheVxuICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgIC8vIFNwbGl0LCBpZiBtYW55IHZhbHVlcyBpbiBhIHN0cmluZ1xuICAgIGlmICh0eXBlb2Ygc291cmNlID09PSAnc3RyaW5nJykge1xuICAgICAgc291cmNlID0gc291cmNlLnNwbGl0KCd8Jyk7XG4gICAgfVxuICAgIC8vIFNraXAgaWYgdmFsdWUgaXMgbm90IGFuIGFycmF5XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvLyBSZXNpemFibGUgYXJyYXlcbiAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEFwcEZvcm1BcnJheSkge1xuICAgICAgLy8gTWFrZSBzdXJlIHRvIGhhdmUgb25lIHZhbHVlLCBpZiBlbXB0eSBhcnJheSBhcmUgbm90IGFsbG93ZWRcbiAgICAgIGlmIChjb250cm9sLmFsbG93RW1wdHlBcnJheSA9PT0gZmFsc2UgJiYgc291cmNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBzb3VyY2UgPSBbbnVsbF07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4YW1wbGVDb250cm9sID0gY29udHJvbC5jcmVhdGVDb250cm9sKHVuZGVmaW5lZCwgY29udHJvbC5sZW5ndGgpO1xuICAgICAgcmV0dXJuIHNvdXJjZS5tYXAoKGl0ZW0sIGluZGV4KSA9PiBhZGFwdFZhbHVlVG9Db250cm9sKGl0ZW0sIGV4YW1wbGVDb250cm9sLCBwYXRoUHJlZml4ICsgJyMnICsgaW5kZXgpKSBhcyBhbnlbXTtcbiAgICB9XG5cbiAgICAvLyBMZWdhY3kgYXJyYXlcbiAgICBlbHNlIGlmIChjb250cm9sLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZpcnN0Q29udHJvbCA9IGNvbnRyb2wuYXQoMCk7XG4gICAgICAvLyBVc2UgdGhlIGZpcnN0IGZvcm0gZ3JvdXAsIGFzIG1vZGVsXG4gICAgICBsZXQgcmVzdWx0ID0gc291cmNlLm1hcCgoaXRlbSwgaW5kZXgpID0+IGFkYXB0VmFsdWVUb0NvbnRyb2woaXRlbSwgZmlyc3RDb250cm9sLCBwYXRoUHJlZml4ICsgJyMnICsgaW5kZXgpKSBhcyBhbnlbXTtcblxuICAgICAgLy8gVHJ1bmNhdGUgaWYgdG9vIG1hbnkgdmFsdWVzXG4gICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IGNvbnRyb2wubGVuZ3RoKSB7XG4gICAgICAgIGlmIChmaXJzdENvbnRyb2wgaW5zdGFuY2VvZiBVbnR5cGVkRm9ybUNvbnRyb2wpIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gY29udHJvbC5sZW5ndGg7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnRyb2wucHVzaChuZXcgVW50eXBlZEZvcm1Db250cm9sKG51bGwsIGZpcnN0Q29udHJvbC52YWxpZGF0b3IpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBXQVJOOiBwbGVhc2UgcmVzaXplIHRoZSBGb3JtQXJyYXkgJyR7cGF0aCB8fCAnJ30nIHRvIHRoZSBzYW1lIGxlbmd0aCBvZiB0aGUgaW5wdXQgYXJyYXlgKTtcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgY29udHJvbC5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB2YWx1ZXMgaWYgbm90IGVub3VnaHRcbiAgICAgIGVsc2UgaWYgKHJlc3VsdC5sZW5ndGggPCBjb250cm9sLmxlbmd0aCkge1xuICAgICAgICAvL2NvbnNvbGUud2FybihgV0FSTjogQWRkaW5nIG51bGwgdmFsdWUgdG8gYXJyYXkgdmFsdWVzYCk7XG4gICAgICAgIGZvciAobGV0IGkgPSByZXN1bHQubGVuZ3RoOyBpIDwgY29udHJvbC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICAvLyBTa2lwIGlmIHVuYWJsZSB0byBmaW5kIGEgY29udHJvbCBpbiB0aGUgYXJyYXlcbiAgICBlbHNlIHtcbiAgICAgIGlmIChpc05vdEVtcHR5QXJyYXkoc291cmNlKSkgY29uc29sZS53YXJuKGBXQVJOOiBwbGVhc2UgcmVzaXplIHRoZSBGb3JtQXJyYXkgJyR7cGF0aH0nIHRvIHRoZSBzYW1lIGxlbmd0aCBvZiB0aGUgaW5wdXQgYXJyYXlgKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvLyBGb3JtIGNvbnRyb2xcbiAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCkge1xuICAgIC8vIERhdGVcbiAgICBpZiAoaXNNb21lbnQoc291cmNlKSkge1xuICAgICAgcmV0dXJuIHRvRGF0ZUlTT1N0cmluZyhzb3VyY2UpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFueSBvdGhlciBjb250cm9sOiByZXBsYWNlIHVuZGVmaW5lZCBieSBudWxsIHZhbHVlXG4gIC8vIGJlY2F1c2UgVW5kZWZpbmVkIGlzIG5vdCBhdXRob3JpemVkIGFzIGNvbnRyb2wgdmFsdWVcbiAgcmV0dXJuIG51bGxJZlVuZGVmaW5lZChzb3VyY2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9nRm9ybUVycm9ycyhjb250cm9sOiBBYnN0cmFjdENvbnRyb2wsIGxvZ1ByZWZpeD86IHN0cmluZywgcGF0aD86IHN0cmluZykge1xuICBpZiAoIWNvbnRyb2wgfHwgY29udHJvbC52YWxpZCkgcmV0dXJuO1xuICBsb2dQcmVmaXggPSBsb2dQcmVmaXggfHwgJyc7XG4gIC8vIEZvcm0gZ3JvdXBcbiAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBVbnR5cGVkRm9ybUdyb3VwKSB7XG4gICAgaWYgKCFwYXRoKSBjb25zb2xlLndhcm4oYCR7bG9nUHJlZml4fSBGb3JtIGVycm9yczpgKTtcbiAgICBpZiAoY29udHJvbC5lcnJvcnMpIHtcbiAgICAgIE9iamVjdC5rZXlzKGNvbnRyb2wuZXJyb3JzKS5mb3JFYWNoKChlcnJvcikgPT4gY29uc29sZS53YXJuKGAke2xvZ1ByZWZpeH0gLT4gJHtwYXRoIHx8ICcnfSAoJHtlcnJvcn0pYCkpO1xuICAgIH1cbiAgICBpZiAoY29udHJvbC5jb250cm9scykge1xuICAgICAgT2JqZWN0LmtleXMoY29udHJvbC5jb250cm9scykuZm9yRWFjaChcbiAgICAgICAgKGNoaWxkKSA9PiBsb2dGb3JtRXJyb3JzKGNvbnRyb2wuY29udHJvbHNbY2hpbGRdLCBsb2dQcmVmaXgsIHBhdGggPyBgJHtwYXRofS4ke2NoaWxkfWAgOiBjaGlsZCkgLy8gUmVjdXJzaXZlIGNhbGxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIC8vIEZvcm0gYXJyYXlcbiAgZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVudHlwZWRGb3JtQXJyYXkpIHtcbiAgICBpZiAoY29udHJvbC5lcnJvcnMpIHtcbiAgICAgIE9iamVjdC5rZXlzKGNvbnRyb2wuZXJyb3JzKS5mb3JFYWNoKChlcnJvcikgPT4gY29uc29sZS53YXJuKGAke2xvZ1ByZWZpeH0gLT4gJHtwYXRoIHx8ICcnfSAoJHtlcnJvcn0pYCkpO1xuICAgIH1cbiAgICBjb250cm9sLmNvbnRyb2xzLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgbG9nRm9ybUVycm9ycyhjaGlsZCwgbG9nUHJlZml4LCBwYXRoID8gYCR7cGF0aH0uJHtpbmRleH1gIDogYCR7aW5kZXh9YCk7IC8vIFJlY3Vyc2l2ZSBjYWxsXG4gICAgfSk7XG4gIH1cbiAgLy8gT3RoZXIgY29udHJvbCdzIGVycm9yc1xuICBlbHNlIGlmIChjb250cm9sLmVycm9ycykge1xuICAgIE9iamVjdC5rZXlzKGNvbnRyb2wuZXJyb3JzKS5mb3JFYWNoKChlcnJvcikgPT4gY29uc29sZS53YXJuKGAke2xvZ1ByZWZpeH0gLT4gJHtwYXRoIHx8ICcnfSAoJHtlcnJvcn0pYCkpO1xuICB9XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGFsbCB2YWxpZGF0aW9uIGVycm9ycyBmcm9tIGEgZ2l2ZW4gZm9ybSBjb250cm9sLCBpbmNsdWRpbmcgaXRzIGNoaWxkIGNvbnRyb2xzIGlmIGl0IGlzIGEgZm9ybSBncm91cCBvciBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0Q29udHJvbH0gY29udHJvbCAtIFRoZSBmb3JtIGNvbnRyb2wgdG8gcmV0cmlldmUgZXJyb3JzIGZyb20uIFRoaXMgY2FuIGJlIGEgZm9ybSBncm91cCwgYSBmb3JtIGFycmF5LCBvciBhIHNpbXBsZSBmb3JtIGNvbnRyb2wuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHNdIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbnMgZm9yIGVycm9yIHJldHJpZXZhbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5jb250cm9sTmFtZV0gLSBUaGUgbmFtZSBvciBwYXRoIG9mIHRoZSBjb250cm9sIGJlaW5nIHByb2Nlc3NlZCwgdXNlZCBmb3Igc3RydWN0dXJpbmcgZXJyb3Iga2V5cyBpbiB0aGUgcmVzdWx0LlxuICogQHBhcmFtIHtGb3JtRXJyb3JzfSBbb3B0cy5yZXN1bHRdIC0gVGhlIG9iamVjdCB0byB3aGljaCBlcnJvcnMgd2lsbCBiZSBhZGRlZCwgYWxsb3dpbmcgZm9yIGFnZ3JlZ2F0aW9uIGFuZCBwZXJzaXN0ZW5jZSBiZXR3ZWVuIGNhbGxzLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5yZWN1cnNpdmU9dHJ1ZV0gLSBXaGV0aGVyIHRvIHJlY3Vyc2l2ZWx5IGNvbGxlY3QgZXJyb3JzIGZyb20gY2hpbGQgY29udHJvbHMgd2l0aGluIGEgZm9ybSBncm91cCBvciBhcnJheS4gRGVmYXVsdHMgdG8gdHJ1ZS5cbiAqIEByZXR1cm4ge0Zvcm1FcnJvcnN9IFRoZSBjb2xsZWN0ZWQgZXJyb3JzIGFzIGEga2V5LXZhbHVlIG9iamVjdCB3aGVyZSBrZXlzIHJlcHJlc2VudCBjb250cm9sIG5hbWVzIG9yIHBhdGhzIGFuZCB2YWx1ZXMgcmVwcmVzZW50IHRoZWlyIHJlc3BlY3RpdmUgZXJyb3JzLiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIHRoZSBwcm92aWRlZCBjb250cm9sIGlzIHZhbGlkIGFuZCBoYXMgbm8gZXJyb3JzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybUVycm9ycyhcbiAgY29udHJvbDogQWJzdHJhY3RDb250cm9sLFxuICBvcHRzPzoge1xuICAgIGNvbnRyb2xOYW1lPzogc3RyaW5nO1xuICAgIHJlc3VsdD86IEZvcm1FcnJvcnM7XG4gICAgcmVjdXJzaXZlPzogYm9vbGVhbjtcbiAgfVxuKTogRm9ybUVycm9ycyB7XG4gIGlmICghY29udHJvbCB8fCBjb250cm9sLnZhbGlkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuICBvcHRzLnJlc3VsdCA9IG9wdHMucmVzdWx0IHx8IHt9O1xuXG4gIC8vIEZvcm0gZ3JvdXBcbiAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICAvLyBDb3B5IGVycm9yc1xuICAgIGlmIChjb250cm9sLmVycm9ycykge1xuICAgICAgaWYgKG9wdHMuY29udHJvbE5hbWUpIHtcbiAgICAgICAgb3B0cy5yZXN1bHRbb3B0cy5jb250cm9sTmFtZV0gPSB7XG4gICAgICAgICAgLi4uY29udHJvbC5lcnJvcnMsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRzLnJlc3VsdCA9IHtcbiAgICAgICAgICAuLi5vcHRzLnJlc3VsdCxcbiAgICAgICAgICAuLi5jb250cm9sLmVycm9ycyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW9wdHMgfHwgb3B0cy5yZWN1cnNpdmUgIT09IGZhbHNlKSB7XG4gICAgICAvLyBMb29wIG9uIGNoaWxkcmVuIGNvbnRyb2xzXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBjb250cm9sLmNvbnRyb2xzKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gY29udHJvbC5jb250cm9sc1trZXldO1xuICAgICAgICBpZiAoY2hpbGQ/LmVuYWJsZWQpIHtcbiAgICAgICAgICBnZXRGb3JtRXJyb3JzKGNoaWxkLCB7XG4gICAgICAgICAgICAuLi5vcHRzLFxuICAgICAgICAgICAgY29udHJvbE5hbWU6IG9wdHMuY29udHJvbE5hbWUgPyBbb3B0cy5jb250cm9sTmFtZSwga2V5XS5qb2luKCcuJykgOiBrZXksXG4gICAgICAgICAgICByZXN1bHQ6IG9wdHMucmVzdWx0LCAvLyBNYWtlIHN1cmUgdG8ga2VlcCB0aGUgc2FtZSByZXN1bHQgb2JqZWN0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBGb3JtIGFycmF5XG4gIGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAvLyBDb3B5IGVycm9yc1xuICAgIGlmIChjb250cm9sLmVycm9ycykge1xuICAgICAgaWYgKG9wdHMuY29udHJvbE5hbWUpIHtcbiAgICAgICAgb3B0cy5yZXN1bHRbb3B0cy5jb250cm9sTmFtZV0gPSB7XG4gICAgICAgICAgLi4uY29udHJvbC5lcnJvcnMsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRzLnJlc3VsdCA9IHtcbiAgICAgICAgICAuLi5vcHRzLnJlc3VsdCxcbiAgICAgICAgICAuLi5jb250cm9sLmVycm9ycyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb250cm9sLmNvbnRyb2xzLmZvckVhY2goKGNoaWxkLCBpbmRleCkgPT4ge1xuICAgICAgZ2V0Rm9ybUVycm9ycyhjaGlsZCwge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBjb250cm9sTmFtZTogKG9wdHMuY29udHJvbE5hbWUgfHwgJycpICsgJy4nICsgaW5kZXgsXG4gICAgICAgIHJlc3VsdDogb3B0cy5yZXN1bHQsIC8vIE1ha2Ugc3VyZSB0byBrZWVwIHRoZSBzYW1lIHJlc3VsdCBvYmplY3RcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gT3RoZXIgdHlwZSBvZiBjb250cm9sIChlLmcgc2ltcGxlIGNvbnRyb2wpXG4gIGVsc2UgaWYgKGNvbnRyb2wuZXJyb3JzKSB7XG4gICAgaWYgKG9wdHMuY29udHJvbE5hbWUpIHtcbiAgICAgIG9wdHMucmVzdWx0W29wdHMuY29udHJvbE5hbWVdID0ge1xuICAgICAgICAuLi5jb250cm9sLmVycm9ycyxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdHMucmVzdWx0ID0ge1xuICAgICAgICAuLi5vcHRzLnJlc3VsdCxcbiAgICAgICAgLi4uY29udHJvbC5lcnJvcnMsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3B0cy5yZXN1bHQ7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGEgY29udHJvbCBmcm9tIHRoZSBwcm92aWRlZCBmb3JtL2NvbnRyb2wgc3RydWN0dXJlIHVzaW5nIGEgZG90LXNlcGFyYXRlZCBwYXRoLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RDb250cm9sfSBmb3JtIC0gVGhlIHJvb3QgZm9ybSBncm91cCwgZm9ybSBhcnJheSwgb3IgY29udHJvbCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIGRvdC1zZXBhcmF0ZWQgcGF0aCBzcGVjaWZ5aW5nIHRoZSBjb250cm9sLiBGb3IgZXhhbXBsZSwgJ2dyb3VwTmFtZS5jb250cm9sTmFtZScgb3IgJ2FycmF5TmFtZS4wLmNvbnRyb2xOYW1lJy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3N0cmljdD10cnVlXSAtIElmIHRydWUsIHRocm93cyBhbiBlcnJvciBpZiB0aGUgZnVsbCBwYXRoIGNhbm5vdCBiZSByZXNvbHZlZDsgaWYgZmFsc2UsIHJldHVybnMgdGhlIGxhc3QgdmFsaWQgY29udHJvbCBlbmNvdW50ZXJlZC5cbiAqIEBwYXJhbSBmYWlsSWZNaXNzaW5nIC0gSWYgdHJ1ZSwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGNvbnRyb2wgbm90IGV4aXN0cy5cbiAqIEByZXR1cm4ge0Fic3RyYWN0Q29udHJvbH0gLSBUaGUgY29udHJvbCBhdCB0aGUgc3BlY2lmaWVkIHBhdGggb3IgdGhlIGNsb3Nlc3QgdmFsaWQgY29udHJvbCBpZiBzdHJpY3QgbW9kZSBpcyBkaXNhYmxlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGUgcGF0aCBjYW5ub3QgYmUgcmVzb2x2ZWQgYW5kIHN0cmljdCBtb2RlIGlzIGVuYWJsZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250cm9sRnJvbVBhdGgoZm9ybTogQWJzdHJhY3RDb250cm9sLCBwYXRoOiBzdHJpbmcsIHN0cmljdDogYm9vbGVhbiA9IHRydWUsIGZhaWxJZk1pc3Npbmc6IGJvb2xlYW4gPSBmYWxzZSk6IEFic3RyYWN0Q29udHJvbCB7XG4gIGlmIChpc05pbE9yQmxhbmsocGF0aCkpIHJldHVybiBmb3JtOyAvLyBub3QgcGF0aCA9IHRoZSBpbnB1dCBjb250cm9sIGl0c2VsZlxuXG4gIC8vIEZvcm0gZ3JvdXBcbiAgaWYgKGZvcm0gaW5zdGFuY2VvZiBGb3JtR3JvdXApIHtcbiAgICBjb25zdCBpID0gcGF0aC5pbmRleE9mKCcuJyk7XG4gICAgaWYgKGkgPT09IC0xKSB7XG4gICAgICByZXR1cm4gZm9ybS5nZXQocGF0aCk7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IHBhdGguc3Vic3RyaW5nKDAsIGkpO1xuICAgIGlmIChmb3JtLmNvbnRhaW5zKGtleSkpIHtcbiAgICAgIHJldHVybiBnZXRDb250cm9sRnJvbVBhdGgoZm9ybS5nZXQoa2V5KSwgcGF0aC5zdWJzdHJpbmcoaSArIDEpLCBzdHJpY3QsIGZhaWxJZk1pc3NpbmcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZvcm0gYXJyYXlcbiAgZWxzZSBpZiAoZm9ybSBpbnN0YW5jZW9mIEZvcm1BcnJheSkge1xuICAgIGNvbnN0IGkgPSBwYXRoLmluZGV4T2YoJy4nKTtcbiAgICBpZiAoaSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBmb3JtLmF0KCtwYXRoKTtcbiAgICB9XG4gICAgY29uc3QgaW5kZXggPSArcGF0aC5zdWJzdHJpbmcoMCwgaSk7XG4gICAgaWYgKGluZGV4IDwgZm9ybS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBnZXRDb250cm9sRnJvbVBhdGgoZm9ybS5hdChpbmRleCksIHBhdGguc3Vic3RyaW5nKGkgKyAxKSwgc3RyaWN0LCBmYWlsSWZNaXNzaW5nKTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgcGF0aCBpZiBub3QgYmxhbmssIGJ1dCB3ZSBjYW5ub3QgZ28gZGVlcGVyIGluc2lkZSB0aGUgY29udHJvbFxuICAvLyBSZXR1cm4gdGhlIGN1cnJlbnQgY29udHJvbCwgaWYgTk9UIHN0cmljdCBtb2RlIChwYXRoIGlzIHRvbyBsb25nLCBidXQgdGhpcyBpcyBPSylcbiAgZWxzZSBpZiAoIXN0cmljdCkge1xuICAgIHJldHVybiBmb3JtO1xuICB9XG5cbiAgaWYgKGZhaWxJZk1pc3NpbmcpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjb250cm9sIHBhdGg6ICcke3BhdGh9JyBzaG91bGQgYmUgYW4gZXhpc3RpbmcgY29udHJvbC5gKTtcblxuICByZXR1cm4gbnVsbDsgLy8gTm90IGZvdW5kXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNhYmxlQ29udHJvbHMoZm9ybTogVW50eXBlZEZvcm1Hcm91cCwgcGF0aHM6IHN0cmluZ1tdLCBvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW47IHJlcXVpcmVkPzogYm9vbGVhbiB9KSB7XG4gIChwYXRocyB8fCBbXSkuZm9yRWFjaCgocGF0aCkgPT4ge1xuICAgIGNvbnN0IGNvbnRyb2wgPSBnZXRDb250cm9sRnJvbVBhdGgoZm9ybSwgcGF0aCk7XG4gICAgaWYgKGNvbnRyb2wpIGRpc2FibGVDb250cm9sKGNvbnRyb2wsIG9wdHMpO1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkaXNhYmxlQW5kQ2xlYXJDb250cm9scyhcbiAgZm9ybTogVW50eXBlZEZvcm1Hcm91cCxcbiAgcGF0aHM6IHN0cmluZ1tdLFxuICBvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW47IHJlcXVpcmVkPzogYm9vbGVhbiB9XG4pIHtcbiAgKHBhdGhzIHx8IFtdKS5mb3JFYWNoKChwYXRoKSA9PiB7XG4gICAgY29uc3QgY29udHJvbCA9IGdldENvbnRyb2xGcm9tUGF0aChmb3JtLCBwYXRoKTtcbiAgICBpZiAoY29udHJvbCkgZGlzYWJsZUFuZENsZWFyQ29udHJvbChjb250cm9sLCBvcHRzKTtcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlQ29udHJvbHMoZm9ybTogVW50eXBlZEZvcm1Hcm91cCwgcGF0aHM6IHN0cmluZ1tdLCBvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW47IHJlcXVpcmVkPzogYm9vbGVhbiB9KSB7XG4gIChwYXRocyB8fCBbXSkuZm9yRWFjaCgocGF0aCkgPT4ge1xuICAgIGNvbnN0IGNvbnRyb2wgPSBnZXRDb250cm9sRnJvbVBhdGgoZm9ybSwgcGF0aCk7XG4gICAgaWYgKGNvbnRyb2wpIGVuYWJsZUNvbnRyb2woY29udHJvbCwgb3B0cyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q29udHJvbHNFbmFibGVkKFxuICBmb3JtOiBVbnR5cGVkRm9ybUdyb3VwLFxuICBlbmFibGVkOiBib29sZWFuLFxuICBwYXRoczogc3RyaW5nW10sXG4gIG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbjsgcmVxdWlyZWQ/OiBib29sZWFuIH1cbikge1xuICAocGF0aHMgfHwgW10pLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICBjb25zdCBjb250cm9sID0gZ2V0Q29udHJvbEZyb21QYXRoKGZvcm0sIHBhdGgpO1xuICAgIGlmIChjb250cm9sKSBzZXRDb250cm9sRW5hYmxlZChjb250cm9sLCBlbmFibGVkLCBvcHRzKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRDb250cm9sUmVxdWlyZWQoXG4gIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCxcbiAgcmVxdWlyZWQ6IGJvb2xlYW5cbikge1xuICBpZiAoIWNvbnRyb2wpIHJldHVybjtcbiAgaWYgKHJlcXVpcmVkICYmICFjb250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkKSkge1xuICAgIGNvbnRyb2wuYWRkVmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgfSBlbHNlIGlmICghcmVxdWlyZWQgJiYgY29udHJvbC5oYXNWYWxpZGF0b3IoVmFsaWRhdG9ycy5yZXF1aXJlZCkpIHtcbiAgICBjb250cm9sLnJlbW92ZVZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gIH1cbn1cblxuXG4vKipcbiAqIFNldHMgZm9ybSBlcnJvcnMgb24gYW4gQWJzdHJhY3RDb250cm9sLCBpbmNsdWRpbmcgbmVzdGVkIGNvbnRyb2xzIHdpdGhpbiBmb3JtIGdyb3VwcyBvciBhcnJheXMuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdENvbnRyb2x9IGNvbnRyb2wgLSBUaGUgZm9ybSBjb250cm9sLCBmb3JtIGdyb3VwLCBvciBmb3JtIGFycmF5IHRvIGFwcGx5IHRoZSBlcnJvcnMgdG8uXG4gKiBAcGFyYW0ge0Zvcm1FcnJvcnN9IGVycm9ycyAtIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGVycm9ycyB0byBiZSBzZXQgb24gdGhlIGNvbnRyb2wgb3IgaXRzIGNoaWxkcmVuLlxuICogQHJldHVybiB7dm9pZH0gRG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRGb3JtRXJyb3JzKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgZXJyb3JzOiBGb3JtRXJyb3JzKTogdm9pZCB7XG4gIGlmICghY29udHJvbCB8fCAhZXJyb3JzKSByZXR1cm47XG5cbiAgLy8gRm9ybSBncm91cCBvciBhcnJheVxuICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCB8fCBjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgT2JqZWN0LmVudHJpZXMoZXJyb3JzKS5mb3JFYWNoKChbY2hpbGRQYXRoLCBjaGlsZEVycm9yXSkgPT4ge1xuICAgICAgY29uc3QgY2hpbGRDb250cm9sID0gZ2V0Q29udHJvbEZyb21QYXRoKGNvbnRyb2wsIGNoaWxkUGF0aCk7XG4gICAgICBpZiAoY2hpbGRDb250cm9sKSBjaGlsZENvbnRyb2wuc2V0RXJyb3JzKGNoaWxkRXJyb3IpO1xuICAgIH0pO1xuICB9XG4gIC8vIFNpbXBsZSBjb250cm9sXG4gIGVsc2Uge1xuICAgIGNvbnRyb2wuc2V0RXJyb3JzKGVycm9ycyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZUNvbnRyb2woY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW47IHJlcXVpcmVkPzogYm9vbGVhbiB9KSB7XG4gIHNldENvbnRyb2xFbmFibGVkKGNvbnRyb2wsIHRydWUsIG9wdHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGlzYWJsZUNvbnRyb2woY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW47IHJlcXVpcmVkPzogYm9vbGVhbiB9KSB7XG4gIHNldENvbnRyb2xFbmFibGVkKGNvbnRyb2wsIGZhbHNlLCB7IHJlcXVpcmVkOiBmYWxzZSwgLi4ub3B0cyB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc2FibGVBbmRDbGVhckNvbnRyb2woY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW47IHJlcXVpcmVkPzogYm9vbGVhbiB9KSB7XG4gIGNvbnN0IHdhc0Rpc2FibGVkID0gY29udHJvbC5kaXNhYmxlZDtcblxuICAvLyBBcHBseSBkaXNhYmxlXG4gIHNldENvbnRyb2xFbmFibGVkKGNvbnRyb2wsIGZhbHNlLCB7IHJlcXVpcmVkOiBmYWxzZSwgLi4ub3B0cyB9KTtcblxuICAvLyBJbXBvcnRhbnQsIHNob3VsZCBub3QgdXNlIHJlc2V0KCkgdG8gbWFyayB0aGUgY29udHJvbCBhcyBkaXJ0eS5cbiAgLy8gT3RoZXJ3aXNlLCBvcHRpbWl6YXRpb24gdXNpbmcgZGlydHkgKC5lLmcgTWVhc3VyZW1lbnRGb3JtKSB3aWxsIG5vdCBiZSBub3RpZmllZCBieSB0aGlzIGNoYW5nZWRcbiAgaWYgKGlzTm90TmlsKGNvbnRyb2wudmFsdWUpKSB7XG4gICAgaWYgKHdhc0Rpc2FibGVkKSB7XG4gICAgICBjb250cm9sLnJlc2V0KG51bGwsIG9wdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250cm9sLnNldFZhbHVlKG51bGwsIG9wdHMpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q29udHJvbEVuYWJsZWQoXG4gIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCxcbiAgZW5hYmxlZDogYm9vbGVhbixcbiAgb3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuOyByZXF1aXJlZD86IGJvb2xlYW4gfVxuKSB7XG4gIGlmICghY29udHJvbCkgcmV0dXJuOyAvLyBTS2lwIGlmIG5vIGNvbnRyb2xcbiAgaWYgKGVuYWJsZWQpIHtcbiAgICBpZiAoaXNOb3ROaWwob3B0cz8ucmVxdWlyZWQpICYmIG9wdHMucmVxdWlyZWQgJiYgIWNvbnRyb2wuaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpKSB7XG4gICAgICBjb250cm9sLmFkZFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgfVxuICAgIGNvbnRyb2wuZW5hYmxlKG9wdHMpO1xuICB9IGVsc2Uge1xuICAgIGNvbnRyb2wuZGlzYWJsZShvcHRzKTtcbiAgICBpZiAoaXNOb3ROaWwob3B0cz8ucmVxdWlyZWQpICYmICFvcHRzLnJlcXVpcmVkICYmIGNvbnRyb2wuaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpKSB7XG4gICAgICBjb250cm9sLnJlbW92ZVZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRWYWx1ZUluQXJyYXkoXG4gIGFycmF5Q29udHJvbDogVW50eXBlZEZvcm1BcnJheSxcbiAgY3JlYXRlQ29udHJvbDogKHZhbHVlOiBhbnkgfCB1bmRlZmluZWQsIGluZGV4OiBudW1iZXIpID0+IEFic3RyYWN0Q29udHJvbCxcbiAgZXF1YWxzOiAodjE6IGFueSwgdjI6IGFueSkgPT4gYm9vbGVhbixcbiAgaXNFbXB0eTogKHZhbHVlOiBhbnkpID0+IGJvb2xlYW4sXG4gIHZhbHVlOiBhbnksXG4gIG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbjsgaW5zZXJ0QXQ/OiBudW1iZXI7IGFsbG93TWFueU51bGxWYWx1ZXM/OiBib29sZWFuOyBhbGxvd0R1cGxpY2F0ZVZhbHVlPzogYm9vbGVhbiB9XG4pOiBib29sZWFuIHtcbiAgY29uc3QgZGlzYWJsZWQgPSBhcnJheUNvbnRyb2wuZGlzYWJsZWQ7XG5cbiAgbGV0IGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgbGV0IGluZGV4ID0gLTE7XG4gIGxldCBpc0VtcHR5VmFsdWUgPSBpc0VtcHR5KHZhbHVlKTtcblxuICAvLyBTZWFyY2ggaWYgdmFsdWUgYWxyZWFkeSBleGlzdHNcbiAgaWYgKCFpc0VtcHR5VmFsdWUgJiYgb3B0cz8uYWxsb3dEdXBsaWNhdGVWYWx1ZSAhPT0gdHJ1ZSkge1xuICAgIGluZGV4ID0gKGFycmF5Q29udHJvbC52YWx1ZSB8fCBbXSkuZmluZEluZGV4KCh2KSA9PiBlcXVhbHModmFsdWUsIHYpKTtcbiAgfVxuXG4gIC8vIElmIHZhbHVlIG5vdCBleGlzdHMsIGJ1dCBsYXN0IHZhbHVlIGlzIGVtcHR5OiByZXVzZSBsYXN0IHZhbHVlXG4gIGlmIChpbmRleCA9PT0gLTEgJiYgb3B0cz8uYWxsb3dNYW55TnVsbFZhbHVlcyAhPT0gdHJ1ZSAmJiBhcnJheUNvbnRyb2wubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGxhc3RWYWx1ZSA9IGFycmF5Q29udHJvbC5hdChhcnJheUNvbnRyb2wubGVuZ3RoIC0gMSkudmFsdWU7XG4gICAgaWYgKGlzRW1wdHkobGFzdFZhbHVlKSkge1xuICAgICAgaW5kZXggPSBhcnJheUNvbnRyb2wubGVuZ3RoIC0gMTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXBsYWNlIHRoZSBleGlzdGluZyB2YWx1ZVxuICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgaWYgKCFpc0VtcHR5VmFsdWUpIHtcbiAgICAgIGFycmF5Q29udHJvbC5hdChpbmRleCkucGF0Y2hWYWx1ZSh2YWx1ZSwgb3B0cyk7XG4gICAgICBoYXNDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgY29udHJvbCA9IGNyZWF0ZUNvbnRyb2wodmFsdWUsIGFycmF5Q29udHJvbC5sZW5ndGgpO1xuXG4gICAgLy8gQXBwbHkgcGFyZW50IGRpc2FibGVkIHN0YXRlLCBiZWZvcmUgdG8gcHVzaCBpdCBpbnRvIHRoZSBhcnJheVxuICAgIC8vIFRoaXMgaXMgbmVlZCB0byBhdm9pZCBwYXJlbnQgZm9ybSB0byBiZSBlbmFibGVkXG4gICAgaWYgKGRpc2FibGVkICYmIGNvbnRyb2wuZW5hYmxlZCkgY29udHJvbC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICBlbHNlIGlmICghZGlzYWJsZWQgJiYgY29udHJvbC5kaXNhYmxlZCkgY29udHJvbC5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXG4gICAgaWYgKGlzTm90TmlsT3JOYU4ob3B0cz8uaW5zZXJ0QXQpKSB7XG4gICAgICBhcnJheUNvbnRyb2wuaW5zZXJ0KG9wdHMuaW5zZXJ0QXQsIGNvbnRyb2wsIG9wdHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcnJheUNvbnRyb2wucHVzaChjb250cm9sLCBvcHRzKTtcbiAgICB9XG4gICAgaGFzQ2hhbmdlZCA9IHRydWU7XG4gIH1cblxuICBpZiAoaGFzQ2hhbmdlZCkge1xuICAgIGlmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHtcbiAgICAgIC8vIE1hcmsgYXJyYXkgY29udHJvbCBkaXJ0eVxuICAgICAgaWYgKCFpc0VtcHR5VmFsdWUpIHtcbiAgICAgICAgYXJyYXlDb250cm9sLm1hcmtBc0RpcnR5KG9wdHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBoYXNDaGFuZ2VkO1xufVxuXG4vKipcbiAqIFNldCBhbiBhcnJheSB1c2luZyBnaXZlbiBkZWZhdWx0IHZhbHVlcy4gRWFjaCBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgcGFzcyB0byB0aGUgJ2NyZWF0ZUNvbnRyb2woKScgZnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0gYXJyYXlDb250cm9sXG4gKiBAcGFyYW0gY3JlYXRlQ29udHJvbFxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZXNcbiAqIEBwYXJhbSBvcHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0QXJyYXlDb250cm9sc0Zyb21WYWx1ZXMoXG4gIGFycmF5Q29udHJvbDogVW50eXBlZEZvcm1BcnJheSxcbiAgY3JlYXRlQ29udHJvbDogKHZhbHVlPzogYW55LCBpbmRleD86IG51bWJlcikgPT4gQWJzdHJhY3RDb250cm9sLFxuICBkZWZhdWx0VmFsdWVzOiBhbnlbXSxcbiAgb3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9XG4pOiBib29sZWFuIHtcbiAgaWYgKGFycmF5Q29udHJvbC5sZW5ndGggPT09IDAgJiYgKCFkZWZhdWx0VmFsdWVzIHx8IGRlZmF1bHRWYWx1ZXMubGVuZ3RoID09PSAwKSkgcmV0dXJuIGZhbHNlOyAvLyBObyBjaGFuZ2VzIG5lZWRcblxuICBjb25zdCBkaXNhYmxlZCA9IGFycmF5Q29udHJvbC5kaXNhYmxlZDtcblxuICB3aGlsZSAoYXJyYXlDb250cm9sLmxlbmd0aCA+IDApIHtcbiAgICBhcnJheUNvbnRyb2wucmVtb3ZlQXQoYXJyYXlDb250cm9sLmxlbmd0aCAtIDEsIG9wdHMpO1xuICB9XG5cbiAgKGRlZmF1bHRWYWx1ZXMgfHwgW10pLmZvckVhY2goKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGNvbnRyb2wgPSBjcmVhdGVDb250cm9sKHZhbHVlLCBpbmRleCk7XG5cbiAgICAvLyBBcHBseSBwYXJlbnQgZGlzYWJsZWQgc3RhdGUsIGJlZm9yZSB0byBwdXNoIGl0IGludG8gdGhlIGFycmF5XG4gICAgLy8gVGhpcyBpcyBuZWVkIHRvIGF2b2lkIHBhcmVudCBmb3JtIHRvIGJlIGVuYWJsZWRcbiAgICBpZiAoZGlzYWJsZWQgJiYgY29udHJvbC5lbmFibGVkKSBjb250cm9sLmRpc2FibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIGVsc2UgaWYgKCFkaXNhYmxlZCAmJiBjb250cm9sLmRpc2FibGVkKSBjb250cm9sLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG5cbiAgICBhcnJheUNvbnRyb2wucHVzaChjb250cm9sLCBvcHRzKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHRydWU7IC8vIEhhcyBzb21lIGNoYW5nZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2l6ZUFycmF5KFxuICBhcnJheUNvbnRyb2w6IFVudHlwZWRGb3JtQXJyYXksXG4gIGNyZWF0ZUNvbnRyb2w6ICh2YWx1ZT86IGFueSB8IHVuZGVmaW5lZCwgaW5kZXg/OiBudW1iZXIpID0+IEFic3RyYWN0Q29udHJvbCxcbiAgbGVuZ3RoOiBudW1iZXIsXG4gIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfVxuKTogYm9vbGVhbiB7XG4gIGlmIChhcnJheUNvbnRyb2wubGVuZ3RoID09PSBsZW5ndGggfHwgbGVuZ3RoIDwgMCkgcmV0dXJuIGZhbHNlOyAvLyBObyBjaGFuZ2VzIG5lZWRcblxuICBjb25zdCBkaXNhYmxlZCA9IGFycmF5Q29udHJvbC5kaXNhYmxlZDtcblxuICAvLyBSZWR1Y2Ugc2l6ZVxuICBsZXQgY3VycmVudExlbmd0aCA9IGFycmF5Q29udHJvbC5sZW5ndGg7XG4gIHdoaWxlIChjdXJyZW50TGVuZ3RoID4gbGVuZ3RoKSB7XG4gICAgYXJyYXlDb250cm9sLnJlbW92ZUF0KGN1cnJlbnRMZW5ndGggLSAxLCBvcHRzKTtcblxuICAgIC8vIElmIGRlbGV0aW9uIHdhcyBub3QgZG9uZTsgc3RvcCAoQXZvaWQgaW5maW5pdGUgbG9vcCB3aGVuIEFwcEZvcm1BcnJheSByZWZ1c2VkIGRlbGV0aW9uIC0gZml4IGlzc3VlIHN1bWFyaXMtYXBwIzEzODkpXG4gICAgaWYgKGFycmF5Q29udHJvbC5sZW5ndGggPT09IGN1cnJlbnRMZW5ndGgpIGJyZWFrOyAvLyBTdG9wIChhdm9pZCBpbmZpbml0ZSBsb29wKVxuICAgIGN1cnJlbnRMZW5ndGggPSBhcnJheUNvbnRyb2wubGVuZ3RoO1xuICB9XG5cbiAgLy8gSW5jcmVhc2Ugc2l6ZVxuICB3aGlsZSAoYXJyYXlDb250cm9sLmxlbmd0aCA8IGxlbmd0aCkge1xuICAgIGNvbnN0IGNvbnRyb2wgPSBjcmVhdGVDb250cm9sKHVuZGVmaW5lZCwgYXJyYXlDb250cm9sLmxlbmd0aCk7XG5cbiAgICAvLyBBcHBseSBwYXJlbnQgZGlzYWJsZWQgc3RhdGUsIGJlZm9yZSB0byBwdXNoIGl0IGludG8gdGhlIGFycmF5XG4gICAgLy8gVGhpcyBpcyBuZWVkIHRvIGF2b2lkIHBhcmVudCBmb3JtIHRvIGJlIGVuYWJsZWQsIGFmdGVyIGNhbGxpbmcgcmVzaXplQXJyYXkoKVxuICAgIGlmIChkaXNhYmxlZCAmJiBjb250cm9sLmVuYWJsZWQpIGNvbnRyb2wuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgZWxzZSBpZiAoIWRpc2FibGVkICYmIGNvbnRyb2wuZGlzYWJsZWQpIGNvbnRyb2wuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcblxuICAgIGFycmF5Q29udHJvbC5wdXNoKGNvbnRyb2wsIG9wdHMpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7IC8vIEhhcyBzb21lIGNoYW5nZXNcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVZhbHVlSW5BcnJheShhcnJheUNvbnRyb2w6IFVudHlwZWRGb3JtQXJyYXksIGluZGV4OiBudW1iZXIsIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSk6IGJvb2xlYW4ge1xuICBhcnJheUNvbnRyb2wucmVtb3ZlQXQoaW5kZXgsIG9wdHMpO1xuICBhcnJheUNvbnRyb2wubWFya0FzRGlydHkob3B0cyk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJWYWx1ZUluQXJyYXkoXG4gIGFycmF5Q29udHJvbDogVW50eXBlZEZvcm1BcnJheSxcbiAgaXNFbXB0eTogKHZhbHVlOiBhbnkpID0+IGJvb2xlYW4sXG4gIGluZGV4OiBudW1iZXIsXG4gIG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbjsgZW1pdEV2ZW50PzogYm9vbGVhbiB9XG4pOiBib29sZWFuIHtcbiAgY29uc3QgY29udHJvbCA9IGFycmF5Q29udHJvbC5hdChpbmRleCk7XG4gIGlmIChpc0VtcHR5KGNvbnRyb2wudmFsdWUpKSByZXR1cm4gZmFsc2U7IC8vIHNraXAgKG5vdCBuZWVkIHRvIGNsZWFyKVxuXG4gIGlmIChjb250cm9sIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Hcm91cCkge1xuICAgIGNvcHlFbnRpdHkyRm9ybSh7fSwgY29udHJvbCwgb3B0cyk7XG4gIH0gZWxzZSBpZiAoY29udHJvbCBpbnN0YW5jZW9mIFVudHlwZWRGb3JtQXJyYXkpIHtcbiAgICBjb250cm9sLnNldFZhbHVlKFtdLCBvcHRzKTtcbiAgfSBlbHNlIHtcbiAgICBjb250cm9sLnNldFZhbHVlKG51bGwsIG9wdHMpO1xuICB9XG4gIGFycmF5Q29udHJvbC5tYXJrQXNEaXJ0eShvcHRzKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXJrQWxsQXNUb3VjaGVkKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgb3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgaWYgKCFjb250cm9sKSByZXR1cm47XG4gIGlmIChjb250cm9sIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Hcm91cCkge1xuICAgIG1hcmtGb3JtR3JvdXBBc1RvdWNoZWQoY29udHJvbCwgeyAuLi5vcHRzLCBvbmx5U2VsZjogdHJ1ZSB9KTsgLy8gcmVjdXJzaXZlIGNhbGxcbiAgfSBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgVW50eXBlZEZvcm1BcnJheSkge1xuICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgIChjb250cm9sLmNvbnRyb2xzIHx8IFtdKS5mb3JFYWNoKChjKSA9PiBtYXJrQ29udHJvbEFzVG91Y2hlZChjLCB7IC4uLm9wdHMsIG9ubHlTZWxmOiB0cnVlIH0pKTsgLy8gcmVjdXJzaXZlIGNhbGxcbiAgfSBlbHNlIHtcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyAuLi5vcHRzLCBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFya0Zvcm1Hcm91cEFzVG91Y2hlZChmb3JtOiBVbnR5cGVkRm9ybUdyb3VwLCBvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICBpZiAoIWZvcm0pIHJldHVybjtcbiAgZm9ybS5tYXJrQXNUb3VjaGVkKG9wdHMpO1xuICBPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKVxuICAgIC5tYXAoKGtleSkgPT4gZm9ybS5jb250cm9sc1trZXldKVxuICAgIC5maWx0ZXIoKGNvbnRyb2wpID0+IGNvbnRyb2wuZW5hYmxlZClcbiAgICAuZm9yRWFjaCgoY29udHJvbCkgPT4gbWFya0NvbnRyb2xBc1RvdWNoZWQoY29udHJvbCwgb3B0cykpO1xuICBmb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyAuLi5vcHRzLCBvbmx5U2VsZjogdHJ1ZSB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcmtDb250cm9sQXNUb3VjaGVkKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwgb3B0cz86IHsgb25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgaWYgKCFjb250cm9sKSByZXR1cm47XG4gIGlmIChjb250cm9sIGluc3RhbmNlb2YgVW50eXBlZEZvcm1Hcm91cCkge1xuICAgIG1hcmtBbGxBc1RvdWNoZWQoY29udHJvbCwgeyAuLi5vcHRzLCBvbmx5U2VsZjogdHJ1ZSB9KTsgLy8gcmVjdXJzaXZlIGNhbGxcbiAgfSBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgVW50eXBlZEZvcm1BcnJheSkge1xuICAgIChjb250cm9sLmNvbnRyb2xzIHx8IFtdKS5mb3JFYWNoKChjKSA9PiBtYXJrQ29udHJvbEFzVG91Y2hlZChjLCB7IC4uLm9wdHMsIG9ubHlTZWxmOiB0cnVlIH0pKTsgLy8gcmVjdXJzaXZlIGNhbGxcbiAgfSBlbHNlIHtcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyAuLi5vcHRzLCBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlVmFsdWVBbmRWYWxpZGl0eShmb3JtOiBVbnR5cGVkRm9ybUdyb3VwLCBvcHRzPzogeyBvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICBpZiAoIWZvcm0pIHJldHVybjtcbiAgZm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KG9wdHMpO1xuICBPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKVxuICAgIC5tYXAoKGtleSkgPT4gZm9ybS5jb250cm9sc1trZXldKVxuICAgIC5maWx0ZXIoKGNvbnRyb2wpID0+IGNvbnRyb2wuZW5hYmxlZClcbiAgICAuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xuICAgICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBVbnR5cGVkRm9ybUdyb3VwKSB7XG4gICAgICAgIHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoY29udHJvbCwgeyAuLi5vcHRzLCBvbmx5U2VsZjogdHJ1ZSB9KTsgLy8gcmVjdXJzaXZlIGNhbGxcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IC4uLm9wdHMsIG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFya0FzVW50b3VjaGVkKGZvcm06IFVudHlwZWRGb3JtR3JvdXAsIG9wdHM/OiB7IG9ubHlTZWxmPzogYm9vbGVhbiB9KSB7XG4gIGlmICghZm9ybSkgcmV0dXJuO1xuICBmb3JtLm1hcmtBc1VudG91Y2hlZChvcHRzKTtcbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZm9ybS5jb250cm9scykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgY29uc3QgY29udHJvbCA9IGZvcm0uZ2V0KGtleSk7XG4gICAgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBVbnR5cGVkRm9ybUdyb3VwKSB7XG4gICAgICBtYXJrQXNVbnRvdWNoZWQoY29udHJvbCwgeyBvbmx5U2VsZjogdHJ1ZSB9KTsgLy8gcmVjdXJzaXZlIGNhbGxcbiAgICB9IGVsc2Uge1xuICAgICAgY29udHJvbC5tYXJrQXNVbnRvdWNoZWQoeyBvbmx5U2VsZjogdHJ1ZSB9KTtcbiAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogV2FpdCBlbmQgb2YgYXN5bmMgdmFsaWRhdGlvbiAobm90IHBlbmRpbmcpLiBUaGlzIG5lZWQgdG8gaW1wbGVtZW50IHtwZW5kaW5nOiBib29sZWFufVxuICogcmV0dXJuIGZhbHNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YWl0V2hpbGVQZW5kaW5nPFQgZXh0ZW5kcyB7IHBlbmRpbmc6IGJvb2xlYW4gfT4oZm9ybTogVCwgb3B0cz86IFdhaXRGb3JPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByZWRpY2F0ZTogUHJlZGljYXRlPHZvaWQ+ID0gKCkgPT4gZm9ybS5wZW5kaW5nICE9PSB0cnVlO1xuICByZXR1cm4gd2FpdEZvcihwcmVkaWNhdGUsIG9wdHMpO1xufVxuXG4vKipcbiAqIFdhaXQgZm9ybSBpcyBpZGxlIChub3QgbG9hZGluZykuIFRoaXMgbmVlZCB0byBpbXBsZW1lbnQge2xvYWRpbmc6IGJvb2xlYW59XG4gKlxuICogQHBhcmFtIGZvcm1cbiAqIEBwYXJhbSBvcHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YWl0SWRsZTxUIGV4dGVuZHMgeyBsb2FkaW5nOiBib29sZWFuIH0+KGZvcm06IFQsIG9wdHM/OiBXYWl0Rm9yT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcmVkaWNhdGU6IFByZWRpY2F0ZTx2b2lkPiA9ICgpID0+IGZvcm0ubG9hZGluZyAhPT0gdHJ1ZTtcbiAgcmV0dXJuIHdhaXRGb3IocHJlZGljYXRlLCBvcHRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlckZvcm1FcnJvcnNCeVByZWZpeChlcnJvcnM6IEZvcm1FcnJvcnMsIC4uLnByZWZpeGVzOiBzdHJpbmdbXSk6IEZvcm1FcnJvcnMge1xuICBpZiAoaXNFbXB0eUFycmF5KHByZWZpeGVzKSkgcmV0dXJuIGVycm9ycztcbiAgcmV0dXJuIGZpbHRlckZvcm1FcnJvcnNCeVBhdGgoZXJyb3JzLCAocGF0aCkgPT4gcHJlZml4ZXM/LnNvbWUoKHByZWZpeCkgPT4gcGF0aC5zdGFydHNXaXRoKHByZWZpeCkpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlckZvcm1FcnJvcnNCeVBhdGgoZXJyb3JzOiBGb3JtRXJyb3JzLCBmaWx0ZXI6IFByZWRpY2F0ZTxzdHJpbmc+KTogRm9ybUVycm9ycyB7XG4gIGlmICh0eXBlb2YgZmlsdGVyICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZXJyb3JzO1xuICByZXR1cm4gZmlsdGVyRm9ybUVycm9ycyhlcnJvcnMsIChbcGF0aCwgX10pID0+IGZpbHRlcihwYXRoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJGb3JtRXJyb3JzKGVycm9yczogRm9ybUVycm9ycywgZmlsdGVyOiBQcmVkaWNhdGU8W3N0cmluZywgYW55XT4pOiBGb3JtRXJyb3JzIHtcbiAgaWYgKHR5cGVvZiBmaWx0ZXIgIT09ICdmdW5jdGlvbicpIHJldHVybiBlcnJvcnM7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhlcnJvcnMpXG4gICAgLmZpbHRlcihmaWx0ZXIpXG4gICAgLnJlZHVjZShcbiAgICAgIChyZXMsIFtwYXRoLCBlcnJvcl0pID0+IHtcbiAgICAgICAgLy8gSW5pdCBlcnJvciBtYXBcbiAgICAgICAgcmVzID0gcmVzIHx8IHt9O1xuICAgICAgICAvLyBBZGQgY3VycmVudCBlcnJvclxuICAgICAgICByZXNbcGF0aF0gPSBlcnJvcjtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0sXG4gICAgICA8Rm9ybUVycm9ycz51bmRlZmluZWRcbiAgICApO1xufVxuIl19
@@ -35,7 +35,7 @@ import * as i1 from '@angular/material-moment-adapter';
35
35
  import { MatMomentDateModule } from '@angular/material-moment-adapter';
36
36
  import { isMoment as isMoment$1 } from 'moment/moment';
37
37
  import * as i1$3 from '@angular/forms';
38
- import { AbstractControl, UntypedFormArray, UntypedFormGroup, UntypedFormControl, FormGroup, FormArray, Validators, NG_VALUE_ACCESSOR, ReactiveFormsModule, FormBuilder, FormControl, FormsModule, NgControl } from '@angular/forms';
38
+ import { AbstractControl, UntypedFormArray, UntypedFormGroup, FormGroup, FormArray, UntypedFormControl, FormControl, Validators, NG_VALUE_ACCESSOR, ReactiveFormsModule, FormBuilder, FormsModule, NgControl } from '@angular/forms';
39
39
  import { maskitoWithPlaceholder, maskitoEventHandler, maskitoDateOptionsGenerator, maskitoTimeOptionsGenerator, maskitoNumberOptionsGenerator } from '@maskito/kit';
40
40
  import * as i1$2 from '@angular/platform-browser';
41
41
  import { HammerGestureConfig, HammerModule } from '@angular/platform-browser';
@@ -3892,7 +3892,7 @@ function getFormValueFromEntity(entity, form) {
3892
3892
  function adaptValueToControl(source, control, path) {
3893
3893
  const pathPrefix = path ? path + '.' : '';
3894
3894
  // Form group
3895
- if (control instanceof UntypedFormGroup) {
3895
+ if (control instanceof FormGroup) {
3896
3896
  const result = {};
3897
3897
  // eslint-disable-next-line guard-for-in
3898
3898
  for (const key in control.controls) {
@@ -3901,7 +3901,7 @@ function adaptValueToControl(source, control, path) {
3901
3901
  return result;
3902
3902
  }
3903
3903
  // Array
3904
- if (control instanceof UntypedFormArray) {
3904
+ if (control instanceof FormArray) {
3905
3905
  // Split, if many values in a string
3906
3906
  if (typeof source === 'string') {
3907
3907
  source = source.split('|');
@@ -3953,17 +3953,15 @@ function adaptValueToControl(source, control, path) {
3953
3953
  }
3954
3954
  }
3955
3955
  // Form control
3956
- if (control instanceof UntypedFormControl) {
3956
+ if (control instanceof FormControl) {
3957
3957
  // Date
3958
3958
  if (isMoment(source)) {
3959
3959
  return toDateISOString(source);
3960
3960
  }
3961
- // Any other control: replace undefined by null value
3962
- // because Undefined is not authorized as control value
3963
- else {
3964
- return nullIfUndefined(source);
3965
- }
3966
3961
  }
3962
+ // Any other control: replace undefined by null value
3963
+ // because Undefined is not authorized as control value
3964
+ return nullIfUndefined(source);
3967
3965
  }
3968
3966
  function logFormErrors(control, logPrefix, path) {
3969
3967
  if (!control || control.valid)
@@ -4596,6 +4594,7 @@ class AppFormProvider {
4596
4594
  class AppFormUtils {
4597
4595
  static copyEntity2Form = copyEntity2Form;
4598
4596
  static getFormValueFromEntity = getFormValueFromEntity;
4597
+ static getControlValueFromEntity = adaptValueToControl;
4599
4598
  /**
4600
4599
  * Retrieves a control from the provided form/control structure using a dot-separated path.
4601
4600
  *
@@ -38554,7 +38553,7 @@ class AppTable {
38554
38553
  if (previousRow.id === -1 && previousRow.validator?.invalid && !previousRow.validator?.dirty) {
38555
38554
  this.deleteNewRow(event, previousRow);
38556
38555
  // Wait deletion is done, then edit previous row (by id, because of reloading)
38557
- this.waitIdle().then(() => this.editRowById(event, row.id, { focusColumn }));
38556
+ this.waitIdle().then(() => this.editOrAddRowById(event, row.id, { focusColumn }));
38558
38557
  return true;
38559
38558
  }
38560
38559
  // If cannot confirm previous row
@@ -38596,7 +38595,7 @@ class AppTable {
38596
38595
  }
38597
38596
  // Edit next row
38598
38597
  const nextRowId = row.id + 1;
38599
- this.editRowById(event, nextRowId, { focusColumn });
38598
+ this.editOrAddRowById(event, nextRowId, { focusColumn });
38600
38599
  return true;
38601
38600
  }
38602
38601
  /**
@@ -39612,7 +39611,7 @@ class AppTable {
39612
39611
  this.registerSubscription(this.sort.sortChange.pipe(filter(() => !this.sort.disabled)).subscribe(() => (this.paginator.pageIndex = 0)));
39613
39612
  }
39614
39613
  }
39615
- async editRowById(event, id, opts) {
39614
+ async editOrAddRowById(event, id, opts) {
39616
39615
  if (id < 0)
39617
39616
  return;
39618
39617
  if (id >= this.visibleRowCount) {
@@ -41379,6 +41378,12 @@ class AppAsyncTable {
41379
41378
  // Add row
41380
41379
  return this.addRow(event, undefined /* insertAt: use default */, opts);
41381
41380
  }
41381
+ /**
41382
+ * Same as confirmAndUp(), but using the next focused row. Should be call by the action column components
41383
+ * @param event
41384
+ * @param row
41385
+ * @param opts
41386
+ */
41382
41387
  async confirmAndBackward(event, row, opts) {
41383
41388
  const focusColumn = opts?.focusColumn ?? this.lastUserColumn;
41384
41389
  // Deleting edited row, if empty and not dirty
@@ -41387,8 +41392,8 @@ class AppAsyncTable {
41387
41392
  await this.deleteNewRow(event, editingRow);
41388
41393
  }
41389
41394
  // Wait deletion is done, then edit previous row (by id, because of reloading)
41390
- await this.waitIdle();
41391
- await this.editRowById(event, row.id, { focusColumn });
41395
+ await this.waitIdle(opts);
41396
+ await this.editOrAddRowById(event, row.id, { focusColumn });
41392
41397
  return true;
41393
41398
  }
41394
41399
  // Edit row, focusing at the end
@@ -41408,7 +41413,35 @@ class AppAsyncTable {
41408
41413
  return false;
41409
41414
  }
41410
41415
  // Edit next row
41411
- await this.editRowById(event, row.id + 1, { focusColumn });
41416
+ await this.editOrAddRowById(event, row.id + 1, { focusColumn });
41417
+ return true;
41418
+ }
41419
+ /**
41420
+ * Confirms the current row and moves the focus to the upper row.
41421
+ * Typical usage is inside a <input type="number">, with `(keyup.arrowUp)="confirmAndUp(event, row, {focusColumn: columnName})"`
41422
+ * Same as confirmAndBackward, but on the current row.
41423
+ *
41424
+ *
41425
+ * @param {Event} [event] - The event associated with the confirmation and update action.
41426
+ * @param {AsyncTableElement} [row] - The current row object.
41427
+ * @param {Object} [opts] - Options.
41428
+ * @param {string} [opts.focusColumn] - The column to focus on the upper row; defaults to the current focus column
41429
+ * @return {Promise<boolean>} A promise that resolves to a boolean indicating the success of the navigation.
41430
+ */
41431
+ async confirmAndUp(event, row, opts) {
41432
+ const focusColumn = opts?.focusColumn ?? this.focusColumn;
41433
+ // Deleting edited row, if empty and not dirty
41434
+ if (this.dataSource.hasSomeEditingRow()) {
41435
+ for (const editingRow of this.dataSource.getEditingRows().filter((row) => row.id === -1 && row.invalid && !row.dirty)) {
41436
+ await this.deleteNewRow(event, editingRow);
41437
+ }
41438
+ // Wait deletion is done, then edit previous row (by id, because of reloading)
41439
+ await this.waitIdle(opts);
41440
+ await this.editOrAddRowById(event, row.id - 1, { focusColumn });
41441
+ return true;
41442
+ }
41443
+ // Edit row, focusing at the end
41444
+ await this.editRow(event, row, { focusColumn });
41412
41445
  return true;
41413
41446
  }
41414
41447
  /**
@@ -42402,7 +42435,7 @@ class AppAsyncTable {
42402
42435
  this.registerSubscription(this.sort.sortChange.pipe(filter(() => !this.sort.disabled)).subscribe(() => (this.paginator.pageIndex = 0)));
42403
42436
  }
42404
42437
  }
42405
- async editRowById(event, id, opts) {
42438
+ async editOrAddRowById(event, id, opts) {
42406
42439
  if (id < 0)
42407
42440
  return;
42408
42441
  if (id >= this.visibleRowCount) {