ngx-mask 16.0.7 → 16.0.8

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.
@@ -196,7 +196,9 @@ class NgxMaskDirective {
196
196
  ? this._maskValue.length -
197
197
  this._maskService.checkSpecialCharAmount(this._maskValue) -
198
198
  counterOfOpt
199
- : this._maskValue.length - counterOfOpt;
199
+ : this.prefix
200
+ ? this._maskValue.length + this.prefix.length - counterOfOpt
201
+ : this._maskValue.length - counterOfOpt;
200
202
  if (value.toString().length < length) {
201
203
  return this._createValidationError(value);
202
204
  }
@@ -648,4 +650,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImpor
648
650
  type: HostListener,
649
651
  args: ['keydown', ['$event']]
650
652
  }] } });
651
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1hc2suZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hc2stbGliL3NyYy9saWIvbmd4LW1hc2suZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdILGFBQWEsRUFDYixpQkFBaUIsR0FHcEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4QixPQUFPLEVBQVcsZUFBZSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFFcEQsTUFrQmEsZ0JBQWdCO0lBbEI3QjtRQW1CSSwyREFBMkQ7UUFDckMsbUJBQWMsR0FBOEIsRUFBRSxDQUFDO1FBRXJELHNCQUFpQixHQUFpQyxFQUFFLENBQUM7UUFFckQsYUFBUSxHQUF3QixFQUFFLENBQUM7UUFFbkMsV0FBTSxHQUFzQixFQUFFLENBQUM7UUFFL0IsV0FBTSxHQUFzQixFQUFFLENBQUM7UUFFL0Isc0JBQWlCLEdBQWlDLEdBQUcsQ0FBQztRQUV0RCxrQkFBYSxHQUE2QixHQUFHLENBQUM7UUFFOUMsMEJBQXFCLEdBQTRDLElBQUksQ0FBQztRQUV0RSxnQkFBVyxHQUFrQyxJQUFJLENBQUM7UUFFbEQsa0JBQWEsR0FBb0MsSUFBSSxDQUFDO1FBRXRELHlCQUFvQixHQUEyQyxJQUFJLENBQUM7UUFFcEUsd0JBQW1CLEdBQTBDLElBQUksQ0FBQztRQUVsRSxpQkFBWSxHQUFtQyxJQUFJLENBQUM7UUFFcEQsb0JBQWUsR0FBc0MsSUFBSSxDQUFDO1FBRTFELGVB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QUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVFuQyxNQUFNO3NCQURaLFlBQVk7dUJBQUMsTUFBTTtnQkFTYixPQUFPO3NCQURiLFlBQVk7dUJBQUMsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWlFMUIsU0FBUztzQkFEZixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgRGlyZWN0aXZlLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIEZvcm1Db250cm9sLFxuICAgIE5HX1ZBTElEQVRPUlMsXG4gICAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgVmFsaWRhdGlvbkVycm9ycyxcbiAgICBWYWxpZGF0b3IsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgQ3VzdG9tS2V5Ym9hcmRFdmVudCB9IGZyb20gJy4vY3VzdG9tLWtleWJvYXJkLWV2ZW50JztcbmltcG9ydCB7IElDb25maWcsIE5HWF9NQVNLX0NPTkZJRywgdGltZU1hc2tzLCB3aXRob3V0VmFsaWRhdGlvbiB9IGZyb20gJy4vbmd4LW1hc2suY29uZmlnJztcbmltcG9ydCB7IE5neE1hc2tTZXJ2aWNlIH0gZnJvbSAnLi9uZ3gtbWFzay5zZXJ2aWNlJztcblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdpbnB1dFttYXNrXSwgdGV4dGFyZWFbbWFza10nLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IE5neE1hc2tEaXJlY3RpdmUsXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBOZ3hNYXNrRGlyZWN0aXZlLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIE5neE1hc2tTZXJ2aWNlLFxuICAgIF0sXG4gICAgZXhwb3J0QXM6ICdtYXNrLG5neE1hc2snLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hNYXNrRGlyZWN0aXZlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcywgVmFsaWRhdG9yIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0LXJlbmFtZVxuICAgIEBJbnB1dCgnbWFzaycpIHB1YmxpYyBtYXNrRXhwcmVzc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCA9ICcnO1xuXG4gICAgQElucHV0KCkgcHVibGljIHNwZWNpYWxDaGFyYWN0ZXJzOiBJQ29uZmlnWydzcGVjaWFsQ2hhcmFjdGVycyddID0gW107XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgcGF0dGVybnM6IElDb25maWdbJ3BhdHRlcm5zJ10gPSB7fTtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBwcmVmaXg6IElDb25maWdbJ3ByZWZpeCddID0gJyc7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgc3VmZml4OiBJQ29uZmlnWydzdWZmaXgnXSA9ICcnO1xuXG4gICAgQElucHV0KCkgcHVibGljIHRob3VzYW5kU2VwYXJhdG9yOiBJQ29uZmlnWyd0aG91c2FuZFNlcGFyYXRvciddID0gJyAnO1xuXG4gICAgQElucHV0KCkgcHVibGljIGRlY2ltYWxNYXJrZXI6IElDb25maWdbJ2RlY2ltYWxNYXJrZXInXSA9ICcuJztcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBkcm9wU3BlY2lhbENoYXJhY3RlcnM6IElDb25maWdbJ2Ryb3BTcGVjaWFsQ2hhcmFjdGVycyddIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgaGlkZGVuSW5wdXQ6IElDb25maWdbJ2hpZGRlbklucHV0J10gfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBzaG93TWFza1R5cGVkOiBJQ29uZmlnWydzaG93TWFza1R5cGVkJ10gfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBwbGFjZUhvbGRlckNoYXJhY3RlcjogSUNvbmZpZ1sncGxhY2VIb2xkZXJDaGFyYWN0ZXInXSB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KCkgcHVibGljIHNob3duTWFza0V4cHJlc3Npb246IElDb25maWdbJ3Nob3duTWFza0V4cHJlc3Npb24nXSB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KCkgcHVibGljIHNob3dUZW1wbGF0ZTogSUNvbmZpZ1snc2hvd1RlbXBsYXRlJ10gfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBjbGVhcklmTm90TWF0Y2g6IElDb25maWdbJ2NsZWFySWZOb3RNYXRjaCddIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgdmFsaWRhdGlvbjogSUNvbmZpZ1sndmFsaWRhdGlvbiddIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgc2VwYXJhdG9yTGltaXQ6IElDb25maWdbJ3NlcGFyYXRvckxpbWl0J10gfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBhbGxvd05lZ2F0aXZlTnVtYmVyczogSUNvbmZpZ1snYWxsb3dOZWdhdGl2ZU51bWJlcnMnXSB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KCkgcHVibGljIGxlYWRaZXJvRGF0ZVRpbWU6IElDb25maWdbJ2xlYWRaZXJvRGF0ZVRpbWUnXSB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KCkgcHVibGljIHRyaWdnZXJPbk1hc2tDaGFuZ2U6IElDb25maWdbJ3RyaWdnZXJPbk1hc2tDaGFuZ2UnXSB8IG51bGwgPSBudWxsO1xuXG4gICAgQE91dHB1dCgpIHB1YmxpYyBtYXNrRmlsbGVkOiBJQ29uZmlnWydtYXNrRmlsbGVkJ10gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICBwcml2YXRlIF9tYXNrVmFsdWUgPSAnJztcblxuICAgIHByaXZhdGUgX2lucHV0VmFsdWUhOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIF9wb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcml2YXRlIF9zdGFydCE6IG51bWJlcjtcblxuICAgIHByaXZhdGUgX2VuZCE6IG51bWJlcjtcblxuICAgIHByaXZhdGUgX2NvZGUhOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIF9tYXNrRXhwcmVzc2lvbkFycmF5OiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSBfanVzdFBhc3RlZCA9IGZhbHNlO1xuXG4gICAgLyoqRm9yIElNRSBjb21wb3NpdGlvbiBldmVudCAqL1xuICAgIHByaXZhdGUgX2lzQ29tcG9zaW5nID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcblxuICAgIHB1YmxpYyBfbWFza1NlcnZpY2UgPSBpbmplY3QoTmd4TWFza1NlcnZpY2UsIHsgc2VsZjogdHJ1ZSB9KTtcblxuICAgIHByb3RlY3RlZCBfY29uZmlnID0gaW5qZWN0PElDb25maWc+KE5HWF9NQVNLX0NPTkZJRyk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHVibGljIG9uQ2hhbmdlID0gKF86IGFueSkgPT4ge307XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgcHVibGljIG9uVG91Y2ggPSAoKSA9PiB7fTtcblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIG1hc2tFeHByZXNzaW9uLFxuICAgICAgICAgICAgc3BlY2lhbENoYXJhY3RlcnMsXG4gICAgICAgICAgICBwYXR0ZXJucyxcbiAgICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICAgIHN1ZmZpeCxcbiAgICAgICAgICAgIHRob3VzYW5kU2VwYXJhdG9yLFxuICAgICAgICAgICAgZGVjaW1hbE1hcmtlcixcbiAgICAgICAgICAgIGRyb3BTcGVjaWFsQ2hhcmFjdGVycyxcbiAgICAgICAgICAgIGhpZGRlbklucHV0LFxuICAgICAgICAgICAgc2hvd01hc2tUeXBlZCxcbiAgICAgICAgICAgIHBsYWNlSG9sZGVyQ2hhcmFjdGVyLFxuICAgICAgICAgICAgc2hvd25NYXNrRXhwcmVzc2lvbixcbiAgICAgICAgICAgIHNob3dUZW1wbGF0ZSxcbiAgICAgICAgICAgIGNsZWFySWZOb3RNYXRjaCxcbiAgICAgICAgICAgIHZhbGlkYXRpb24sXG4gICAgICAgICAgICBzZXBhcmF0b3JMaW1pdCxcbiAgICAgICAgICAgIGFsbG93TmVnYXRpdmVOdW1iZXJzLFxuICAgICAgICAgICAgbGVhZFplcm9EYXRlVGltZSxcbiAgICAgICAgICAgIHRyaWdnZXJPbk1hc2tDaGFuZ2UsXG4gICAgICAgIH0gPSBjaGFuZ2VzO1xuICAgICAgICBpZiAobWFza0V4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBtYXNrRXhwcmVzc2lvbi5jdXJyZW50VmFsdWUgIT09IG1hc2tFeHByZXNzaW9uLnByZXZpb3VzVmFsdWUgJiZcbiAgICAgICAgICAgICAgICAhbWFza0V4cHJlc3Npb24uZmlyc3RDaGFuZ2VcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhbGxvd05lZ2F0aXZlTnVtYmVycykge1xuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFsbG93TmVnYXRpdmVOdW1iZXJzID0gYWxsb3dOZWdhdGl2ZU51bWJlcnMuY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXNrU2VydmljZS5hbGxvd05lZ2F0aXZlTnVtYmVycykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5zcGVjaWFsQ2hhcmFjdGVycyA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5zcGVjaWFsQ2hhcmFjdGVycy5maWx0ZXIoKGM6IHN0cmluZykgPT4gYyAhPT0gJy0nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWFza0V4cHJlc3Npb24uY3VycmVudFZhbHVlICYmIG1hc2tFeHByZXNzaW9uLmN1cnJlbnRWYWx1ZS5zcGxpdCgnfHwnKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza0V4cHJlc3Npb25BcnJheSA9IG1hc2tFeHByZXNzaW9uLmN1cnJlbnRWYWx1ZVxuICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJ3x8JylcbiAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGE6IHN0cmluZywgYjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5sZW5ndGggLSBiLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0TWFzaygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrRXhwcmVzc2lvbkFycmF5ID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza1ZhbHVlID0gbWFza0V4cHJlc3Npb24uY3VycmVudFZhbHVlIHx8ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tFeHByZXNzaW9uID0gdGhpcy5fbWFza1ZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzcGVjaWFsQ2hhcmFjdGVycykge1xuICAgICAgICAgICAgaWYgKCFzcGVjaWFsQ2hhcmFjdGVycy5jdXJyZW50VmFsdWUgfHwgIUFycmF5LmlzQXJyYXkoc3BlY2lhbENoYXJhY3RlcnMuY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2Uuc3BlY2lhbENoYXJhY3RlcnMgPSBzcGVjaWFsQ2hhcmFjdGVycy5jdXJyZW50VmFsdWUgfHwgW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gT25seSBvdmVyd3JpdGUgdGhlIG1hc2sgYXZhaWxhYmxlIHBhdHRlcm5zIGlmIGEgcGF0dGVybiBoYXMgYWN0dWFsbHkgYmVlbiBwYXNzZWQgaW5cbiAgICAgICAgaWYgKHBhdHRlcm5zICYmIHBhdHRlcm5zLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UucGF0dGVybnMgPSBwYXR0ZXJucy5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZWZpeCkge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UucHJlZml4ID0gcHJlZml4LmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VmZml4KSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5zdWZmaXggPSBzdWZmaXguY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aG91c2FuZFNlcGFyYXRvcikge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UudGhvdXNhbmRTZXBhcmF0b3IgPSB0aG91c2FuZFNlcGFyYXRvci5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlY2ltYWxNYXJrZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmRlY2ltYWxNYXJrZXIgPSBkZWNpbWFsTWFya2VyLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZHJvcFNwZWNpYWxDaGFyYWN0ZXJzKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5kcm9wU3BlY2lhbENoYXJhY3RlcnMgPSBkcm9wU3BlY2lhbENoYXJhY3RlcnMuY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoaWRkZW5JbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuaGlkZGVuSW5wdXQgPSBoaWRkZW5JbnB1dC5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3dNYXNrVHlwZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnNob3dNYXNrVHlwZWQgPSBzaG93TWFza1R5cGVkLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGxhY2VIb2xkZXJDaGFyYWN0ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnBsYWNlSG9sZGVyQ2hhcmFjdGVyID0gcGxhY2VIb2xkZXJDaGFyYWN0ZXIuY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaG93bk1hc2tFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5zaG93bk1hc2tFeHByZXNzaW9uID0gc2hvd25NYXNrRXhwcmVzc2lvbi5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3dUZW1wbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2Uuc2hvd1RlbXBsYXRlID0gc2hvd1RlbXBsYXRlLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2xlYXJJZk5vdE1hdGNoKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5jbGVhcklmTm90TWF0Y2ggPSBjbGVhcklmTm90TWF0Y2guY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS52YWxpZGF0aW9uID0gdmFsaWRhdGlvbi5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlcGFyYXRvckxpbWl0KSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5zZXBhcmF0b3JMaW1pdCA9IHNlcGFyYXRvckxpbWl0LmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGVhZFplcm9EYXRlVGltZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubGVhZFplcm9EYXRlVGltZSA9IGxlYWRaZXJvRGF0ZVRpbWUuY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmlnZ2VyT25NYXNrQ2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS50cmlnZ2VyT25NYXNrQ2hhbmdlID0gdHJpZ2dlck9uTWFza0NoYW5nZS5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9hcHBseU1hc2soKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICAgIHB1YmxpYyB2YWxpZGF0ZSh7IHZhbHVlIH06IEZvcm1Db250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMuX21hc2tTZXJ2aWNlLnZhbGlkYXRpb24gfHwgIXRoaXMuX21hc2tWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX21hc2tTZXJ2aWNlLmlwRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVWYWxpZGF0aW9uRXJyb3IodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9tYXNrU2VydmljZS5jcGZDbnBqRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVWYWxpZGF0aW9uRXJyb3IodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9tYXNrVmFsdWUuc3RhcnRzV2l0aCgnc2VwYXJhdG9yJykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh3aXRob3V0VmFsaWRhdGlvbi5pbmNsdWRlcyh0aGlzLl9tYXNrVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fbWFza1NlcnZpY2UuY2xlYXJJZk5vdE1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGltZU1hc2tzLmluY2x1ZGVzKHRoaXMuX21hc2tWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0ZVRpbWUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50b1N0cmluZygpLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICBsZXQgY291bnRlck9mT3B0ID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuX21hc2tTZXJ2aWNlLnBhdHRlcm5zKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21hc2tTZXJ2aWNlLnBhdHRlcm5zW2tleV0/Lm9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZihrZXkpICE9PSB0aGlzLl9tYXNrVmFsdWUubGFzdEluZGV4T2Yoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0OiBzdHJpbmcgPSB0aGlzLl9tYXNrVmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoaTogc3RyaW5nKSA9PiBpID09PSBrZXkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlck9mT3B0ICs9IG9wdC5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbWFza1ZhbHVlLmluZGV4T2Yoa2V5KSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJPZk9wdCsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tWYWx1ZS5pbmRleE9mKGtleSkgIT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS50b1N0cmluZygpLmxlbmd0aCA+PSB0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZihrZXkpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJPZk9wdCA9PT0gdGhpcy5fbWFza1ZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza1ZhbHVlLmluZGV4T2YoJ3snKSA9PT0gMSAmJlxuICAgICAgICAgICAgICAgIHZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoID09PVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrVmFsdWUubGVuZ3RoICtcbiAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlcigodGhpcy5fbWFza1ZhbHVlLnNwbGl0KCd7JylbMV0gPz8gJycpLnNwbGl0KCd9JylbMF0pIC1cbiAgICAgICAgICAgICAgICAgICAgICAgIDRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX21hc2tWYWx1ZS5pbmRleE9mKCcqJykgPT09IDEgfHwgdGhpcy5fbWFza1ZhbHVlLmluZGV4T2YoJz8nKSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAodGhpcy5fbWFza1ZhbHVlLmluZGV4T2YoJyonKSA+IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcoKS5sZW5ndGggPCB0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZignKicpKSB8fFxuICAgICAgICAgICAgICAgICh0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZignPycpID4gMSAmJlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS50b1N0cmluZygpLmxlbmd0aCA8IHRoaXMuX21hc2tWYWx1ZS5pbmRleE9mKCc/JykpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza1ZhbHVlLmluZGV4T2YoJ3snKSA9PT0gMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVZhbGlkYXRpb25FcnJvcih2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fbWFza1ZhbHVlLmluZGV4T2YoJyonKSA9PT0gLTEgfHwgdGhpcy5fbWFza1ZhbHVlLmluZGV4T2YoJz8nKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGg6IG51bWJlciA9IHRoaXMuX21hc2tTZXJ2aWNlLmRyb3BTcGVjaWFsQ2hhcmFjdGVyc1xuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuX21hc2tWYWx1ZS5sZW5ndGggLVxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmNoZWNrU3BlY2lhbENoYXJBbW91bnQodGhpcy5fbWFza1ZhbHVlKSAtXG4gICAgICAgICAgICAgICAgICAgICAgY291bnRlck9mT3B0XG4gICAgICAgICAgICAgICAgICAgIDogdGhpcy5fbWFza1ZhbHVlLmxlbmd0aCAtIGNvdW50ZXJPZk9wdDtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUudG9TdHJpbmcoKS5sZW5ndGggPCBsZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVZhbGlkYXRpb25FcnJvcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5tYXNrRmlsbGVkLmVtaXQoKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3Bhc3RlJylcbiAgICBwdWJsaWMgb25QYXN0ZSgpIHtcbiAgICAgICAgdGhpcy5fanVzdFBhc3RlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignbmdNb2RlbENoYW5nZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uTW9kZWxDaGFuZ2UodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwgfCBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgLy8gb24gZm9ybSByZXNldCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgYWN0dWFsVmFsdWVcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuYWN0dWFsVmFsdWVcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hY3R1YWxWYWx1ZSA9IHRoaXMuX21hc2tTZXJ2aWNlLmdldEFjdHVhbFZhbHVlKCcnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2lucHV0JywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25JbnB1dChlOiBDdXN0b21LZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIC8vIElmIElNRSBpcyBjb21wb3NpbmcgdGV4dCwgd2Ugd2FpdCBmb3IgdGhlIGNvbXBvc2VkIHRleHQuXG4gICAgICAgIGlmICh0aGlzLl9pc0NvbXBvc2luZykgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGVsOiBIVE1MSW5wdXRFbGVtZW50ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgdGhpcy5faW5wdXRWYWx1ZSA9IGVsLnZhbHVlO1xuXG4gICAgICAgIHRoaXMuX3NldE1hc2soKTtcblxuICAgICAgICBpZiAoIXRoaXMuX21hc2tWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZShlbC52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBvc2l0aW9uOiBudW1iZXIgPVxuICAgICAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPT09IDFcbiAgICAgICAgICAgICAgICA/IChlbC5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpICsgdGhpcy5fbWFza1NlcnZpY2UucHJlZml4Lmxlbmd0aFxuICAgICAgICAgICAgICAgIDogKGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcik7XG5cbiAgICAgICAgbGV0IGNhcmV0U2hpZnQgPSAwO1xuICAgICAgICBsZXQgYmFja3NwYWNlU2hpZnQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuYXBwbHlWYWx1ZUNoYW5nZXMoXG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIHRoaXMuX2p1c3RQYXN0ZWQsXG4gICAgICAgICAgICB0aGlzLl9jb2RlID09PSAnQmFja3NwYWNlJyB8fCB0aGlzLl9jb2RlID09PSAnRGVsZXRlJyxcbiAgICAgICAgICAgIChzaGlmdDogbnVtYmVyLCBfYmFja3NwYWNlU2hpZnQ6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9qdXN0UGFzdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY2FyZXRTaGlmdCA9IHNoaWZ0O1xuICAgICAgICAgICAgICAgIGJhY2tzcGFjZVNoaWZ0ID0gX2JhY2tzcGFjZVNoaWZ0O1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICAvLyBvbmx5IHNldCB0aGUgc2VsZWN0aW9uIGlmIHRoZSBlbGVtZW50IGlzIGFjdGl2ZVxuICAgICAgICBpZiAodGhpcy5fZ2V0QWN0aXZlRWxlbWVudCgpICE9PSBlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdXBkYXRlIHBvc2l0aW9uIGFmdGVyIGFwcGx5VmFsdWVDaGFuZ2VzIHRvIHByZXZlbnQgY3Vyc29yIG9uIHdyb25nIHBvc2l0aW9uIHdoZW4gaXQgaGFzIGFuIGFycmF5IG9mIG1hc2tFeHByZXNzaW9uXG4gICAgICAgIGlmICh0aGlzLl9tYXNrRXhwcmVzc2lvbkFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgcG9zaXRpb24gPVxuICAgICAgICAgICAgICAgIGVsLnNlbGVjdGlvblN0YXJ0ID09PSAxXG4gICAgICAgICAgICAgICAgICAgID8gKGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcikgKyB0aGlzLl9tYXNrU2VydmljZS5wcmVmaXgubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgIDogKGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wb3NpdGlvbiA9XG4gICAgICAgICAgICB0aGlzLl9wb3NpdGlvbiA9PT0gMSAmJiB0aGlzLl9pbnB1dFZhbHVlLmxlbmd0aCA9PT0gMSA/IG51bGwgOiB0aGlzLl9wb3NpdGlvbjtcblxuICAgICAgICBsZXQgcG9zaXRpb25Ub0FwcGx5OiBudW1iZXIgPSB0aGlzLl9wb3NpdGlvblxuICAgICAgICAgICAgPyB0aGlzLl9pbnB1dFZhbHVlLmxlbmd0aCArIHBvc2l0aW9uICsgY2FyZXRTaGlmdFxuICAgICAgICAgICAgOiBwb3NpdGlvbiArICh0aGlzLl9jb2RlID09PSAnQmFja3NwYWNlJyAmJiAhYmFja3NwYWNlU2hpZnQgPyAwIDogY2FyZXRTaGlmdCk7XG4gICAgICAgIGlmIChwb3NpdGlvblRvQXBwbHkgPiB0aGlzLl9nZXRBY3R1YWxJbnB1dExlbmd0aCgpKSB7XG4gICAgICAgICAgICBwb3NpdGlvblRvQXBwbHkgPSB0aGlzLl9nZXRBY3R1YWxJbnB1dExlbmd0aCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwb3NpdGlvblRvQXBwbHkgPCAwKSB7XG4gICAgICAgICAgICBwb3NpdGlvblRvQXBwbHkgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlKHBvc2l0aW9uVG9BcHBseSwgcG9zaXRpb25Ub0FwcGx5KTtcbiAgICAgICAgdGhpcy5fcG9zaXRpb24gPSBudWxsO1xuICAgIH1cblxuICAgIC8vIElNRSBzdGFydHNcbiAgICBASG9zdExpc3RlbmVyKCdjb21wb3NpdGlvbnN0YXJ0JywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25Db21wb3NpdGlvblN0YXJ0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9pc0NvbXBvc2luZyA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gSU1FIGNvbXBsZXRlc1xuICAgIEBIb3N0TGlzdGVuZXIoJ2NvbXBvc2l0aW9uZW5kJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25Db21wb3NpdGlvbkVuZChlOiBDdXN0b21LZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2lzQ29tcG9zaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2p1c3RQYXN0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLm9uSW5wdXQoZSk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignYmx1cicpXG4gICAgcHVibGljIG9uQmx1cigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX21hc2tWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuY2xlYXJJZk5vdE1hdGNoRm4oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uVG91Y2goKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uQ2xpY2soZTogTW91c2VFdmVudCB8IEN1c3RvbUtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tYXNrVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlbDogSFRNTElucHV0RWxlbWVudCA9IGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHBvc1N0YXJ0ID0gMDtcbiAgICAgICAgY29uc3QgcG9zRW5kID0gMDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZWwgIT09IG51bGwgJiZcbiAgICAgICAgICAgIGVsLnNlbGVjdGlvblN0YXJ0ICE9PSBudWxsICYmXG4gICAgICAgICAgICBlbC5zZWxlY3Rpb25TdGFydCA9PT0gZWwuc2VsZWN0aW9uRW5kICYmXG4gICAgICAgICAgICBlbC5zZWxlY3Rpb25TdGFydCA+IHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeC5sZW5ndGggJiZcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgKGUgYXMgYW55KS5rZXlDb2RlICE9PSAzOFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXNrU2VydmljZS5zaG93TWFza1R5cGVkKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgYXJlIHNob3dpbmcgdGhlIG1hc2sgaW4gdGhlIGlucHV0XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubWFza0lzU2hvd24gPSB0aGlzLl9tYXNrU2VydmljZS5zaG93TWFza0luSW5wdXQoKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeCArIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tJc1Nob3duID09PSBlbC52YWx1ZVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgT05MWSBjb250YWlucyB0aGUgbWFzaywgc28gcG9zaXRpb24gdGhlIGN1cnNvciBhdCB0aGUgc3RhcnRcbiAgICAgICAgICAgICAgICAgICAgZWwuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgZWwuc2V0U2VsZWN0aW9uUmFuZ2UocG9zU3RhcnQsIHBvc0VuZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGlucHV0IGNvbnRhaW5zIHNvbWUgY2hhcmFjdGVycyBhbHJlYWR5XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbC5zZWxlY3Rpb25TdGFydCA+IHRoaXMuX21hc2tTZXJ2aWNlLmFjdHVhbFZhbHVlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHVzZXIgY2xpY2tlZCBiZXlvbmQgb3VyIHZhbHVlJ3MgbGVuZ3RoLCBwb3NpdGlvbiB0aGUgY3Vyc29yIGF0IHRoZSBlbmQgb2Ygb3VyIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5zZXRTZWxlY3Rpb25SYW5nZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hY3R1YWxWYWx1ZS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuYWN0dWFsVmFsdWUubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5leHRWYWx1ZTogc3RyaW5nIHwgbnVsbCA9XG4gICAgICAgICAgICBlbCAmJlxuICAgICAgICAgICAgKCFlbC52YWx1ZSB8fCBlbC52YWx1ZSA9PT0gdGhpcy5fbWFza1NlcnZpY2UucHJlZml4XG4gICAgICAgICAgICAgICAgPyB0aGlzLl9tYXNrU2VydmljZS5wcmVmaXggKyB0aGlzLl9tYXNrU2VydmljZS5tYXNrSXNTaG93blxuICAgICAgICAgICAgICAgIDogZWwudmFsdWUpO1xuICAgICAgICAvKiogRml4IG9mIGN1cnNvciBwb3NpdGlvbiBqdW1waW5nIHRvIGVuZCBpbiBtb3N0IGJyb3dzZXJzIG5vIG1hdHRlciB3aGVyZSBjdXJzb3IgaXMgaW5zZXJ0ZWQgb25Gb2N1cyAqL1xuICAgICAgICBpZiAoZWwgJiYgZWwudmFsdWUgIT09IG5leHRWYWx1ZSkge1xuICAgICAgICAgICAgZWwudmFsdWUgPSBuZXh0VmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKiogZml4IG9mIGN1cnNvciBwb3NpdGlvbiB3aXRoIHByZWZpeCB3aGVuIG1vdXNlIGNsaWNrIG9jY3VyICovXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGVsICYmXG4gICAgICAgICAgICAoKGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcikgfHwgKGVsLnNlbGVjdGlvbkVuZCBhcyBudW1iZXIpKSA8PVxuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeC5sZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBlbC5zZWxlY3Rpb25TdGFydCA9IHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeC5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLyoqIHNlbGVjdCBvbmx5IGluc2VydGVkIHRleHQgKi9cbiAgICAgICAgaWYgKGVsICYmIChlbC5zZWxlY3Rpb25FbmQgYXMgbnVtYmVyKSA+IHRoaXMuX2dldEFjdHVhbElucHV0TGVuZ3RoKCkpIHtcbiAgICAgICAgICAgIGVsLnNlbGVjdGlvbkVuZCA9IHRoaXMuX2dldEFjdHVhbElucHV0TGVuZ3RoKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleURvd24oZTogQ3VzdG9tS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX21hc2tWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2lzQ29tcG9zaW5nKSB7XG4gICAgICAgICAgICAvLyBVc2VyIGZpbmFsaXplIHRoZWlyIGNob2ljZSBmcm9tIElNRSBjb21wb3NpdGlvbiwgc28gdHJpZ2dlciBvbklucHV0KCkgZm9yIHRoZSBjb21wb3NlZCB0ZXh0LlxuICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSB0aGlzLm9uQ29tcG9zaXRpb25FbmQoZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9jb2RlID0gZS5jb2RlID8gZS5jb2RlIDogZS5rZXk7XG4gICAgICAgIGNvbnN0IGVsOiBIVE1MSW5wdXRFbGVtZW50ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgdGhpcy5faW5wdXRWYWx1ZSA9IGVsLnZhbHVlO1xuXG4gICAgICAgIHRoaXMuX3NldE1hc2soKTtcblxuICAgICAgICBpZiAoZS5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGUua2V5ID09PSAnQXJyb3dMZWZ0JyB8fCBlLmtleSA9PT0gJ0JhY2tzcGFjZScgfHwgZS5rZXkgPT09ICdEZWxldGUnKSB7XG4gICAgICAgICAgICBpZiAoZS5rZXkgPT09ICdCYWNrc3BhY2UnICYmIGVsLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGVsLnNlbGVjdGlvblN0YXJ0ID0gZWwuc2VsZWN0aW9uRW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnQmFja3NwYWNlJyAmJiAoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHNwZWNpYWxDaGFycyBpcyBmYWxzZSwgKHNob3VsZG4ndCBldmVyIGhhcHBlbikgdGhlbiBzZXQgdG8gdGhlIGRlZmF1bHRzXG4gICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsQ2hhcmFjdGVycyA9IHRoaXMuc3BlY2lhbENoYXJhY3RlcnM/Lmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuc3BlY2lhbENoYXJhY3RlcnNcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9jb25maWcuc3BlY2lhbENoYXJhY3RlcnM7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJlZml4Lmxlbmd0aCA+IDEgJiYgKGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcikgPD0gdGhpcy5wcmVmaXgubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlKHRoaXMucHJlZml4Lmxlbmd0aCwgZWwuc2VsZWN0aW9uRW5kKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dFZhbHVlLmxlbmd0aCAhPT0gKGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChlbC5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpICE9PSAxXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BlY2lhbENoYXJhY3RlcnMuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0VmFsdWVbKGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcikgLSAxXSA/PyAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0aGlzLnByZWZpeC5sZW5ndGggPj0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKSA+IHRoaXMucHJlZml4Lmxlbmd0aCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVmaXgubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuc2V0U2VsZWN0aW9uUmFuZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbC5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpIC0gMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuc2VsZWN0aW9uRW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY2hlY2tTZWxlY3Rpb25PbkRlbGV0aW9uKGVsKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5wcmVmaXgubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgKGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcikgPD0gdGhpcy5fbWFza1NlcnZpY2UucHJlZml4Lmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgIChlbC5zZWxlY3Rpb25FbmQgYXMgbnVtYmVyKSA8PSB0aGlzLl9tYXNrU2VydmljZS5wcmVmaXgubGVuZ3RoXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBjdXJzb3JTdGFydDogbnVtYmVyIHwgbnVsbCA9IGVsLnNlbGVjdGlvblN0YXJ0O1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGUua2V5ID09PSAnQmFja3NwYWNlJyAmJlxuICAgICAgICAgICAgICAgICFlbC5yZWFkT25seSAmJlxuICAgICAgICAgICAgICAgIGN1cnNvclN0YXJ0ID09PSAwICYmXG4gICAgICAgICAgICAgICAgZWwuc2VsZWN0aW9uRW5kID09PSBlbC52YWx1ZS5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICBlbC52YWx1ZS5sZW5ndGggIT09IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uID0gdGhpcy5fbWFza1NlcnZpY2UucHJlZml4ID8gdGhpcy5fbWFza1NlcnZpY2UucHJlZml4Lmxlbmd0aCA6IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuYXBwbHlNYXNrKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5wcmVmaXgsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tFeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3NpdGlvblxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgISF0aGlzLnN1ZmZpeCAmJlxuICAgICAgICAgICAgdGhpcy5zdWZmaXgubGVuZ3RoID4gMSAmJlxuICAgICAgICAgICAgdGhpcy5faW5wdXRWYWx1ZS5sZW5ndGggLSB0aGlzLnN1ZmZpeC5sZW5ndGggPCAoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlKFxuICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0VmFsdWUubGVuZ3RoIC0gdGhpcy5zdWZmaXgubGVuZ3RoLFxuICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0VmFsdWUubGVuZ3RoXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgKGUuY29kZSA9PT0gJ0tleUEnICYmIGUuY3RybEtleSkgfHxcbiAgICAgICAgICAgIChlLmNvZGUgPT09ICdLZXlBJyAmJiBlLm1ldGFLZXkpIC8vIENtZCArIEEgKE1hYylcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBlbC5zZXRTZWxlY3Rpb25SYW5nZSgwLCB0aGlzLl9nZXRBY3R1YWxJbnB1dExlbmd0aCgpKTtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5zZWxTdGFydCA9IGVsLnNlbGVjdGlvblN0YXJ0O1xuICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5zZWxFbmQgPSBlbC5zZWxlY3Rpb25FbmQ7XG4gICAgfVxuXG4gICAgLyoqIEl0IHdyaXRlcyB0aGUgdmFsdWUgaW4gdGhlIGlucHV0ICovXG4gICAgcHVibGljIGFzeW5jIHdyaXRlVmFsdWUoXG4gICAgICAgIGlucHV0VmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHsgdmFsdWU6IHN0cmluZyB8IG51bWJlcjsgZGlzYWJsZT86IGJvb2xlYW4gfVxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0VmFsdWUgPT09ICdvYmplY3QnICYmIGlucHV0VmFsdWUgIT09IG51bGwgJiYgJ3ZhbHVlJyBpbiBpbnB1dFZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoJ2Rpc2FibGUnIGluIGlucHV0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldERpc2FibGVkU3RhdGUoQm9vbGVhbihpbnB1dFZhbHVlLmRpc2FibGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgaW5wdXRWYWx1ZSA9IGlucHV0VmFsdWUudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGlucHV0VmFsdWUgPT09ICdudW1iZXInIHx8IHRoaXMuX21hc2tWYWx1ZS5zdGFydHNXaXRoKCdzZXBhcmF0b3InKSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICBpbnB1dFZhbHVlID0gdGhpcy5fbWFza1NlcnZpY2UubnVtYmVyVG9TdHJpbmcoaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5fbWFza1NlcnZpY2UuZGVjaW1hbE1hcmtlcikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2NhbGVEZWNpbWFsTWFya2VyID0gdGhpcy5fY3VycmVudExvY2FsZURlY2ltYWxNYXJrZXIoKTtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuZGVjaW1hbE1hcmtlciAhPT0gbG9jYWxlRGVjaW1hbE1hcmtlclxuICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnB1dFZhbHVlLnJlcGxhY2UobG9jYWxlRGVjaW1hbE1hcmtlciwgdGhpcy5fbWFza1NlcnZpY2UuZGVjaW1hbE1hcmtlcilcbiAgICAgICAgICAgICAgICAgICAgICAgIDogaW5wdXRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmlzTnVtYmVyVmFsdWUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dFZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICBpbnB1dFZhbHVlID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9pbnB1dFZhbHVlID0gaW5wdXRWYWx1ZTtcbiAgICAgICAgdGhpcy5fc2V0TWFzaygpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIChpbnB1dFZhbHVlICYmIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tFeHByZXNzaW9uKSB8fFxuICAgICAgICAgICAgKHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tFeHByZXNzaW9uICYmXG4gICAgICAgICAgICAgICAgKHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeCB8fCB0aGlzLl9tYXNrU2VydmljZS5zaG93TWFza1R5cGVkKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBMZXQgdGhlIHNlcnZpY2Ugd2Uga25vdyB3ZSBhcmUgd3JpdGluZyB2YWx1ZSBzbyB0aGF0IHRyaWdnZXJpbmcgb25DaGFuZ2UgZnVuY3Rpb24gd29uJ3QgaGFwcGVuIGR1cmluZyBhcHBseU1hc2tcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLndyaXRpbmdWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5mb3JtRWxlbWVudFByb3BlcnR5ID0gW1xuICAgICAgICAgICAgICAgICd2YWx1ZScsXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuYXBwbHlNYXNrKGlucHV0VmFsdWUsIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tFeHByZXNzaW9uKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICAvLyBMZXQgdGhlIHNlcnZpY2Uga25vdyB3ZSd2ZSBmaW5pc2hlZCB3cml0aW5nIHZhbHVlXG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS53cml0aW5nVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmZvcm1FbGVtZW50UHJvcGVydHkgPSBbJ3ZhbHVlJywgaW5wdXRWYWx1ZV07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faW5wdXRWYWx1ZSA9IGlucHV0VmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IHR5cGVvZiB0aGlzLm9uQ2hhbmdlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogdHlwZW9mIHRoaXMub25Ub3VjaCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2ggPSBmbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRBY3RpdmVFbGVtZW50KGRvY3VtZW50OiBEb2N1bWVudE9yU2hhZG93Um9vdCA9IHRoaXMuZG9jdW1lbnQpOiBFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHNoYWRvd1Jvb3RFbCA9IGRvY3VtZW50Py5hY3RpdmVFbGVtZW50Py5zaGFkb3dSb290O1xuICAgICAgICBpZiAoIXNoYWRvd1Jvb3RFbD8uYWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QWN0aXZlRWxlbWVudChzaGFkb3dSb290RWwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNoZWNrU2VsZWN0aW9uT25EZWxldGlvbihlbDogSFRNTElucHV0RWxlbWVudCk6IHZvaWQge1xuICAgICAgICBlbC5zZWxlY3Rpb25TdGFydCA9IE1hdGgubWluKFxuICAgICAgICAgICAgTWF0aC5tYXgodGhpcy5wcmVmaXgubGVuZ3RoLCBlbC5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpLFxuICAgICAgICAgICAgdGhpcy5faW5wdXRWYWx1ZS5sZW5ndGggLSB0aGlzLnN1ZmZpeC5sZW5ndGhcbiAgICAgICAgKTtcbiAgICAgICAgZWwuc2VsZWN0aW9uRW5kID0gTWF0aC5taW4oXG4gICAgICAgICAgICBNYXRoLm1heCh0aGlzLnByZWZpeC5sZW5ndGgsIGVsLnNlbGVjdGlvbkVuZCBhcyBudW1iZXIpLFxuICAgICAgICAgICAgdGhpcy5faW5wdXRWYWx1ZS5sZW5ndGggLSB0aGlzLnN1ZmZpeC5sZW5ndGhcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogSXQgZGlzYWJsZXMgdGhlIGlucHV0IGVsZW1lbnQgKi9cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmZvcm1FbGVtZW50UHJvcGVydHkgPSBbJ2Rpc2FibGVkJywgaXNEaXNhYmxlZF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVwZWF0UGF0dGVyblN5bWJvbHMobWFza0V4cDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChtYXNrRXhwLm1hdGNoKC97WzAtOV0rfS8pICYmXG4gICAgICAgICAgICAgICAgbWFza0V4cFxuICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJycpXG4gICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKGFjY3VtOiBzdHJpbmcsIGN1cnJWYWw6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFydCA9IGN1cnJWYWwgPT09ICd7JyA/IGluZGV4IDogdGhpcy5fc3RhcnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyVmFsICE9PSAnfScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbWFza1NlcnZpY2UuX2ZpbmRTcGVjaWFsQ2hhcihjdXJyVmFsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFjY3VtICsgY3VyclZhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFjY3VtO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5kID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXBlYXROdW1iZXIgPSBOdW1iZXIobWFza0V4cC5zbGljZSh0aGlzLl9zdGFydCArIDEsIHRoaXMuX2VuZCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVwbGFjZVdpdGg6IHN0cmluZyA9IG5ldyBBcnJheShyZXBlYXROdW1iZXIgKyAxKS5qb2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tFeHBbdGhpcy5fc3RhcnQgLSAxXVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bSArIHJlcGxhY2VXaXRoO1xuICAgICAgICAgICAgICAgICAgICB9LCAnJykpIHx8XG4gICAgICAgICAgICBtYXNrRXhwXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcml2YXRlIF9hcHBseU1hc2soKTogYW55IHtcbiAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubWFza0V4cHJlc3Npb24gPSB0aGlzLl9yZXBlYXRQYXR0ZXJuU3ltYm9scyh0aGlzLl9tYXNrVmFsdWUgfHwgJycpO1xuICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5mb3JtRWxlbWVudFByb3BlcnR5ID0gW1xuICAgICAgICAgICAgJ3ZhbHVlJyxcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFwcGx5TWFzayh0aGlzLl9pbnB1dFZhbHVlLCB0aGlzLl9tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbiksXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdmFsaWRhdGVUaW1lKHZhbHVlOiBzdHJpbmcpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHJvd01hc2tMZW46IG51bWJlciA9IHRoaXMuX21hc2tWYWx1ZVxuICAgICAgICAgICAgLnNwbGl0KCcnKVxuICAgICAgICAgICAgLmZpbHRlcigoczogc3RyaW5nKSA9PiBzICE9PSAnOicpLmxlbmd0aDtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIERvbid0IHZhbGlkYXRlIGVtcHR5IHZhbHVlcyB0byBhbGxvdyBmb3Igb3B0aW9uYWwgZm9ybSBjb250cm9sXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAoKyh2YWx1ZVt2YWx1ZS5sZW5ndGggLSAxXSA/PyAtMSkgPT09IDAgJiYgdmFsdWUubGVuZ3RoIDwgcm93TWFza0xlbikgfHxcbiAgICAgICAgICAgIHZhbHVlLmxlbmd0aCA8PSByb3dNYXNrTGVuIC0gMlxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVWYWxpZGF0aW9uRXJyb3IodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0QWN0dWFsSW5wdXRMZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hY3R1YWxWYWx1ZS5sZW5ndGggfHxcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFjdHVhbFZhbHVlLmxlbmd0aCArIHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeC5sZW5ndGhcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jcmVhdGVWYWxpZGF0aW9uRXJyb3IoYWN0dWFsVmFsdWU6IHN0cmluZyk6IFZhbGlkYXRpb25FcnJvcnMge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWFzazoge1xuICAgICAgICAgICAgICAgIHJlcXVpcmVkTWFzazogdGhpcy5fbWFza1ZhbHVlLFxuICAgICAgICAgICAgICAgIGFjdHVhbFZhbHVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRNYXNrKCkge1xuICAgICAgICBpZiAodGhpcy5fbWFza0V4cHJlc3Npb25BcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrRXhwcmVzc2lvbkFycmF5LnNvbWUoKG1hc2spOiBib29sZWFuIHwgdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVzdCA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnJlbW92ZU1hc2sodGhpcy5faW5wdXRWYWx1ZSk/Lmxlbmd0aCA8PVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5yZW1vdmVNYXNrKG1hc2spPy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lucHV0VmFsdWUgJiYgdGVzdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrVmFsdWUgPSBtYXNrO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hc2tFeHByZXNzaW9uID0gbWFzaztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubWFza0V4cHJlc3Npb24gPSBtYXNrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGVzdDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHByZXNzaW9uID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tFeHByZXNzaW9uQXJyYXlbdGhpcy5fbWFza0V4cHJlc3Npb25BcnJheS5sZW5ndGggLSAxXSA/PyAnJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1ZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFza0V4cHJlc3Npb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubWFza0V4cHJlc3Npb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3Npb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9jdXJyZW50TG9jYWxlRGVjaW1hbE1hcmtlcigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gKDEuMSkudG9Mb2NhbGVTdHJpbmcoKS5zdWJzdHJpbmcoMSwgMik7XG4gICAgfVxufVxuIl19
653
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW1hc2suZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hc2stbGliL3NyYy9saWIvbmd4LW1hc2suZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdILGFBQWEsRUFDYixpQkFBaUIsR0FHcEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUd4QixPQUFPLEVBQVcsZUFBZSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFFcEQsTUFrQmEsZ0JBQWdCO0lBbEI3QjtRQW1CSSwyREFBMkQ7UUFDckMsbUJBQWMsR0FBOEIsRUFBRSxDQUFDO1FBRXJELHNCQUFpQixHQUFpQyxFQUFFLENBQUM7UUFFckQsYUFBUSxHQUF3QixFQUFFLENBQUM7UUFFbkMsV0FBTSxHQUFzQixFQUFFLENBQUM7UUFFL0IsV0FBTSxHQUFzQixFQUFFLENBQUM7UUFFL0Isc0JBQWlCLEdBQWlDLEdBQUcsQ0FBQztRQUV0RCxrQkFBYSxHQUE2QixHQUFHLENBQUM7UUFFOUMsMEJBQXFCLEdBQTRDLElBQUksQ0FBQztRQUV0RSxnQkFBVyxHQUFrQyxJQUFJLENBQUM7UUFFbEQsa0JBQWEsR0FBb0MsSUFBSSxDQUFDO1FBRXRELHlCQUFvQixHQUEyQyxJQUFJLENBQUM7UUFFcEUsd0JBQW1CLEdBQTBDLElBQUksQ0FBQztRQUVsRSxpQkFBWSxHQUFtQyxJQUFJLENBQUM7UUFFcEQsb0JBQWUsR0FBc0MsSUFBSSxDQUFDO1FBRTFELGVB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T0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQThEMUIsa0JBQWtCO3NCQUR4QixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQU9yQyxnQkFBZ0I7c0JBRHRCLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBUW5DLE1BQU07c0JBRFosWUFBWTt1QkFBQyxNQUFNO2dCQVNiLE9BQU87c0JBRGIsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBaUUxQixTQUFTO3NCQURmLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBEaXJlY3RpdmUsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT3V0cHV0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gICAgRm9ybUNvbnRyb2wsXG4gICAgTkdfVkFMSURBVE9SUyxcbiAgICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICBWYWxpZGF0aW9uRXJyb3JzLFxuICAgIFZhbGlkYXRvcixcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBDdXN0b21LZXlib2FyZEV2ZW50IH0gZnJvbSAnLi9jdXN0b20ta2V5Ym9hcmQtZXZlbnQnO1xuaW1wb3J0IHsgSUNvbmZpZywgTkdYX01BU0tfQ09ORklHLCB0aW1lTWFza3MsIHdpdGhvdXRWYWxpZGF0aW9uIH0gZnJvbSAnLi9uZ3gtbWFzay5jb25maWcnO1xuaW1wb3J0IHsgTmd4TWFza1NlcnZpY2UgfSBmcm9tICcuL25neC1tYXNrLnNlcnZpY2UnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ2lucHV0W21hc2tdLCB0ZXh0YXJlYVttYXNrXScsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogTmd4TWFza0RpcmVjdGl2ZSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IE5neE1hc2tEaXJlY3RpdmUsXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgTmd4TWFza1NlcnZpY2UsXG4gICAgXSxcbiAgICBleHBvcnRBczogJ21hc2ssbmd4TWFzaycsXG59KVxuZXhwb3J0IGNsYXNzIE5neE1hc2tEaXJlY3RpdmUgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25DaGFuZ2VzLCBWYWxpZGF0b3Ige1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taW5wdXQtcmVuYW1lXG4gICAgQElucHV0KCdtYXNrJykgcHVibGljIG1hc2tFeHByZXNzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsID0gJyc7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgc3BlY2lhbENoYXJhY3RlcnM6IElDb25maWdbJ3NwZWNpYWxDaGFyYWN0ZXJzJ10gPSBbXTtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBwYXR0ZXJuczogSUNvbmZpZ1sncGF0dGVybnMnXSA9IHt9O1xuXG4gICAgQElucHV0KCkgcHVibGljIHByZWZpeDogSUNvbmZpZ1sncHJlZml4J10gPSAnJztcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBzdWZmaXg6IElDb25maWdbJ3N1ZmZpeCddID0gJyc7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgdGhvdXNhbmRTZXBhcmF0b3I6IElDb25maWdbJ3Rob3VzYW5kU2VwYXJhdG9yJ10gPSAnICc7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgZGVjaW1hbE1hcmtlcjogSUNvbmZpZ1snZGVjaW1hbE1hcmtlciddID0gJy4nO1xuXG4gICAgQElucHV0KCkgcHVibGljIGRyb3BTcGVjaWFsQ2hhcmFjdGVyczogSUNvbmZpZ1snZHJvcFNwZWNpYWxDaGFyYWN0ZXJzJ10gfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBoaWRkZW5JbnB1dDogSUNvbmZpZ1snaGlkZGVuSW5wdXQnXSB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KCkgcHVibGljIHNob3dNYXNrVHlwZWQ6IElDb25maWdbJ3Nob3dNYXNrVHlwZWQnXSB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KCkgcHVibGljIHBsYWNlSG9sZGVyQ2hhcmFjdGVyOiBJQ29uZmlnWydwbGFjZUhvbGRlckNoYXJhY3RlciddIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd25NYXNrRXhwcmVzc2lvbjogSUNvbmZpZ1snc2hvd25NYXNrRXhwcmVzc2lvbiddIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd1RlbXBsYXRlOiBJQ29uZmlnWydzaG93VGVtcGxhdGUnXSB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KCkgcHVibGljIGNsZWFySWZOb3RNYXRjaDogSUNvbmZpZ1snY2xlYXJJZk5vdE1hdGNoJ10gfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyB2YWxpZGF0aW9uOiBJQ29uZmlnWyd2YWxpZGF0aW9uJ10gfCBudWxsID0gbnVsbDtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBzZXBhcmF0b3JMaW1pdDogSUNvbmZpZ1snc2VwYXJhdG9yTGltaXQnXSB8IG51bGwgPSBudWxsO1xuXG4gICAgQElucHV0KCkgcHVibGljIGFsbG93TmVnYXRpdmVOdW1iZXJzOiBJQ29uZmlnWydhbGxvd05lZ2F0aXZlTnVtYmVycyddIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgbGVhZFplcm9EYXRlVGltZTogSUNvbmZpZ1snbGVhZFplcm9EYXRlVGltZSddIHwgbnVsbCA9IG51bGw7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgdHJpZ2dlck9uTWFza0NoYW5nZTogSUNvbmZpZ1sndHJpZ2dlck9uTWFza0NoYW5nZSddIHwgbnVsbCA9IG51bGw7XG5cbiAgICBAT3V0cHV0KCkgcHVibGljIG1hc2tGaWxsZWQ6IElDb25maWdbJ21hc2tGaWxsZWQnXSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIHByaXZhdGUgX21hc2tWYWx1ZSA9ICcnO1xuXG4gICAgcHJpdmF0ZSBfaW5wdXRWYWx1ZSE6IHN0cmluZztcblxuICAgIHByaXZhdGUgX3Bvc2l0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgX3N0YXJ0ITogbnVtYmVyO1xuXG4gICAgcHJpdmF0ZSBfZW5kITogbnVtYmVyO1xuXG4gICAgcHJpdmF0ZSBfY29kZSE6IHN0cmluZztcblxuICAgIHByaXZhdGUgX21hc2tFeHByZXNzaW9uQXJyYXk6IHN0cmluZ1tdID0gW107XG5cbiAgICBwcml2YXRlIF9qdXN0UGFzdGVkID0gZmFsc2U7XG5cbiAgICAvKipGb3IgSU1FIGNvbXBvc2l0aW9uIGV2ZW50ICovXG4gICAgcHJpdmF0ZSBfaXNDb21wb3NpbmcgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuXG4gICAgcHVibGljIF9tYXNrU2VydmljZSA9IGluamVjdChOZ3hNYXNrU2VydmljZSwgeyBzZWxmOiB0cnVlIH0pO1xuXG4gICAgcHJvdGVjdGVkIF9jb25maWcgPSBpbmplY3Q8SUNvbmZpZz4oTkdYX01BU0tfQ09ORklHKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb24sIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwdWJsaWMgb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICBwdWJsaWMgb25Ub3VjaCA9ICgpID0+IHt9O1xuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgbWFza0V4cHJlc3Npb24sXG4gICAgICAgICAgICBzcGVjaWFsQ2hhcmFjdGVycyxcbiAgICAgICAgICAgIHBhdHRlcm5zLFxuICAgICAgICAgICAgcHJlZml4LFxuICAgICAgICAgICAgc3VmZml4LFxuICAgICAgICAgICAgdGhvdXNhbmRTZXBhcmF0b3IsXG4gICAgICAgICAgICBkZWNpbWFsTWFya2VyLFxuICAgICAgICAgICAgZHJvcFNwZWNpYWxDaGFyYWN0ZXJzLFxuICAgICAgICAgICAgaGlkZGVuSW5wdXQsXG4gICAgICAgICAgICBzaG93TWFza1R5cGVkLFxuICAgICAgICAgICAgcGxhY2VIb2xkZXJDaGFyYWN0ZXIsXG4gICAgICAgICAgICBzaG93bk1hc2tFeHByZXNzaW9uLFxuICAgICAgICAgICAgc2hvd1RlbXBsYXRlLFxuICAgICAgICAgICAgY2xlYXJJZk5vdE1hdGNoLFxuICAgICAgICAgICAgdmFsaWRhdGlvbixcbiAgICAgICAgICAgIHNlcGFyYXRvckxpbWl0LFxuICAgICAgICAgICAgYWxsb3dOZWdhdGl2ZU51bWJlcnMsXG4gICAgICAgICAgICBsZWFkWmVyb0RhdGVUaW1lLFxuICAgICAgICAgICAgdHJpZ2dlck9uTWFza0NoYW5nZSxcbiAgICAgICAgfSA9IGNoYW5nZXM7XG4gICAgICAgIGlmIChtYXNrRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG1hc2tFeHByZXNzaW9uLmN1cnJlbnRWYWx1ZSAhPT0gbWFza0V4cHJlc3Npb24ucHJldmlvdXNWYWx1ZSAmJlxuICAgICAgICAgICAgICAgICFtYXNrRXhwcmVzc2lvbi5maXJzdENoYW5nZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubWFza0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFsbG93TmVnYXRpdmVOdW1iZXJzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuYWxsb3dOZWdhdGl2ZU51bWJlcnMgPSBhbGxvd05lZ2F0aXZlTnVtYmVycy5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21hc2tTZXJ2aWNlLmFsbG93TmVnYXRpdmVOdW1iZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnNwZWNpYWxDaGFyYWN0ZXJzID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnNwZWNpYWxDaGFyYWN0ZXJzLmZpbHRlcigoYzogc3RyaW5nKSA9PiBjICE9PSAnLScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXNrRXhwcmVzc2lvbi5jdXJyZW50VmFsdWUgJiYgbWFza0V4cHJlc3Npb24uY3VycmVudFZhbHVlLnNwbGl0KCd8fCcpLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrRXhwcmVzc2lvbkFycmF5ID0gbWFza0V4cHJlc3Npb24uY3VycmVudFZhbHVlXG4gICAgICAgICAgICAgICAgICAgIC5zcGxpdCgnfHwnKVxuICAgICAgICAgICAgICAgICAgICAuc29ydCgoYTogc3RyaW5nLCBiOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmxlbmd0aCAtIGIubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRNYXNrKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tFeHByZXNzaW9uQXJyYXkgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrVmFsdWUgPSBtYXNrRXhwcmVzc2lvbi5jdXJyZW50VmFsdWUgfHwgJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubWFza0V4cHJlc3Npb24gPSB0aGlzLl9tYXNrVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNwZWNpYWxDaGFyYWN0ZXJzKSB7XG4gICAgICAgICAgICBpZiAoIXNwZWNpYWxDaGFyYWN0ZXJzLmN1cnJlbnRWYWx1ZSB8fCAhQXJyYXkuaXNBcnJheShzcGVjaWFsQ2hhcmFjdGVycy5jdXJyZW50VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5zcGVjaWFsQ2hhcmFjdGVycyA9IHNwZWNpYWxDaGFyYWN0ZXJzLmN1cnJlbnRWYWx1ZSB8fCBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBPbmx5IG92ZXJ3cml0ZSB0aGUgbWFzayBhdmFpbGFibGUgcGF0dGVybnMgaWYgYSBwYXR0ZXJuIGhhcyBhY3R1YWxseSBiZWVuIHBhc3NlZCBpblxuICAgICAgICBpZiAocGF0dGVybnMgJiYgcGF0dGVybnMuY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5wYXR0ZXJucyA9IHBhdHRlcm5zLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJlZml4KSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5wcmVmaXggPSBwcmVmaXguY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdWZmaXgpIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnN1ZmZpeCA9IHN1ZmZpeC5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRob3VzYW5kU2VwYXJhdG9yKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS50aG91c2FuZFNlcGFyYXRvciA9IHRob3VzYW5kU2VwYXJhdG9yLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVjaW1hbE1hcmtlcikge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuZGVjaW1hbE1hcmtlciA9IGRlY2ltYWxNYXJrZXIuY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkcm9wU3BlY2lhbENoYXJhY3RlcnMpIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmRyb3BTcGVjaWFsQ2hhcmFjdGVycyA9IGRyb3BTcGVjaWFsQ2hhcmFjdGVycy5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhpZGRlbklucHV0KSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5oaWRkZW5JbnB1dCA9IGhpZGRlbklucHV0LmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvd01hc2tUeXBlZCkge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2Uuc2hvd01hc2tUeXBlZCA9IHNob3dNYXNrVHlwZWQuY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwbGFjZUhvbGRlckNoYXJhY3Rlcikge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UucGxhY2VIb2xkZXJDaGFyYWN0ZXIgPSBwbGFjZUhvbGRlckNoYXJhY3Rlci5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3duTWFza0V4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnNob3duTWFza0V4cHJlc3Npb24gPSBzaG93bk1hc2tFeHByZXNzaW9uLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2hvd1RlbXBsYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5zaG93VGVtcGxhdGUgPSBzaG93VGVtcGxhdGUuY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjbGVhcklmTm90TWF0Y2gpIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmNsZWFySWZOb3RNYXRjaCA9IGNsZWFySWZOb3RNYXRjaC5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnZhbGlkYXRpb24gPSB2YWxpZGF0aW9uLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VwYXJhdG9yTGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnNlcGFyYXRvckxpbWl0ID0gc2VwYXJhdG9yTGltaXQuY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsZWFkWmVyb0RhdGVUaW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5sZWFkWmVyb0RhdGVUaW1lID0gbGVhZFplcm9EYXRlVGltZS5jdXJyZW50VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyaWdnZXJPbk1hc2tDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnRyaWdnZXJPbk1hc2tDaGFuZ2UgPSB0cmlnZ2VyT25NYXNrQ2hhbmdlLmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2FwcGx5TWFzaygpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gICAgcHVibGljIHZhbGlkYXRlKHsgdmFsdWUgfTogRm9ybUNvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgICAgIGlmICghdGhpcy5fbWFza1NlcnZpY2UudmFsaWRhdGlvbiB8fCAhdGhpcy5fbWFza1ZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fbWFza1NlcnZpY2UuaXBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVZhbGlkYXRpb25FcnJvcih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX21hc2tTZXJ2aWNlLmNwZkNucGpFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVZhbGlkYXRpb25FcnJvcih2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX21hc2tWYWx1ZS5zdGFydHNXaXRoKCdzZXBhcmF0b3InKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdpdGhvdXRWYWxpZGF0aW9uLmluY2x1ZGVzKHRoaXMuX21hc2tWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9tYXNrU2VydmljZS5jbGVhcklmTm90TWF0Y2gpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aW1lTWFza3MuaW5jbHVkZXModGhpcy5fbWFza1ZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRlVGltZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgIGxldCBjb3VudGVyT2ZPcHQgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5fbWFza1NlcnZpY2UucGF0dGVybnMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWFza1NlcnZpY2UucGF0dGVybnNba2V5XT8ub3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX21hc2tWYWx1ZS5pbmRleE9mKGtleSkgIT09IHRoaXMuX21hc2tWYWx1ZS5sYXN0SW5kZXhPZihrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHQ6IHN0cmluZyA9IHRoaXMuX21hc2tWYWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChpOiBzdHJpbmcpID0+IGkgPT09IGtleSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyT2ZPcHQgKz0gb3B0Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZihrZXkpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlck9mT3B0Kys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1ZhbHVlLmluZGV4T2Yoa2V5KSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoID49IHRoaXMuX21hc2tWYWx1ZS5pbmRleE9mKGtleSlcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRlck9mT3B0ID09PSB0aGlzLl9tYXNrVmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZigneycpID09PSAxICYmXG4gICAgICAgICAgICAgICAgdmFsdWUudG9TdHJpbmcoKS5sZW5ndGggPT09XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tWYWx1ZS5sZW5ndGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyKCh0aGlzLl9tYXNrVmFsdWUuc3BsaXQoJ3snKVsxXSA/PyAnJykuc3BsaXQoJ30nKVswXSkgLVxuICAgICAgICAgICAgICAgICAgICAgICAgNFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fbWFza1ZhbHVlLmluZGV4T2YoJyonKSA9PT0gMSB8fCB0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZignPycpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICh0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZignKicpID4gMSAmJlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS50b1N0cmluZygpLmxlbmd0aCA8IHRoaXMuX21hc2tWYWx1ZS5pbmRleE9mKCcqJykpIHx8XG4gICAgICAgICAgICAgICAgKHRoaXMuX21hc2tWYWx1ZS5pbmRleE9mKCc/JykgPiAxICYmXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoIDwgdGhpcy5fbWFza1ZhbHVlLmluZGV4T2YoJz8nKSkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZigneycpID09PSAxXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlVmFsaWRhdGlvbkVycm9yKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZignKicpID09PSAtMSB8fCB0aGlzLl9tYXNrVmFsdWUuaW5kZXhPZignPycpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aDogbnVtYmVyID0gdGhpcy5fbWFza1NlcnZpY2UuZHJvcFNwZWNpYWxDaGFyYWN0ZXJzXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5fbWFza1ZhbHVlLmxlbmd0aCAtXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuY2hlY2tTcGVjaWFsQ2hhckFtb3VudCh0aGlzLl9tYXNrVmFsdWUpIC1cbiAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyT2ZPcHRcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnByZWZpeFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuX21hc2tWYWx1ZS5sZW5ndGggKyB0aGlzLnByZWZpeC5sZW5ndGggLSBjb3VudGVyT2ZPcHRcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9tYXNrVmFsdWUubGVuZ3RoIC0gY291bnRlck9mT3B0O1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50b1N0cmluZygpLmxlbmd0aCA8IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlVmFsaWRhdGlvbkVycm9yKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLm1hc2tGaWxsZWQuZW1pdCgpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigncGFzdGUnKVxuICAgIHB1YmxpYyBvblBhc3RlKCkge1xuICAgICAgICB0aGlzLl9qdXN0UGFzdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCduZ01vZGVsQ2hhbmdlJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25Nb2RlbENoYW5nZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCB8IG51bWJlcik6IHZvaWQge1xuICAgICAgICAvLyBvbiBmb3JtIHJlc2V0IHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBhY3R1YWxWYWx1ZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hY3R1YWxWYWx1ZVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFjdHVhbFZhbHVlID0gdGhpcy5fbWFza1NlcnZpY2UuZ2V0QWN0dWFsVmFsdWUoJycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignaW5wdXQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbklucHV0KGU6IEN1c3RvbUtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgLy8gSWYgSU1FIGlzIGNvbXBvc2luZyB0ZXh0LCB3ZSB3YWl0IGZvciB0aGUgY29tcG9zZWQgdGV4dC5cbiAgICAgICAgaWYgKHRoaXMuX2lzQ29tcG9zaW5nKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgZWw6IEhUTUxJbnB1dEVsZW1lbnQgPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICB0aGlzLl9pbnB1dFZhbHVlID0gZWwudmFsdWU7XG5cbiAgICAgICAgdGhpcy5fc2V0TWFzaygpO1xuXG4gICAgICAgIGlmICghdGhpcy5fbWFza1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKGVsLnZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcG9zaXRpb246IG51bWJlciA9XG4gICAgICAgICAgICBlbC5zZWxlY3Rpb25TdGFydCA9PT0gMVxuICAgICAgICAgICAgICAgID8gKGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcikgKyB0aGlzLl9tYXNrU2VydmljZS5wcmVmaXgubGVuZ3RoXG4gICAgICAgICAgICAgICAgOiAoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKTtcblxuICAgICAgICBsZXQgY2FyZXRTaGlmdCA9IDA7XG4gICAgICAgIGxldCBiYWNrc3BhY2VTaGlmdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hcHBseVZhbHVlQ2hhbmdlcyhcbiAgICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgICAgdGhpcy5fanVzdFBhc3RlZCxcbiAgICAgICAgICAgIHRoaXMuX2NvZGUgPT09ICdCYWNrc3BhY2UnIHx8IHRoaXMuX2NvZGUgPT09ICdEZWxldGUnLFxuICAgICAgICAgICAgKHNoaWZ0OiBudW1iZXIsIF9iYWNrc3BhY2VTaGlmdDogYm9vbGVhbikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2p1c3RQYXN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjYXJldFNoaWZ0ID0gc2hpZnQ7XG4gICAgICAgICAgICAgICAgYmFja3NwYWNlU2hpZnQgPSBfYmFja3NwYWNlU2hpZnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIC8vIG9ubHkgc2V0IHRoZSBzZWxlY3Rpb24gaWYgdGhlIGVsZW1lbnQgaXMgYWN0aXZlXG4gICAgICAgIGlmICh0aGlzLl9nZXRBY3RpdmVFbGVtZW50KCkgIT09IGVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB1cGRhdGUgcG9zaXRpb24gYWZ0ZXIgYXBwbHlWYWx1ZUNoYW5nZXMgdG8gcHJldmVudCBjdXJzb3Igb24gd3JvbmcgcG9zaXRpb24gd2hlbiBpdCBoYXMgYW4gYXJyYXkgb2YgbWFza0V4cHJlc3Npb25cbiAgICAgICAgaWYgKHRoaXMuX21hc2tFeHByZXNzaW9uQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgICBwb3NpdGlvbiA9XG4gICAgICAgICAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgPyAoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKSArIHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeC5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgOiAoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uID1cbiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uID09PSAxICYmIHRoaXMuX2lucHV0VmFsdWUubGVuZ3RoID09PSAxID8gbnVsbCA6IHRoaXMuX3Bvc2l0aW9uO1xuXG4gICAgICAgIGxldCBwb3NpdGlvblRvQXBwbHk6IG51bWJlciA9IHRoaXMuX3Bvc2l0aW9uXG4gICAgICAgICAgICA/IHRoaXMuX2lucHV0VmFsdWUubGVuZ3RoICsgcG9zaXRpb24gKyBjYXJldFNoaWZ0XG4gICAgICAgICAgICA6IHBvc2l0aW9uICsgKHRoaXMuX2NvZGUgPT09ICdCYWNrc3BhY2UnICYmICFiYWNrc3BhY2VTaGlmdCA/IDAgOiBjYXJldFNoaWZ0KTtcbiAgICAgICAgaWYgKHBvc2l0aW9uVG9BcHBseSA+IHRoaXMuX2dldEFjdHVhbElucHV0TGVuZ3RoKCkpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uVG9BcHBseSA9IHRoaXMuX2dldEFjdHVhbElucHV0TGVuZ3RoKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvc2l0aW9uVG9BcHBseSA8IDApIHtcbiAgICAgICAgICAgIHBvc2l0aW9uVG9BcHBseSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWwuc2V0U2VsZWN0aW9uUmFuZ2UocG9zaXRpb25Ub0FwcGx5LCBwb3NpdGlvblRvQXBwbHkpO1xuICAgICAgICB0aGlzLl9wb3NpdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSU1FIHN0YXJ0c1xuICAgIEBIb3N0TGlzdGVuZXIoJ2NvbXBvc2l0aW9uc3RhcnQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkNvbXBvc2l0aW9uU3RhcnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2lzQ29tcG9zaW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJTUUgY29tcGxldGVzXG4gICAgQEhvc3RMaXN0ZW5lcignY29tcG9zaXRpb25lbmQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbkNvbXBvc2l0aW9uRW5kKGU6IEN1c3RvbUtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5faXNDb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fanVzdFBhc3RlZCA9IHRydWU7XG4gICAgICAgIHRoaXMub25JbnB1dChlKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgICBwdWJsaWMgb25CbHVyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fbWFza1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5jbGVhcklmTm90TWF0Y2hGbigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25Ub3VjaCgpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25DbGljayhlOiBNb3VzZUV2ZW50IHwgQ3VzdG9tS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX21hc2tWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsOiBIVE1MSW5wdXRFbGVtZW50ID0gZS50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgY29uc3QgcG9zU3RhcnQgPSAwO1xuICAgICAgICBjb25zdCBwb3NFbmQgPSAwO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBlbCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgIT09IG51bGwgJiZcbiAgICAgICAgICAgIGVsLnNlbGVjdGlvblN0YXJ0ID09PSBlbC5zZWxlY3Rpb25FbmQgJiZcbiAgICAgICAgICAgIGVsLnNlbGVjdGlvblN0YXJ0ID4gdGhpcy5fbWFza1NlcnZpY2UucHJlZml4Lmxlbmd0aCAmJlxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICAoZSBhcyBhbnkpLmtleUNvZGUgIT09IDM4XG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX21hc2tTZXJ2aWNlLnNob3dNYXNrVHlwZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBhcmUgc2hvd2luZyB0aGUgbWFzayBpbiB0aGUgaW5wdXRcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5tYXNrSXNTaG93biA9IHRoaXMuX21hc2tTZXJ2aWNlLnNob3dNYXNrSW5JbnB1dCgpO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgZWwuc2V0U2VsZWN0aW9uUmFuZ2UgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UucHJlZml4ICsgdGhpcy5fbWFza1NlcnZpY2UubWFza0lzU2hvd24gPT09IGVsLnZhbHVlXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbnB1dCBPTkxZIGNvbnRhaW5zIHRoZSBtYXNrLCBzbyBwb3NpdGlvbiB0aGUgY3Vyc29yIGF0IHRoZSBzdGFydFxuICAgICAgICAgICAgICAgICAgICBlbC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICBlbC5zZXRTZWxlY3Rpb25SYW5nZShwb3NTdGFydCwgcG9zRW5kKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgY29udGFpbnMgc29tZSBjaGFyYWN0ZXJzIGFscmVhZHlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsLnNlbGVjdGlvblN0YXJ0ID4gdGhpcy5fbWFza1NlcnZpY2UuYWN0dWFsVmFsdWUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdXNlciBjbGlja2VkIGJleW9uZCBvdXIgdmFsdWUncyBsZW5ndGgsIHBvc2l0aW9uIHRoZSBjdXJzb3IgYXQgdGhlIGVuZCBvZiBvdXIgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFjdHVhbFZhbHVlLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hY3R1YWxWYWx1ZS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV4dFZhbHVlOiBzdHJpbmcgfCBudWxsID1cbiAgICAgICAgICAgIGVsICYmXG4gICAgICAgICAgICAoIWVsLnZhbHVlIHx8IGVsLnZhbHVlID09PSB0aGlzLl9tYXNrU2VydmljZS5wcmVmaXhcbiAgICAgICAgICAgICAgICA/IHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeCArIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tJc1Nob3duXG4gICAgICAgICAgICAgICAgOiBlbC52YWx1ZSk7XG4gICAgICAgIC8qKiBGaXggb2YgY3Vyc29yIHBvc2l0aW9uIGp1bXBpbmcgdG8gZW5kIGluIG1vc3QgYnJvd3NlcnMgbm8gbWF0dGVyIHdoZXJlIGN1cnNvciBpcyBpbnNlcnRlZCBvbkZvY3VzICovXG4gICAgICAgIGlmIChlbCAmJiBlbC52YWx1ZSAhPT0gbmV4dFZhbHVlKSB7XG4gICAgICAgICAgICBlbC52YWx1ZSA9IG5leHRWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiBmaXggb2YgY3Vyc29yIHBvc2l0aW9uIHdpdGggcHJlZml4IHdoZW4gbW91c2UgY2xpY2sgb2NjdXIgKi9cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZWwgJiZcbiAgICAgICAgICAgICgoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKSB8fCAoZWwuc2VsZWN0aW9uRW5kIGFzIG51bWJlcikpIDw9XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UucHJlZml4Lmxlbmd0aFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGVsLnNlbGVjdGlvblN0YXJ0ID0gdGhpcy5fbWFza1NlcnZpY2UucHJlZml4Lmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvKiogc2VsZWN0IG9ubHkgaW5zZXJ0ZWQgdGV4dCAqL1xuICAgICAgICBpZiAoZWwgJiYgKGVsLnNlbGVjdGlvbkVuZCBhcyBudW1iZXIpID4gdGhpcy5fZ2V0QWN0dWFsSW5wdXRMZW5ndGgoKSkge1xuICAgICAgICAgICAgZWwuc2VsZWN0aW9uRW5kID0gdGhpcy5fZ2V0QWN0dWFsSW5wdXRMZW5ndGgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5RG93bihlOiBDdXN0b21LZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fbWFza1ZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faXNDb21wb3NpbmcpIHtcbiAgICAgICAgICAgIC8vIFVzZXIgZmluYWxpemUgdGhlaXIgY2hvaWNlIGZyb20gSU1FIGNvbXBvc2l0aW9uLCBzbyB0cmlnZ2VyIG9uSW5wdXQoKSBmb3IgdGhlIGNvbXBvc2VkIHRleHQuXG4gICAgICAgICAgICBpZiAoZS5rZXkgPT09ICdFbnRlcicpIHRoaXMub25Db21wb3NpdGlvbkVuZChlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NvZGUgPSBlLmNvZGUgPyBlLmNvZGUgOiBlLmtleTtcbiAgICAgICAgY29uc3QgZWw6IEhUTUxJbnB1dEVsZW1lbnQgPSBlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICB0aGlzLl9pbnB1dFZhbHVlID0gZWwudmFsdWU7XG5cbiAgICAgICAgdGhpcy5fc2V0TWFzaygpO1xuXG4gICAgICAgIGlmIChlLmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZS5rZXkgPT09ICdBcnJvd0xlZnQnIHx8IGUua2V5ID09PSAnQmFja3NwYWNlJyB8fCBlLmtleSA9PT0gJ0RlbGV0ZScpIHtcbiAgICAgICAgICAgIGlmIChlLmtleSA9PT0gJ0JhY2tzcGFjZScgJiYgZWwudmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZWwuc2VsZWN0aW9uU3RhcnQgPSBlbC5zZWxlY3Rpb25FbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZS5rZXkgPT09ICdCYWNrc3BhY2UnICYmIChlbC5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgc3BlY2lhbENoYXJzIGlzIGZhbHNlLCAoc2hvdWxkbid0IGV2ZXIgaGFwcGVuKSB0aGVuIHNldCB0byB0aGUgZGVmYXVsdHNcbiAgICAgICAgICAgICAgICB0aGlzLnNwZWNpYWxDaGFyYWN0ZXJzID0gdGhpcy5zcGVjaWFsQ2hhcmFjdGVycz8ubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5zcGVjaWFsQ2hhcmFjdGVyc1xuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2NvbmZpZy5zcGVjaWFsQ2hhcmFjdGVycztcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmVmaXgubGVuZ3RoID4gMSAmJiAoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKSA8PSB0aGlzLnByZWZpeC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZWwuc2V0U2VsZWN0aW9uUmFuZ2UodGhpcy5wcmVmaXgubGVuZ3RoLCBlbC5zZWxlY3Rpb25FbmQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0VmFsdWUubGVuZ3RoICE9PSAoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcikgIT09IDFcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVjaWFsQ2hhcmFjdGVycy5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5wdXRWYWx1ZVsoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKSAtIDFdID8/ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHRoaXMucHJlZml4Lmxlbmd0aCA+PSAxICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbC5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpID4gdGhpcy5wcmVmaXgubGVuZ3RoKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByZWZpeC5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5zZXRTZWxlY3Rpb25SYW5nZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcikgLSAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5zZWxlY3Rpb25FbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jaGVja1NlbGVjdGlvbk9uRGVsZXRpb24oZWwpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeC5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAoZWwuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKSA8PSB0aGlzLl9tYXNrU2VydmljZS5wcmVmaXgubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgKGVsLnNlbGVjdGlvbkVuZCBhcyBudW1iZXIpIDw9IHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeC5sZW5ndGhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGN1cnNvclN0YXJ0OiBudW1iZXIgfCBudWxsID0gZWwuc2VsZWN0aW9uU3RhcnQ7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZS5rZXkgPT09ICdCYWNrc3BhY2UnICYmXG4gICAgICAgICAgICAgICAgIWVsLnJlYWRPbmx5ICYmXG4gICAgICAgICAgICAgICAgY3Vyc29yU3RhcnQgPT09IDAgJiZcbiAgICAgICAgICAgICAgICBlbC5zZWxlY3Rpb25FbmQgPT09IGVsLnZhbHVlLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgIGVsLnZhbHVlLmxlbmd0aCAhPT0gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcG9zaXRpb24gPSB0aGlzLl9tYXNrU2VydmljZS5wcmVmaXggPyB0aGlzLl9tYXNrU2VydmljZS5wcmVmaXgubGVuZ3RoIDogMDtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hcHBseU1hc2soXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnByZWZpeCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UubWFza0V4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhIXRoaXMuc3VmZml4ICYmXG4gICAgICAgICAgICB0aGlzLnN1ZmZpeC5sZW5ndGggPiAxICYmXG4gICAgICAgICAgICB0aGlzLl9pbnB1dFZhbHVlLmxlbmd0aCAtIHRoaXMuc3VmZml4Lmxlbmd0aCA8IChlbC5zZWxlY3Rpb25TdGFydCBhcyBudW1iZXIpXG4gICAgICAgICkge1xuICAgICAgICAgICAgZWwuc2V0U2VsZWN0aW9uUmFuZ2UoXG4gICAgICAgICAgICAgICAgdGhpcy5faW5wdXRWYWx1ZS5sZW5ndGggLSB0aGlzLnN1ZmZpeC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgdGhpcy5faW5wdXRWYWx1ZS5sZW5ndGhcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAoZS5jb2RlID09PSAnS2V5QScgJiYgZS5jdHJsS2V5KSB8fFxuICAgICAgICAgICAgKGUuY29kZSA9PT0gJ0tleUEnICYmIGUubWV0YUtleSkgLy8gQ21kICsgQSAoTWFjKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlKDAsIHRoaXMuX2dldEFjdHVhbElucHV0TGVuZ3RoKCkpO1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnNlbFN0YXJ0ID0gZWwuc2VsZWN0aW9uU3RhcnQ7XG4gICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnNlbEVuZCA9IGVsLnNlbGVjdGlvbkVuZDtcbiAgICB9XG5cbiAgICAvKiogSXQgd3JpdGVzIHRoZSB2YWx1ZSBpbiB0aGUgaW5wdXQgKi9cbiAgICBwdWJsaWMgYXN5bmMgd3JpdGVWYWx1ZShcbiAgICAgICAgaW5wdXRWYWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgeyB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyOyBkaXNhYmxlPzogYm9vbGVhbiB9XG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXRWYWx1ZSA9PT0gJ29iamVjdCcgJiYgaW5wdXRWYWx1ZSAhPT0gbnVsbCAmJiAndmFsdWUnIGluIGlucHV0VmFsdWUpIHtcbiAgICAgICAgICAgIGlmICgnZGlzYWJsZScgaW4gaW5wdXRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0RGlzYWJsZWRTdGF0ZShCb29sZWFuKGlucHV0VmFsdWUuZGlzYWJsZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICBpbnB1dFZhbHVlID0gaW5wdXRWYWx1ZS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXRWYWx1ZSA9PT0gJ251bWJlcicgfHwgdGhpcy5fbWFza1ZhbHVlLnN0YXJ0c1dpdGgoJ3NlcGFyYXRvcicpKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLl9tYXNrU2VydmljZS5udW1iZXJUb1N0cmluZyhpbnB1dFZhbHVlKTtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLl9tYXNrU2VydmljZS5kZWNpbWFsTWFya2VyKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsZURlY2ltYWxNYXJrZXIgPSB0aGlzLl9jdXJyZW50TG9jYWxlRGVjaW1hbE1hcmtlcigpO1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIGlucHV0VmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5kZWNpbWFsTWFya2VyICE9PSBsb2NhbGVEZWNpbWFsTWFya2VyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGlucHV0VmFsdWUucmVwbGFjZShsb2NhbGVEZWNpbWFsTWFya2VyLCB0aGlzLl9tYXNrU2VydmljZS5kZWNpbWFsTWFya2VyKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnB1dFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuaXNOdW1iZXJWYWx1ZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGlucHV0VmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIGlucHV0VmFsdWUgPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2lucHV0VmFsdWUgPSBpbnB1dFZhbHVlO1xuICAgICAgICB0aGlzLl9zZXRNYXNrKCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGlucHV0VmFsdWUgJiYgdGhpcy5fbWFza1NlcnZpY2UubWFza0V4cHJlc3Npb24pIHx8XG4gICAgICAgICAgICAodGhpcy5fbWFza1NlcnZpY2UubWFza0V4cHJlc3Npb24gJiZcbiAgICAgICAgICAgICAgICAodGhpcy5fbWFza1NlcnZpY2UucHJlZml4IHx8IHRoaXMuX21hc2tTZXJ2aWNlLnNob3dNYXNrVHlwZWQpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIExldCB0aGUgc2VydmljZSB3ZSBrbm93IHdlIGFyZSB3cml0aW5nIHZhbHVlIHNvIHRoYXQgdHJpZ2dlcmluZyBvbkNoYW5nZSBmdW5jdGlvbiB3b24ndCBoYXBwZW4gZHVyaW5nIGFwcGx5TWFza1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2Uud3JpdGluZ1ZhbHVlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmZvcm1FbGVtZW50UHJvcGVydHkgPSBbXG4gICAgICAgICAgICAgICAgJ3ZhbHVlJyxcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5hcHBseU1hc2soaW5wdXRWYWx1ZSwgdGhpcy5fbWFza1NlcnZpY2UubWFza0V4cHJlc3Npb24pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIC8vIExldCB0aGUgc2VydmljZSBrbm93IHdlJ3ZlIGZpbmlzaGVkIHdyaXRpbmcgdmFsdWVcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLndyaXRpbmdWYWx1ZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuZm9ybUVsZW1lbnRQcm9wZXJ0eSA9IFsndmFsdWUnLCBpbnB1dFZhbHVlXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pbnB1dFZhbHVlID0gaW5wdXRWYWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogdHlwZW9mIHRoaXMub25DaGFuZ2UpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbWFza1NlcnZpY2Uub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiB0eXBlb2YgdGhpcy5vblRvdWNoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaCA9IGZuO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldEFjdGl2ZUVsZW1lbnQoZG9jdW1lbnQ6IERvY3VtZW50T3JTaGFkb3dSb290ID0gdGhpcy5kb2N1bWVudCk6IEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgY29uc3Qgc2hhZG93Um9vdEVsID0gZG9jdW1lbnQ/LmFjdGl2ZUVsZW1lbnQ/LnNoYWRvd1Jvb3Q7XG4gICAgICAgIGlmICghc2hhZG93Um9vdEVsPy5hY3RpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRBY3RpdmVFbGVtZW50KHNoYWRvd1Jvb3RFbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY2hlY2tTZWxlY3Rpb25PbkRlbGV0aW9uKGVsOiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGVsLnNlbGVjdGlvblN0YXJ0ID0gTWF0aC5taW4oXG4gICAgICAgICAgICBNYXRoLm1heCh0aGlzLnByZWZpeC5sZW5ndGgsIGVsLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlciksXG4gICAgICAgICAgICB0aGlzLl9pbnB1dFZhbHVlLmxlbmd0aCAtIHRoaXMuc3VmZml4Lmxlbmd0aFxuICAgICAgICApO1xuICAgICAgICBlbC5zZWxlY3Rpb25FbmQgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIE1hdGgubWF4KHRoaXMucHJlZml4Lmxlbmd0aCwgZWwuc2VsZWN0aW9uRW5kIGFzIG51bWJlciksXG4gICAgICAgICAgICB0aGlzLl9pbnB1dFZhbHVlLmxlbmd0aCAtIHRoaXMuc3VmZml4Lmxlbmd0aFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKiBJdCBkaXNhYmxlcyB0aGUgaW5wdXQgZWxlbWVudCAqL1xuICAgIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuZm9ybUVsZW1lbnRQcm9wZXJ0eSA9IFsnZGlzYWJsZWQnLCBpc0Rpc2FibGVkXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXBlYXRQYXR0ZXJuU3ltYm9scyhtYXNrRXhwOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKG1hc2tFeHAubWF0Y2goL3tbMC05XSt9LykgJiZcbiAgICAgICAgICAgICAgICBtYXNrRXhwXG4gICAgICAgICAgICAgICAgICAgIC5zcGxpdCgnJylcbiAgICAgICAgICAgICAgICAgICAgLnJlZHVjZSgoYWNjdW06IHN0cmluZywgY3VyclZhbDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0ID0gY3VyclZhbCA9PT0gJ3snID8gaW5kZXggOiB0aGlzLl9zdGFydDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJWYWwgIT09ICd9Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXNrU2VydmljZS5fZmluZFNwZWNpYWxDaGFyKGN1cnJWYWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYWNjdW0gKyBjdXJyVmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYWNjdW07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmQgPSBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcGVhdE51bWJlciA9IE51bWJlcihtYXNrRXhwLnNsaWNlKHRoaXMuX3N0YXJ0ICsgMSwgdGhpcy5fZW5kKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXBsYWNlV2l0aDogc3RyaW5nID0gbmV3IEFycmF5KHJlcGVhdE51bWJlciArIDEpLmpvaW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza0V4cFt0aGlzLl9zdGFydCAtIDFdXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtICsgcmVwbGFjZVdpdGg7XG4gICAgICAgICAgICAgICAgICAgIH0sICcnKSkgfHxcbiAgICAgICAgICAgIG1hc2tFeHBcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByaXZhdGUgX2FwcGx5TWFzaygpOiBhbnkge1xuICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbiA9IHRoaXMuX3JlcGVhdFBhdHRlcm5TeW1ib2xzKHRoaXMuX21hc2tWYWx1ZSB8fCAnJyk7XG4gICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmZvcm1FbGVtZW50UHJvcGVydHkgPSBbXG4gICAgICAgICAgICAndmFsdWUnLFxuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuYXBwbHlNYXNrKHRoaXMuX2lucHV0VmFsdWUsIHRoaXMuX21hc2tTZXJ2aWNlLm1hc2tFeHByZXNzaW9uKSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF92YWxpZGF0ZVRpbWUodmFsdWU6IHN0cmluZyk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICAgICAgY29uc3Qgcm93TWFza0xlbjogbnVtYmVyID0gdGhpcy5fbWFza1ZhbHVlXG4gICAgICAgICAgICAuc3BsaXQoJycpXG4gICAgICAgICAgICAuZmlsdGVyKChzOiBzdHJpbmcpID0+IHMgIT09ICc6JykubGVuZ3RoO1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gRG9uJ3QgdmFsaWRhdGUgZW1wdHkgdmFsdWVzIHRvIGFsbG93IGZvciBvcHRpb25hbCBmb3JtIGNvbnRyb2xcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICgrKHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdID8/IC0xKSA9PT0gMCAmJiB2YWx1ZS5sZW5ndGggPCByb3dNYXNrTGVuKSB8fFxuICAgICAgICAgICAgdmFsdWUubGVuZ3RoIDw9IHJvd01hc2tMZW4gLSAyXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVZhbGlkYXRpb25FcnJvcih2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRBY3R1YWxJbnB1dExlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLmFjdHVhbFZhbHVlLmxlbmd0aCB8fFxuICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UuYWN0dWFsVmFsdWUubGVuZ3RoICsgdGhpcy5fbWFza1NlcnZpY2UucHJlZml4Lmxlbmd0aFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NyZWF0ZVZhbGlkYXRpb25FcnJvcihhY3R1YWxWYWx1ZTogc3RyaW5nKTogVmFsaWRhdGlvbkVycm9ycyB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtYXNrOiB7XG4gICAgICAgICAgICAgICAgcmVxdWlyZWRNYXNrOiB0aGlzLl9tYXNrVmFsdWUsXG4gICAgICAgICAgICAgICAgYWN0dWFsVmFsdWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldE1hc2soKSB7XG4gICAgICAgIGlmICh0aGlzLl9tYXNrRXhwcmVzc2lvbkFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX21hc2tFeHByZXNzaW9uQXJyYXkuc29tZSgobWFzayk6IGJvb2xlYW4gfCB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0ID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza1NlcnZpY2UucmVtb3ZlTWFzayh0aGlzLl9pbnB1dFZhbHVlKT8ubGVuZ3RoIDw9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tTZXJ2aWNlLnJlbW92ZU1hc2sobWFzayk/Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5faW5wdXRWYWx1ZSAmJiB0ZXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hc2tWYWx1ZSA9IG1hc2s7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFza0V4cHJlc3Npb24gPSBtYXNrO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbiA9IG1hc2s7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFza0V4cHJlc3Npb25BcnJheVt0aGlzLl9tYXNrRXhwcmVzc2lvbkFycmF5Lmxlbmd0aCAtIDFdID8/ICcnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrVmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXNrRXhwcmVzc2lvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXNrU2VydmljZS5tYXNrRXhwcmVzc2lvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX2N1cnJlbnRMb2NhbGVEZWNpbWFsTWFya2VyKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAoMS4xKS50b0xvY2FsZVN0cmluZygpLnN1YnN0cmluZygxLCAyKTtcbiAgICB9XG59XG4iXX0=
@@ -1305,7 +1305,9 @@ class NgxMaskDirective {
1305
1305
  ? this._maskValue.length -
1306
1306
  this._maskService.checkSpecialCharAmount(this._maskValue) -
1307
1307
  counterOfOpt
1308
- : this._maskValue.length - counterOfOpt;
1308
+ : this.prefix
1309
+ ? this._maskValue.length + this.prefix.length - counterOfOpt
1310
+ : this._maskValue.length - counterOfOpt;
1309
1311
  if (value.toString().length < length) {
1310
1312
  return this._createValidationError(value);
1311
1313
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-mask.mjs","sources":["../../../projects/ngx-mask-lib/src/lib/ngx-mask.config.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask-applier.service.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask.service.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask.providers.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask.directive.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask.pipe.ts","../../../projects/ngx-mask-lib/src/ngx-mask.ts"],"sourcesContent":["import { InjectionToken, EventEmitter } from '@angular/core';\n\nexport interface IConfig {\n suffix: string;\n prefix: string;\n thousandSeparator: string;\n decimalMarker: '.' | ',' | ['.', ','];\n clearIfNotMatch: boolean;\n showTemplate: boolean;\n showMaskTyped: boolean;\n placeHolderCharacter: string;\n shownMaskExpression: string;\n dropSpecialCharacters: boolean | string[];\n specialCharacters: string[];\n hiddenInput: boolean | undefined;\n validation: boolean;\n separatorLimit: string;\n allowNegativeNumbers: boolean;\n leadZeroDateTime: boolean;\n triggerOnMaskChange: boolean;\n maskFilled: EventEmitter<void>;\n patterns: {\n [character: string]: {\n pattern: RegExp;\n optional?: boolean;\n symbol?: string;\n };\n };\n}\n\nexport type optionsConfig = Partial<IConfig>;\nexport const NGX_MASK_CONFIG: InjectionToken<IConfig> = new InjectionToken('ngx-mask config');\nexport const NEW_CONFIG: InjectionToken<IConfig> = new InjectionToken('new ngx-mask config');\nexport const INITIAL_CONFIG: InjectionToken<IConfig> = new InjectionToken(\n 'initial ngx-mask config'\n);\n\nexport const initialConfig: IConfig = {\n suffix: '',\n prefix: '',\n thousandSeparator: ' ',\n decimalMarker: ['.', ','],\n clearIfNotMatch: false,\n showTemplate: false,\n showMaskTyped: false,\n placeHolderCharacter: '_',\n dropSpecialCharacters: true,\n hiddenInput: undefined,\n shownMaskExpression: '',\n separatorLimit: '',\n allowNegativeNumbers: false,\n validation: true,\n // eslint-disable-next-line @typescript-eslint/quotes\n specialCharacters: ['-', '/', '(', ')', '.', ':', ' ', '+', ',', '@', '[', ']', '\"', \"'\"],\n leadZeroDateTime: false,\n triggerOnMaskChange: false,\n maskFilled: new EventEmitter<void>(),\n patterns: {\n '0': {\n pattern: new RegExp('\\\\d'),\n },\n '9': {\n pattern: new RegExp('\\\\d'),\n optional: true,\n },\n X: {\n pattern: new RegExp('\\\\d'),\n symbol: '*',\n },\n A: {\n pattern: new RegExp('[a-zA-Z0-9]'),\n },\n S: {\n pattern: new RegExp('[a-zA-Z]'),\n },\n U: {\n pattern: new RegExp('[A-Z]'),\n },\n L: {\n pattern: new RegExp('[a-z]'),\n },\n d: {\n pattern: new RegExp('\\\\d'),\n },\n m: {\n pattern: new RegExp('\\\\d'),\n },\n M: {\n pattern: new RegExp('\\\\d'),\n },\n H: {\n pattern: new RegExp('\\\\d'),\n },\n h: {\n pattern: new RegExp('\\\\d'),\n },\n s: {\n pattern: new RegExp('\\\\d'),\n },\n },\n};\n\nexport const timeMasks: string[] = ['Hh:m0:s0', 'Hh:m0', 'm0:s0'];\n\nexport const withoutValidation: string[] = [\n 'percent',\n 'Hh',\n 's0',\n 'm0',\n 'separator',\n 'd0/M0/0000',\n 'd0/M0',\n 'd0',\n 'M0',\n];\n","import { inject, Injectable } from '@angular/core';\nimport { NGX_MASK_CONFIG, IConfig } from './ngx-mask.config';\n\n@Injectable()\nexport class NgxMaskApplierService {\n protected _config = inject<IConfig>(NGX_MASK_CONFIG);\n\n public dropSpecialCharacters: IConfig['dropSpecialCharacters'] =\n this._config.dropSpecialCharacters;\n\n public hiddenInput: IConfig['hiddenInput'] = this._config.hiddenInput;\n\n public showTemplate!: IConfig['showTemplate'];\n\n public clearIfNotMatch: IConfig['clearIfNotMatch'] = this._config.clearIfNotMatch;\n\n public specialCharacters: IConfig['specialCharacters'] = this._config.specialCharacters;\n\n public patterns: IConfig['patterns'] = this._config.patterns;\n\n public prefix: IConfig['prefix'] = this._config.prefix;\n\n public suffix: IConfig['suffix'] = this._config.suffix;\n\n public thousandSeparator: IConfig['thousandSeparator'] = this._config.thousandSeparator;\n\n public decimalMarker: IConfig['decimalMarker'] = this._config.decimalMarker;\n\n public customPattern!: IConfig['patterns'];\n\n public showMaskTyped: IConfig['showMaskTyped'] = this._config.showMaskTyped;\n\n public placeHolderCharacter: IConfig['placeHolderCharacter'] =\n this._config.placeHolderCharacter;\n\n public validation: IConfig['validation'] = this._config.validation;\n\n public separatorLimit: IConfig['separatorLimit'] = this._config.separatorLimit;\n\n public allowNegativeNumbers: IConfig['allowNegativeNumbers'] =\n this._config.allowNegativeNumbers;\n\n public leadZeroDateTime: IConfig['leadZeroDateTime'] = this._config.leadZeroDateTime;\n\n private _shift: Set<number> = new Set();\n\n public maskExpression = '';\n\n public actualValue = '';\n\n public shownMaskExpression = '';\n\n public ipError?: boolean;\n\n public cpfCnpjError?: boolean;\n public applyMaskWithPattern(\n inputValue: string,\n maskAndPattern: [string, IConfig['patterns']]\n ): string {\n const [mask, customPattern] = maskAndPattern;\n this.customPattern = customPattern;\n return this.applyMask(inputValue, mask);\n }\n\n public applyMask(\n inputValue: string | object | boolean | null | undefined,\n maskExpression: string,\n position = 0,\n justPasted = false,\n backspaced = false,\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any\n cb: (...args: any[]) => any = () => {}\n ): string {\n if (!maskExpression || typeof inputValue !== 'string') {\n return '';\n }\n let cursor = 0;\n let result = '';\n let multi = false;\n let backspaceShift = false;\n let shift = 1;\n let stepBack = false;\n if (inputValue.slice(0, this.prefix.length) === this.prefix) {\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue.slice(this.prefix.length, inputValue.length);\n }\n if (!!this.suffix && inputValue?.length > 0) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this.checkAndRemoveSuffix(inputValue);\n }\n const inputArray: string[] = inputValue.toString().split('');\n if (this.allowNegativeNumbers && inputValue.slice(cursor, cursor + 1) === '-') {\n // eslint-disable-next-line no-param-reassign\n result += inputValue.slice(cursor, cursor + 1);\n }\n if (maskExpression === 'IP') {\n const valuesIP = inputValue.split('.');\n this.ipError = this._validIP(valuesIP);\n // eslint-disable-next-line no-param-reassign\n maskExpression = '099.099.099.099';\n }\n const arr: string[] = [];\n for (let i = 0; i < inputValue.length; i++) {\n if (inputValue[i]?.match('\\\\d')) {\n arr.push(inputValue[i] ?? '');\n }\n }\n if (maskExpression === 'CPF_CNPJ') {\n this.cpfCnpjError = arr.length !== 11 && arr.length !== 14;\n if (arr.length > 11) {\n // eslint-disable-next-line no-param-reassign\n maskExpression = '00.000.000/0000-00';\n } else {\n // eslint-disable-next-line no-param-reassign\n maskExpression = '000.000.000-00';\n }\n }\n if (maskExpression.startsWith('percent')) {\n if (\n inputValue.match('[a-z]|[A-Z]') ||\n // eslint-disable-next-line no-useless-escape\n inputValue.match(/[-!$%^&*()_+|~=`{}\\[\\]:\";'<>?,\\/.]/)\n ) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this._stripToDecimal(inputValue);\n const precision: number = this.getPrecision(maskExpression);\n // eslint-disable-next-line no-param-reassign\n inputValue = this.checkInputPrecision(inputValue, precision, this.decimalMarker);\n }\n if (\n inputValue.indexOf('.') > 0 &&\n !this.percentage(inputValue.substring(0, inputValue.indexOf('.')))\n ) {\n let base: string = inputValue.substring(0, inputValue.indexOf('.') - 1);\n if (this.allowNegativeNumbers && inputValue.slice(cursor, cursor + 1) === '-') {\n base = inputValue.substring(0, inputValue.indexOf('.'));\n }\n // eslint-disable-next-line no-param-reassign\n inputValue = `${base}${inputValue.substring(\n inputValue.indexOf('.'),\n inputValue.length\n )}`;\n }\n let value = '';\n this.allowNegativeNumbers && inputValue.slice(cursor, cursor + 1) === '-'\n ? (value = inputValue.slice(cursor + 1, cursor + inputValue.length))\n : (value = inputValue);\n if (this.percentage(value)) {\n result = inputValue;\n } else {\n result = inputValue.substring(0, inputValue.length - 1);\n }\n } else if (maskExpression.startsWith('separator')) {\n if (\n inputValue.match('[wа-яА-Я]') ||\n inputValue.match('[ЁёА-я]') ||\n inputValue.match('[a-z]|[A-Z]') ||\n inputValue.match(/[-@#!$%\\\\^&*()_£¬'+|~=`{}\\]:\";<>.?/]/) ||\n inputValue.match('[^A-Za-z0-9,]')\n ) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this._stripToDecimal(inputValue);\n }\n // eslint-disable-next-line no-param-reassign\n inputValue =\n inputValue.length > 1 &&\n inputValue[0] === '0' &&\n inputValue[1] !== this.thousandSeparator &&\n !this._compareOrIncludes(\n inputValue[1],\n this.decimalMarker,\n this.thousandSeparator\n ) &&\n !backspaced\n ? inputValue.slice(0, inputValue.length - 1)\n : inputValue;\n if (backspaced) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this._compareOrIncludes(\n inputValue[inputValue.length - 1],\n this.decimalMarker,\n this.thousandSeparator\n )\n ? inputValue.slice(0, inputValue.length - 1)\n : inputValue;\n }\n // TODO: we had different rexexps here for the different cases... but tests dont seam to bother - check this\n // separator: no COMMA, dot-sep: no SPACE, COMMA OK, comma-sep: no SPACE, COMMA OK\n\n const thousandSeparatorCharEscaped: string = this._charToRegExpExpression(\n this.thousandSeparator\n );\n let invalidChars: string = '@#!$%^&*()_+|~=`{}\\\\[\\\\]:\\\\s,\\\\.\";<>?\\\\/'.replace(\n thousandSeparatorCharEscaped,\n ''\n );\n //.replace(decimalMarkerEscaped, '');\n if (Array.isArray(this.decimalMarker)) {\n for (const marker of this.decimalMarker) {\n invalidChars = invalidChars.replace(this._charToRegExpExpression(marker), '');\n }\n } else {\n invalidChars = invalidChars.replace(\n this._charToRegExpExpression(this.decimalMarker),\n ''\n );\n }\n\n const invalidCharRegexp = new RegExp('[' + invalidChars + ']');\n\n if (\n inputValue.match(invalidCharRegexp) ||\n (inputValue.length === 1 &&\n this._compareOrIncludes(inputValue, this.decimalMarker, this.thousandSeparator))\n ) {\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue.substring(0, inputValue.length - 1);\n }\n\n const precision: number = this.getPrecision(maskExpression);\n // eslint-disable-next-line no-param-reassign\n inputValue = this.checkInputPrecision(inputValue, precision, this.decimalMarker);\n const strForSep: string = inputValue.replace(\n new RegExp(thousandSeparatorCharEscaped, 'g'),\n ''\n );\n result = this._formatWithSeparators(\n strForSep,\n this.thousandSeparator,\n this.decimalMarker,\n precision\n );\n const commaShift: number = result.indexOf(',') - inputValue.indexOf(',');\n const shiftStep: number = result.length - inputValue.length;\n\n if (shiftStep > 0 && result[position] !== ',') {\n backspaceShift = true;\n let _shift = 0;\n do {\n this._shift.add(position + _shift);\n _shift++;\n } while (_shift < shiftStep);\n } else if (\n (commaShift !== 0 &&\n position > 0 &&\n !(result.indexOf(',') >= position && position > 3)) ||\n (!(result.indexOf('.') >= position && position > 3) && shiftStep <= 0)\n ) {\n this._shift.clear();\n backspaceShift = true;\n shift = shiftStep;\n // eslint-disable-next-line no-param-reassign\n position += shiftStep;\n this._shift.add(position);\n } else {\n this._shift.clear();\n }\n } else {\n for (\n // eslint-disable-next-line\n let i: number = 0, inputSymbol: string = inputArray[0]!;\n i < inputArray.length;\n i++, inputSymbol = inputArray[i] ?? ''\n ) {\n if (cursor === maskExpression.length) {\n break;\n }\n if (\n this._checkSymbolMask(inputSymbol, maskExpression[cursor] ?? '') &&\n maskExpression[cursor + 1] === '?'\n ) {\n result += inputSymbol;\n cursor += 2;\n } else if (\n maskExpression[cursor + 1] === '*' &&\n multi &&\n this._checkSymbolMask(inputSymbol, maskExpression[cursor + 2] ?? '')\n ) {\n result += inputSymbol;\n cursor += 3;\n multi = false;\n } else if (\n this._checkSymbolMask(inputSymbol, maskExpression[cursor] ?? '') &&\n maskExpression[cursor + 1] === '*'\n ) {\n result += inputSymbol;\n multi = true;\n } else if (\n maskExpression[cursor + 1] === '?' &&\n this._checkSymbolMask(inputSymbol, maskExpression[cursor + 2] ?? '')\n ) {\n result += inputSymbol;\n cursor += 3;\n } else if (this._checkSymbolMask(inputSymbol, maskExpression[cursor] ?? '')) {\n if (maskExpression[cursor] === 'H') {\n if (Number(inputSymbol) > 2) {\n // eslint-disable-next-line no-param-reassign\n position = position + 1;\n cursor += 1;\n this._shiftStep(maskExpression, cursor, inputArray.length);\n i--;\n if (this.leadZeroDateTime) {\n result += '0';\n }\n continue;\n }\n }\n if (maskExpression[cursor] === 'h') {\n if (\n (result === '2' && Number(inputSymbol) > 3) ||\n ((result.slice(cursor - 2, cursor) === '2' ||\n result.slice(cursor - 3, cursor) === '2' ||\n result.slice(cursor - 4, cursor) === '2' ||\n result.slice(cursor - 1, cursor) === '2') &&\n Number(inputSymbol) > 3 &&\n cursor > 10)\n ) {\n // eslint-disable-next-line no-param-reassign\n position = position + 1;\n cursor += 1;\n i--;\n continue;\n }\n }\n if (maskExpression[cursor] === 'm' || maskExpression[cursor] === 's') {\n if (Number(inputSymbol) > 5) {\n // eslint-disable-next-line no-param-reassign\n position = position + 1;\n cursor += 1;\n this._shiftStep(maskExpression, cursor, inputArray.length);\n i--;\n if (this.leadZeroDateTime) {\n result += '0';\n }\n continue;\n }\n }\n const daysCount = 31;\n const inputValueCursor = inputValue[cursor] as string;\n const inputValueCursorPlusOne = inputValue[cursor + 1] as string;\n const inputValueCursorPlusTwo = inputValue[cursor + 2] as string;\n const inputValueCursorMinusOne = inputValue[cursor - 1] as string;\n const inputValueCursorMinusTwo = inputValue[cursor - 2] as string;\n const inputValueCursorMinusThree = inputValue[cursor - 3] as string;\n const inputValueSliceMinusThreeMinusOne = inputValue.slice(\n cursor - 3,\n cursor - 1\n );\n const inputValueSliceMinusOnePlusOne = inputValue.slice(cursor - 1, cursor + 1);\n const inputValueSliceCursorPlusTwo = inputValue.slice(cursor, cursor + 2);\n const inputValueSliceMinusTwoCursor = inputValue.slice(cursor - 2, cursor);\n if (maskExpression[cursor] === 'd') {\n const maskStartWithMonth = maskExpression.slice(0, 2) === 'M0';\n const startWithMonthInput: boolean =\n maskExpression.slice(0, 2) === 'M0' &&\n this.specialCharacters.includes(inputValueCursorMinusTwo);\n if (\n (Number(inputSymbol) > 3 && this.leadZeroDateTime) ||\n (!maskStartWithMonth &&\n (Number(inputValueSliceCursorPlusTwo) > daysCount ||\n Number(inputValueSliceMinusOnePlusOne) > daysCount ||\n this.specialCharacters.includes(inputValueCursorPlusOne))) ||\n (startWithMonthInput\n ? Number(inputValueSliceMinusOnePlusOne) > daysCount ||\n (!this.specialCharacters.includes(inputValueCursor) &&\n this.specialCharacters.includes(inputValueCursorPlusTwo)) ||\n this.specialCharacters.includes(inputValueCursor)\n : Number(inputValueSliceCursorPlusTwo) > daysCount ||\n this.specialCharacters.includes(inputValueCursorPlusOne))\n ) {\n // eslint-disable-next-line no-param-reassign\n position = position + 1;\n cursor += 1;\n this._shiftStep(maskExpression, cursor, inputArray.length);\n i--;\n if (this.leadZeroDateTime) {\n result += '0';\n }\n continue;\n }\n }\n if (maskExpression[cursor] === 'M') {\n const monthsCount = 12;\n // mask without day\n const withoutDays: boolean =\n cursor === 0 &&\n (Number(inputSymbol) > 2 ||\n Number(inputValueSliceCursorPlusTwo) > monthsCount ||\n this.specialCharacters.includes(inputValueCursorPlusOne));\n // day<10 && month<12 for input\n const specialChart = maskExpression.slice(cursor + 2, cursor + 3);\n const day1monthInput: boolean =\n inputValueSliceMinusThreeMinusOne.includes(specialChart) &&\n ((this.specialCharacters.includes(inputValueCursorMinusTwo) &&\n Number(inputValueSliceMinusOnePlusOne) > monthsCount &&\n !this.specialCharacters.includes(inputValueCursor)) ||\n this.specialCharacters.includes(inputValueCursor) ||\n (this.specialCharacters.includes(inputValueCursorMinusThree) &&\n Number(inputValueSliceMinusTwoCursor) > monthsCount &&\n !this.specialCharacters.includes(inputValueCursorMinusOne)) ||\n this.specialCharacters.includes(inputValueCursorMinusOne));\n // month<12 && day<10 for input\n const day2monthInput: boolean =\n Number(inputValueSliceMinusThreeMinusOne) <= daysCount &&\n !this.specialCharacters.includes(\n inputValueSliceMinusThreeMinusOne as string\n ) &&\n this.specialCharacters.includes(inputValueCursorMinusOne) &&\n (Number(inputValueSliceCursorPlusTwo) > monthsCount ||\n this.specialCharacters.includes(inputValueCursorPlusOne));\n // cursor === 5 && without days\n const day2monthInputDot: boolean =\n (Number(inputValueSliceCursorPlusTwo) > monthsCount && cursor === 5) ||\n (this.specialCharacters.includes(inputValueCursorPlusOne) &&\n cursor === 5);\n // // day<10 && month<12 for paste whole data\n const day1monthPaste: boolean =\n Number(inputValueSliceMinusThreeMinusOne) > daysCount &&\n !this.specialCharacters.includes(\n inputValueSliceMinusThreeMinusOne as string\n ) &&\n !this.specialCharacters.includes(\n inputValueSliceMinusTwoCursor as string\n ) &&\n Number(inputValueSliceMinusTwoCursor) > monthsCount;\n // 10<day<31 && month<12 for paste whole data\n const day2monthPaste: boolean =\n Number(inputValueSliceMinusThreeMinusOne) <= daysCount &&\n !this.specialCharacters.includes(\n inputValueSliceMinusThreeMinusOne as string\n ) &&\n !this.specialCharacters.includes(inputValueCursorMinusOne) &&\n Number(inputValueSliceMinusOnePlusOne) > monthsCount;\n if (\n (Number(inputSymbol) > 1 && this.leadZeroDateTime) ||\n withoutDays ||\n day1monthInput ||\n day2monthPaste ||\n day1monthPaste ||\n day2monthInput ||\n day2monthInputDot\n ) {\n // eslint-disable-next-line no-param-reassign\n position = position + 1;\n cursor += 1;\n this._shiftStep(maskExpression, cursor, inputArray.length);\n i--;\n if (this.leadZeroDateTime) {\n result += '0';\n }\n continue;\n }\n }\n result += inputSymbol;\n cursor++;\n } else if (inputSymbol === ' ' && maskExpression[cursor] === ' ') {\n result += inputSymbol;\n cursor++;\n } else if (this.specialCharacters.indexOf(maskExpression[cursor] ?? '') !== -1) {\n result += maskExpression[cursor];\n cursor++;\n this._shiftStep(maskExpression, cursor, inputArray.length);\n i--;\n } else if (maskExpression[cursor] === '9' && this.showMaskTyped) {\n this._shiftStep(maskExpression, cursor, inputArray.length);\n } else if (\n this.specialCharacters.indexOf(inputSymbol) > -1 &&\n this.patterns[maskExpression[cursor] ?? ''] &&\n this.patterns[maskExpression[cursor] ?? '']?.optional\n ) {\n if (\n !!inputArray[cursor] &&\n maskExpression !== '099.099.099.099' &&\n maskExpression !== '000.000.000-00' &&\n maskExpression !== '00.000.000/0000-00' &&\n !maskExpression.match(/^9+\\.0+$/) &&\n // maskExpression[cursor] !== '9'\n !this.patterns[maskExpression[cursor] ?? '']?.optional\n ) {\n result += inputArray[cursor];\n }\n cursor++;\n i--;\n } else if (\n this.maskExpression[cursor + 1] === '*' &&\n this._findSpecialChar(this.maskExpression[cursor + 2] ?? '') &&\n this._findSpecialChar(inputSymbol) === this.maskExpression[cursor + 2] &&\n multi\n ) {\n cursor += 3;\n result += inputSymbol;\n } else if (\n this.maskExpression[cursor + 1] === '?' &&\n this._findSpecialChar(this.maskExpression[cursor + 2] ?? '') &&\n this._findSpecialChar(inputSymbol) === this.maskExpression[cursor + 2] &&\n multi\n ) {\n cursor += 3;\n result += inputSymbol;\n } else if (\n this.showMaskTyped &&\n this.specialCharacters.indexOf(inputSymbol) < 0 &&\n inputSymbol !== this.placeHolderCharacter\n ) {\n stepBack = true;\n }\n }\n }\n if (\n result.length + 1 === maskExpression.length &&\n this.specialCharacters.indexOf(maskExpression[maskExpression.length - 1] ?? '') !== -1\n ) {\n result += maskExpression[maskExpression.length - 1];\n }\n let newPosition: number = position + 1;\n\n while (this._shift.has(newPosition)) {\n shift++;\n newPosition++;\n }\n\n let actualShift: number =\n justPasted && !maskExpression.startsWith('separator')\n ? cursor\n : this._shift.has(position)\n ? shift\n : 0;\n if (stepBack) {\n actualShift--;\n }\n\n cb(actualShift, backspaceShift);\n if (shift < 0) {\n this._shift.clear();\n }\n let onlySpecial = false;\n if (backspaced) {\n onlySpecial = inputArray.every((char) => this.specialCharacters.includes(char));\n }\n let res = `${this.prefix}${onlySpecial ? '' : result}${this.suffix}`;\n if (result.length === 0) {\n res = `${this.prefix}${result}`;\n }\n return res;\n }\n\n public _findSpecialChar(inputSymbol: string): undefined | string {\n return this.specialCharacters.find((val: string) => val === inputSymbol);\n }\n\n protected _checkSymbolMask(inputSymbol: string, maskSymbol: string): boolean {\n this.patterns = this.customPattern ? this.customPattern : this.patterns;\n return (\n (this.patterns[maskSymbol]?.pattern &&\n this.patterns[maskSymbol]?.pattern.test(inputSymbol)) ??\n false\n );\n }\n\n private _formatWithSeparators = (\n str: string,\n thousandSeparatorChar: string,\n decimalChars: string | string[],\n precision: number\n ) => {\n let x: string[] = [];\n let decimalChar = '';\n if (Array.isArray(decimalChars)) {\n const regExp = new RegExp(\n decimalChars.map((v) => ('[\\\\^$.|?*+()'.indexOf(v) >= 0 ? `\\\\${v}` : v)).join('|')\n );\n x = str.split(regExp);\n decimalChar = str.match(regExp)?.[0] ?? '';\n } else {\n x = str.split(decimalChars);\n decimalChar = decimalChars;\n }\n const decimals: string = x.length > 1 ? `${decimalChar}${x[1]}` : '';\n let res: string = x[0] ?? '';\n const separatorLimit: string = this.separatorLimit.replace(/\\s/g, '');\n if (separatorLimit && +separatorLimit) {\n if (res[0] === '-') {\n res = `-${res.slice(1, res.length).slice(0, separatorLimit.length)}`;\n } else {\n res = res.slice(0, separatorLimit.length);\n }\n }\n const rgx = /(\\d+)(\\d{3})/;\n\n while (thousandSeparatorChar && rgx.test(res)) {\n res = res.replace(rgx, '$1' + thousandSeparatorChar + '$2');\n }\n\n if (precision === undefined) {\n return res + decimals;\n } else if (precision === 0) {\n return res;\n }\n return res + decimals.substring(0, precision + 1);\n };\n\n private percentage = (str: string): boolean => {\n return Number(str) >= 0 && Number(str) <= 100;\n };\n\n private getPrecision = (maskExpression: string): number => {\n const x: string[] = maskExpression.split('.');\n if (x.length > 1) {\n return Number(x[x.length - 1]);\n }\n\n return Infinity;\n };\n\n private checkAndRemoveSuffix = (inputValue: string): string => {\n for (let i = this.suffix?.length - 1; i >= 0; i--) {\n const substr = this.suffix.substring(i, this.suffix?.length);\n if (\n inputValue.includes(substr) &&\n i !== this.suffix?.length - 1 &&\n (i - 1 < 0 ||\n !inputValue.includes(this.suffix.substring(i - 1, this.suffix?.length)))\n ) {\n return inputValue.replace(substr, '');\n }\n }\n return inputValue;\n };\n\n private checkInputPrecision = (\n inputValue: string,\n precision: number,\n decimalMarker: IConfig['decimalMarker']\n ): string => {\n if (precision < Infinity) {\n // TODO need think about decimalMarker\n if (Array.isArray(decimalMarker)) {\n const marker = decimalMarker.find((dm) => dm !== this.thousandSeparator);\n // eslint-disable-next-line no-param-reassign\n decimalMarker = marker ? marker : decimalMarker[0];\n }\n const precisionRegEx = new RegExp(\n this._charToRegExpExpression(decimalMarker) + `\\\\d{${precision}}.*$`\n );\n\n const precisionMatch: RegExpMatchArray | null = inputValue.match(precisionRegEx);\n const precisionMatchLength: number = (precisionMatch && precisionMatch[0]?.length) ?? 0;\n if (precisionMatchLength - 1 > precision) {\n const diff = precisionMatchLength - 1 - precision;\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue.substring(0, inputValue.length - diff);\n }\n if (\n precision === 0 &&\n this._compareOrIncludes(\n inputValue[inputValue.length - 1],\n decimalMarker,\n this.thousandSeparator\n )\n ) {\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue.substring(0, inputValue.length - 1);\n }\n }\n return inputValue;\n };\n\n private _stripToDecimal(str: string): string {\n return str\n .split('')\n .filter((i: string, idx: number) => {\n const isDecimalMarker =\n typeof this.decimalMarker === 'string'\n ? i === this.decimalMarker\n : // TODO (inepipenko) use utility type\n this.decimalMarker.includes(i as ',' | '.');\n return (\n i.match('^-?\\\\d') ||\n i === this.thousandSeparator ||\n isDecimalMarker ||\n (i === '-' && idx === 0 && this.allowNegativeNumbers)\n );\n })\n .join('');\n }\n\n private _charToRegExpExpression(char: string): string {\n // if (Array.isArray(char)) {\n // \treturn char.map((v) => ('[\\\\^$.|?*+()'.indexOf(v) >= 0 ? `\\\\${v}` : v)).join('|');\n // }\n if (char) {\n const charsToEscape = '[\\\\^$.|?*+()';\n return char === ' ' ? '\\\\s' : charsToEscape.indexOf(char) >= 0 ? `\\\\${char}` : char;\n }\n return char;\n }\n\n private _shiftStep(maskExpression: string, cursor: number, inputLength: number) {\n const shiftStep: number = /[*?]/g.test(maskExpression.slice(0, cursor))\n ? inputLength\n : cursor;\n this._shift.add(shiftStep + this.prefix.length || 0);\n }\n\n protected _compareOrIncludes<T>(value: T, comparedValue: T | T[], excludedValue: T): boolean {\n return Array.isArray(comparedValue)\n ? comparedValue.filter((v) => v !== excludedValue).includes(value)\n : value === comparedValue;\n }\n\n private _validIP(valuesIP: string[]): boolean {\n return !(\n valuesIP.length === 4 &&\n !valuesIP.some((value: string, index: number) => {\n if (valuesIP.length !== index + 1) {\n return value === '' || Number(value) > 255;\n }\n return value === '' || Number(value.substring(0, 3)) > 255;\n })\n );\n }\n}\n","import { ElementRef, inject, Injectable, Renderer2 } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\nimport { NGX_MASK_CONFIG, IConfig } from './ngx-mask.config';\nimport { NgxMaskApplierService } from './ngx-mask-applier.service';\n\n@Injectable()\nexport class NgxMaskService extends NgxMaskApplierService {\n public isNumberValue = false;\n\n public maskIsShown = '';\n\n public selStart: number | null = null;\n\n public selEnd: number | null = null;\n\n /**\n * Whether we are currently in writeValue function, in this case when applying the mask we don't want to trigger onChange function,\n * since writeValue should be a one way only process of writing the DOM value based on the Angular model value.\n */\n public writingValue = false;\n\n public maskChanged = false;\n\n public triggerOnMaskChange = false;\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any\n public onChange = (_: any) => {};\n\n private readonly document = inject(DOCUMENT);\n\n protected override _config = inject<IConfig>(NGX_MASK_CONFIG);\n\n private readonly _elementRef = inject(ElementRef, { optional: true });\n\n private readonly _renderer = inject(Renderer2, { optional: true });\n\n // eslint-disable-next-line complexity\n public override applyMask(\n inputValue: string,\n maskExpression: string,\n position = 0,\n justPasted = false,\n backspaced = false,\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any\n cb: (...args: any[]) => any = () => {}\n ): string {\n if (!maskExpression) {\n return inputValue !== this.actualValue ? this.actualValue : inputValue;\n }\n this.maskIsShown = this.showMaskTyped ? this.showMaskInInput() : '';\n if (this.maskExpression === 'IP' && this.showMaskTyped) {\n this.maskIsShown = this.showMaskInInput(inputValue || '#');\n }\n if (this.maskExpression === 'CPF_CNPJ' && this.showMaskTyped) {\n this.maskIsShown = this.showMaskInInput(inputValue || '#');\n }\n if (!inputValue && this.showMaskTyped) {\n this.formControlResult(this.prefix);\n return this.prefix + this.maskIsShown;\n }\n const getSymbol: string =\n !!inputValue && typeof this.selStart === 'number'\n ? inputValue[this.selStart] ?? ''\n : '';\n let newInputValue = '';\n if (this.hiddenInput !== undefined && !this.writingValue) {\n let actualResult: string[] = this.actualValue.split('');\n // eslint-disable @typescript-eslint/no-unused-expressions\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n inputValue !== '' && actualResult.length\n ? typeof this.selStart === 'number' && typeof this.selEnd === 'number'\n ? inputValue.length > actualResult.length\n ? actualResult.splice(this.selStart, 0, getSymbol)\n : inputValue.length < actualResult.length\n ? actualResult.length - inputValue.length === 1\n ? actualResult.splice(this.selStart - 1, 1)\n : actualResult.splice(this.selStart, this.selEnd - this.selStart)\n : null\n : null\n : (actualResult = []);\n if (this.showMaskTyped) {\n if (!this.hiddenInput) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this.removeMask(inputValue);\n }\n }\n // eslint-enable @typescript-eslint/no-unused-expressions\n newInputValue =\n this.actualValue.length && actualResult.length <= inputValue.length\n ? this.shiftTypedSymbols(actualResult.join(''))\n : inputValue;\n }\n\n if (this.showMaskTyped) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this.removeMask(inputValue);\n }\n\n newInputValue = Boolean(newInputValue) && newInputValue.length ? newInputValue : inputValue;\n\n const result: string = super.applyMask(\n newInputValue,\n maskExpression,\n position,\n justPasted,\n backspaced,\n cb\n );\n this.actualValue = this.getActualValue(result);\n // handle some separator implications:\n // a.) adjust decimalMarker default (. -> ,) if thousandSeparator is a dot\n if (this.thousandSeparator === '.' && this.decimalMarker === '.') {\n this.decimalMarker = ',';\n }\n\n // b) remove decimal marker from list of special characters to mask\n if (this.maskExpression.startsWith('separator') && this.dropSpecialCharacters === true) {\n this.specialCharacters = this.specialCharacters.filter(\n (item: string) =>\n !this._compareOrIncludes(item, this.decimalMarker, this.thousandSeparator) //item !== this.decimalMarker, // !\n );\n }\n this.formControlResult(result);\n if (!this.showMaskTyped || (this.showMaskTyped && this.hiddenInput)) {\n if (this.hiddenInput) {\n return result && result.length\n ? this.hideInput(result, this.maskExpression)\n : result;\n }\n return result;\n }\n const resLen: number = result.length;\n const prefNmask: string = this.prefix + this.maskIsShown;\n\n if (this.maskExpression.includes('H')) {\n const countSkipedSymbol = this._numberSkipedSymbols(result);\n return result + prefNmask.slice(resLen + countSkipedSymbol);\n } else if (this.maskExpression === 'IP' || this.maskExpression === 'CPF_CNPJ') {\n return result + prefNmask;\n }\n return result + prefNmask.slice(resLen);\n }\n\n // get the number of characters that were shifted\n private _numberSkipedSymbols(value: string): number {\n const regex = /(^|\\D)(\\d\\D)/g;\n let match = regex.exec(value);\n let countSkipedSymbol = 0;\n while (match != null) {\n countSkipedSymbol += 1;\n match = regex.exec(value);\n }\n return countSkipedSymbol;\n }\n\n public applyValueChanges(\n position: number,\n justPasted: boolean,\n backspaced: boolean,\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any\n cb: (...args: any[]) => any = () => {}\n ): void {\n const formElement = this._elementRef?.nativeElement;\n if (!formElement) {\n return;\n }\n formElement.value = this.applyMask(\n formElement.value,\n this.maskExpression,\n position,\n justPasted,\n backspaced,\n cb\n );\n if (formElement === this._getActiveElement()) {\n return;\n }\n this.clearIfNotMatchFn();\n }\n\n public hideInput(inputValue: string, maskExpression: string): string {\n return inputValue\n .split('')\n .map((curr: string, index: number) => {\n if (\n this.patterns &&\n this.patterns[maskExpression[index] ?? ''] &&\n this.patterns[maskExpression[index] ?? '']?.symbol\n ) {\n return this.patterns[maskExpression[index] ?? '']?.symbol;\n }\n return curr;\n })\n .join('');\n }\n\n // this function is not necessary, it checks result against maskExpression\n public getActualValue(res: string): string {\n const compare: string[] = res.split('').filter((symbol: string, i: number) => {\n const maskChar = this.maskExpression[i] ?? '';\n return (\n this._checkSymbolMask(symbol, maskChar) ||\n (this.specialCharacters.includes(maskChar) && symbol === maskChar)\n );\n });\n if (compare.join('') === res) {\n return compare.join('');\n }\n return res;\n }\n\n public shiftTypedSymbols(inputValue: string): string {\n let symbolToReplace = '';\n const newInputValue: (string | undefined)[] =\n (inputValue &&\n inputValue.split('').map((currSymbol: string, index: number) => {\n if (\n this.specialCharacters.includes(inputValue[index + 1] ?? '') &&\n inputValue[index + 1] !== this.maskExpression[index + 1]\n ) {\n symbolToReplace = currSymbol;\n return inputValue[index + 1];\n }\n if (symbolToReplace.length) {\n const replaceSymbol: string = symbolToReplace;\n symbolToReplace = '';\n return replaceSymbol;\n }\n return currSymbol;\n })) ||\n [];\n return newInputValue.join('');\n }\n\n /**\n * Convert number value to string\n * 3.1415 -> '3.1415'\n * 1e-7 -> '0.0000001'\n */\n public numberToString(value: number | string): string {\n if (!value && value !== 0) {\n return String(value);\n }\n return Number(value).toLocaleString('fullwide', {\n useGrouping: false,\n maximumFractionDigits: 20,\n });\n }\n\n public showMaskInInput(inputVal?: string): string {\n if (this.showMaskTyped && !!this.shownMaskExpression) {\n if (this.maskExpression.length !== this.shownMaskExpression.length) {\n throw new Error('Mask expression must match mask placeholder length');\n } else {\n return this.shownMaskExpression;\n }\n } else if (this.showMaskTyped) {\n if (inputVal) {\n if (this.maskExpression === 'IP') {\n return this._checkForIp(inputVal);\n }\n if (this.maskExpression === 'CPF_CNPJ') {\n return this._checkForCpfCnpj(inputVal);\n }\n }\n return this.maskExpression.replace(/\\w/g, this.placeHolderCharacter);\n }\n return '';\n }\n\n public clearIfNotMatchFn(): void {\n const formElement = this._elementRef?.nativeElement;\n if (!formElement) {\n return;\n }\n if (\n this.clearIfNotMatch &&\n this.prefix.length + this.maskExpression.length + this.suffix.length !==\n formElement.value.replace(/_/g, '').length\n ) {\n this.formElementProperty = ['value', ''];\n this.applyMask(formElement.value, this.maskExpression);\n }\n }\n\n public set formElementProperty([name, value]: [string, string | boolean]) {\n if (!this._renderer || !this._elementRef) {\n return;\n }\n Promise.resolve().then(() =>\n this._renderer?.setProperty(this._elementRef?.nativeElement, name, value)\n );\n }\n\n public checkSpecialCharAmount(mask: string): number {\n const chars: string[] = mask\n .split('')\n .filter((item: string) => this._findSpecialChar(item));\n return chars.length;\n }\n\n public removeMask(inputValue: string): string {\n return this._removeMask(\n this._removeSuffix(this._removePrefix(inputValue)),\n this.specialCharacters.concat('_').concat(this.placeHolderCharacter)\n );\n }\n\n private _checkForIp(inputVal: string): string {\n if (inputVal === '#') {\n return `${this.placeHolderCharacter}.${this.placeHolderCharacter}.${this.placeHolderCharacter}.${this.placeHolderCharacter}`;\n }\n const arr: string[] = [];\n for (let i = 0; i < inputVal.length; i++) {\n const value = inputVal[i] ?? '';\n if (!value) {\n continue;\n }\n if (value.match('\\\\d')) {\n arr.push(value);\n }\n }\n if (arr.length <= 3) {\n return `${this.placeHolderCharacter}.${this.placeHolderCharacter}.${this.placeHolderCharacter}`;\n }\n if (arr.length > 3 && arr.length <= 6) {\n return `${this.placeHolderCharacter}.${this.placeHolderCharacter}`;\n }\n if (arr.length > 6 && arr.length <= 9) {\n return this.placeHolderCharacter;\n }\n if (arr.length > 9 && arr.length <= 12) {\n return '';\n }\n return '';\n }\n\n private _checkForCpfCnpj(inputVal: string): string {\n const cpf =\n `${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `.${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `.${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `-${this.placeHolderCharacter}${this.placeHolderCharacter}`;\n const cnpj =\n `${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `.${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `.${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `/${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `-${this.placeHolderCharacter}${this.placeHolderCharacter}`;\n\n if (inputVal === '#') {\n return cpf;\n }\n const arr: string[] = [];\n for (let i = 0; i < inputVal.length; i++) {\n const value = inputVal[i] ?? '';\n if (!value) {\n continue;\n }\n if (value.match('\\\\d')) {\n arr.push(value);\n }\n }\n if (arr.length <= 3) {\n return cpf.slice(arr.length, cpf.length);\n }\n if (arr.length > 3 && arr.length <= 6) {\n return cpf.slice(arr.length + 1, cpf.length);\n }\n if (arr.length > 6 && arr.length <= 9) {\n return cpf.slice(arr.length + 2, cpf.length);\n }\n if (arr.length > 9 && arr.length < 11) {\n return cpf.slice(arr.length + 3, cpf.length);\n }\n if (arr.length === 11) {\n return '';\n }\n if (arr.length === 12) {\n if (inputVal.length === 17) {\n return cnpj.slice(16, cnpj.length);\n }\n return cnpj.slice(15, cnpj.length);\n }\n if (arr.length > 12 && arr.length <= 14) {\n return cnpj.slice(arr.length + 4, cnpj.length);\n }\n return '';\n }\n\n /**\n * Recursively determine the current active element by navigating the Shadow DOM until the Active Element is found.\n */\n private _getActiveElement(document: DocumentOrShadowRoot = this.document): Element | null {\n const shadowRootEl = document?.activeElement?.shadowRoot;\n if (!shadowRootEl?.activeElement) {\n return document.activeElement;\n } else {\n return this._getActiveElement(shadowRootEl);\n }\n }\n\n /**\n * Propogates the input value back to the Angular model by triggering the onChange function. It won't do this if writingValue\n * is true. If that is true it means we are currently in the writeValue function, which is supposed to only update the actual\n * DOM element based on the Angular model value. It should be a one way process, i.e. writeValue should not be modifying the Angular\n * model value too. Therefore, we don't trigger onChange in this scenario.\n * @param inputValue the current form input value\n */\n private formControlResult(inputValue: string): void {\n if (this.writingValue || (!this.triggerOnMaskChange && this.maskChanged)) {\n this.maskChanged = false;\n return;\n }\n if (Array.isArray(this.dropSpecialCharacters)) {\n this.onChange(\n this._toNumber(\n this._checkSymbols(\n this._removeMask(\n this._removeSuffix(this._removePrefix(inputValue)),\n this.dropSpecialCharacters\n )\n )\n )\n );\n } else if (\n this.dropSpecialCharacters ||\n (!this.dropSpecialCharacters && this.prefix === inputValue)\n ) {\n this.onChange(\n this._toNumber(\n this._checkSymbols(this._removeSuffix(this._removePrefix(inputValue)))\n )\n );\n } else {\n this.onChange(this._toNumber(inputValue));\n }\n }\n\n private _toNumber(value: string | number | undefined | null) {\n if (!this.isNumberValue || value === '') {\n return value;\n }\n const num = Number(value);\n return Number.isNaN(num) ? value : num;\n }\n\n private _removeMask(value: string, specialCharactersForRemove: string[]): string {\n if (this.maskExpression.startsWith('percent') && value.includes('.')) {\n return value;\n }\n return value ? value.replace(this._regExpForRemove(specialCharactersForRemove), '') : value;\n }\n\n private _removePrefix(value: string): string {\n if (!this.prefix) {\n return value;\n }\n return value ? value.replace(this.prefix, '') : value;\n }\n\n private _removeSuffix(value: string): string {\n if (!this.suffix) {\n return value;\n }\n return value ? value.replace(this.suffix, '') : value;\n }\n\n private _retrieveSeparatorValue(result: string): string {\n const specialCharacters = Array.isArray(this.dropSpecialCharacters)\n ? this.specialCharacters.filter((v) => {\n return (this.dropSpecialCharacters as string[]).includes(v);\n })\n : this.specialCharacters;\n return this._removeMask(result, specialCharacters);\n }\n\n private _regExpForRemove(specialCharactersForRemove: string[]): RegExp {\n return new RegExp(\n specialCharactersForRemove.map((item: string) => `\\\\${item}`).join('|'),\n 'gi'\n );\n }\n\n private _replaceDecimalMarkerToDot(value: string): string {\n const markers = Array.isArray(this.decimalMarker)\n ? this.decimalMarker\n : [this.decimalMarker];\n\n return value.replace(this._regExpForRemove(markers), '.');\n }\n\n private _checkSymbols(result: string): string | number | undefined | null {\n if (result === '') {\n return result;\n }\n\n const separatorPrecision: number | null = this._retrieveSeparatorPrecision(\n this.maskExpression\n );\n const separatorValue: string = this._replaceDecimalMarkerToDot(\n this._retrieveSeparatorValue(result)\n );\n\n if (!this.isNumberValue) {\n return separatorValue;\n }\n if (separatorPrecision) {\n if (result === this.decimalMarker) {\n return null;\n }\n return this._checkPrecision(this.maskExpression, separatorValue);\n } else {\n return separatorValue;\n }\n }\n\n // TODO should think about helpers or separting decimal precision to own property\n private _retrieveSeparatorPrecision(maskExpretion: string): number | null {\n const matcher: RegExpMatchArray | null = maskExpretion.match(\n new RegExp(`^separator\\\\.([^d]*)`)\n );\n return matcher ? Number(matcher[1]) : null;\n }\n\n private _checkPrecision(separatorExpression: string, separatorValue: string): number | string {\n if (separatorExpression.indexOf('2') > 0) {\n return Number(separatorValue).toFixed(2);\n }\n return Number(separatorValue);\n }\n}\n","import { EnvironmentProviders, inject, makeEnvironmentProviders, Provider } from '@angular/core';\n\nimport {\n NGX_MASK_CONFIG,\n INITIAL_CONFIG,\n initialConfig,\n NEW_CONFIG,\n optionsConfig,\n} from './ngx-mask.config';\nimport { NgxMaskService } from './ngx-mask.service';\n\n/**\n * @internal\n */\nfunction _configFactory(): optionsConfig {\n const initConfig = inject<optionsConfig>(INITIAL_CONFIG);\n const configValue = inject<optionsConfig | (() => optionsConfig)>(NEW_CONFIG);\n\n return configValue instanceof Function\n ? { ...initConfig, ...configValue() }\n : { ...initConfig, ...configValue };\n}\n\nexport function provideNgxMask(configValue?: optionsConfig | (() => optionsConfig)): Provider[] {\n return [\n {\n provide: NEW_CONFIG,\n useValue: configValue,\n },\n {\n provide: INITIAL_CONFIG,\n useValue: initialConfig,\n },\n {\n provide: NGX_MASK_CONFIG,\n useFactory: _configFactory,\n },\n NgxMaskService,\n ];\n}\n\nexport function provideEnvironmentNgxMask(\n configValue?: optionsConfig | (() => optionsConfig)\n): EnvironmentProviders {\n return makeEnvironmentProviders(provideNgxMask(configValue));\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n Directive,\n EventEmitter,\n HostListener,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n inject,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n FormControl,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\n\nimport { CustomKeyboardEvent } from './custom-keyboard-event';\nimport { IConfig, NGX_MASK_CONFIG, timeMasks, withoutValidation } from './ngx-mask.config';\nimport { NgxMaskService } from './ngx-mask.service';\n\n@Directive({\n selector: 'input[mask], textarea[mask]',\n standalone: true,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: NgxMaskDirective,\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: NgxMaskDirective,\n multi: true,\n },\n NgxMaskService,\n ],\n exportAs: 'mask,ngxMask',\n})\nexport class NgxMaskDirective implements ControlValueAccessor, OnChanges, Validator {\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input('mask') public maskExpression: string | undefined | null = '';\n\n @Input() public specialCharacters: IConfig['specialCharacters'] = [];\n\n @Input() public patterns: IConfig['patterns'] = {};\n\n @Input() public prefix: IConfig['prefix'] = '';\n\n @Input() public suffix: IConfig['suffix'] = '';\n\n @Input() public thousandSeparator: IConfig['thousandSeparator'] = ' ';\n\n @Input() public decimalMarker: IConfig['decimalMarker'] = '.';\n\n @Input() public dropSpecialCharacters: IConfig['dropSpecialCharacters'] | null = null;\n\n @Input() public hiddenInput: IConfig['hiddenInput'] | null = null;\n\n @Input() public showMaskTyped: IConfig['showMaskTyped'] | null = null;\n\n @Input() public placeHolderCharacter: IConfig['placeHolderCharacter'] | null = null;\n\n @Input() public shownMaskExpression: IConfig['shownMaskExpression'] | null = null;\n\n @Input() public showTemplate: IConfig['showTemplate'] | null = null;\n\n @Input() public clearIfNotMatch: IConfig['clearIfNotMatch'] | null = null;\n\n @Input() public validation: IConfig['validation'] | null = null;\n\n @Input() public separatorLimit: IConfig['separatorLimit'] | null = null;\n\n @Input() public allowNegativeNumbers: IConfig['allowNegativeNumbers'] | null = null;\n\n @Input() public leadZeroDateTime: IConfig['leadZeroDateTime'] | null = null;\n\n @Input() public triggerOnMaskChange: IConfig['triggerOnMaskChange'] | null = null;\n\n @Output() public maskFilled: IConfig['maskFilled'] = new EventEmitter<void>();\n\n private _maskValue = '';\n\n private _inputValue!: string;\n\n private _position: number | null = null;\n\n private _start!: number;\n\n private _end!: number;\n\n private _code!: string;\n\n private _maskExpressionArray: string[] = [];\n\n private _justPasted = false;\n\n /**For IME composition event */\n private _isComposing = false;\n\n private readonly document = inject(DOCUMENT);\n\n public _maskService = inject(NgxMaskService, { self: true });\n\n protected _config = inject<IConfig>(NGX_MASK_CONFIG);\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any\n public onChange = (_: any) => {};\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n public onTouch = () => {};\n\n public ngOnChanges(changes: SimpleChanges): void {\n const {\n maskExpression,\n specialCharacters,\n patterns,\n prefix,\n suffix,\n thousandSeparator,\n decimalMarker,\n dropSpecialCharacters,\n hiddenInput,\n showMaskTyped,\n placeHolderCharacter,\n shownMaskExpression,\n showTemplate,\n clearIfNotMatch,\n validation,\n separatorLimit,\n allowNegativeNumbers,\n leadZeroDateTime,\n triggerOnMaskChange,\n } = changes;\n if (maskExpression) {\n if (\n maskExpression.currentValue !== maskExpression.previousValue &&\n !maskExpression.firstChange\n ) {\n this._maskService.maskChanged = true;\n }\n if (allowNegativeNumbers) {\n this._maskService.allowNegativeNumbers = allowNegativeNumbers.currentValue;\n if (this._maskService.allowNegativeNumbers) {\n this._maskService.specialCharacters =\n this._maskService.specialCharacters.filter((c: string) => c !== '-');\n }\n }\n if (maskExpression.currentValue && maskExpression.currentValue.split('||').length > 1) {\n this._maskExpressionArray = maskExpression.currentValue\n .split('||')\n .sort((a: string, b: string) => {\n return a.length - b.length;\n });\n this._setMask();\n } else {\n this._maskExpressionArray = [];\n this._maskValue = maskExpression.currentValue || '';\n this._maskService.maskExpression = this._maskValue;\n }\n }\n if (specialCharacters) {\n if (!specialCharacters.currentValue || !Array.isArray(specialCharacters.currentValue)) {\n return;\n } else {\n this._maskService.specialCharacters = specialCharacters.currentValue || [];\n }\n }\n // Only overwrite the mask available patterns if a pattern has actually been passed in\n if (patterns && patterns.currentValue) {\n this._maskService.patterns = patterns.currentValue;\n }\n if (prefix) {\n this._maskService.prefix = prefix.currentValue;\n }\n if (suffix) {\n this._maskService.suffix = suffix.currentValue;\n }\n if (thousandSeparator) {\n this._maskService.thousandSeparator = thousandSeparator.currentValue;\n }\n if (decimalMarker) {\n this._maskService.decimalMarker = decimalMarker.currentValue;\n }\n if (dropSpecialCharacters) {\n this._maskService.dropSpecialCharacters = dropSpecialCharacters.currentValue;\n }\n if (hiddenInput) {\n this._maskService.hiddenInput = hiddenInput.currentValue;\n }\n if (showMaskTyped) {\n this._maskService.showMaskTyped = showMaskTyped.currentValue;\n }\n if (placeHolderCharacter) {\n this._maskService.placeHolderCharacter = placeHolderCharacter.currentValue;\n }\n if (shownMaskExpression) {\n this._maskService.shownMaskExpression = shownMaskExpression.currentValue;\n }\n if (showTemplate) {\n this._maskService.showTemplate = showTemplate.currentValue;\n }\n if (clearIfNotMatch) {\n this._maskService.clearIfNotMatch = clearIfNotMatch.currentValue;\n }\n if (validation) {\n this._maskService.validation = validation.currentValue;\n }\n if (separatorLimit) {\n this._maskService.separatorLimit = separatorLimit.currentValue;\n }\n if (leadZeroDateTime) {\n this._maskService.leadZeroDateTime = leadZeroDateTime.currentValue;\n }\n if (triggerOnMaskChange) {\n this._maskService.triggerOnMaskChange = triggerOnMaskChange.currentValue;\n }\n\n this._applyMask();\n }\n\n // eslint-disable-next-line complexity\n public validate({ value }: FormControl): ValidationErrors | null {\n if (!this._maskService.validation || !this._maskValue) {\n return null;\n }\n if (this._maskService.ipError) {\n return this._createValidationError(value);\n }\n if (this._maskService.cpfCnpjError) {\n return this._createValidationError(value);\n }\n if (this._maskValue.startsWith('separator')) {\n return null;\n }\n if (withoutValidation.includes(this._maskValue)) {\n return null;\n }\n if (this._maskService.clearIfNotMatch) {\n return null;\n }\n if (timeMasks.includes(this._maskValue)) {\n return this._validateTime(value);\n }\n if (value && value.toString().length >= 1) {\n let counterOfOpt = 0;\n for (const key in this._maskService.patterns) {\n if (this._maskService.patterns[key]?.optional) {\n if (this._maskValue.indexOf(key) !== this._maskValue.lastIndexOf(key)) {\n const opt: string = this._maskValue\n .split('')\n .filter((i: string) => i === key)\n .join('');\n counterOfOpt += opt.length;\n } else if (this._maskValue.indexOf(key) !== -1) {\n counterOfOpt++;\n }\n if (\n this._maskValue.indexOf(key) !== -1 &&\n value.toString().length >= this._maskValue.indexOf(key)\n ) {\n return null;\n }\n if (counterOfOpt === this._maskValue.length) {\n return null;\n }\n }\n }\n if (\n this._maskValue.indexOf('{') === 1 &&\n value.toString().length ===\n this._maskValue.length +\n Number((this._maskValue.split('{')[1] ?? '').split('}')[0]) -\n 4\n ) {\n return null;\n }\n if (this._maskValue.indexOf('*') === 1 || this._maskValue.indexOf('?') === 1) {\n return null;\n } else if (\n (this._maskValue.indexOf('*') > 1 &&\n value.toString().length < this._maskValue.indexOf('*')) ||\n (this._maskValue.indexOf('?') > 1 &&\n value.toString().length < this._maskValue.indexOf('?')) ||\n this._maskValue.indexOf('{') === 1\n ) {\n return this._createValidationError(value);\n }\n if (this._maskValue.indexOf('*') === -1 || this._maskValue.indexOf('?') === -1) {\n const length: number = this._maskService.dropSpecialCharacters\n ? this._maskValue.length -\n this._maskService.checkSpecialCharAmount(this._maskValue) -\n counterOfOpt\n : this._maskValue.length - counterOfOpt;\n if (value.toString().length < length) {\n return this._createValidationError(value);\n }\n }\n }\n if (value) {\n this.maskFilled.emit();\n return null;\n }\n return null;\n }\n\n @HostListener('paste')\n public onPaste() {\n this._justPasted = true;\n }\n\n @HostListener('ngModelChange', ['$event'])\n public onModelChange(value: string | undefined | null | number): void {\n // on form reset we need to update the actualValue\n if (\n (value === '' || value === null || value === undefined) &&\n this._maskService.actualValue\n ) {\n this._maskService.actualValue = this._maskService.getActualValue('');\n }\n }\n\n @HostListener('input', ['$event'])\n public onInput(e: CustomKeyboardEvent): void {\n // If IME is composing text, we wait for the composed text.\n if (this._isComposing) return;\n\n const el: HTMLInputElement = e.target as HTMLInputElement;\n this._inputValue = el.value;\n\n this._setMask();\n\n if (!this._maskValue) {\n this.onChange(el.value);\n return;\n }\n let position: number =\n el.selectionStart === 1\n ? (el.selectionStart as number) + this._maskService.prefix.length\n : (el.selectionStart as number);\n\n let caretShift = 0;\n let backspaceShift = false;\n this._maskService.applyValueChanges(\n position,\n this._justPasted,\n this._code === 'Backspace' || this._code === 'Delete',\n (shift: number, _backspaceShift: boolean) => {\n this._justPasted = false;\n caretShift = shift;\n backspaceShift = _backspaceShift;\n }\n );\n // only set the selection if the element is active\n if (this._getActiveElement() !== el) {\n return;\n }\n\n // update position after applyValueChanges to prevent cursor on wrong position when it has an array of maskExpression\n if (this._maskExpressionArray.length) {\n position =\n el.selectionStart === 1\n ? (el.selectionStart as number) + this._maskService.prefix.length\n : (el.selectionStart as number);\n }\n\n this._position =\n this._position === 1 && this._inputValue.length === 1 ? null : this._position;\n\n let positionToApply: number = this._position\n ? this._inputValue.length + position + caretShift\n : position + (this._code === 'Backspace' && !backspaceShift ? 0 : caretShift);\n if (positionToApply > this._getActualInputLength()) {\n positionToApply = this._getActualInputLength();\n }\n if (positionToApply < 0) {\n positionToApply = 0;\n }\n el.setSelectionRange(positionToApply, positionToApply);\n this._position = null;\n }\n\n // IME starts\n @HostListener('compositionstart', ['$event'])\n public onCompositionStart(): void {\n this._isComposing = true;\n }\n\n // IME completes\n @HostListener('compositionend', ['$event'])\n public onCompositionEnd(e: CustomKeyboardEvent): void {\n this._isComposing = false;\n this._justPasted = true;\n this.onInput(e);\n }\n\n @HostListener('blur')\n public onBlur(): void {\n if (this._maskValue) {\n this._maskService.clearIfNotMatchFn();\n }\n this.onTouch();\n }\n\n @HostListener('click', ['$event'])\n public onClick(e: MouseEvent | CustomKeyboardEvent): void {\n if (!this._maskValue) {\n return;\n }\n const el: HTMLInputElement = e.target as HTMLInputElement;\n const posStart = 0;\n const posEnd = 0;\n if (\n el !== null &&\n el.selectionStart !== null &&\n el.selectionStart === el.selectionEnd &&\n el.selectionStart > this._maskService.prefix.length &&\n // eslint-disable-next-line\n (e as any).keyCode !== 38\n ) {\n if (this._maskService.showMaskTyped) {\n // We are showing the mask in the input\n this._maskService.maskIsShown = this._maskService.showMaskInInput();\n if (\n el.setSelectionRange &&\n this._maskService.prefix + this._maskService.maskIsShown === el.value\n ) {\n // the input ONLY contains the mask, so position the cursor at the start\n el.focus();\n el.setSelectionRange(posStart, posEnd);\n } else {\n // the input contains some characters already\n if (el.selectionStart > this._maskService.actualValue.length) {\n // if the user clicked beyond our value's length, position the cursor at the end of our value\n el.setSelectionRange(\n this._maskService.actualValue.length,\n this._maskService.actualValue.length\n );\n }\n }\n }\n }\n const nextValue: string | null =\n el &&\n (!el.value || el.value === this._maskService.prefix\n ? this._maskService.prefix + this._maskService.maskIsShown\n : el.value);\n /** Fix of cursor position jumping to end in most browsers no matter where cursor is inserted onFocus */\n if (el && el.value !== nextValue) {\n el.value = nextValue;\n }\n\n /** fix of cursor position with prefix when mouse click occur */\n if (\n el &&\n ((el.selectionStart as number) || (el.selectionEnd as number)) <=\n this._maskService.prefix.length\n ) {\n el.selectionStart = this._maskService.prefix.length;\n return;\n }\n /** select only inserted text */\n if (el && (el.selectionEnd as number) > this._getActualInputLength()) {\n el.selectionEnd = this._getActualInputLength();\n }\n }\n\n // eslint-disable-next-line complexity\n @HostListener('keydown', ['$event'])\n public onKeyDown(e: CustomKeyboardEvent): void {\n if (!this._maskValue) {\n return;\n }\n\n if (this._isComposing) {\n // User finalize their choice from IME composition, so trigger onInput() for the composed text.\n if (e.key === 'Enter') this.onCompositionEnd(e);\n return;\n }\n\n this._code = e.code ? e.code : e.key;\n const el: HTMLInputElement = e.target as HTMLInputElement;\n this._inputValue = el.value;\n\n this._setMask();\n\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n }\n\n if (e.key === 'ArrowLeft' || e.key === 'Backspace' || e.key === 'Delete') {\n if (e.key === 'Backspace' && el.value.length === 0) {\n el.selectionStart = el.selectionEnd;\n }\n if (e.key === 'Backspace' && (el.selectionStart as number) !== 0) {\n // If specialChars is false, (shouldn't ever happen) then set to the defaults\n this.specialCharacters = this.specialCharacters?.length\n ? this.specialCharacters\n : this._config.specialCharacters;\n if (this.prefix.length > 1 && (el.selectionStart as number) <= this.prefix.length) {\n el.setSelectionRange(this.prefix.length, el.selectionEnd);\n } else {\n if (\n this._inputValue.length !== (el.selectionStart as number) &&\n (el.selectionStart as number) !== 1\n ) {\n while (\n this.specialCharacters.includes(\n (\n this._inputValue[(el.selectionStart as number) - 1] ?? ''\n ).toString()\n ) &&\n ((this.prefix.length >= 1 &&\n (el.selectionStart as number) > this.prefix.length) ||\n this.prefix.length === 0)\n ) {\n el.setSelectionRange(\n (el.selectionStart as number) - 1,\n el.selectionEnd\n );\n }\n }\n }\n }\n this.checkSelectionOnDeletion(el);\n if (\n this._maskService.prefix.length &&\n (el.selectionStart as number) <= this._maskService.prefix.length &&\n (el.selectionEnd as number) <= this._maskService.prefix.length\n ) {\n e.preventDefault();\n }\n const cursorStart: number | null = el.selectionStart;\n if (\n e.key === 'Backspace' &&\n !el.readOnly &&\n cursorStart === 0 &&\n el.selectionEnd === el.value.length &&\n el.value.length !== 0\n ) {\n this._position = this._maskService.prefix ? this._maskService.prefix.length : 0;\n this._maskService.applyMask(\n this._maskService.prefix,\n this._maskService.maskExpression,\n this._position\n );\n }\n }\n if (\n !!this.suffix &&\n this.suffix.length > 1 &&\n this._inputValue.length - this.suffix.length < (el.selectionStart as number)\n ) {\n el.setSelectionRange(\n this._inputValue.length - this.suffix.length,\n this._inputValue.length\n );\n } else if (\n (e.code === 'KeyA' && e.ctrlKey) ||\n (e.code === 'KeyA' && e.metaKey) // Cmd + A (Mac)\n ) {\n el.setSelectionRange(0, this._getActualInputLength());\n e.preventDefault();\n }\n this._maskService.selStart = el.selectionStart;\n this._maskService.selEnd = el.selectionEnd;\n }\n\n /** It writes the value in the input */\n public async writeValue(\n inputValue: string | number | { value: string | number; disable?: boolean }\n ): Promise<void> {\n if (typeof inputValue === 'object' && inputValue !== null && 'value' in inputValue) {\n if ('disable' in inputValue) {\n this.setDisabledState(Boolean(inputValue.disable));\n }\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue.value;\n }\n\n if (typeof inputValue === 'number' || this._maskValue.startsWith('separator')) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this._maskService.numberToString(inputValue);\n if (!Array.isArray(this._maskService.decimalMarker)) {\n const localeDecimalMarker = this._currentLocaleDecimalMarker();\n // eslint-disable-next-line no-param-reassign\n inputValue =\n this._maskService.decimalMarker !== localeDecimalMarker\n ? inputValue.replace(localeDecimalMarker, this._maskService.decimalMarker)\n : inputValue;\n }\n this._maskService.isNumberValue = true;\n }\n\n if (typeof inputValue !== 'string') {\n // eslint-disable-next-line no-param-reassign\n inputValue = '';\n }\n\n this._inputValue = inputValue;\n this._setMask();\n\n if (\n (inputValue && this._maskService.maskExpression) ||\n (this._maskService.maskExpression &&\n (this._maskService.prefix || this._maskService.showMaskTyped))\n ) {\n // Let the service we know we are writing value so that triggering onChange function won't happen during applyMask\n this._maskService.writingValue = true;\n this._maskService.formElementProperty = [\n 'value',\n this._maskService.applyMask(inputValue, this._maskService.maskExpression),\n ];\n // Let the service know we've finished writing value\n this._maskService.writingValue = false;\n } else {\n this._maskService.formElementProperty = ['value', inputValue];\n }\n this._inputValue = inputValue;\n }\n\n public registerOnChange(fn: typeof this.onChange): void {\n this._maskService.onChange = this.onChange = fn;\n }\n\n public registerOnTouched(fn: typeof this.onTouch): void {\n this.onTouch = fn;\n }\n\n private _getActiveElement(document: DocumentOrShadowRoot = this.document): Element | null {\n const shadowRootEl = document?.activeElement?.shadowRoot;\n if (!shadowRootEl?.activeElement) {\n return document.activeElement;\n } else {\n return this._getActiveElement(shadowRootEl);\n }\n }\n\n public checkSelectionOnDeletion(el: HTMLInputElement): void {\n el.selectionStart = Math.min(\n Math.max(this.prefix.length, el.selectionStart as number),\n this._inputValue.length - this.suffix.length\n );\n el.selectionEnd = Math.min(\n Math.max(this.prefix.length, el.selectionEnd as number),\n this._inputValue.length - this.suffix.length\n );\n }\n\n /** It disables the input element */\n public setDisabledState(isDisabled: boolean): void {\n this._maskService.formElementProperty = ['disabled', isDisabled];\n }\n\n private _repeatPatternSymbols(maskExp: string): string {\n return (\n (maskExp.match(/{[0-9]+}/) &&\n maskExp\n .split('')\n .reduce((accum: string, currVal: string, index: number): string => {\n this._start = currVal === '{' ? index : this._start;\n\n if (currVal !== '}') {\n return this._maskService._findSpecialChar(currVal)\n ? accum + currVal\n : accum;\n }\n this._end = index;\n const repeatNumber = Number(maskExp.slice(this._start + 1, this._end));\n const replaceWith: string = new Array(repeatNumber + 1).join(\n maskExp[this._start - 1]\n );\n return accum + replaceWith;\n }, '')) ||\n maskExp\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _applyMask(): any {\n this._maskService.maskExpression = this._repeatPatternSymbols(this._maskValue || '');\n this._maskService.formElementProperty = [\n 'value',\n this._maskService.applyMask(this._inputValue, this._maskService.maskExpression),\n ];\n }\n\n private _validateTime(value: string): ValidationErrors | null {\n const rowMaskLen: number = this._maskValue\n .split('')\n .filter((s: string) => s !== ':').length;\n if (!value) {\n return null; // Don't validate empty values to allow for optional form control\n }\n\n if (\n (+(value[value.length - 1] ?? -1) === 0 && value.length < rowMaskLen) ||\n value.length <= rowMaskLen - 2\n ) {\n return this._createValidationError(value);\n }\n\n return null;\n }\n\n private _getActualInputLength() {\n return (\n this._maskService.actualValue.length ||\n this._maskService.actualValue.length + this._maskService.prefix.length\n );\n }\n\n private _createValidationError(actualValue: string): ValidationErrors {\n return {\n mask: {\n requiredMask: this._maskValue,\n actualValue,\n },\n };\n }\n\n private _setMask() {\n if (this._maskExpressionArray.length > 0) {\n this._maskExpressionArray.some((mask): boolean | void => {\n const test =\n this._maskService.removeMask(this._inputValue)?.length <=\n this._maskService.removeMask(mask)?.length;\n if (this._inputValue && test) {\n this._maskValue = mask;\n this.maskExpression = mask;\n this._maskService.maskExpression = mask;\n return test;\n } else {\n const expression =\n this._maskExpressionArray[this._maskExpressionArray.length - 1] ?? '';\n this._maskValue =\n this.maskExpression =\n this._maskService.maskExpression =\n expression;\n }\n });\n }\n }\n\n private _currentLocaleDecimalMarker(): string {\n return (1.1).toLocaleString().substring(1, 2);\n }\n}\n","import { inject, Pipe, PipeTransform } from '@angular/core';\n\nimport { IConfig } from './ngx-mask.config';\nimport { NgxMaskService } from './ngx-mask.service';\n\n@Pipe({\n name: 'mask',\n pure: true,\n standalone: true,\n})\nexport class NgxMaskPipe implements PipeTransform {\n private readonly defaultOptions: Partial<IConfig> = {};\n\n private readonly _maskService = inject(NgxMaskService);\n\n public transform(\n value: string | number,\n mask: string,\n { patterns, ...config }: Partial<IConfig> = {} as Partial<IConfig>\n ): string {\n const currentConfig = {\n maskExpression: mask,\n ...this.defaultOptions,\n ...config,\n patterns: {\n ...this._maskService.patterns,\n ...patterns,\n },\n };\n Object.entries(currentConfig).forEach(([key, value]) => {\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this._maskService as any)[key] = value;\n });\n return this._maskService.applyMask(`${value}`, mask);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-mask.mjs","sources":["../../../projects/ngx-mask-lib/src/lib/ngx-mask.config.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask-applier.service.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask.service.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask.providers.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask.directive.ts","../../../projects/ngx-mask-lib/src/lib/ngx-mask.pipe.ts","../../../projects/ngx-mask-lib/src/ngx-mask.ts"],"sourcesContent":["import { InjectionToken, EventEmitter } from '@angular/core';\n\nexport interface IConfig {\n suffix: string;\n prefix: string;\n thousandSeparator: string;\n decimalMarker: '.' | ',' | ['.', ','];\n clearIfNotMatch: boolean;\n showTemplate: boolean;\n showMaskTyped: boolean;\n placeHolderCharacter: string;\n shownMaskExpression: string;\n dropSpecialCharacters: boolean | string[];\n specialCharacters: string[];\n hiddenInput: boolean | undefined;\n validation: boolean;\n separatorLimit: string;\n allowNegativeNumbers: boolean;\n leadZeroDateTime: boolean;\n triggerOnMaskChange: boolean;\n maskFilled: EventEmitter<void>;\n patterns: {\n [character: string]: {\n pattern: RegExp;\n optional?: boolean;\n symbol?: string;\n };\n };\n}\n\nexport type optionsConfig = Partial<IConfig>;\nexport const NGX_MASK_CONFIG: InjectionToken<IConfig> = new InjectionToken('ngx-mask config');\nexport const NEW_CONFIG: InjectionToken<IConfig> = new InjectionToken('new ngx-mask config');\nexport const INITIAL_CONFIG: InjectionToken<IConfig> = new InjectionToken(\n 'initial ngx-mask config'\n);\n\nexport const initialConfig: IConfig = {\n suffix: '',\n prefix: '',\n thousandSeparator: ' ',\n decimalMarker: ['.', ','],\n clearIfNotMatch: false,\n showTemplate: false,\n showMaskTyped: false,\n placeHolderCharacter: '_',\n dropSpecialCharacters: true,\n hiddenInput: undefined,\n shownMaskExpression: '',\n separatorLimit: '',\n allowNegativeNumbers: false,\n validation: true,\n // eslint-disable-next-line @typescript-eslint/quotes\n specialCharacters: ['-', '/', '(', ')', '.', ':', ' ', '+', ',', '@', '[', ']', '\"', \"'\"],\n leadZeroDateTime: false,\n triggerOnMaskChange: false,\n maskFilled: new EventEmitter<void>(),\n patterns: {\n '0': {\n pattern: new RegExp('\\\\d'),\n },\n '9': {\n pattern: new RegExp('\\\\d'),\n optional: true,\n },\n X: {\n pattern: new RegExp('\\\\d'),\n symbol: '*',\n },\n A: {\n pattern: new RegExp('[a-zA-Z0-9]'),\n },\n S: {\n pattern: new RegExp('[a-zA-Z]'),\n },\n U: {\n pattern: new RegExp('[A-Z]'),\n },\n L: {\n pattern: new RegExp('[a-z]'),\n },\n d: {\n pattern: new RegExp('\\\\d'),\n },\n m: {\n pattern: new RegExp('\\\\d'),\n },\n M: {\n pattern: new RegExp('\\\\d'),\n },\n H: {\n pattern: new RegExp('\\\\d'),\n },\n h: {\n pattern: new RegExp('\\\\d'),\n },\n s: {\n pattern: new RegExp('\\\\d'),\n },\n },\n};\n\nexport const timeMasks: string[] = ['Hh:m0:s0', 'Hh:m0', 'm0:s0'];\n\nexport const withoutValidation: string[] = [\n 'percent',\n 'Hh',\n 's0',\n 'm0',\n 'separator',\n 'd0/M0/0000',\n 'd0/M0',\n 'd0',\n 'M0',\n];\n","import { inject, Injectable } from '@angular/core';\nimport { NGX_MASK_CONFIG, IConfig } from './ngx-mask.config';\n\n@Injectable()\nexport class NgxMaskApplierService {\n protected _config = inject<IConfig>(NGX_MASK_CONFIG);\n\n public dropSpecialCharacters: IConfig['dropSpecialCharacters'] =\n this._config.dropSpecialCharacters;\n\n public hiddenInput: IConfig['hiddenInput'] = this._config.hiddenInput;\n\n public showTemplate!: IConfig['showTemplate'];\n\n public clearIfNotMatch: IConfig['clearIfNotMatch'] = this._config.clearIfNotMatch;\n\n public specialCharacters: IConfig['specialCharacters'] = this._config.specialCharacters;\n\n public patterns: IConfig['patterns'] = this._config.patterns;\n\n public prefix: IConfig['prefix'] = this._config.prefix;\n\n public suffix: IConfig['suffix'] = this._config.suffix;\n\n public thousandSeparator: IConfig['thousandSeparator'] = this._config.thousandSeparator;\n\n public decimalMarker: IConfig['decimalMarker'] = this._config.decimalMarker;\n\n public customPattern!: IConfig['patterns'];\n\n public showMaskTyped: IConfig['showMaskTyped'] = this._config.showMaskTyped;\n\n public placeHolderCharacter: IConfig['placeHolderCharacter'] =\n this._config.placeHolderCharacter;\n\n public validation: IConfig['validation'] = this._config.validation;\n\n public separatorLimit: IConfig['separatorLimit'] = this._config.separatorLimit;\n\n public allowNegativeNumbers: IConfig['allowNegativeNumbers'] =\n this._config.allowNegativeNumbers;\n\n public leadZeroDateTime: IConfig['leadZeroDateTime'] = this._config.leadZeroDateTime;\n\n private _shift: Set<number> = new Set();\n\n public maskExpression = '';\n\n public actualValue = '';\n\n public shownMaskExpression = '';\n\n public ipError?: boolean;\n\n public cpfCnpjError?: boolean;\n public applyMaskWithPattern(\n inputValue: string,\n maskAndPattern: [string, IConfig['patterns']]\n ): string {\n const [mask, customPattern] = maskAndPattern;\n this.customPattern = customPattern;\n return this.applyMask(inputValue, mask);\n }\n\n public applyMask(\n inputValue: string | object | boolean | null | undefined,\n maskExpression: string,\n position = 0,\n justPasted = false,\n backspaced = false,\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any\n cb: (...args: any[]) => any = () => {}\n ): string {\n if (!maskExpression || typeof inputValue !== 'string') {\n return '';\n }\n let cursor = 0;\n let result = '';\n let multi = false;\n let backspaceShift = false;\n let shift = 1;\n let stepBack = false;\n if (inputValue.slice(0, this.prefix.length) === this.prefix) {\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue.slice(this.prefix.length, inputValue.length);\n }\n if (!!this.suffix && inputValue?.length > 0) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this.checkAndRemoveSuffix(inputValue);\n }\n const inputArray: string[] = inputValue.toString().split('');\n if (this.allowNegativeNumbers && inputValue.slice(cursor, cursor + 1) === '-') {\n // eslint-disable-next-line no-param-reassign\n result += inputValue.slice(cursor, cursor + 1);\n }\n if (maskExpression === 'IP') {\n const valuesIP = inputValue.split('.');\n this.ipError = this._validIP(valuesIP);\n // eslint-disable-next-line no-param-reassign\n maskExpression = '099.099.099.099';\n }\n const arr: string[] = [];\n for (let i = 0; i < inputValue.length; i++) {\n if (inputValue[i]?.match('\\\\d')) {\n arr.push(inputValue[i] ?? '');\n }\n }\n if (maskExpression === 'CPF_CNPJ') {\n this.cpfCnpjError = arr.length !== 11 && arr.length !== 14;\n if (arr.length > 11) {\n // eslint-disable-next-line no-param-reassign\n maskExpression = '00.000.000/0000-00';\n } else {\n // eslint-disable-next-line no-param-reassign\n maskExpression = '000.000.000-00';\n }\n }\n if (maskExpression.startsWith('percent')) {\n if (\n inputValue.match('[a-z]|[A-Z]') ||\n // eslint-disable-next-line no-useless-escape\n inputValue.match(/[-!$%^&*()_+|~=`{}\\[\\]:\";'<>?,\\/.]/)\n ) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this._stripToDecimal(inputValue);\n const precision: number = this.getPrecision(maskExpression);\n // eslint-disable-next-line no-param-reassign\n inputValue = this.checkInputPrecision(inputValue, precision, this.decimalMarker);\n }\n if (\n inputValue.indexOf('.') > 0 &&\n !this.percentage(inputValue.substring(0, inputValue.indexOf('.')))\n ) {\n let base: string = inputValue.substring(0, inputValue.indexOf('.') - 1);\n if (this.allowNegativeNumbers && inputValue.slice(cursor, cursor + 1) === '-') {\n base = inputValue.substring(0, inputValue.indexOf('.'));\n }\n // eslint-disable-next-line no-param-reassign\n inputValue = `${base}${inputValue.substring(\n inputValue.indexOf('.'),\n inputValue.length\n )}`;\n }\n let value = '';\n this.allowNegativeNumbers && inputValue.slice(cursor, cursor + 1) === '-'\n ? (value = inputValue.slice(cursor + 1, cursor + inputValue.length))\n : (value = inputValue);\n if (this.percentage(value)) {\n result = inputValue;\n } else {\n result = inputValue.substring(0, inputValue.length - 1);\n }\n } else if (maskExpression.startsWith('separator')) {\n if (\n inputValue.match('[wа-яА-Я]') ||\n inputValue.match('[ЁёА-я]') ||\n inputValue.match('[a-z]|[A-Z]') ||\n inputValue.match(/[-@#!$%\\\\^&*()_£¬'+|~=`{}\\]:\";<>.?/]/) ||\n inputValue.match('[^A-Za-z0-9,]')\n ) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this._stripToDecimal(inputValue);\n }\n // eslint-disable-next-line no-param-reassign\n inputValue =\n inputValue.length > 1 &&\n inputValue[0] === '0' &&\n inputValue[1] !== this.thousandSeparator &&\n !this._compareOrIncludes(\n inputValue[1],\n this.decimalMarker,\n this.thousandSeparator\n ) &&\n !backspaced\n ? inputValue.slice(0, inputValue.length - 1)\n : inputValue;\n if (backspaced) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this._compareOrIncludes(\n inputValue[inputValue.length - 1],\n this.decimalMarker,\n this.thousandSeparator\n )\n ? inputValue.slice(0, inputValue.length - 1)\n : inputValue;\n }\n // TODO: we had different rexexps here for the different cases... but tests dont seam to bother - check this\n // separator: no COMMA, dot-sep: no SPACE, COMMA OK, comma-sep: no SPACE, COMMA OK\n\n const thousandSeparatorCharEscaped: string = this._charToRegExpExpression(\n this.thousandSeparator\n );\n let invalidChars: string = '@#!$%^&*()_+|~=`{}\\\\[\\\\]:\\\\s,\\\\.\";<>?\\\\/'.replace(\n thousandSeparatorCharEscaped,\n ''\n );\n //.replace(decimalMarkerEscaped, '');\n if (Array.isArray(this.decimalMarker)) {\n for (const marker of this.decimalMarker) {\n invalidChars = invalidChars.replace(this._charToRegExpExpression(marker), '');\n }\n } else {\n invalidChars = invalidChars.replace(\n this._charToRegExpExpression(this.decimalMarker),\n ''\n );\n }\n\n const invalidCharRegexp = new RegExp('[' + invalidChars + ']');\n\n if (\n inputValue.match(invalidCharRegexp) ||\n (inputValue.length === 1 &&\n this._compareOrIncludes(inputValue, this.decimalMarker, this.thousandSeparator))\n ) {\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue.substring(0, inputValue.length - 1);\n }\n\n const precision: number = this.getPrecision(maskExpression);\n // eslint-disable-next-line no-param-reassign\n inputValue = this.checkInputPrecision(inputValue, precision, this.decimalMarker);\n const strForSep: string = inputValue.replace(\n new RegExp(thousandSeparatorCharEscaped, 'g'),\n ''\n );\n result = this._formatWithSeparators(\n strForSep,\n this.thousandSeparator,\n this.decimalMarker,\n precision\n );\n const commaShift: number = result.indexOf(',') - inputValue.indexOf(',');\n const shiftStep: number = result.length - inputValue.length;\n\n if (shiftStep > 0 && result[position] !== ',') {\n backspaceShift = true;\n let _shift = 0;\n do {\n this._shift.add(position + _shift);\n _shift++;\n } while (_shift < shiftStep);\n } else if (\n (commaShift !== 0 &&\n position > 0 &&\n !(result.indexOf(',') >= position && position > 3)) ||\n (!(result.indexOf('.') >= position && position > 3) && shiftStep <= 0)\n ) {\n this._shift.clear();\n backspaceShift = true;\n shift = shiftStep;\n // eslint-disable-next-line no-param-reassign\n position += shiftStep;\n this._shift.add(position);\n } else {\n this._shift.clear();\n }\n } else {\n for (\n // eslint-disable-next-line\n let i: number = 0, inputSymbol: string = inputArray[0]!;\n i < inputArray.length;\n i++, inputSymbol = inputArray[i] ?? ''\n ) {\n if (cursor === maskExpression.length) {\n break;\n }\n if (\n this._checkSymbolMask(inputSymbol, maskExpression[cursor] ?? '') &&\n maskExpression[cursor + 1] === '?'\n ) {\n result += inputSymbol;\n cursor += 2;\n } else if (\n maskExpression[cursor + 1] === '*' &&\n multi &&\n this._checkSymbolMask(inputSymbol, maskExpression[cursor + 2] ?? '')\n ) {\n result += inputSymbol;\n cursor += 3;\n multi = false;\n } else if (\n this._checkSymbolMask(inputSymbol, maskExpression[cursor] ?? '') &&\n maskExpression[cursor + 1] === '*'\n ) {\n result += inputSymbol;\n multi = true;\n } else if (\n maskExpression[cursor + 1] === '?' &&\n this._checkSymbolMask(inputSymbol, maskExpression[cursor + 2] ?? '')\n ) {\n result += inputSymbol;\n cursor += 3;\n } else if (this._checkSymbolMask(inputSymbol, maskExpression[cursor] ?? '')) {\n if (maskExpression[cursor] === 'H') {\n if (Number(inputSymbol) > 2) {\n // eslint-disable-next-line no-param-reassign\n position = position + 1;\n cursor += 1;\n this._shiftStep(maskExpression, cursor, inputArray.length);\n i--;\n if (this.leadZeroDateTime) {\n result += '0';\n }\n continue;\n }\n }\n if (maskExpression[cursor] === 'h') {\n if (\n (result === '2' && Number(inputSymbol) > 3) ||\n ((result.slice(cursor - 2, cursor) === '2' ||\n result.slice(cursor - 3, cursor) === '2' ||\n result.slice(cursor - 4, cursor) === '2' ||\n result.slice(cursor - 1, cursor) === '2') &&\n Number(inputSymbol) > 3 &&\n cursor > 10)\n ) {\n // eslint-disable-next-line no-param-reassign\n position = position + 1;\n cursor += 1;\n i--;\n continue;\n }\n }\n if (maskExpression[cursor] === 'm' || maskExpression[cursor] === 's') {\n if (Number(inputSymbol) > 5) {\n // eslint-disable-next-line no-param-reassign\n position = position + 1;\n cursor += 1;\n this._shiftStep(maskExpression, cursor, inputArray.length);\n i--;\n if (this.leadZeroDateTime) {\n result += '0';\n }\n continue;\n }\n }\n const daysCount = 31;\n const inputValueCursor = inputValue[cursor] as string;\n const inputValueCursorPlusOne = inputValue[cursor + 1] as string;\n const inputValueCursorPlusTwo = inputValue[cursor + 2] as string;\n const inputValueCursorMinusOne = inputValue[cursor - 1] as string;\n const inputValueCursorMinusTwo = inputValue[cursor - 2] as string;\n const inputValueCursorMinusThree = inputValue[cursor - 3] as string;\n const inputValueSliceMinusThreeMinusOne = inputValue.slice(\n cursor - 3,\n cursor - 1\n );\n const inputValueSliceMinusOnePlusOne = inputValue.slice(cursor - 1, cursor + 1);\n const inputValueSliceCursorPlusTwo = inputValue.slice(cursor, cursor + 2);\n const inputValueSliceMinusTwoCursor = inputValue.slice(cursor - 2, cursor);\n if (maskExpression[cursor] === 'd') {\n const maskStartWithMonth = maskExpression.slice(0, 2) === 'M0';\n const startWithMonthInput: boolean =\n maskExpression.slice(0, 2) === 'M0' &&\n this.specialCharacters.includes(inputValueCursorMinusTwo);\n if (\n (Number(inputSymbol) > 3 && this.leadZeroDateTime) ||\n (!maskStartWithMonth &&\n (Number(inputValueSliceCursorPlusTwo) > daysCount ||\n Number(inputValueSliceMinusOnePlusOne) > daysCount ||\n this.specialCharacters.includes(inputValueCursorPlusOne))) ||\n (startWithMonthInput\n ? Number(inputValueSliceMinusOnePlusOne) > daysCount ||\n (!this.specialCharacters.includes(inputValueCursor) &&\n this.specialCharacters.includes(inputValueCursorPlusTwo)) ||\n this.specialCharacters.includes(inputValueCursor)\n : Number(inputValueSliceCursorPlusTwo) > daysCount ||\n this.specialCharacters.includes(inputValueCursorPlusOne))\n ) {\n // eslint-disable-next-line no-param-reassign\n position = position + 1;\n cursor += 1;\n this._shiftStep(maskExpression, cursor, inputArray.length);\n i--;\n if (this.leadZeroDateTime) {\n result += '0';\n }\n continue;\n }\n }\n if (maskExpression[cursor] === 'M') {\n const monthsCount = 12;\n // mask without day\n const withoutDays: boolean =\n cursor === 0 &&\n (Number(inputSymbol) > 2 ||\n Number(inputValueSliceCursorPlusTwo) > monthsCount ||\n this.specialCharacters.includes(inputValueCursorPlusOne));\n // day<10 && month<12 for input\n const specialChart = maskExpression.slice(cursor + 2, cursor + 3);\n const day1monthInput: boolean =\n inputValueSliceMinusThreeMinusOne.includes(specialChart) &&\n ((this.specialCharacters.includes(inputValueCursorMinusTwo) &&\n Number(inputValueSliceMinusOnePlusOne) > monthsCount &&\n !this.specialCharacters.includes(inputValueCursor)) ||\n this.specialCharacters.includes(inputValueCursor) ||\n (this.specialCharacters.includes(inputValueCursorMinusThree) &&\n Number(inputValueSliceMinusTwoCursor) > monthsCount &&\n !this.specialCharacters.includes(inputValueCursorMinusOne)) ||\n this.specialCharacters.includes(inputValueCursorMinusOne));\n // month<12 && day<10 for input\n const day2monthInput: boolean =\n Number(inputValueSliceMinusThreeMinusOne) <= daysCount &&\n !this.specialCharacters.includes(\n inputValueSliceMinusThreeMinusOne as string\n ) &&\n this.specialCharacters.includes(inputValueCursorMinusOne) &&\n (Number(inputValueSliceCursorPlusTwo) > monthsCount ||\n this.specialCharacters.includes(inputValueCursorPlusOne));\n // cursor === 5 && without days\n const day2monthInputDot: boolean =\n (Number(inputValueSliceCursorPlusTwo) > monthsCount && cursor === 5) ||\n (this.specialCharacters.includes(inputValueCursorPlusOne) &&\n cursor === 5);\n // // day<10 && month<12 for paste whole data\n const day1monthPaste: boolean =\n Number(inputValueSliceMinusThreeMinusOne) > daysCount &&\n !this.specialCharacters.includes(\n inputValueSliceMinusThreeMinusOne as string\n ) &&\n !this.specialCharacters.includes(\n inputValueSliceMinusTwoCursor as string\n ) &&\n Number(inputValueSliceMinusTwoCursor) > monthsCount;\n // 10<day<31 && month<12 for paste whole data\n const day2monthPaste: boolean =\n Number(inputValueSliceMinusThreeMinusOne) <= daysCount &&\n !this.specialCharacters.includes(\n inputValueSliceMinusThreeMinusOne as string\n ) &&\n !this.specialCharacters.includes(inputValueCursorMinusOne) &&\n Number(inputValueSliceMinusOnePlusOne) > monthsCount;\n if (\n (Number(inputSymbol) > 1 && this.leadZeroDateTime) ||\n withoutDays ||\n day1monthInput ||\n day2monthPaste ||\n day1monthPaste ||\n day2monthInput ||\n day2monthInputDot\n ) {\n // eslint-disable-next-line no-param-reassign\n position = position + 1;\n cursor += 1;\n this._shiftStep(maskExpression, cursor, inputArray.length);\n i--;\n if (this.leadZeroDateTime) {\n result += '0';\n }\n continue;\n }\n }\n result += inputSymbol;\n cursor++;\n } else if (inputSymbol === ' ' && maskExpression[cursor] === ' ') {\n result += inputSymbol;\n cursor++;\n } else if (this.specialCharacters.indexOf(maskExpression[cursor] ?? '') !== -1) {\n result += maskExpression[cursor];\n cursor++;\n this._shiftStep(maskExpression, cursor, inputArray.length);\n i--;\n } else if (maskExpression[cursor] === '9' && this.showMaskTyped) {\n this._shiftStep(maskExpression, cursor, inputArray.length);\n } else if (\n this.specialCharacters.indexOf(inputSymbol) > -1 &&\n this.patterns[maskExpression[cursor] ?? ''] &&\n this.patterns[maskExpression[cursor] ?? '']?.optional\n ) {\n if (\n !!inputArray[cursor] &&\n maskExpression !== '099.099.099.099' &&\n maskExpression !== '000.000.000-00' &&\n maskExpression !== '00.000.000/0000-00' &&\n !maskExpression.match(/^9+\\.0+$/) &&\n // maskExpression[cursor] !== '9'\n !this.patterns[maskExpression[cursor] ?? '']?.optional\n ) {\n result += inputArray[cursor];\n }\n cursor++;\n i--;\n } else if (\n this.maskExpression[cursor + 1] === '*' &&\n this._findSpecialChar(this.maskExpression[cursor + 2] ?? '') &&\n this._findSpecialChar(inputSymbol) === this.maskExpression[cursor + 2] &&\n multi\n ) {\n cursor += 3;\n result += inputSymbol;\n } else if (\n this.maskExpression[cursor + 1] === '?' &&\n this._findSpecialChar(this.maskExpression[cursor + 2] ?? '') &&\n this._findSpecialChar(inputSymbol) === this.maskExpression[cursor + 2] &&\n multi\n ) {\n cursor += 3;\n result += inputSymbol;\n } else if (\n this.showMaskTyped &&\n this.specialCharacters.indexOf(inputSymbol) < 0 &&\n inputSymbol !== this.placeHolderCharacter\n ) {\n stepBack = true;\n }\n }\n }\n if (\n result.length + 1 === maskExpression.length &&\n this.specialCharacters.indexOf(maskExpression[maskExpression.length - 1] ?? '') !== -1\n ) {\n result += maskExpression[maskExpression.length - 1];\n }\n let newPosition: number = position + 1;\n\n while (this._shift.has(newPosition)) {\n shift++;\n newPosition++;\n }\n\n let actualShift: number =\n justPasted && !maskExpression.startsWith('separator')\n ? cursor\n : this._shift.has(position)\n ? shift\n : 0;\n if (stepBack) {\n actualShift--;\n }\n\n cb(actualShift, backspaceShift);\n if (shift < 0) {\n this._shift.clear();\n }\n let onlySpecial = false;\n if (backspaced) {\n onlySpecial = inputArray.every((char) => this.specialCharacters.includes(char));\n }\n let res = `${this.prefix}${onlySpecial ? '' : result}${this.suffix}`;\n if (result.length === 0) {\n res = `${this.prefix}${result}`;\n }\n return res;\n }\n\n public _findSpecialChar(inputSymbol: string): undefined | string {\n return this.specialCharacters.find((val: string) => val === inputSymbol);\n }\n\n protected _checkSymbolMask(inputSymbol: string, maskSymbol: string): boolean {\n this.patterns = this.customPattern ? this.customPattern : this.patterns;\n return (\n (this.patterns[maskSymbol]?.pattern &&\n this.patterns[maskSymbol]?.pattern.test(inputSymbol)) ??\n false\n );\n }\n\n private _formatWithSeparators = (\n str: string,\n thousandSeparatorChar: string,\n decimalChars: string | string[],\n precision: number\n ) => {\n let x: string[] = [];\n let decimalChar = '';\n if (Array.isArray(decimalChars)) {\n const regExp = new RegExp(\n decimalChars.map((v) => ('[\\\\^$.|?*+()'.indexOf(v) >= 0 ? `\\\\${v}` : v)).join('|')\n );\n x = str.split(regExp);\n decimalChar = str.match(regExp)?.[0] ?? '';\n } else {\n x = str.split(decimalChars);\n decimalChar = decimalChars;\n }\n const decimals: string = x.length > 1 ? `${decimalChar}${x[1]}` : '';\n let res: string = x[0] ?? '';\n const separatorLimit: string = this.separatorLimit.replace(/\\s/g, '');\n if (separatorLimit && +separatorLimit) {\n if (res[0] === '-') {\n res = `-${res.slice(1, res.length).slice(0, separatorLimit.length)}`;\n } else {\n res = res.slice(0, separatorLimit.length);\n }\n }\n const rgx = /(\\d+)(\\d{3})/;\n\n while (thousandSeparatorChar && rgx.test(res)) {\n res = res.replace(rgx, '$1' + thousandSeparatorChar + '$2');\n }\n\n if (precision === undefined) {\n return res + decimals;\n } else if (precision === 0) {\n return res;\n }\n return res + decimals.substring(0, precision + 1);\n };\n\n private percentage = (str: string): boolean => {\n return Number(str) >= 0 && Number(str) <= 100;\n };\n\n private getPrecision = (maskExpression: string): number => {\n const x: string[] = maskExpression.split('.');\n if (x.length > 1) {\n return Number(x[x.length - 1]);\n }\n\n return Infinity;\n };\n\n private checkAndRemoveSuffix = (inputValue: string): string => {\n for (let i = this.suffix?.length - 1; i >= 0; i--) {\n const substr = this.suffix.substring(i, this.suffix?.length);\n if (\n inputValue.includes(substr) &&\n i !== this.suffix?.length - 1 &&\n (i - 1 < 0 ||\n !inputValue.includes(this.suffix.substring(i - 1, this.suffix?.length)))\n ) {\n return inputValue.replace(substr, '');\n }\n }\n return inputValue;\n };\n\n private checkInputPrecision = (\n inputValue: string,\n precision: number,\n decimalMarker: IConfig['decimalMarker']\n ): string => {\n if (precision < Infinity) {\n // TODO need think about decimalMarker\n if (Array.isArray(decimalMarker)) {\n const marker = decimalMarker.find((dm) => dm !== this.thousandSeparator);\n // eslint-disable-next-line no-param-reassign\n decimalMarker = marker ? marker : decimalMarker[0];\n }\n const precisionRegEx = new RegExp(\n this._charToRegExpExpression(decimalMarker) + `\\\\d{${precision}}.*$`\n );\n\n const precisionMatch: RegExpMatchArray | null = inputValue.match(precisionRegEx);\n const precisionMatchLength: number = (precisionMatch && precisionMatch[0]?.length) ?? 0;\n if (precisionMatchLength - 1 > precision) {\n const diff = precisionMatchLength - 1 - precision;\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue.substring(0, inputValue.length - diff);\n }\n if (\n precision === 0 &&\n this._compareOrIncludes(\n inputValue[inputValue.length - 1],\n decimalMarker,\n this.thousandSeparator\n )\n ) {\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue.substring(0, inputValue.length - 1);\n }\n }\n return inputValue;\n };\n\n private _stripToDecimal(str: string): string {\n return str\n .split('')\n .filter((i: string, idx: number) => {\n const isDecimalMarker =\n typeof this.decimalMarker === 'string'\n ? i === this.decimalMarker\n : // TODO (inepipenko) use utility type\n this.decimalMarker.includes(i as ',' | '.');\n return (\n i.match('^-?\\\\d') ||\n i === this.thousandSeparator ||\n isDecimalMarker ||\n (i === '-' && idx === 0 && this.allowNegativeNumbers)\n );\n })\n .join('');\n }\n\n private _charToRegExpExpression(char: string): string {\n // if (Array.isArray(char)) {\n // \treturn char.map((v) => ('[\\\\^$.|?*+()'.indexOf(v) >= 0 ? `\\\\${v}` : v)).join('|');\n // }\n if (char) {\n const charsToEscape = '[\\\\^$.|?*+()';\n return char === ' ' ? '\\\\s' : charsToEscape.indexOf(char) >= 0 ? `\\\\${char}` : char;\n }\n return char;\n }\n\n private _shiftStep(maskExpression: string, cursor: number, inputLength: number) {\n const shiftStep: number = /[*?]/g.test(maskExpression.slice(0, cursor))\n ? inputLength\n : cursor;\n this._shift.add(shiftStep + this.prefix.length || 0);\n }\n\n protected _compareOrIncludes<T>(value: T, comparedValue: T | T[], excludedValue: T): boolean {\n return Array.isArray(comparedValue)\n ? comparedValue.filter((v) => v !== excludedValue).includes(value)\n : value === comparedValue;\n }\n\n private _validIP(valuesIP: string[]): boolean {\n return !(\n valuesIP.length === 4 &&\n !valuesIP.some((value: string, index: number) => {\n if (valuesIP.length !== index + 1) {\n return value === '' || Number(value) > 255;\n }\n return value === '' || Number(value.substring(0, 3)) > 255;\n })\n );\n }\n}\n","import { ElementRef, inject, Injectable, Renderer2 } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\nimport { NGX_MASK_CONFIG, IConfig } from './ngx-mask.config';\nimport { NgxMaskApplierService } from './ngx-mask-applier.service';\n\n@Injectable()\nexport class NgxMaskService extends NgxMaskApplierService {\n public isNumberValue = false;\n\n public maskIsShown = '';\n\n public selStart: number | null = null;\n\n public selEnd: number | null = null;\n\n /**\n * Whether we are currently in writeValue function, in this case when applying the mask we don't want to trigger onChange function,\n * since writeValue should be a one way only process of writing the DOM value based on the Angular model value.\n */\n public writingValue = false;\n\n public maskChanged = false;\n\n public triggerOnMaskChange = false;\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any\n public onChange = (_: any) => {};\n\n private readonly document = inject(DOCUMENT);\n\n protected override _config = inject<IConfig>(NGX_MASK_CONFIG);\n\n private readonly _elementRef = inject(ElementRef, { optional: true });\n\n private readonly _renderer = inject(Renderer2, { optional: true });\n\n // eslint-disable-next-line complexity\n public override applyMask(\n inputValue: string,\n maskExpression: string,\n position = 0,\n justPasted = false,\n backspaced = false,\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any\n cb: (...args: any[]) => any = () => {}\n ): string {\n if (!maskExpression) {\n return inputValue !== this.actualValue ? this.actualValue : inputValue;\n }\n this.maskIsShown = this.showMaskTyped ? this.showMaskInInput() : '';\n if (this.maskExpression === 'IP' && this.showMaskTyped) {\n this.maskIsShown = this.showMaskInInput(inputValue || '#');\n }\n if (this.maskExpression === 'CPF_CNPJ' && this.showMaskTyped) {\n this.maskIsShown = this.showMaskInInput(inputValue || '#');\n }\n if (!inputValue && this.showMaskTyped) {\n this.formControlResult(this.prefix);\n return this.prefix + this.maskIsShown;\n }\n const getSymbol: string =\n !!inputValue && typeof this.selStart === 'number'\n ? inputValue[this.selStart] ?? ''\n : '';\n let newInputValue = '';\n if (this.hiddenInput !== undefined && !this.writingValue) {\n let actualResult: string[] = this.actualValue.split('');\n // eslint-disable @typescript-eslint/no-unused-expressions\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n inputValue !== '' && actualResult.length\n ? typeof this.selStart === 'number' && typeof this.selEnd === 'number'\n ? inputValue.length > actualResult.length\n ? actualResult.splice(this.selStart, 0, getSymbol)\n : inputValue.length < actualResult.length\n ? actualResult.length - inputValue.length === 1\n ? actualResult.splice(this.selStart - 1, 1)\n : actualResult.splice(this.selStart, this.selEnd - this.selStart)\n : null\n : null\n : (actualResult = []);\n if (this.showMaskTyped) {\n if (!this.hiddenInput) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this.removeMask(inputValue);\n }\n }\n // eslint-enable @typescript-eslint/no-unused-expressions\n newInputValue =\n this.actualValue.length && actualResult.length <= inputValue.length\n ? this.shiftTypedSymbols(actualResult.join(''))\n : inputValue;\n }\n\n if (this.showMaskTyped) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this.removeMask(inputValue);\n }\n\n newInputValue = Boolean(newInputValue) && newInputValue.length ? newInputValue : inputValue;\n\n const result: string = super.applyMask(\n newInputValue,\n maskExpression,\n position,\n justPasted,\n backspaced,\n cb\n );\n this.actualValue = this.getActualValue(result);\n // handle some separator implications:\n // a.) adjust decimalMarker default (. -> ,) if thousandSeparator is a dot\n if (this.thousandSeparator === '.' && this.decimalMarker === '.') {\n this.decimalMarker = ',';\n }\n\n // b) remove decimal marker from list of special characters to mask\n if (this.maskExpression.startsWith('separator') && this.dropSpecialCharacters === true) {\n this.specialCharacters = this.specialCharacters.filter(\n (item: string) =>\n !this._compareOrIncludes(item, this.decimalMarker, this.thousandSeparator) //item !== this.decimalMarker, // !\n );\n }\n this.formControlResult(result);\n if (!this.showMaskTyped || (this.showMaskTyped && this.hiddenInput)) {\n if (this.hiddenInput) {\n return result && result.length\n ? this.hideInput(result, this.maskExpression)\n : result;\n }\n return result;\n }\n const resLen: number = result.length;\n const prefNmask: string = this.prefix + this.maskIsShown;\n\n if (this.maskExpression.includes('H')) {\n const countSkipedSymbol = this._numberSkipedSymbols(result);\n return result + prefNmask.slice(resLen + countSkipedSymbol);\n } else if (this.maskExpression === 'IP' || this.maskExpression === 'CPF_CNPJ') {\n return result + prefNmask;\n }\n return result + prefNmask.slice(resLen);\n }\n\n // get the number of characters that were shifted\n private _numberSkipedSymbols(value: string): number {\n const regex = /(^|\\D)(\\d\\D)/g;\n let match = regex.exec(value);\n let countSkipedSymbol = 0;\n while (match != null) {\n countSkipedSymbol += 1;\n match = regex.exec(value);\n }\n return countSkipedSymbol;\n }\n\n public applyValueChanges(\n position: number,\n justPasted: boolean,\n backspaced: boolean,\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any\n cb: (...args: any[]) => any = () => {}\n ): void {\n const formElement = this._elementRef?.nativeElement;\n if (!formElement) {\n return;\n }\n formElement.value = this.applyMask(\n formElement.value,\n this.maskExpression,\n position,\n justPasted,\n backspaced,\n cb\n );\n if (formElement === this._getActiveElement()) {\n return;\n }\n this.clearIfNotMatchFn();\n }\n\n public hideInput(inputValue: string, maskExpression: string): string {\n return inputValue\n .split('')\n .map((curr: string, index: number) => {\n if (\n this.patterns &&\n this.patterns[maskExpression[index] ?? ''] &&\n this.patterns[maskExpression[index] ?? '']?.symbol\n ) {\n return this.patterns[maskExpression[index] ?? '']?.symbol;\n }\n return curr;\n })\n .join('');\n }\n\n // this function is not necessary, it checks result against maskExpression\n public getActualValue(res: string): string {\n const compare: string[] = res.split('').filter((symbol: string, i: number) => {\n const maskChar = this.maskExpression[i] ?? '';\n return (\n this._checkSymbolMask(symbol, maskChar) ||\n (this.specialCharacters.includes(maskChar) && symbol === maskChar)\n );\n });\n if (compare.join('') === res) {\n return compare.join('');\n }\n return res;\n }\n\n public shiftTypedSymbols(inputValue: string): string {\n let symbolToReplace = '';\n const newInputValue: (string | undefined)[] =\n (inputValue &&\n inputValue.split('').map((currSymbol: string, index: number) => {\n if (\n this.specialCharacters.includes(inputValue[index + 1] ?? '') &&\n inputValue[index + 1] !== this.maskExpression[index + 1]\n ) {\n symbolToReplace = currSymbol;\n return inputValue[index + 1];\n }\n if (symbolToReplace.length) {\n const replaceSymbol: string = symbolToReplace;\n symbolToReplace = '';\n return replaceSymbol;\n }\n return currSymbol;\n })) ||\n [];\n return newInputValue.join('');\n }\n\n /**\n * Convert number value to string\n * 3.1415 -> '3.1415'\n * 1e-7 -> '0.0000001'\n */\n public numberToString(value: number | string): string {\n if (!value && value !== 0) {\n return String(value);\n }\n return Number(value).toLocaleString('fullwide', {\n useGrouping: false,\n maximumFractionDigits: 20,\n });\n }\n\n public showMaskInInput(inputVal?: string): string {\n if (this.showMaskTyped && !!this.shownMaskExpression) {\n if (this.maskExpression.length !== this.shownMaskExpression.length) {\n throw new Error('Mask expression must match mask placeholder length');\n } else {\n return this.shownMaskExpression;\n }\n } else if (this.showMaskTyped) {\n if (inputVal) {\n if (this.maskExpression === 'IP') {\n return this._checkForIp(inputVal);\n }\n if (this.maskExpression === 'CPF_CNPJ') {\n return this._checkForCpfCnpj(inputVal);\n }\n }\n return this.maskExpression.replace(/\\w/g, this.placeHolderCharacter);\n }\n return '';\n }\n\n public clearIfNotMatchFn(): void {\n const formElement = this._elementRef?.nativeElement;\n if (!formElement) {\n return;\n }\n if (\n this.clearIfNotMatch &&\n this.prefix.length + this.maskExpression.length + this.suffix.length !==\n formElement.value.replace(/_/g, '').length\n ) {\n this.formElementProperty = ['value', ''];\n this.applyMask(formElement.value, this.maskExpression);\n }\n }\n\n public set formElementProperty([name, value]: [string, string | boolean]) {\n if (!this._renderer || !this._elementRef) {\n return;\n }\n Promise.resolve().then(() =>\n this._renderer?.setProperty(this._elementRef?.nativeElement, name, value)\n );\n }\n\n public checkSpecialCharAmount(mask: string): number {\n const chars: string[] = mask\n .split('')\n .filter((item: string) => this._findSpecialChar(item));\n return chars.length;\n }\n\n public removeMask(inputValue: string): string {\n return this._removeMask(\n this._removeSuffix(this._removePrefix(inputValue)),\n this.specialCharacters.concat('_').concat(this.placeHolderCharacter)\n );\n }\n\n private _checkForIp(inputVal: string): string {\n if (inputVal === '#') {\n return `${this.placeHolderCharacter}.${this.placeHolderCharacter}.${this.placeHolderCharacter}.${this.placeHolderCharacter}`;\n }\n const arr: string[] = [];\n for (let i = 0; i < inputVal.length; i++) {\n const value = inputVal[i] ?? '';\n if (!value) {\n continue;\n }\n if (value.match('\\\\d')) {\n arr.push(value);\n }\n }\n if (arr.length <= 3) {\n return `${this.placeHolderCharacter}.${this.placeHolderCharacter}.${this.placeHolderCharacter}`;\n }\n if (arr.length > 3 && arr.length <= 6) {\n return `${this.placeHolderCharacter}.${this.placeHolderCharacter}`;\n }\n if (arr.length > 6 && arr.length <= 9) {\n return this.placeHolderCharacter;\n }\n if (arr.length > 9 && arr.length <= 12) {\n return '';\n }\n return '';\n }\n\n private _checkForCpfCnpj(inputVal: string): string {\n const cpf =\n `${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `.${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `.${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `-${this.placeHolderCharacter}${this.placeHolderCharacter}`;\n const cnpj =\n `${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `.${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `.${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `/${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}${this.placeHolderCharacter}` +\n `-${this.placeHolderCharacter}${this.placeHolderCharacter}`;\n\n if (inputVal === '#') {\n return cpf;\n }\n const arr: string[] = [];\n for (let i = 0; i < inputVal.length; i++) {\n const value = inputVal[i] ?? '';\n if (!value) {\n continue;\n }\n if (value.match('\\\\d')) {\n arr.push(value);\n }\n }\n if (arr.length <= 3) {\n return cpf.slice(arr.length, cpf.length);\n }\n if (arr.length > 3 && arr.length <= 6) {\n return cpf.slice(arr.length + 1, cpf.length);\n }\n if (arr.length > 6 && arr.length <= 9) {\n return cpf.slice(arr.length + 2, cpf.length);\n }\n if (arr.length > 9 && arr.length < 11) {\n return cpf.slice(arr.length + 3, cpf.length);\n }\n if (arr.length === 11) {\n return '';\n }\n if (arr.length === 12) {\n if (inputVal.length === 17) {\n return cnpj.slice(16, cnpj.length);\n }\n return cnpj.slice(15, cnpj.length);\n }\n if (arr.length > 12 && arr.length <= 14) {\n return cnpj.slice(arr.length + 4, cnpj.length);\n }\n return '';\n }\n\n /**\n * Recursively determine the current active element by navigating the Shadow DOM until the Active Element is found.\n */\n private _getActiveElement(document: DocumentOrShadowRoot = this.document): Element | null {\n const shadowRootEl = document?.activeElement?.shadowRoot;\n if (!shadowRootEl?.activeElement) {\n return document.activeElement;\n } else {\n return this._getActiveElement(shadowRootEl);\n }\n }\n\n /**\n * Propogates the input value back to the Angular model by triggering the onChange function. It won't do this if writingValue\n * is true. If that is true it means we are currently in the writeValue function, which is supposed to only update the actual\n * DOM element based on the Angular model value. It should be a one way process, i.e. writeValue should not be modifying the Angular\n * model value too. Therefore, we don't trigger onChange in this scenario.\n * @param inputValue the current form input value\n */\n private formControlResult(inputValue: string): void {\n if (this.writingValue || (!this.triggerOnMaskChange && this.maskChanged)) {\n this.maskChanged = false;\n return;\n }\n if (Array.isArray(this.dropSpecialCharacters)) {\n this.onChange(\n this._toNumber(\n this._checkSymbols(\n this._removeMask(\n this._removeSuffix(this._removePrefix(inputValue)),\n this.dropSpecialCharacters\n )\n )\n )\n );\n } else if (\n this.dropSpecialCharacters ||\n (!this.dropSpecialCharacters && this.prefix === inputValue)\n ) {\n this.onChange(\n this._toNumber(\n this._checkSymbols(this._removeSuffix(this._removePrefix(inputValue)))\n )\n );\n } else {\n this.onChange(this._toNumber(inputValue));\n }\n }\n\n private _toNumber(value: string | number | undefined | null) {\n if (!this.isNumberValue || value === '') {\n return value;\n }\n const num = Number(value);\n return Number.isNaN(num) ? value : num;\n }\n\n private _removeMask(value: string, specialCharactersForRemove: string[]): string {\n if (this.maskExpression.startsWith('percent') && value.includes('.')) {\n return value;\n }\n return value ? value.replace(this._regExpForRemove(specialCharactersForRemove), '') : value;\n }\n\n private _removePrefix(value: string): string {\n if (!this.prefix) {\n return value;\n }\n return value ? value.replace(this.prefix, '') : value;\n }\n\n private _removeSuffix(value: string): string {\n if (!this.suffix) {\n return value;\n }\n return value ? value.replace(this.suffix, '') : value;\n }\n\n private _retrieveSeparatorValue(result: string): string {\n const specialCharacters = Array.isArray(this.dropSpecialCharacters)\n ? this.specialCharacters.filter((v) => {\n return (this.dropSpecialCharacters as string[]).includes(v);\n })\n : this.specialCharacters;\n return this._removeMask(result, specialCharacters);\n }\n\n private _regExpForRemove(specialCharactersForRemove: string[]): RegExp {\n return new RegExp(\n specialCharactersForRemove.map((item: string) => `\\\\${item}`).join('|'),\n 'gi'\n );\n }\n\n private _replaceDecimalMarkerToDot(value: string): string {\n const markers = Array.isArray(this.decimalMarker)\n ? this.decimalMarker\n : [this.decimalMarker];\n\n return value.replace(this._regExpForRemove(markers), '.');\n }\n\n private _checkSymbols(result: string): string | number | undefined | null {\n if (result === '') {\n return result;\n }\n\n const separatorPrecision: number | null = this._retrieveSeparatorPrecision(\n this.maskExpression\n );\n const separatorValue: string = this._replaceDecimalMarkerToDot(\n this._retrieveSeparatorValue(result)\n );\n\n if (!this.isNumberValue) {\n return separatorValue;\n }\n if (separatorPrecision) {\n if (result === this.decimalMarker) {\n return null;\n }\n return this._checkPrecision(this.maskExpression, separatorValue);\n } else {\n return separatorValue;\n }\n }\n\n // TODO should think about helpers or separting decimal precision to own property\n private _retrieveSeparatorPrecision(maskExpretion: string): number | null {\n const matcher: RegExpMatchArray | null = maskExpretion.match(\n new RegExp(`^separator\\\\.([^d]*)`)\n );\n return matcher ? Number(matcher[1]) : null;\n }\n\n private _checkPrecision(separatorExpression: string, separatorValue: string): number | string {\n if (separatorExpression.indexOf('2') > 0) {\n return Number(separatorValue).toFixed(2);\n }\n return Number(separatorValue);\n }\n}\n","import { EnvironmentProviders, inject, makeEnvironmentProviders, Provider } from '@angular/core';\n\nimport {\n NGX_MASK_CONFIG,\n INITIAL_CONFIG,\n initialConfig,\n NEW_CONFIG,\n optionsConfig,\n} from './ngx-mask.config';\nimport { NgxMaskService } from './ngx-mask.service';\n\n/**\n * @internal\n */\nfunction _configFactory(): optionsConfig {\n const initConfig = inject<optionsConfig>(INITIAL_CONFIG);\n const configValue = inject<optionsConfig | (() => optionsConfig)>(NEW_CONFIG);\n\n return configValue instanceof Function\n ? { ...initConfig, ...configValue() }\n : { ...initConfig, ...configValue };\n}\n\nexport function provideNgxMask(configValue?: optionsConfig | (() => optionsConfig)): Provider[] {\n return [\n {\n provide: NEW_CONFIG,\n useValue: configValue,\n },\n {\n provide: INITIAL_CONFIG,\n useValue: initialConfig,\n },\n {\n provide: NGX_MASK_CONFIG,\n useFactory: _configFactory,\n },\n NgxMaskService,\n ];\n}\n\nexport function provideEnvironmentNgxMask(\n configValue?: optionsConfig | (() => optionsConfig)\n): EnvironmentProviders {\n return makeEnvironmentProviders(provideNgxMask(configValue));\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n Directive,\n EventEmitter,\n HostListener,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n inject,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n FormControl,\n NG_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors,\n Validator,\n} from '@angular/forms';\n\nimport { CustomKeyboardEvent } from './custom-keyboard-event';\nimport { IConfig, NGX_MASK_CONFIG, timeMasks, withoutValidation } from './ngx-mask.config';\nimport { NgxMaskService } from './ngx-mask.service';\n\n@Directive({\n selector: 'input[mask], textarea[mask]',\n standalone: true,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: NgxMaskDirective,\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: NgxMaskDirective,\n multi: true,\n },\n NgxMaskService,\n ],\n exportAs: 'mask,ngxMask',\n})\nexport class NgxMaskDirective implements ControlValueAccessor, OnChanges, Validator {\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input('mask') public maskExpression: string | undefined | null = '';\n\n @Input() public specialCharacters: IConfig['specialCharacters'] = [];\n\n @Input() public patterns: IConfig['patterns'] = {};\n\n @Input() public prefix: IConfig['prefix'] = '';\n\n @Input() public suffix: IConfig['suffix'] = '';\n\n @Input() public thousandSeparator: IConfig['thousandSeparator'] = ' ';\n\n @Input() public decimalMarker: IConfig['decimalMarker'] = '.';\n\n @Input() public dropSpecialCharacters: IConfig['dropSpecialCharacters'] | null = null;\n\n @Input() public hiddenInput: IConfig['hiddenInput'] | null = null;\n\n @Input() public showMaskTyped: IConfig['showMaskTyped'] | null = null;\n\n @Input() public placeHolderCharacter: IConfig['placeHolderCharacter'] | null = null;\n\n @Input() public shownMaskExpression: IConfig['shownMaskExpression'] | null = null;\n\n @Input() public showTemplate: IConfig['showTemplate'] | null = null;\n\n @Input() public clearIfNotMatch: IConfig['clearIfNotMatch'] | null = null;\n\n @Input() public validation: IConfig['validation'] | null = null;\n\n @Input() public separatorLimit: IConfig['separatorLimit'] | null = null;\n\n @Input() public allowNegativeNumbers: IConfig['allowNegativeNumbers'] | null = null;\n\n @Input() public leadZeroDateTime: IConfig['leadZeroDateTime'] | null = null;\n\n @Input() public triggerOnMaskChange: IConfig['triggerOnMaskChange'] | null = null;\n\n @Output() public maskFilled: IConfig['maskFilled'] = new EventEmitter<void>();\n\n private _maskValue = '';\n\n private _inputValue!: string;\n\n private _position: number | null = null;\n\n private _start!: number;\n\n private _end!: number;\n\n private _code!: string;\n\n private _maskExpressionArray: string[] = [];\n\n private _justPasted = false;\n\n /**For IME composition event */\n private _isComposing = false;\n\n private readonly document = inject(DOCUMENT);\n\n public _maskService = inject(NgxMaskService, { self: true });\n\n protected _config = inject<IConfig>(NGX_MASK_CONFIG);\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/no-explicit-any\n public onChange = (_: any) => {};\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n public onTouch = () => {};\n\n public ngOnChanges(changes: SimpleChanges): void {\n const {\n maskExpression,\n specialCharacters,\n patterns,\n prefix,\n suffix,\n thousandSeparator,\n decimalMarker,\n dropSpecialCharacters,\n hiddenInput,\n showMaskTyped,\n placeHolderCharacter,\n shownMaskExpression,\n showTemplate,\n clearIfNotMatch,\n validation,\n separatorLimit,\n allowNegativeNumbers,\n leadZeroDateTime,\n triggerOnMaskChange,\n } = changes;\n if (maskExpression) {\n if (\n maskExpression.currentValue !== maskExpression.previousValue &&\n !maskExpression.firstChange\n ) {\n this._maskService.maskChanged = true;\n }\n if (allowNegativeNumbers) {\n this._maskService.allowNegativeNumbers = allowNegativeNumbers.currentValue;\n if (this._maskService.allowNegativeNumbers) {\n this._maskService.specialCharacters =\n this._maskService.specialCharacters.filter((c: string) => c !== '-');\n }\n }\n if (maskExpression.currentValue && maskExpression.currentValue.split('||').length > 1) {\n this._maskExpressionArray = maskExpression.currentValue\n .split('||')\n .sort((a: string, b: string) => {\n return a.length - b.length;\n });\n this._setMask();\n } else {\n this._maskExpressionArray = [];\n this._maskValue = maskExpression.currentValue || '';\n this._maskService.maskExpression = this._maskValue;\n }\n }\n if (specialCharacters) {\n if (!specialCharacters.currentValue || !Array.isArray(specialCharacters.currentValue)) {\n return;\n } else {\n this._maskService.specialCharacters = specialCharacters.currentValue || [];\n }\n }\n // Only overwrite the mask available patterns if a pattern has actually been passed in\n if (patterns && patterns.currentValue) {\n this._maskService.patterns = patterns.currentValue;\n }\n if (prefix) {\n this._maskService.prefix = prefix.currentValue;\n }\n if (suffix) {\n this._maskService.suffix = suffix.currentValue;\n }\n if (thousandSeparator) {\n this._maskService.thousandSeparator = thousandSeparator.currentValue;\n }\n if (decimalMarker) {\n this._maskService.decimalMarker = decimalMarker.currentValue;\n }\n if (dropSpecialCharacters) {\n this._maskService.dropSpecialCharacters = dropSpecialCharacters.currentValue;\n }\n if (hiddenInput) {\n this._maskService.hiddenInput = hiddenInput.currentValue;\n }\n if (showMaskTyped) {\n this._maskService.showMaskTyped = showMaskTyped.currentValue;\n }\n if (placeHolderCharacter) {\n this._maskService.placeHolderCharacter = placeHolderCharacter.currentValue;\n }\n if (shownMaskExpression) {\n this._maskService.shownMaskExpression = shownMaskExpression.currentValue;\n }\n if (showTemplate) {\n this._maskService.showTemplate = showTemplate.currentValue;\n }\n if (clearIfNotMatch) {\n this._maskService.clearIfNotMatch = clearIfNotMatch.currentValue;\n }\n if (validation) {\n this._maskService.validation = validation.currentValue;\n }\n if (separatorLimit) {\n this._maskService.separatorLimit = separatorLimit.currentValue;\n }\n if (leadZeroDateTime) {\n this._maskService.leadZeroDateTime = leadZeroDateTime.currentValue;\n }\n if (triggerOnMaskChange) {\n this._maskService.triggerOnMaskChange = triggerOnMaskChange.currentValue;\n }\n\n this._applyMask();\n }\n\n // eslint-disable-next-line complexity\n public validate({ value }: FormControl): ValidationErrors | null {\n if (!this._maskService.validation || !this._maskValue) {\n return null;\n }\n if (this._maskService.ipError) {\n return this._createValidationError(value);\n }\n if (this._maskService.cpfCnpjError) {\n return this._createValidationError(value);\n }\n if (this._maskValue.startsWith('separator')) {\n return null;\n }\n if (withoutValidation.includes(this._maskValue)) {\n return null;\n }\n if (this._maskService.clearIfNotMatch) {\n return null;\n }\n if (timeMasks.includes(this._maskValue)) {\n return this._validateTime(value);\n }\n if (value && value.toString().length >= 1) {\n let counterOfOpt = 0;\n for (const key in this._maskService.patterns) {\n if (this._maskService.patterns[key]?.optional) {\n if (this._maskValue.indexOf(key) !== this._maskValue.lastIndexOf(key)) {\n const opt: string = this._maskValue\n .split('')\n .filter((i: string) => i === key)\n .join('');\n counterOfOpt += opt.length;\n } else if (this._maskValue.indexOf(key) !== -1) {\n counterOfOpt++;\n }\n if (\n this._maskValue.indexOf(key) !== -1 &&\n value.toString().length >= this._maskValue.indexOf(key)\n ) {\n return null;\n }\n if (counterOfOpt === this._maskValue.length) {\n return null;\n }\n }\n }\n if (\n this._maskValue.indexOf('{') === 1 &&\n value.toString().length ===\n this._maskValue.length +\n Number((this._maskValue.split('{')[1] ?? '').split('}')[0]) -\n 4\n ) {\n return null;\n }\n if (this._maskValue.indexOf('*') === 1 || this._maskValue.indexOf('?') === 1) {\n return null;\n } else if (\n (this._maskValue.indexOf('*') > 1 &&\n value.toString().length < this._maskValue.indexOf('*')) ||\n (this._maskValue.indexOf('?') > 1 &&\n value.toString().length < this._maskValue.indexOf('?')) ||\n this._maskValue.indexOf('{') === 1\n ) {\n return this._createValidationError(value);\n }\n if (this._maskValue.indexOf('*') === -1 || this._maskValue.indexOf('?') === -1) {\n const length: number = this._maskService.dropSpecialCharacters\n ? this._maskValue.length -\n this._maskService.checkSpecialCharAmount(this._maskValue) -\n counterOfOpt\n : this.prefix\n ? this._maskValue.length + this.prefix.length - counterOfOpt\n : this._maskValue.length - counterOfOpt;\n if (value.toString().length < length) {\n return this._createValidationError(value);\n }\n }\n }\n if (value) {\n this.maskFilled.emit();\n return null;\n }\n return null;\n }\n\n @HostListener('paste')\n public onPaste() {\n this._justPasted = true;\n }\n\n @HostListener('ngModelChange', ['$event'])\n public onModelChange(value: string | undefined | null | number): void {\n // on form reset we need to update the actualValue\n if (\n (value === '' || value === null || value === undefined) &&\n this._maskService.actualValue\n ) {\n this._maskService.actualValue = this._maskService.getActualValue('');\n }\n }\n\n @HostListener('input', ['$event'])\n public onInput(e: CustomKeyboardEvent): void {\n // If IME is composing text, we wait for the composed text.\n if (this._isComposing) return;\n\n const el: HTMLInputElement = e.target as HTMLInputElement;\n this._inputValue = el.value;\n\n this._setMask();\n\n if (!this._maskValue) {\n this.onChange(el.value);\n return;\n }\n let position: number =\n el.selectionStart === 1\n ? (el.selectionStart as number) + this._maskService.prefix.length\n : (el.selectionStart as number);\n\n let caretShift = 0;\n let backspaceShift = false;\n this._maskService.applyValueChanges(\n position,\n this._justPasted,\n this._code === 'Backspace' || this._code === 'Delete',\n (shift: number, _backspaceShift: boolean) => {\n this._justPasted = false;\n caretShift = shift;\n backspaceShift = _backspaceShift;\n }\n );\n // only set the selection if the element is active\n if (this._getActiveElement() !== el) {\n return;\n }\n\n // update position after applyValueChanges to prevent cursor on wrong position when it has an array of maskExpression\n if (this._maskExpressionArray.length) {\n position =\n el.selectionStart === 1\n ? (el.selectionStart as number) + this._maskService.prefix.length\n : (el.selectionStart as number);\n }\n\n this._position =\n this._position === 1 && this._inputValue.length === 1 ? null : this._position;\n\n let positionToApply: number = this._position\n ? this._inputValue.length + position + caretShift\n : position + (this._code === 'Backspace' && !backspaceShift ? 0 : caretShift);\n if (positionToApply > this._getActualInputLength()) {\n positionToApply = this._getActualInputLength();\n }\n if (positionToApply < 0) {\n positionToApply = 0;\n }\n el.setSelectionRange(positionToApply, positionToApply);\n this._position = null;\n }\n\n // IME starts\n @HostListener('compositionstart', ['$event'])\n public onCompositionStart(): void {\n this._isComposing = true;\n }\n\n // IME completes\n @HostListener('compositionend', ['$event'])\n public onCompositionEnd(e: CustomKeyboardEvent): void {\n this._isComposing = false;\n this._justPasted = true;\n this.onInput(e);\n }\n\n @HostListener('blur')\n public onBlur(): void {\n if (this._maskValue) {\n this._maskService.clearIfNotMatchFn();\n }\n this.onTouch();\n }\n\n @HostListener('click', ['$event'])\n public onClick(e: MouseEvent | CustomKeyboardEvent): void {\n if (!this._maskValue) {\n return;\n }\n const el: HTMLInputElement = e.target as HTMLInputElement;\n const posStart = 0;\n const posEnd = 0;\n if (\n el !== null &&\n el.selectionStart !== null &&\n el.selectionStart === el.selectionEnd &&\n el.selectionStart > this._maskService.prefix.length &&\n // eslint-disable-next-line\n (e as any).keyCode !== 38\n ) {\n if (this._maskService.showMaskTyped) {\n // We are showing the mask in the input\n this._maskService.maskIsShown = this._maskService.showMaskInInput();\n if (\n el.setSelectionRange &&\n this._maskService.prefix + this._maskService.maskIsShown === el.value\n ) {\n // the input ONLY contains the mask, so position the cursor at the start\n el.focus();\n el.setSelectionRange(posStart, posEnd);\n } else {\n // the input contains some characters already\n if (el.selectionStart > this._maskService.actualValue.length) {\n // if the user clicked beyond our value's length, position the cursor at the end of our value\n el.setSelectionRange(\n this._maskService.actualValue.length,\n this._maskService.actualValue.length\n );\n }\n }\n }\n }\n const nextValue: string | null =\n el &&\n (!el.value || el.value === this._maskService.prefix\n ? this._maskService.prefix + this._maskService.maskIsShown\n : el.value);\n /** Fix of cursor position jumping to end in most browsers no matter where cursor is inserted onFocus */\n if (el && el.value !== nextValue) {\n el.value = nextValue;\n }\n\n /** fix of cursor position with prefix when mouse click occur */\n if (\n el &&\n ((el.selectionStart as number) || (el.selectionEnd as number)) <=\n this._maskService.prefix.length\n ) {\n el.selectionStart = this._maskService.prefix.length;\n return;\n }\n /** select only inserted text */\n if (el && (el.selectionEnd as number) > this._getActualInputLength()) {\n el.selectionEnd = this._getActualInputLength();\n }\n }\n\n // eslint-disable-next-line complexity\n @HostListener('keydown', ['$event'])\n public onKeyDown(e: CustomKeyboardEvent): void {\n if (!this._maskValue) {\n return;\n }\n\n if (this._isComposing) {\n // User finalize their choice from IME composition, so trigger onInput() for the composed text.\n if (e.key === 'Enter') this.onCompositionEnd(e);\n return;\n }\n\n this._code = e.code ? e.code : e.key;\n const el: HTMLInputElement = e.target as HTMLInputElement;\n this._inputValue = el.value;\n\n this._setMask();\n\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n }\n\n if (e.key === 'ArrowLeft' || e.key === 'Backspace' || e.key === 'Delete') {\n if (e.key === 'Backspace' && el.value.length === 0) {\n el.selectionStart = el.selectionEnd;\n }\n if (e.key === 'Backspace' && (el.selectionStart as number) !== 0) {\n // If specialChars is false, (shouldn't ever happen) then set to the defaults\n this.specialCharacters = this.specialCharacters?.length\n ? this.specialCharacters\n : this._config.specialCharacters;\n if (this.prefix.length > 1 && (el.selectionStart as number) <= this.prefix.length) {\n el.setSelectionRange(this.prefix.length, el.selectionEnd);\n } else {\n if (\n this._inputValue.length !== (el.selectionStart as number) &&\n (el.selectionStart as number) !== 1\n ) {\n while (\n this.specialCharacters.includes(\n (\n this._inputValue[(el.selectionStart as number) - 1] ?? ''\n ).toString()\n ) &&\n ((this.prefix.length >= 1 &&\n (el.selectionStart as number) > this.prefix.length) ||\n this.prefix.length === 0)\n ) {\n el.setSelectionRange(\n (el.selectionStart as number) - 1,\n el.selectionEnd\n );\n }\n }\n }\n }\n this.checkSelectionOnDeletion(el);\n if (\n this._maskService.prefix.length &&\n (el.selectionStart as number) <= this._maskService.prefix.length &&\n (el.selectionEnd as number) <= this._maskService.prefix.length\n ) {\n e.preventDefault();\n }\n const cursorStart: number | null = el.selectionStart;\n if (\n e.key === 'Backspace' &&\n !el.readOnly &&\n cursorStart === 0 &&\n el.selectionEnd === el.value.length &&\n el.value.length !== 0\n ) {\n this._position = this._maskService.prefix ? this._maskService.prefix.length : 0;\n this._maskService.applyMask(\n this._maskService.prefix,\n this._maskService.maskExpression,\n this._position\n );\n }\n }\n if (\n !!this.suffix &&\n this.suffix.length > 1 &&\n this._inputValue.length - this.suffix.length < (el.selectionStart as number)\n ) {\n el.setSelectionRange(\n this._inputValue.length - this.suffix.length,\n this._inputValue.length\n );\n } else if (\n (e.code === 'KeyA' && e.ctrlKey) ||\n (e.code === 'KeyA' && e.metaKey) // Cmd + A (Mac)\n ) {\n el.setSelectionRange(0, this._getActualInputLength());\n e.preventDefault();\n }\n this._maskService.selStart = el.selectionStart;\n this._maskService.selEnd = el.selectionEnd;\n }\n\n /** It writes the value in the input */\n public async writeValue(\n inputValue: string | number | { value: string | number; disable?: boolean }\n ): Promise<void> {\n if (typeof inputValue === 'object' && inputValue !== null && 'value' in inputValue) {\n if ('disable' in inputValue) {\n this.setDisabledState(Boolean(inputValue.disable));\n }\n // eslint-disable-next-line no-param-reassign\n inputValue = inputValue.value;\n }\n\n if (typeof inputValue === 'number' || this._maskValue.startsWith('separator')) {\n // eslint-disable-next-line no-param-reassign\n inputValue = this._maskService.numberToString(inputValue);\n if (!Array.isArray(this._maskService.decimalMarker)) {\n const localeDecimalMarker = this._currentLocaleDecimalMarker();\n // eslint-disable-next-line no-param-reassign\n inputValue =\n this._maskService.decimalMarker !== localeDecimalMarker\n ? inputValue.replace(localeDecimalMarker, this._maskService.decimalMarker)\n : inputValue;\n }\n this._maskService.isNumberValue = true;\n }\n\n if (typeof inputValue !== 'string') {\n // eslint-disable-next-line no-param-reassign\n inputValue = '';\n }\n\n this._inputValue = inputValue;\n this._setMask();\n\n if (\n (inputValue && this._maskService.maskExpression) ||\n (this._maskService.maskExpression &&\n (this._maskService.prefix || this._maskService.showMaskTyped))\n ) {\n // Let the service we know we are writing value so that triggering onChange function won't happen during applyMask\n this._maskService.writingValue = true;\n this._maskService.formElementProperty = [\n 'value',\n this._maskService.applyMask(inputValue, this._maskService.maskExpression),\n ];\n // Let the service know we've finished writing value\n this._maskService.writingValue = false;\n } else {\n this._maskService.formElementProperty = ['value', inputValue];\n }\n this._inputValue = inputValue;\n }\n\n public registerOnChange(fn: typeof this.onChange): void {\n this._maskService.onChange = this.onChange = fn;\n }\n\n public registerOnTouched(fn: typeof this.onTouch): void {\n this.onTouch = fn;\n }\n\n private _getActiveElement(document: DocumentOrShadowRoot = this.document): Element | null {\n const shadowRootEl = document?.activeElement?.shadowRoot;\n if (!shadowRootEl?.activeElement) {\n return document.activeElement;\n } else {\n return this._getActiveElement(shadowRootEl);\n }\n }\n\n public checkSelectionOnDeletion(el: HTMLInputElement): void {\n el.selectionStart = Math.min(\n Math.max(this.prefix.length, el.selectionStart as number),\n this._inputValue.length - this.suffix.length\n );\n el.selectionEnd = Math.min(\n Math.max(this.prefix.length, el.selectionEnd as number),\n this._inputValue.length - this.suffix.length\n );\n }\n\n /** It disables the input element */\n public setDisabledState(isDisabled: boolean): void {\n this._maskService.formElementProperty = ['disabled', isDisabled];\n }\n\n private _repeatPatternSymbols(maskExp: string): string {\n return (\n (maskExp.match(/{[0-9]+}/) &&\n maskExp\n .split('')\n .reduce((accum: string, currVal: string, index: number): string => {\n this._start = currVal === '{' ? index : this._start;\n\n if (currVal !== '}') {\n return this._maskService._findSpecialChar(currVal)\n ? accum + currVal\n : accum;\n }\n this._end = index;\n const repeatNumber = Number(maskExp.slice(this._start + 1, this._end));\n const replaceWith: string = new Array(repeatNumber + 1).join(\n maskExp[this._start - 1]\n );\n return accum + replaceWith;\n }, '')) ||\n maskExp\n );\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private _applyMask(): any {\n this._maskService.maskExpression = this._repeatPatternSymbols(this._maskValue || '');\n this._maskService.formElementProperty = [\n 'value',\n this._maskService.applyMask(this._inputValue, this._maskService.maskExpression),\n ];\n }\n\n private _validateTime(value: string): ValidationErrors | null {\n const rowMaskLen: number = this._maskValue\n .split('')\n .filter((s: string) => s !== ':').length;\n if (!value) {\n return null; // Don't validate empty values to allow for optional form control\n }\n\n if (\n (+(value[value.length - 1] ?? -1) === 0 && value.length < rowMaskLen) ||\n value.length <= rowMaskLen - 2\n ) {\n return this._createValidationError(value);\n }\n\n return null;\n }\n\n private _getActualInputLength() {\n return (\n this._maskService.actualValue.length ||\n this._maskService.actualValue.length + this._maskService.prefix.length\n );\n }\n\n private _createValidationError(actualValue: string): ValidationErrors {\n return {\n mask: {\n requiredMask: this._maskValue,\n actualValue,\n },\n };\n }\n\n private _setMask() {\n if (this._maskExpressionArray.length > 0) {\n this._maskExpressionArray.some((mask): boolean | void => {\n const test =\n this._maskService.removeMask(this._inputValue)?.length <=\n this._maskService.removeMask(mask)?.length;\n if (this._inputValue && test) {\n this._maskValue = mask;\n this.maskExpression = mask;\n this._maskService.maskExpression = mask;\n return test;\n } else {\n const expression =\n this._maskExpressionArray[this._maskExpressionArray.length - 1] ?? '';\n this._maskValue =\n this.maskExpression =\n this._maskService.maskExpression =\n expression;\n }\n });\n }\n }\n\n private _currentLocaleDecimalMarker(): string {\n return (1.1).toLocaleString().substring(1, 2);\n }\n}\n","import { inject, Pipe, PipeTransform } from '@angular/core';\n\nimport { IConfig } from './ngx-mask.config';\nimport { NgxMaskService } from './ngx-mask.service';\n\n@Pipe({\n name: 'mask',\n pure: true,\n standalone: true,\n})\nexport class NgxMaskPipe implements PipeTransform {\n private readonly defaultOptions: Partial<IConfig> = {};\n\n private readonly _maskService = inject(NgxMaskService);\n\n public transform(\n value: string | number,\n mask: string,\n { patterns, ...config }: Partial<IConfig> = {} as Partial<IConfig>\n ): string {\n const currentConfig = {\n maskExpression: mask,\n ...this.defaultOptions,\n ...config,\n patterns: {\n ...this._maskService.patterns,\n ...patterns,\n },\n };\n Object.entries(currentConfig).forEach(([key, value]) => {\n //eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this._maskService as any)[key] = value;\n });\n return this._maskService.applyMask(`${value}`, mask);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-mask",
3
- "version": "16.0.7",
3
+ "version": "16.0.8",
4
4
  "description": "awesome ngx mask",
5
5
  "keywords": [
6
6
  "ng2-mask",