valtech-components 4.0.119 → 4.0.121

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.
@@ -32,4 +32,4 @@ export const DEFAULT_LOGIN_LOGO = {
32
32
  flex: true,
33
33
  width: 4,
34
34
  };
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL2xvZ2luL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWtGQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FFdkI7SUFDRixTQUFTLEVBQUUsSUFBSTtJQUNmLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQztJQUMxQixZQUFZLEVBQUUsSUFBSTtJQUNsQixrQkFBa0IsRUFBRSxJQUFJO0lBQ3hCLFFBQVEsRUFBRSxLQUFLO0NBQ2hCLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBa0I7SUFDL0MsR0FBRyxFQUFFLGtCQUFrQjtJQUN2QixHQUFHLEVBQUUsRUFBRTtJQUNQLElBQUksRUFBRSxLQUFLO0lBQ1gsTUFBTSxFQUFFLEtBQUs7SUFDYixRQUFRLEVBQUUsS0FBSztJQUNmLElBQUksRUFBRSxRQUFRO0lBQ2QsU0FBUyxFQUFFLFFBQVE7SUFDbkIsSUFBSSxFQUFFLElBQUk7SUFDVixLQUFLLEVBQUUsQ0FBQztDQUNULENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbWFnZU1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vYXRvbXMvaW1hZ2UvdHlwZXMnO1xuaW1wb3J0IHsgT0F1dGhQcm92aWRlciB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGgvdHlwZXMnO1xuaW1wb3J0IHsgQXV0aFVzZXIgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoL3R5cGVzJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBsZWdhbCBub3RpY2UgZGlzcGxheWVkIGluIHRoZSBsb2dpbiBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dpbkxlZ2FsQ29uZmlnIHtcbiAgLyoqIENvbXBhbnkgbmFtZSB0byBkaXNwbGF5ICovXG4gIGNvbXBhbnlOYW1lOiBzdHJpbmc7XG4gIC8qKiBMaW5rIGZvciBjb21wYW55IG5hbWUgKG9wdGlvbmFsKSAqL1xuICBjb21wYW55TGluaz86IHN0cmluZztcbiAgLyoqIExpbmsgdG8gdGVybXMgYW5kIGNvbmRpdGlvbnMgcGFnZSAqL1xuICB0ZXJtc0xpbms/OiBzdHJpbmc7XG4gIC8qKiBMaW5rIHRvIHByaXZhY3kgcG9saWN5IHBhZ2UgKi9cbiAgcHJpdmFjeUxpbms/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogTWFpbiBjb25maWd1cmF0aW9uIGZvciB0aGUgTG9naW4gY29tcG9uZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9naW5NZXRhZGF0YSB7XG4gIC8qKiBMb2dvIHRvIGRpc3BsYXkgYXQgdGhlIHRvcCBvZiB0aGUgZm9ybSAqL1xuICBsb2dvPzogSW1hZ2VNZXRhZGF0YTtcblxuICAvKiogU2hvdyBPQXV0aCBsb2dpbiBidXR0b25zIChkZWZhdWx0OiB0cnVlKSAqL1xuICBzaG93T0F1dGg/OiBib29sZWFuO1xuXG4gIC8qKiBPQXV0aCBwcm92aWRlcnMgdG8gc2hvdyAoZGVmYXVsdDogWydnb29nbGUnXSkgKi9cbiAgb2F1dGhQcm92aWRlcnM/OiBPQXV0aFByb3ZpZGVyW107XG5cbiAgLyoqIFNob3cgcmVnaXN0ZXIgbGluayBhbmQgbW9kYWwgKGRlZmF1bHQ6IHRydWUpICovXG4gIHNob3dSZWdpc3Rlcj86IGJvb2xlYW47XG5cbiAgLyoqIFNob3cgZm9yZ290IHBhc3N3b3JkIGxpbmsgYW5kIG1vZGFsIChkZWZhdWx0OiB0cnVlKSAqL1xuICBzaG93Rm9yZ290UGFzc3dvcmQ/OiBib29sZWFuO1xuXG4gIC8qKiBXcmFwIGNvbXBvbmVudCBpbiBjYXJkLXN0eWxlIGNvbnRhaW5lciB3aXRoIGJhY2tncm91bmQsIHNoYWRvdywgcm91bmRlZCBjb3JuZXJzIChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgc2hvd0NhcmQ/OiBib29sZWFuO1xuXG4gIC8qKiBMZWdhbCBub3RpY2UgY29uZmlndXJhdGlvbiAqL1xuICBsZWdhbD86IExvZ2luTGVnYWxDb25maWc7XG5cbiAgLyoqIFJvdXRlIHRvIHJlZGlyZWN0IGFmdGVyIHN1Y2Nlc3NmdWwgbG9naW4gKG9wdGlvbmFsIC0gaWYgbm90IHNldCwgZW1pdHMgZXZlbnQpICovXG4gIHJlZGlyZWN0T25TdWNjZXNzPzogc3RyaW5nO1xuXG4gIC8qKiBPcGVuIGRpcmVjdGx5IGluIHNpZ251cCB2aWV3IChkZWZhdWx0OiAnc2lnbmluJykgKi9cbiAgaW5pdGlhbE9wZXJhdGlvbj86ICdzaWduaW4nIHwgJ3NpZ251cCc7XG59XG5cbi8qKlxuICogRXZlbnQgZW1pdHRlZCB3aGVuIGxvZ2luIGlzIHN1Y2Nlc3NmdWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dpblN1Y2Nlc3NFdmVudCB7XG4gIC8qKiBUaGUgYXV0aGVudGljYXRlZCB1c2VyICovXG4gIHVzZXI6IEF1dGhVc2VyIHwgbnVsbDtcbiAgLyoqIFdoZXRoZXIgTUZBIHdhcyByZXF1aXJlZCBhbmQgY29tcGxldGVkICovXG4gIG1mYUNvbXBsZXRlZD86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoaXMgd2FzIGFuIE9BdXRoIGxvZ2luICovXG4gIG9hdXRoUHJvdmlkZXI/OiBPQXV0aFByb3ZpZGVyO1xufVxuXG4vKipcbiAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBsb2dpbiBmYWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2luRXJyb3JFdmVudCB7XG4gIC8qKiBFcnJvciBjb2RlIGZyb20gdGhlIGJhY2tlbmQgKi9cbiAgY29kZT86IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UgKi9cbiAgbWVzc2FnZTogc3RyaW5nO1xuICAvKiogVGhlIG9wZXJhdGlvbiB0aGF0IGZhaWxlZCAqL1xuICBvcGVyYXRpb246ICdzaWduaW4nIHwgJ3NpZ251cCcgfCAndmVyaWZ5JyB8ICdmb3Jnb3QnIHwgJ3Jlc2V0JyB8ICdtZmEnIHwgJ29hdXRoJztcbn1cblxuLyoqXG4gKiBFdmVudCBlbWl0dGVkIHdoZW4gTUZBIHZlcmlmaWNhdGlvbiBpcyByZXF1aXJlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1GQVJlcXVpcmVkRXZlbnQge1xuICAvKiogTUZBIG1ldGhvZCByZXF1aXJlZCAqL1xuICBtZXRob2Q6ICdUT1RQJyB8ICdFTUFJTCcgfCAnU01TJztcbn1cblxuLyoqXG4gKiBEZWZhdWx0IHZhbHVlcyBmb3IgTG9naW5NZXRhZGF0YVxuICovXG5leHBvcnQgY29uc3QgTE9HSU5fREVGQVVMVFM6IFJlcXVpcmVkPFxuICBPbWl0PExvZ2luTWV0YWRhdGEsICdsb2dvJyB8ICdsZWdhbCcgfCAncmVkaXJlY3RPblN1Y2Nlc3MnIHwgJ2luaXRpYWxPcGVyYXRpb24nPlxuPiA9IHtcbiAgc2hvd09BdXRoOiB0cnVlLFxuICBvYXV0aFByb3ZpZGVyczogWydnb29nbGUnXSxcbiAgc2hvd1JlZ2lzdGVyOiB0cnVlLFxuICBzaG93Rm9yZ290UGFzc3dvcmQ6IHRydWUsXG4gIHNob3dDYXJkOiBmYWxzZSxcbn07XG5cbi8qKlxuICogTG9nbyBwb3IgZGVmZWN0byBkZSBsYSBjYXJkIGRlIGxvZ2luIGN1YW5kbyBlbCBjb25zdW1lciBubyBwYXNhIGBsb2dvYC5cbiAqXG4gKiBVc2EgZWwgdG9rZW4gQ1NTIGAtLW1haW4tbG9nby1taW5pYCAoZWwgbG9nbyBNSU5JL2ljb25vLCBlbCBtaXNtbyBxdWUgZWxcbiAqIHNpZGUgbWVudSBgdmFsLW1lbnVgKSwgcmVzdWVsdG8gcG9yIGB2YWwtaW1hZ2VgIHbDrWEgYHZhcigtLW1haW4tbG9nby1taW5pKWAuXG4gKiBDYWRhIGFwcCBkZWwgZmFjdG9yeSBsbyBkZWZpbmUgZW4gc3UgYHRoZW1lL3ZhcmlhYmxlcy5zY3NzYCAoc2hvd2Nhc2Ug4oaSXG4gKiBgbWFpbi1pY29uLnBuZ2AsIGJpbmdvIOKGkiBgZmF2aWNvbi1iYWxscy5zdmdgKS4gTk8gZXMgZWwgbG9ja3VwIGdyYW5kZVxuICogYC0tbWFpbi1sb2dvYCBkZWwgaGVhZGVyLiBBc8OtIGVsIGxvZ2luIG11ZXN0cmEgU0lFTVBSRSBlbCBpY29ubyBkZSBtYXJjYSBkZVxuICogbGEgYXBwIHNpbiBhY29wbGFyIGxhIGxpYiBhIHVuYSBtYXJjYSBjb25jcmV0YSDigJQgZXMgZWwgZXN0w6FuZGFyIGRlbCBmYWN0b3J5LlxuICpcbiAqIFVuYSBhcHAgcHVlZGUgb3ZlcnJpZGUgcGFzYW5kbyBzdSBwcm9waW8gYGxvZ29gIGVuIGBMb2dpbk1ldGFkYXRhYCAoZWouXG4gKiBzaG93Y2FzZSB1c2EgdW4gbWFyayBwcm9waW8gYHRlcm1pbmFsLnN2Z2ApLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9MT0dJTl9MT0dPOiBJbWFnZU1ldGFkYXRhID0ge1xuICBzcmM6ICctLW1haW4tbG9nby1taW5pJyxcbiAgYWx0OiAnJyxcbiAgbW9kZTogJ2JveCcsXG4gIHNoYWRlZDogZmFsc2UsXG4gIGJvcmRlcmVkOiBmYWxzZSxcbiAgc2l6ZTogJ3hsYXJnZScsXG4gIGFsaWdubWVudDogJ2NlbnRlcicsXG4gIGZsZXg6IHRydWUsXG4gIHdpZHRoOiA0LFxufTtcbiJdfQ==
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL2xvZ2luL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTJGQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FFdkI7SUFDRixTQUFTLEVBQUUsSUFBSTtJQUNmLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQztJQUMxQixZQUFZLEVBQUUsSUFBSTtJQUNsQixrQkFBa0IsRUFBRSxJQUFJO0lBQ3hCLFFBQVEsRUFBRSxLQUFLO0NBQ2hCLENBQUM7QUFFRjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBa0I7SUFDL0MsR0FBRyxFQUFFLGtCQUFrQjtJQUN2QixHQUFHLEVBQUUsRUFBRTtJQUNQLElBQUksRUFBRSxLQUFLO0lBQ1gsTUFBTSxFQUFFLEtBQUs7SUFDYixRQUFRLEVBQUUsS0FBSztJQUNmLElBQUksRUFBRSxRQUFRO0lBQ2QsU0FBUyxFQUFFLFFBQVE7SUFDbkIsSUFBSSxFQUFFLElBQUk7SUFDVixLQUFLLEVBQUUsQ0FBQztDQUNULENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbWFnZU1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vYXRvbXMvaW1hZ2UvdHlwZXMnO1xuaW1wb3J0IHsgT0F1dGhQcm92aWRlciB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGgvdHlwZXMnO1xuaW1wb3J0IHsgQXV0aFVzZXIgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoL3R5cGVzJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBsZWdhbCBub3RpY2UgZGlzcGxheWVkIGluIHRoZSBsb2dpbiBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dpbkxlZ2FsQ29uZmlnIHtcbiAgLyoqIENvbXBhbnkgbmFtZSB0byBkaXNwbGF5ICovXG4gIGNvbXBhbnlOYW1lOiBzdHJpbmc7XG4gIC8qKiBMaW5rIGZvciBjb21wYW55IG5hbWUgKG9wdGlvbmFsKSAqL1xuICBjb21wYW55TGluaz86IHN0cmluZztcbiAgLyoqIExpbmsgdG8gdGVybXMgYW5kIGNvbmRpdGlvbnMgcGFnZSAqL1xuICB0ZXJtc0xpbms/OiBzdHJpbmc7XG4gIC8qKiBMaW5rIHRvIHByaXZhY3kgcG9saWN5IHBhZ2UgKi9cbiAgcHJpdmFjeUxpbms/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogTWFpbiBjb25maWd1cmF0aW9uIGZvciB0aGUgTG9naW4gY29tcG9uZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9naW5NZXRhZGF0YSB7XG4gIC8qKiBMb2dvIHRvIGRpc3BsYXkgYXQgdGhlIHRvcCBvZiB0aGUgZm9ybSAqL1xuICBsb2dvPzogSW1hZ2VNZXRhZGF0YTtcblxuICAvKiogU2hvdyBPQXV0aCBsb2dpbiBidXR0b25zIChkZWZhdWx0OiB0cnVlKSAqL1xuICBzaG93T0F1dGg/OiBib29sZWFuO1xuXG4gIC8qKiBPQXV0aCBwcm92aWRlcnMgdG8gc2hvdyAoZGVmYXVsdDogWydnb29nbGUnXSkgKi9cbiAgb2F1dGhQcm92aWRlcnM/OiBPQXV0aFByb3ZpZGVyW107XG5cbiAgLyoqIFNob3cgcmVnaXN0ZXIgbGluayBhbmQgbW9kYWwgKGRlZmF1bHQ6IHRydWUpICovXG4gIHNob3dSZWdpc3Rlcj86IGJvb2xlYW47XG5cbiAgLyoqIFNob3cgZm9yZ290IHBhc3N3b3JkIGxpbmsgYW5kIG1vZGFsIChkZWZhdWx0OiB0cnVlKSAqL1xuICBzaG93Rm9yZ290UGFzc3dvcmQ/OiBib29sZWFuO1xuXG4gIC8qKiBXcmFwIGNvbXBvbmVudCBpbiBjYXJkLXN0eWxlIGNvbnRhaW5lciB3aXRoIGJhY2tncm91bmQsIHNoYWRvdywgcm91bmRlZCBjb3JuZXJzIChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgc2hvd0NhcmQ/OiBib29sZWFuO1xuXG4gIC8qKiBMZWdhbCBub3RpY2UgY29uZmlndXJhdGlvbiAqL1xuICBsZWdhbD86IExvZ2luTGVnYWxDb25maWc7XG5cbiAgLyoqIFJvdXRlIHRvIHJlZGlyZWN0IGFmdGVyIHN1Y2Nlc3NmdWwgbG9naW4gKG9wdGlvbmFsIC0gaWYgbm90IHNldCwgZW1pdHMgZXZlbnQpICovXG4gIHJlZGlyZWN0T25TdWNjZXNzPzogc3RyaW5nO1xuXG4gIC8qKiBPcGVuIGRpcmVjdGx5IGluIHNpZ251cCB2aWV3IChkZWZhdWx0OiAnc2lnbmluJykgKi9cbiAgaW5pdGlhbE9wZXJhdGlvbj86ICdzaWduaW4nIHwgJ3NpZ251cCc7XG5cbiAgLyoqXG4gICAqIFJ1dGEgZGUgbGEgcMOhZ2luYSBkZSBsb2dpbi4gU2kgc2Ugc2V0ZWEsIGVsIGxpbmsgXCLCv1lhIHRpZW5lcyBjdWVudGE/XCIgZGVsXG4gICAqIG1vZGFsIGRlIHJlZ2lzdHJvIE5BVkVHQSBhIGVzYSBydXRhIChjaWVycmEgZWwgbW9kYWwgeSBsdWVnbyBlbnJ1dGEpIGVuIHZlelxuICAgKiBkZSBzb2xvIGNlcnJhciBlbCBtb2RhbC4gw5p0aWwgY3VhbmRvIGVsIGB2YWwtbG9naW5gIHNlIHVzYSBzb2xvIGNvbW8gbW9kYWxcbiAgICogZGUgcmVnaXN0cm8gKGVqLiBsYW5kaW5nKSB5IGVsIGxvZ2luIHJlYWwgdml2ZSBlbiB1bmEgcMOhZ2luYSBhcGFydGUuXG4gICAqIFNpbiBzZXRlYXIg4oaSIGNvbXBvcnRhbWllbnRvIHBvciBkZWZlY3RvOiBlbCBsaW5rIHNvbG8gY2llcnJhIGVsIG1vZGFsLlxuICAgKi9cbiAgbG9naW5Sb3V0ZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBFdmVudCBlbWl0dGVkIHdoZW4gbG9naW4gaXMgc3VjY2Vzc2Z1bFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvZ2luU3VjY2Vzc0V2ZW50IHtcbiAgLyoqIFRoZSBhdXRoZW50aWNhdGVkIHVzZXIgKi9cbiAgdXNlcjogQXV0aFVzZXIgfCBudWxsO1xuICAvKiogV2hldGhlciBNRkEgd2FzIHJlcXVpcmVkIGFuZCBjb21wbGV0ZWQgKi9cbiAgbWZhQ29tcGxldGVkPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhpcyB3YXMgYW4gT0F1dGggbG9naW4gKi9cbiAgb2F1dGhQcm92aWRlcj86IE9BdXRoUHJvdmlkZXI7XG59XG5cbi8qKlxuICogRXZlbnQgZW1pdHRlZCB3aGVuIGxvZ2luIGZhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9naW5FcnJvckV2ZW50IHtcbiAgLyoqIEVycm9yIGNvZGUgZnJvbSB0aGUgYmFja2VuZCAqL1xuICBjb2RlPzogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZSAqL1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIC8qKiBUaGUgb3BlcmF0aW9uIHRoYXQgZmFpbGVkICovXG4gIG9wZXJhdGlvbjogJ3NpZ25pbicgfCAnc2lnbnVwJyB8ICd2ZXJpZnknIHwgJ2ZvcmdvdCcgfCAncmVzZXQnIHwgJ21mYScgfCAnb2F1dGgnO1xufVxuXG4vKipcbiAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBNRkEgdmVyaWZpY2F0aW9uIGlzIHJlcXVpcmVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTUZBUmVxdWlyZWRFdmVudCB7XG4gIC8qKiBNRkEgbWV0aG9kIHJlcXVpcmVkICovXG4gIG1ldGhvZDogJ1RPVFAnIHwgJ0VNQUlMJyB8ICdTTVMnO1xufVxuXG4vKipcbiAqIERlZmF1bHQgdmFsdWVzIGZvciBMb2dpbk1ldGFkYXRhXG4gKi9cbmV4cG9ydCBjb25zdCBMT0dJTl9ERUZBVUxUUzogUmVxdWlyZWQ8XG4gIE9taXQ8TG9naW5NZXRhZGF0YSwgJ2xvZ28nIHwgJ2xlZ2FsJyB8ICdyZWRpcmVjdE9uU3VjY2VzcycgfCAnaW5pdGlhbE9wZXJhdGlvbicgfCAnbG9naW5Sb3V0ZSc+XG4+ID0ge1xuICBzaG93T0F1dGg6IHRydWUsXG4gIG9hdXRoUHJvdmlkZXJzOiBbJ2dvb2dsZSddLFxuICBzaG93UmVnaXN0ZXI6IHRydWUsXG4gIHNob3dGb3Jnb3RQYXNzd29yZDogdHJ1ZSxcbiAgc2hvd0NhcmQ6IGZhbHNlLFxufTtcblxuLyoqXG4gKiBMb2dvIHBvciBkZWZlY3RvIGRlIGxhIGNhcmQgZGUgbG9naW4gY3VhbmRvIGVsIGNvbnN1bWVyIG5vIHBhc2EgYGxvZ29gLlxuICpcbiAqIFVzYSBlbCB0b2tlbiBDU1MgYC0tbWFpbi1sb2dvLW1pbmlgIChlbCBsb2dvIE1JTkkvaWNvbm8sIGVsIG1pc21vIHF1ZSBlbFxuICogc2lkZSBtZW51IGB2YWwtbWVudWApLCByZXN1ZWx0byBwb3IgYHZhbC1pbWFnZWAgdsOtYSBgdmFyKC0tbWFpbi1sb2dvLW1pbmkpYC5cbiAqIENhZGEgYXBwIGRlbCBmYWN0b3J5IGxvIGRlZmluZSBlbiBzdSBgdGhlbWUvdmFyaWFibGVzLnNjc3NgIChzaG93Y2FzZSDihpJcbiAqIGBtYWluLWljb24ucG5nYCwgYmluZ28g4oaSIGBmYXZpY29uLWJhbGxzLnN2Z2ApLiBOTyBlcyBlbCBsb2NrdXAgZ3JhbmRlXG4gKiBgLS1tYWluLWxvZ29gIGRlbCBoZWFkZXIuIEFzw60gZWwgbG9naW4gbXVlc3RyYSBTSUVNUFJFIGVsIGljb25vIGRlIG1hcmNhIGRlXG4gKiBsYSBhcHAgc2luIGFjb3BsYXIgbGEgbGliIGEgdW5hIG1hcmNhIGNvbmNyZXRhIOKAlCBlcyBlbCBlc3TDoW5kYXIgZGVsIGZhY3RvcnkuXG4gKlxuICogVW5hIGFwcCBwdWVkZSBvdmVycmlkZSBwYXNhbmRvIHN1IHByb3BpbyBgbG9nb2AgZW4gYExvZ2luTWV0YWRhdGFgIChlai5cbiAqIHNob3djYXNlIHVzYSB1biBtYXJrIHByb3BpbyBgdGVybWluYWwuc3ZnYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0xPR0lOX0xPR086IEltYWdlTWV0YWRhdGEgPSB7XG4gIHNyYzogJy0tbWFpbi1sb2dvLW1pbmknLFxuICBhbHQ6ICcnLFxuICBtb2RlOiAnYm94JyxcbiAgc2hhZGVkOiBmYWxzZSxcbiAgYm9yZGVyZWQ6IGZhbHNlLFxuICBzaXplOiAneGxhcmdlJyxcbiAgYWxpZ25tZW50OiAnY2VudGVyJyxcbiAgZmxleDogdHJ1ZSxcbiAgd2lkdGg6IDQsXG59O1xuIl19
@@ -100,7 +100,7 @@ export class TicketCardImageService {
100
100
  }
101
101
  if (config.brandName) {
102
102
  ctx.fillStyle = '#ffffff';
103
- ctx.font = `bold 1.125rem ${FONT_STACK}`;
103
+ ctx.font = `bold 1.75rem ${FONT_STACK}`;
104
104
  ctx.textAlign = 'center';
105
105
  ctx.textBaseline = 'middle';
106
106
  ctx.fillText(config.brandName, width / 2, textY, width - logoPad * 2);
@@ -120,11 +120,11 @@ export class TicketCardImageService {
120
120
  ctx.strokeStyle = '#e0e0e0';
121
121
  ctx.strokeRect(qrX, qrY, QR_SIZE, QR_SIZE);
122
122
  }
123
- ctx.fillStyle = '#92949c';
124
- ctx.font = `0.75rem ${FONT_STACK}`;
123
+ ctx.fillStyle = '#2f2a36';
124
+ ctx.font = `0.9375rem ${FONT_STACK}`;
125
125
  ctx.textAlign = 'center';
126
126
  ctx.textBaseline = 'top';
127
- ctx.fillText('Escanea para verificar', width / 2, qrY + QR_SIZE + 10);
127
+ ctx.fillText('Escanea para verificar', width / 2, qrY + QR_SIZE + 12);
128
128
  }
129
129
  drawFooter(ctx, config, width) {
130
130
  const footerTop = HEADER_H + QR_ZONE_H;
@@ -138,21 +138,21 @@ export class TicketCardImageService {
138
138
  const label = config.folioLabel ?? 'Entrada';
139
139
  const folioText = `${label} #${config.folio}`;
140
140
  ctx.fillStyle = '#1a0b2e';
141
- ctx.font = `bold 2.5rem ${FONT_STACK}`;
141
+ ctx.font = `bold 3rem ${FONT_STACK}`;
142
142
  ctx.textAlign = 'center';
143
143
  ctx.textBaseline = 'top';
144
144
  ctx.fillText(folioText, width / 2, contentY, width - 40);
145
145
  contentY += 56;
146
146
  }
147
147
  if (config.buyerName) {
148
- ctx.fillStyle = '#6b6675';
149
- ctx.font = `1.125rem ${FONT_STACK}`;
148
+ ctx.fillStyle = '#2f2a36';
149
+ ctx.font = `1.25rem ${FONT_STACK}`;
150
150
  ctx.textAlign = 'center';
151
151
  ctx.textBaseline = 'top';
152
152
  ctx.fillText(config.buyerName, width / 2, contentY, width - 40);
153
153
  }
154
- ctx.fillStyle = '#c0c0c0';
155
- ctx.font = `0.625rem ${FONT_STACK}`;
154
+ ctx.fillStyle = '#6b6675';
155
+ ctx.font = `0.75rem ${FONT_STACK}`;
156
156
  ctx.textAlign = 'right';
157
157
  ctx.textBaseline = 'bottom';
158
158
  ctx.fillText('Valtech', width - 16, footerTop + FOOTER_H - 12);
@@ -172,4 +172,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
172
172
  type: Injectable,
173
173
  args: [{ providedIn: 'root' }]
174
174
  }] });
175
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlja2V0LWNhcmQtaW1hZ2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvdGlja2V0LWNhcmQtaW1hZ2UvdGlja2V0LWNhcmQtaW1hZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUczQyxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUM7QUFDekIsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQ3JCLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQztBQUN0QixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUM7QUFDckIsTUFBTSxhQUFhLEdBQUcsUUFBUSxHQUFHLFNBQVMsR0FBRyxRQUFRLENBQUM7QUFDdEQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBRXBCLE1BQU0sbUJBQW1CLEdBQUcsU0FBUyxDQUFDO0FBQ3RDLE1BQU0sc0JBQXNCLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE1BQU0sVUFBVSxHQUFHLDBCQUEwQixDQUFDO0FBRzlDLE1BQU0sT0FBTyxzQkFBc0I7SUFDakMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUE2QjtRQUMxQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxJQUFJLFlBQVksQ0FBQztRQUUzQyxJQUFJLE1BQTJDLENBQUM7UUFDaEQsSUFBSSxHQUFpRSxDQUFDO1FBRXRFLElBQUksT0FBTyxlQUFlLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDM0MsTUFBTSxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztZQUNuRCxHQUFHLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQXNDLENBQUM7UUFDckUsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FB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QUMsU0FBUyxFQUFFLEtBQUssR0FBRyxFQUFFLEVBQUUsU0FBUyxHQUFHLFFBQVEsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRU8sU0FBUyxDQUFDLEdBQVc7UUFDM0IsT0FBTyxJQUFJLE9BQU8sQ0FBbUIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDdkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN4QixHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQyxHQUFHLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0FoTVUsc0JBQXNCO21IQUF0QixzQkFBc0IsY0FEVCxNQUFNOzs0RkFDbkIsc0JBQXNCO2tCQURsQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRpY2tldENhcmRJbWFnZUNvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBDQU5WQVNfV0lEVEggPSA1NjA7XG5jb25zdCBIRUFERVJfSCA9IDE2MDtcbmNvbnN0IFFSX1pPTkVfSCA9IDM4MDtcbmNvbnN0IEZPT1RFUl9IID0gMjQwO1xuY29uc3QgQ0FOVkFTX0hFSUdIVCA9IEhFQURFUl9IICsgUVJfWk9ORV9IICsgRk9PVEVSX0g7XG5jb25zdCBRUl9TSVpFID0gMjgwO1xuXG5jb25zdCBERUZBVUxUX0JSQU5EX0NPTE9SID0gJyM5YjFmZGUnO1xuY29uc3QgREVGQVVMVF9CUkFORF9DT0xPUl9UTyA9ICcjYzkzMDc1JztcbmNvbnN0IEZPTlRfU1RBQ0sgPSAnS2h1bGEsIEFyaWFsLCBzYW5zLXNlcmlmJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBUaWNrZXRDYXJkSW1hZ2VTZXJ2aWNlIHtcbiAgYXN5bmMgZ2VuZXJhdGUoY29uZmlnOiBUaWNrZXRDYXJkSW1hZ2VDb25maWcpOiBQcm9taXNlPEJsb2I+IHtcbiAgICBjb25zdCB3aWR0aCA9IGNvbmZpZy53aWR0aCA/PyBDQU5WQVNfV0lEVEg7XG5cbiAgICBsZXQgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcztcbiAgICBsZXQgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG5cbiAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIENBTlZBU19IRUlHSFQpO1xuICAgICAgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykgYXMgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIChjYW52YXMgYXMgSFRNTENhbnZhc0VsZW1lbnQpLndpZHRoID0gd2lkdGg7XG4gICAgICAoY2FudmFzIGFzIEhUTUxDYW52YXNFbGVtZW50KS5oZWlnaHQgPSBDQU5WQVNfSEVJR0hUO1xuICAgICAgY3R4ID0gKGNhbnZhcyBhcyBIVE1MQ2FudmFzRWxlbWVudCkuZ2V0Q29udGV4dCgnMmQnKSBhcyBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5kcmF3SGVhZGVyKGN0eCwgY29uZmlnLCB3aWR0aCk7XG4gICAgYXdhaXQgdGhpcy5kcmF3UXJab25lKGN0eCwgY29uZmlnLCB3aWR0aCk7XG4gICAgdGhpcy5kcmF3Rm9vdGVyKGN0eCwgY29uZmlnLCB3aWR0aCk7XG5cbiAgICBpZiAoY2FudmFzIGluc3RhbmNlb2YgT2Zmc2NyZWVuQ2FudmFzKSB7XG4gICAgICByZXR1cm4gY2FudmFzLmNvbnZlcnRUb0Jsb2IoeyB0eXBlOiAnaW1hZ2UvcG5nJyB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8QmxvYj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgKGNhbnZhcyBhcyBIVE1MQ2FudmFzRWxlbWVudCkudG9CbG9iKGJsb2IgPT4ge1xuICAgICAgICBpZiAoYmxvYikge1xuICAgICAgICAgIHJlc29sdmUoYmxvYik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQ2FudmFzIHRvQmxvYiByZXR1cm5lZCBudWxsJykpO1xuICAgICAgICB9XG4gICAgICB9LCAnaW1hZ2UvcG5nJyk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzaGFyZShjb25maWc6IFRpY2tldENhcmRJbWFnZUNvbmZpZywgc2hhcmVUaXRsZT86IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghbmF2aWdhdG9yLnNoYXJlIHx8ICFuYXZpZ2F0b3IuY2FuU2hhcmUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgYmxvYjogQmxvYjtcbiAgICB0cnkge1xuICAgICAgYmxvYiA9IGF3YWl0IHRoaXMuZ2VuZXJhdGUoY29uZmlnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlbmFtZSA9ICdlbnRyYWRhLnBuZyc7XG4gICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgZmlsZW5hbWUsIHsgdHlwZTogJ2ltYWdlL3BuZycgfSk7XG5cbiAgICBpZiAoIW5hdmlnYXRvci5jYW5TaGFyZSh7IGZpbGVzOiBbZmlsZV0gfSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgbmF2aWdhdG9yLnNoYXJlKHtcbiAgICAgICAgdGl0bGU6IHNoYXJlVGl0bGUgPz8gY29uZmlnLmJyYW5kTmFtZSA/PyAnRW50cmFkYScsXG4gICAgICAgIGZpbGVzOiBbZmlsZV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiAmJiBlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRyYXdIZWFkZXIoXG4gICAgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gICAgY29uZmlnOiBUaWNrZXRDYXJkSW1hZ2VDb25maWcsXG4gICAgd2lkdGg6IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb2xvckZyb20gPSBjb25maWcuYnJhbmRDb2xvciA/PyBERUZBVUxUX0JSQU5EX0NPTE9SO1xuICAgIGNvbnN0IGNvbG9yVG8gPVxuICAgICAgY29uZmlnLmJyYW5kQ29sb3JUbyA/PyAoY29uZmlnLmJyYW5kQ29sb3IgPyBjb25maWcuYnJhbmRDb2xvciA6IERFRkFVTFRfQlJBTkRfQ09MT1JfVE8pO1xuXG4gICAgY29uc3QgZ3JhZCA9IGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLCAwLCB3aWR0aCwgSEVBREVSX0gpO1xuICAgIGdyYWQuYWRkQ29sb3JTdG9wKDAsIGNvbG9yRnJvbSk7XG4gICAgZ3JhZC5hZGRDb2xvclN0b3AoMSwgY29sb3JUbyk7XG5cbiAgICBjdHguZmlsbFN0eWxlID0gZ3JhZDtcbiAgICBjdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIEhFQURFUl9IKTtcblxuICAgIGNvbnN0IGxvZ29IID0gNDQ7XG4gICAgY29uc3QgbG9nb1BhZCA9IDI4O1xuICAgIGxldCB0ZXh0WSA9IEhFQURFUl9IIC8gMjtcblxuICAgIGlmIChjb25maWcubG9nb1VybCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbG9nb0ltZyA9IGF3YWl0IHRoaXMubG9hZEltYWdlKGNvbmZpZy5sb2dvVXJsKTtcbiAgICAgICAgY29uc3QgcmF0aW8gPSBsb2dvSW1nLndpZHRoIC8gbG9nb0ltZy5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IGxvZ29XID0gbG9nb0ggKiByYXRpbztcbiAgICAgICAgY29uc3QgbG9nb1ggPSBsb2dvUGFkO1xuICAgICAgICBjb25zdCBsb2dvWSA9IChIRUFERVJfSCAtIGxvZ29IKSAvIDI7XG4gICAgICAgIGN0eC5kcmF3SW1hZ2UobG9nb0ltZywgbG9nb1gsIGxvZ29ZLCBsb2dvVywgbG9nb0gpO1xuXG4gICAgICAgIGlmIChjb25maWcuYnJhbmROYW1lKSB7XG4gICAgICAgICAgdGV4dFkgPSBsb2dvWSArIGxvZ29IICsgMTQ7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBsb2dvIGZhaWxlZCDigJQgcmVuZGVyIGJyYW5kIG5hbWUgY2VudGVyZWQgYXMgZmFsbGJhY2tcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmJyYW5kTmFtZSkge1xuICAgICAgY3R4LmZpbGxTdHlsZSA9ICcjZmZmZmZmJztcbiAgICAgIGN0eC5mb250ID0gYGJvbGQgMS4xMjVyZW0gJHtGT05UX1NUQUNLfWA7XG4gICAgICBjdHgudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICBjdHgudGV4dEJhc2VsaW5lID0gJ21pZGRsZSc7XG4gICAgICBjdHguZmlsbFRleHQoY29uZmlnLmJyYW5kTmFtZSwgd2lkdGggLyAyLCB0ZXh0WSwgd2lkdGggLSBsb2dvUGFkICogMik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkcmF3UXJab25lKFxuICAgIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELFxuICAgIGNvbmZpZzogVGlja2V0Q2FyZEltYWdlQ29uZmlnLFxuICAgIHdpZHRoOiBudW1iZXJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgem9uZVRvcCA9IEhFQURFUl9IO1xuXG4gICAgY3R4LmZpbGxTdHlsZSA9ICcjZmZmZmZmJztcbiAgICBjdHguZmlsbFJlY3QoMCwgem9uZVRvcCwgd2lkdGgsIFFSX1pPTkVfSCk7XG5cbiAgICBjb25zdCBxclggPSAod2lkdGggLSBRUl9TSVpFKSAvIDI7XG4gICAgY29uc3QgcXJZID0gem9uZVRvcCArIChRUl9aT05FX0ggLSBRUl9TSVpFIC0gMjgpIC8gMjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBxckltZyA9IGF3YWl0IHRoaXMubG9hZEltYWdlKGNvbmZpZy5xckRhdGFVcmwpO1xuICAgICAgY3R4LmRyYXdJbWFnZShxckltZywgcXJYLCBxclksIFFSX1NJWkUsIFFSX1NJWkUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgY3R4LnN0cm9rZVN0eWxlID0gJyNlMGUwZTAnO1xuICAgICAgY3R4LnN0cm9rZVJlY3QocXJYLCBxclksIFFSX1NJWkUsIFFSX1NJWkUpO1xuICAgIH1cblxuICAgIGN0eC5maWxsU3R5bGUgPSAnIzkyOTQ5Yyc7XG4gICAgY3R4LmZvbnQgPSBgMC43NXJlbSAke0ZPTlRfU1RBQ0t9YDtcbiAgICBjdHgudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgY3R4LnRleHRCYXNlbGluZSA9ICd0b3AnO1xuICAgIGN0eC5maWxsVGV4dCgnRXNjYW5lYSBwYXJhIHZlcmlmaWNhcicsIHdpZHRoIC8gMiwgcXJZICsgUVJfU0laRSArIDEwKTtcbiAgfVxuXG4gIHByaXZhdGUgZHJhd0Zvb3RlcihcbiAgICBjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCxcbiAgICBjb25maWc6IFRpY2tldENhcmRJbWFnZUNvbmZpZyxcbiAgICB3aWR0aDogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGZvb3RlclRvcCA9IEhFQURFUl9IICsgUVJfWk9ORV9IO1xuXG4gICAgY3R4LmZpbGxTdHlsZSA9ICcjZmZmZmZmJztcbiAgICBjdHguZmlsbFJlY3QoMCwgZm9vdGVyVG9wLCB3aWR0aCwgRk9PVEVSX0gpO1xuXG4gICAgY29uc3QgY29sb3JGcm9tID0gY29uZmlnLmJyYW5kQ29sb3IgPz8gREVGQVVMVF9CUkFORF9DT0xPUjtcbiAgICBjdHguZmlsbFN0eWxlID0gY29sb3JGcm9tO1xuICAgIGN0eC5maWxsUmVjdCgwLCBmb290ZXJUb3AsIHdpZHRoLCAzKTtcblxuICAgIGxldCBjb250ZW50WSA9IGZvb3RlclRvcCArIDQwO1xuXG4gICAgaWYgKGNvbmZpZy5mb2xpbyAhPT0gdW5kZWZpbmVkICYmIGNvbmZpZy5mb2xpbyAhPT0gbnVsbCAmJiBjb25maWcuZm9saW8gIT09ICcnKSB7XG4gICAgICBjb25zdCBsYWJlbCA9IGNvbmZpZy5mb2xpb0xhYmVsID8/ICdFbnRyYWRhJztcbiAgICAgIGNvbnN0IGZvbGlvVGV4dCA9IGAke2xhYmVsfSAjJHtjb25maWcuZm9saW99YDtcbiAgICAgIGN0eC5maWxsU3R5bGUgPSAnIzFhMGIyZSc7XG4gICAgICBjdHguZm9udCA9IGBib2xkIDIuNXJlbSAke0ZPTlRfU1RBQ0t9YDtcbiAgICAgIGN0eC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAndG9wJztcbiAgICAgIGN0eC5maWxsVGV4dChmb2xpb1RleHQsIHdpZHRoIC8gMiwgY29udGVudFksIHdpZHRoIC0gNDApO1xuICAgICAgY29udGVudFkgKz0gNTY7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5idXllck5hbWUpIHtcbiAgICAgIGN0eC5maWxsU3R5bGUgPSAnIzZiNjY3NSc7XG4gICAgICBjdHguZm9udCA9IGAxLjEyNXJlbSAke0ZPTlRfU1RBQ0t9YDtcbiAgICAgIGN0eC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAndG9wJztcbiAgICAgIGN0eC5maWxsVGV4dChjb25maWcuYnV5ZXJOYW1lLCB3aWR0aCAvIDIsIGNvbnRlbnRZLCB3aWR0aCAtIDQwKTtcbiAgICB9XG5cbiAgICBjdHguZmlsbFN0eWxlID0gJyNjMGMwYzAnO1xuICAgIGN0eC5mb250ID0gYDAuNjI1cmVtICR7Rk9OVF9TVEFDS31gO1xuICAgIGN0eC50ZXh0QWxpZ24gPSAncmlnaHQnO1xuICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAnYm90dG9tJztcbiAgICBjdHguZmlsbFRleHQoJ1ZhbHRlY2gnLCB3aWR0aCAtIDE2LCBmb290ZXJUb3AgKyBGT09URVJfSCAtIDEyKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEltYWdlKHNyYzogc3RyaW5nKTogUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPEhUTUxJbWFnZUVsZW1lbnQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoaW1nKTtcbiAgICAgIGltZy5vbmVycm9yID0gKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgaW1hZ2U6ICR7c3JjfWApKTtcbiAgICAgIGltZy5zcmMgPSBzcmM7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
175
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlja2V0LWNhcmQtaW1hZ2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvdGlja2V0LWNhcmQtaW1hZ2UvdGlja2V0LWNhcmQtaW1hZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUczQyxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUM7QUFDekIsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQ3JCLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQztBQUN0QixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUM7QUFDckIsTUFBTSxhQUFhLEdBQUcsUUFBUSxHQUFHLFNBQVMsR0FBRyxRQUFRLENBQUM7QUFDdEQsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBRXBCLE1BQU0sbUJBQW1CLEdBQUcsU0FBUyxDQUFDO0FBQ3RDLE1BQU0sc0JBQXNCLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE1BQU0sVUFBVSxHQUFHLDBCQUEwQixDQUFDO0FBRzlDLE1BQU0sT0FBTyxzQkFBc0I7SUFDakMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUE2QjtRQUMxQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxJQUFJLFlBQVksQ0FBQztRQUUzQyxJQUFJLE1BQTJDLENBQUM7UUFDaEQsSUFBSSxHQUFpRSxDQUFDO1FBRXRFLElBQUksT0FBTyxlQUFlLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDM0MsTUFBTSxHQUFHLElBQUksZUFBZSxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztZQUNuRCxHQUFHLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQXNDLENBQUM7UUFDckUsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN6QyxNQUE0QixDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDM0MsTUFBNEIsQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDO1lBQ3JELEdBQUcsR0FBSSxNQUE0QixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQTZCLENBQUM7UUFDbkYsQ0FBQztRQUVELE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVwQyxJQUFJLE1BQU0sWUFBWSxlQUFlLEVBQUUsQ0FBQztZQUN0QyxPQUFPLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBRUQsT0FBTyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMxQyxNQUE0QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDMUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztvQkFDVCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hCLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDO2dCQUNuRCxDQUFDO1lBQ0gsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBNkIsRUFBRSxVQUFtQjtRQUM1RCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM1QyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxJQUFJLElBQVUsQ0FBQztRQUNmLElBQUksQ0FBQztZQUNILElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQztRQUMvQixNQUFNLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRS9ELElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDM0MsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxTQUFTLENBQUMsS0FBSyxDQUFDO2dCQUNwQixLQUFLLEVBQUUsVUFBVSxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksU0FBUztnQkFDbEQsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDO2FBQ2QsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLElBQUksR0FBRyxZQUFZLFlBQVksSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRSxDQUFDO2dCQUM3RCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLFVBQVUsQ0FDdEIsR0FBaUUsRUFDakUsTUFBNkIsRUFDN0IsS0FBYTtRQUViLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksbUJBQW1CLENBQUM7UUFDM0QsTUFBTSxPQUFPLEdBQ1gsTUFBTSxDQUFDLFlBQVksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFFMUYsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRTlCLEdBQUcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFcEMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLEtBQUssR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBRXpCLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQztnQkFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNyRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7Z0JBQzdDLE1BQU0sS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQzVCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQztnQkFDdEIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFFbkQsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ3JCLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDN0IsQ0FBQztZQUNILENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsdURBQXVEO1lBQ3pELENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDckIsR0FBRyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDMUIsR0FBRyxDQUFDLElBQUksR0FBRyxnQkFBZ0IsVUFBVSxFQUFFLENBQUM7WUFDeEMsR0FBRyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7WUFDekIsR0FBRyxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7WUFDNUIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEUsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsVUFBVSxDQUN0QixHQUFpRSxFQUNqRSxNQUE2QixFQUM3QixLQUFhO1FBRWIsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDO1FBRXpCLEdBQUcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzFCLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFM0MsTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sR0FBRyxHQUFHLE9BQU8sR0FBRyxDQUFDLFNBQVMsR0FBRyxPQUFPLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXJELElBQUksQ0FBQztZQUNILE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLEdBQUcsQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1lBQzVCLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVELEdBQUcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzFCLEdBQUcsQ0FBQyxJQUFJLEdBQUcsYUFBYSxVQUFVLEVBQUUsQ0FBQztRQUNyQyxHQUFHLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztRQUN6QixHQUFHLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUN6QixHQUFHLENBQUMsUUFBUSxDQUFDLHdCQUF3QixFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRU8sVUFBVSxDQUNoQixHQUFpRSxFQUNqRSxNQUE2QixFQUM3QixLQUFhO1FBRWIsTUFBTSxTQUFTLEdBQUcsUUFBUSxHQUFHLFNBQVMsQ0FBQztRQUV2QyxHQUFHLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMxQixHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRTVDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksbUJBQW1CLENBQUM7UUFDM0QsR0FBRyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDMUIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVyQyxJQUFJLFFBQVEsR0FBRyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBRTlCLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUMvRSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxJQUFJLFNBQVMsQ0FBQztZQUM3QyxNQUFNLFNBQVMsR0FBRyxHQUFHLEtBQUssS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDOUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDMUIsR0FBRyxDQUFDLElBQUksR0FBRyxhQUFhLFVBQVUsRUFBRSxDQUFDO1lBQ3JDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1lBQ3pCLEdBQUcsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQztZQUN6RCxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2pCLENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyQixHQUFHLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUMxQixHQUFHLENBQUMsSUFBSSxHQUFHLFdBQVcsVUFBVSxFQUFFLENBQUM7WUFDbkMsR0FBRyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7WUFDekIsR0FBRyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDekIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBRUQsR0FBRyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDMUIsR0FBRyxDQUFDLElBQUksR0FBRyxXQUFXLFVBQVUsRUFBRSxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO1FBQ3hCLEdBQUcsQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDO1FBQzVCLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEtBQUssR0FBRyxFQUFFLEVBQUUsU0FBUyxHQUFHLFFBQVEsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRU8sU0FBUyxDQUFDLEdBQVc7UUFDM0IsT0FBTyxJQUFJLE9BQU8sQ0FBbUIsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDdkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN4QixHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQyxHQUFHLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0FoTVUsc0JBQXNCO21IQUF0QixzQkFBc0IsY0FEVCxNQUFNOzs0RkFDbkIsc0JBQXNCO2tCQURsQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRpY2tldENhcmRJbWFnZUNvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBDQU5WQVNfV0lEVEggPSA1NjA7XG5jb25zdCBIRUFERVJfSCA9IDE2MDtcbmNvbnN0IFFSX1pPTkVfSCA9IDM4MDtcbmNvbnN0IEZPT1RFUl9IID0gMjQwO1xuY29uc3QgQ0FOVkFTX0hFSUdIVCA9IEhFQURFUl9IICsgUVJfWk9ORV9IICsgRk9PVEVSX0g7XG5jb25zdCBRUl9TSVpFID0gMjgwO1xuXG5jb25zdCBERUZBVUxUX0JSQU5EX0NPTE9SID0gJyM5YjFmZGUnO1xuY29uc3QgREVGQVVMVF9CUkFORF9DT0xPUl9UTyA9ICcjYzkzMDc1JztcbmNvbnN0IEZPTlRfU1RBQ0sgPSAnS2h1bGEsIEFyaWFsLCBzYW5zLXNlcmlmJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBUaWNrZXRDYXJkSW1hZ2VTZXJ2aWNlIHtcbiAgYXN5bmMgZ2VuZXJhdGUoY29uZmlnOiBUaWNrZXRDYXJkSW1hZ2VDb25maWcpOiBQcm9taXNlPEJsb2I+IHtcbiAgICBjb25zdCB3aWR0aCA9IGNvbmZpZy53aWR0aCA/PyBDQU5WQVNfV0lEVEg7XG5cbiAgICBsZXQgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcztcbiAgICBsZXQgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG5cbiAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMod2lkdGgsIENBTlZBU19IRUlHSFQpO1xuICAgICAgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykgYXMgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgIChjYW52YXMgYXMgSFRNTENhbnZhc0VsZW1lbnQpLndpZHRoID0gd2lkdGg7XG4gICAgICAoY2FudmFzIGFzIEhUTUxDYW52YXNFbGVtZW50KS5oZWlnaHQgPSBDQU5WQVNfSEVJR0hUO1xuICAgICAgY3R4ID0gKGNhbnZhcyBhcyBIVE1MQ2FudmFzRWxlbWVudCkuZ2V0Q29udGV4dCgnMmQnKSBhcyBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5kcmF3SGVhZGVyKGN0eCwgY29uZmlnLCB3aWR0aCk7XG4gICAgYXdhaXQgdGhpcy5kcmF3UXJab25lKGN0eCwgY29uZmlnLCB3aWR0aCk7XG4gICAgdGhpcy5kcmF3Rm9vdGVyKGN0eCwgY29uZmlnLCB3aWR0aCk7XG5cbiAgICBpZiAoY2FudmFzIGluc3RhbmNlb2YgT2Zmc2NyZWVuQ2FudmFzKSB7XG4gICAgICByZXR1cm4gY2FudmFzLmNvbnZlcnRUb0Jsb2IoeyB0eXBlOiAnaW1hZ2UvcG5nJyB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8QmxvYj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgKGNhbnZhcyBhcyBIVE1MQ2FudmFzRWxlbWVudCkudG9CbG9iKGJsb2IgPT4ge1xuICAgICAgICBpZiAoYmxvYikge1xuICAgICAgICAgIHJlc29sdmUoYmxvYik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQ2FudmFzIHRvQmxvYiByZXR1cm5lZCBudWxsJykpO1xuICAgICAgICB9XG4gICAgICB9LCAnaW1hZ2UvcG5nJyk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzaGFyZShjb25maWc6IFRpY2tldENhcmRJbWFnZUNvbmZpZywgc2hhcmVUaXRsZT86IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghbmF2aWdhdG9yLnNoYXJlIHx8ICFuYXZpZ2F0b3IuY2FuU2hhcmUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgYmxvYjogQmxvYjtcbiAgICB0cnkge1xuICAgICAgYmxvYiA9IGF3YWl0IHRoaXMuZ2VuZXJhdGUoY29uZmlnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlbmFtZSA9ICdlbnRyYWRhLnBuZyc7XG4gICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFtibG9iXSwgZmlsZW5hbWUsIHsgdHlwZTogJ2ltYWdlL3BuZycgfSk7XG5cbiAgICBpZiAoIW5hdmlnYXRvci5jYW5TaGFyZSh7IGZpbGVzOiBbZmlsZV0gfSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgbmF2aWdhdG9yLnNoYXJlKHtcbiAgICAgICAgdGl0bGU6IHNoYXJlVGl0bGUgPz8gY29uZmlnLmJyYW5kTmFtZSA/PyAnRW50cmFkYScsXG4gICAgICAgIGZpbGVzOiBbZmlsZV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiAmJiBlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRyYXdIZWFkZXIoXG4gICAgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gICAgY29uZmlnOiBUaWNrZXRDYXJkSW1hZ2VDb25maWcsXG4gICAgd2lkdGg6IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb2xvckZyb20gPSBjb25maWcuYnJhbmRDb2xvciA/PyBERUZBVUxUX0JSQU5EX0NPTE9SO1xuICAgIGNvbnN0IGNvbG9yVG8gPVxuICAgICAgY29uZmlnLmJyYW5kQ29sb3JUbyA/PyAoY29uZmlnLmJyYW5kQ29sb3IgPyBjb25maWcuYnJhbmRDb2xvciA6IERFRkFVTFRfQlJBTkRfQ09MT1JfVE8pO1xuXG4gICAgY29uc3QgZ3JhZCA9IGN0eC5jcmVhdGVMaW5lYXJHcmFkaWVudCgwLCAwLCB3aWR0aCwgSEVBREVSX0gpO1xuICAgIGdyYWQuYWRkQ29sb3JTdG9wKDAsIGNvbG9yRnJvbSk7XG4gICAgZ3JhZC5hZGRDb2xvclN0b3AoMSwgY29sb3JUbyk7XG5cbiAgICBjdHguZmlsbFN0eWxlID0gZ3JhZDtcbiAgICBjdHguZmlsbFJlY3QoMCwgMCwgd2lkdGgsIEhFQURFUl9IKTtcblxuICAgIGNvbnN0IGxvZ29IID0gNDQ7XG4gICAgY29uc3QgbG9nb1BhZCA9IDI4O1xuICAgIGxldCB0ZXh0WSA9IEhFQURFUl9IIC8gMjtcblxuICAgIGlmIChjb25maWcubG9nb1VybCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbG9nb0ltZyA9IGF3YWl0IHRoaXMubG9hZEltYWdlKGNvbmZpZy5sb2dvVXJsKTtcbiAgICAgICAgY29uc3QgcmF0aW8gPSBsb2dvSW1nLndpZHRoIC8gbG9nb0ltZy5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IGxvZ29XID0gbG9nb0ggKiByYXRpbztcbiAgICAgICAgY29uc3QgbG9nb1ggPSBsb2dvUGFkO1xuICAgICAgICBjb25zdCBsb2dvWSA9IChIRUFERVJfSCAtIGxvZ29IKSAvIDI7XG4gICAgICAgIGN0eC5kcmF3SW1hZ2UobG9nb0ltZywgbG9nb1gsIGxvZ29ZLCBsb2dvVywgbG9nb0gpO1xuXG4gICAgICAgIGlmIChjb25maWcuYnJhbmROYW1lKSB7XG4gICAgICAgICAgdGV4dFkgPSBsb2dvWSArIGxvZ29IICsgMTQ7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBsb2dvIGZhaWxlZCDigJQgcmVuZGVyIGJyYW5kIG5hbWUgY2VudGVyZWQgYXMgZmFsbGJhY2tcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmJyYW5kTmFtZSkge1xuICAgICAgY3R4LmZpbGxTdHlsZSA9ICcjZmZmZmZmJztcbiAgICAgIGN0eC5mb250ID0gYGJvbGQgMS43NXJlbSAke0ZPTlRfU1RBQ0t9YDtcbiAgICAgIGN0eC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcbiAgICAgIGN0eC5maWxsVGV4dChjb25maWcuYnJhbmROYW1lLCB3aWR0aCAvIDIsIHRleHRZLCB3aWR0aCAtIGxvZ29QYWQgKiAyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRyYXdRclpvbmUoXG4gICAgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gICAgY29uZmlnOiBUaWNrZXRDYXJkSW1hZ2VDb25maWcsXG4gICAgd2lkdGg6IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB6b25lVG9wID0gSEVBREVSX0g7XG5cbiAgICBjdHguZmlsbFN0eWxlID0gJyNmZmZmZmYnO1xuICAgIGN0eC5maWxsUmVjdCgwLCB6b25lVG9wLCB3aWR0aCwgUVJfWk9ORV9IKTtcblxuICAgIGNvbnN0IHFyWCA9ICh3aWR0aCAtIFFSX1NJWkUpIC8gMjtcbiAgICBjb25zdCBxclkgPSB6b25lVG9wICsgKFFSX1pPTkVfSCAtIFFSX1NJWkUgLSAyOCkgLyAyO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHFySW1nID0gYXdhaXQgdGhpcy5sb2FkSW1hZ2UoY29uZmlnLnFyRGF0YVVybCk7XG4gICAgICBjdHguZHJhd0ltYWdlKHFySW1nLCBxclgsIHFyWSwgUVJfU0laRSwgUVJfU0laRSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBjdHguc3Ryb2tlU3R5bGUgPSAnI2UwZTBlMCc7XG4gICAgICBjdHguc3Ryb2tlUmVjdChxclgsIHFyWSwgUVJfU0laRSwgUVJfU0laRSk7XG4gICAgfVxuXG4gICAgY3R4LmZpbGxTdHlsZSA9ICcjMmYyYTM2JztcbiAgICBjdHguZm9udCA9IGAwLjkzNzVyZW0gJHtGT05UX1NUQUNLfWA7XG4gICAgY3R4LnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAndG9wJztcbiAgICBjdHguZmlsbFRleHQoJ0VzY2FuZWEgcGFyYSB2ZXJpZmljYXInLCB3aWR0aCAvIDIsIHFyWSArIFFSX1NJWkUgKyAxMik7XG4gIH1cblxuICBwcml2YXRlIGRyYXdGb290ZXIoXG4gICAgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gICAgY29uZmlnOiBUaWNrZXRDYXJkSW1hZ2VDb25maWcsXG4gICAgd2lkdGg6IG51bWJlclxuICApOiB2b2lkIHtcbiAgICBjb25zdCBmb290ZXJUb3AgPSBIRUFERVJfSCArIFFSX1pPTkVfSDtcblxuICAgIGN0eC5maWxsU3R5bGUgPSAnI2ZmZmZmZic7XG4gICAgY3R4LmZpbGxSZWN0KDAsIGZvb3RlclRvcCwgd2lkdGgsIEZPT1RFUl9IKTtcblxuICAgIGNvbnN0IGNvbG9yRnJvbSA9IGNvbmZpZy5icmFuZENvbG9yID8/IERFRkFVTFRfQlJBTkRfQ09MT1I7XG4gICAgY3R4LmZpbGxTdHlsZSA9IGNvbG9yRnJvbTtcbiAgICBjdHguZmlsbFJlY3QoMCwgZm9vdGVyVG9wLCB3aWR0aCwgMyk7XG5cbiAgICBsZXQgY29udGVudFkgPSBmb290ZXJUb3AgKyA0MDtcblxuICAgIGlmIChjb25maWcuZm9saW8gIT09IHVuZGVmaW5lZCAmJiBjb25maWcuZm9saW8gIT09IG51bGwgJiYgY29uZmlnLmZvbGlvICE9PSAnJykge1xuICAgICAgY29uc3QgbGFiZWwgPSBjb25maWcuZm9saW9MYWJlbCA/PyAnRW50cmFkYSc7XG4gICAgICBjb25zdCBmb2xpb1RleHQgPSBgJHtsYWJlbH0gIyR7Y29uZmlnLmZvbGlvfWA7XG4gICAgICBjdHguZmlsbFN0eWxlID0gJyMxYTBiMmUnO1xuICAgICAgY3R4LmZvbnQgPSBgYm9sZCAzcmVtICR7Rk9OVF9TVEFDS31gO1xuICAgICAgY3R4LnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgICAgY3R4LnRleHRCYXNlbGluZSA9ICd0b3AnO1xuICAgICAgY3R4LmZpbGxUZXh0KGZvbGlvVGV4dCwgd2lkdGggLyAyLCBjb250ZW50WSwgd2lkdGggLSA0MCk7XG4gICAgICBjb250ZW50WSArPSA1NjtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLmJ1eWVyTmFtZSkge1xuICAgICAgY3R4LmZpbGxTdHlsZSA9ICcjMmYyYTM2JztcbiAgICAgIGN0eC5mb250ID0gYDEuMjVyZW0gJHtGT05UX1NUQUNLfWA7XG4gICAgICBjdHgudGV4dEFsaWduID0gJ2NlbnRlcic7XG4gICAgICBjdHgudGV4dEJhc2VsaW5lID0gJ3RvcCc7XG4gICAgICBjdHguZmlsbFRleHQoY29uZmlnLmJ1eWVyTmFtZSwgd2lkdGggLyAyLCBjb250ZW50WSwgd2lkdGggLSA0MCk7XG4gICAgfVxuXG4gICAgY3R4LmZpbGxTdHlsZSA9ICcjNmI2Njc1JztcbiAgICBjdHguZm9udCA9IGAwLjc1cmVtICR7Rk9OVF9TVEFDS31gO1xuICAgIGN0eC50ZXh0QWxpZ24gPSAncmlnaHQnO1xuICAgIGN0eC50ZXh0QmFzZWxpbmUgPSAnYm90dG9tJztcbiAgICBjdHguZmlsbFRleHQoJ1ZhbHRlY2gnLCB3aWR0aCAtIDE2LCBmb290ZXJUb3AgKyBGT09URVJfSCAtIDEyKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEltYWdlKHNyYzogc3RyaW5nKTogUHJvbWlzZTxIVE1MSW1hZ2VFbGVtZW50PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPEhUTUxJbWFnZUVsZW1lbnQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgaW1nLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoaW1nKTtcbiAgICAgIGltZy5vbmVycm9yID0gKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgaW1hZ2U6ICR7c3JjfWApKTtcbiAgICAgIGltZy5zcmMgPSBzcmM7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -2,5 +2,5 @@
2
2
  * Current version of valtech-components.
3
3
  * This is automatically updated during the publish process.
4
4
  */
5
- export const VERSION = '4.0.119';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC4xMTknO1xuIl19
5
+ export const VERSION = '4.0.121';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC4xMjEnO1xuIl19
@@ -56,7 +56,7 @@ import { BrowserMultiFormatReader } from '@zxing/browser';
56
56
  * Current version of valtech-components.
57
57
  * This is automatically updated during the publish process.
58
58
  */
59
- const VERSION = '4.0.119';
59
+ const VERSION = '4.0.121';
60
60
 
61
61
  // Control de estado de refresco (singleton a nivel de módulo)
62
62
  let isRefreshing = false;
@@ -41589,6 +41589,11 @@ class LoginComponent {
41589
41589
  state: this._resetPasswordFormState(),
41590
41590
  });
41591
41591
  });
41592
+ // ==========================================
41593
+ // REGISTER HANDLERS
41594
+ // ==========================================
41595
+ /** Navegación pendiente a la página de login tras cerrar el modal de registro. */
41596
+ this._pendingLoginNav = false;
41592
41597
  }
41593
41598
  /** URL del sitio principal resuelta por ambiente — fallback cuando el consumer no pasa companyLink. */
41594
41599
  get resolvedCompanyLink() {
@@ -41665,14 +41670,34 @@ class LoginComponent {
41665
41670
  },
41666
41671
  });
41667
41672
  }
41668
- // ==========================================
41669
- // REGISTER HANDLERS
41670
- // ==========================================
41671
41673
  openRegisterModal() {
41672
41674
  this.isRegisterModalOpen = true;
41673
41675
  }
41674
41676
  closeRegisterModal() {
41675
41677
  this.isRegisterModalOpen = false;
41678
+ // Navegación diferida: se hace en el cierre del modal (didDismiss llama acá)
41679
+ // para que ion-modal complete su animación antes de enrutar — sin esto el
41680
+ // modal puede quedar visible sobre la página destino.
41681
+ if (this._pendingLoginNav) {
41682
+ this._pendingLoginNav = false;
41683
+ const route = this.props.loginRoute;
41684
+ if (route)
41685
+ this.router.navigate([route]);
41686
+ }
41687
+ }
41688
+ /**
41689
+ * Link "¿Ya tienes cuenta?" del modal de registro. Si `props.loginRoute` está
41690
+ * configurado, cierra el modal y navega a la página de login; si no, solo
41691
+ * cierra el modal (comportamiento por defecto).
41692
+ */
41693
+ onRegisterSwitchToLogin() {
41694
+ if (this.props.loginRoute) {
41695
+ this._pendingLoginNav = true;
41696
+ this.isRegisterModalOpen = false; // dispara (didDismiss) → closeRegisterModal
41697
+ }
41698
+ else {
41699
+ this.closeRegisterModal();
41700
+ }
41676
41701
  }
41677
41702
  registerHandler(event) {
41678
41703
  const name = event.fields['name'];
@@ -42034,7 +42059,7 @@ class LoginComponent {
42034
42059
  this.stopResetResendCooldown();
42035
42060
  }
42036
42061
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LoginComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
42037
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LoginComponent, isStandalone: true, selector: "val-login", inputs: { props: "props" }, outputs: { onSuccess: "onSuccess", onError: "onError", onMFARequired: "onMFARequired" }, ngImport: i0, template: "<div class=\"val-login\" [class.val-login--card]=\"config.showCard\">\n <!-- Logo \u2014 default de marca (--main-logo) si el consumer no pasa logo -->\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n\n <!-- Login Form -->\n <val-form [props]=\"loginFormProps()\" (onSubmit)=\"loginHandler($event)\" />\n\n <!-- OAuth Section -->\n @if (config.showOAuth && config.oauthProviders.length > 0) {\n <div class=\"oauth-separator\">\n <span>{{ t('orContinueWith') }}</span>\n </div>\n\n <div class=\"oauth-buttons\">\n @for (provider of config.oauthProviders; track provider) {\n <ion-button\n expand=\"block\"\n fill=\"outline\"\n color=\"dark\"\n (click)=\"loginWithOAuth(provider)\"\n [disabled]=\"isOAuthLoading\"\n >\n @switch (provider) { @case ('google') {\n <ion-icon slot=\"start\" name=\"logo-google\" aria-hidden=\"true\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithGoogle') }} } @case ('apple') {\n <ion-icon slot=\"start\" name=\"logo-apple\" aria-hidden=\"true\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithApple') }} } @case ('microsoft') {\n <ion-icon slot=\"start\" name=\"logo-microsoft\" aria-hidden=\"true\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithMicrosoft') }} } }\n </ion-button>\n }\n </div>\n }\n\n <!-- Register Link -->\n @if (config.showRegister) {\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('noAccount') }}\n <a (click)=\"openRegisterModal()\">{{ t('register') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Forgot Password Link -->\n @if (config.showForgotPassword) {\n <div class=\"auth-link forgot-password\">\n <ion-text color=\"dark\">\n {{ t('forgotLink') }}\n <a (click)=\"openForgotPasswordModal()\">{{ t('recoverPassword') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Legal Notice -->\n @if (props.legal) {\n <div class=\"legal-notice\">\n <ion-text color=\"dark\">\n <p>\n {{ t('legalPrefix') }} @if (resolvedCompanyLink) {\n <a [href]=\"resolvedCompanyLink\" target=\"_blank\" rel=\"noopener noreferrer\"\n ><strong>{{ props.legal.companyName }}</strong></a\n >\n } @else {\n <strong>{{ props.legal.companyName }}</strong>\n } {{ t('legalSuffix') }} @if (props.legal.termsLink) {\n <a [href]=\"props.legal.termsLink\">{{ t('termsAndConditions') }}</a>\n } @else {\n <span>{{ t('termsAndConditions') }}</span>\n } {{ t('and') }} @if (props.legal.privacyLink) {\n <a [href]=\"props.legal.privacyLink\">{{ t('privacyPolicy') }}</a>\n } @else {\n <span>{{ t('privacyPolicy') }}</span>\n }.\n </p>\n </ion-text>\n </div>\n }\n</div>\n\n<!-- Register Modal -->\n<ion-modal [isOpen]=\"isRegisterModalOpen\" (didDismiss)=\"closeRegisterModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeRegisterModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"registerFormProps()\" (onSubmit)=\"registerHandler($event)\" />\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('hasAccount') }}\n <a (click)=\"closeRegisterModal()\">{{ t('signIn') }}</a>\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Verify Email Modal -->\n<ion-modal [isOpen]=\"isVerifyModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeVerifyModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"verifyFormProps()\" (onSubmit)=\"verifyHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Forgot Password Modal -->\n<ion-modal [isOpen]=\"isForgotPasswordModalOpen\" (didDismiss)=\"closeForgotPasswordModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeForgotPasswordModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"forgotPasswordFormProps()\" (onSubmit)=\"forgotPasswordHandler($event)\" />\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Reset Password Modal -->\n<ion-modal [isOpen]=\"isResetPasswordModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeResetPasswordModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"resetPasswordFormProps()\" (onSubmit)=\"resetPasswordHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resetResendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resetResendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendResetCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- MFA Verify Modal -->\n<ion-modal [isOpen]=\"isMFAVerifyModalOpen\" [backdropDismiss]=\"false\" (didDismiss)=\"onMFAVerifyDismissed()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeMFAVerifyModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"mfaVerifyFormProps()\" (onSubmit)=\"verifyMFAHandler($event)\" />\n @if (mfaMethod() === 'TOTP') {\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n @if (mfaUseBackupCode()) {\n <a (click)=\"toggleMFABackupCode()\">{{ t('mfaUseTotpAction') }}</a>\n } @else { {{ t('mfaUseBackupLink') }}\n <a (click)=\"toggleMFABackupCode()\">{{ t('mfaUseBackupAction') }}</a>\n }\n </ion-text>\n </div>\n }\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('mfaLostBackupLink') }}\n <a (click)=\"openMFAResetModal()\">{{ t('mfaResetAction') }}</a>\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- MFA Reset Modal (B) \u2014 recovery por email cuando no hay backup codes -->\n<ion-modal [isOpen]=\"isMFAResetModalOpen\" [backdropDismiss]=\"false\" (didDismiss)=\"closeMFAResetModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeMFAResetModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n @if (mfaResetStep() === 'request') {\n <val-form [props]=\"mfaResetRequestFormProps()\" (onSubmit)=\"mfaResetRequestHandler($event)\" />\n } @else {\n <val-form [props]=\"mfaResetConfirmFormProps()\" (onSubmit)=\"mfaResetConfirmHandler($event)\" />\n }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".val-login{width:100%}.val-login--card{padding:1rem .75rem;background:var(--ion-color-light);border-radius:16px;box-shadow:0 2px 8px #00000014}.logo-container{max-width:130px;margin-bottom:1.5rem}.auth-link{text-align:center;margin-top:1rem;font-size:.9rem}.auth-link a{color:var(--ion-color-primary);text-decoration:none;font-weight:500;cursor:pointer}.auth-link a:hover{text-decoration:underline}.oauth-separator{display:flex;align-items:center;margin:1.5rem 0}.oauth-separator:before,.oauth-separator:after{content:\"\";flex:1;height:1px;background:var(--ion-color-medium-tint)}.oauth-separator span{padding:0 1rem;color:var(--ion-color-dark);font-size:.85rem}.oauth-buttons{margin-bottom:1rem}.oauth-buttons ion-button{--border-radius: 8px;--border-width: 1px}.oauth-buttons ion-icon{font-size:1.2rem;margin-right:.5rem}.legal-notice{margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--ion-color-medium-tint)}.legal-notice p{font-size:.75rem;line-height:1.5;text-align:center;margin:0}.legal-notice a{color:var(--ion-color-primary);text-decoration:none}.legal-notice a:hover{text-decoration:underline}.resend-link{text-align:center;margin-top:1rem;font-size:.9rem}.resend-link a{color:var(--ion-color-primary);cursor:pointer;font-weight:500}.resend-link a:hover{text-decoration:underline}.resend-link .cooldown{color:var(--ion-color-medium)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonModal, selector: "ion-modal" }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: ImageComponent, selector: "val-image", inputs: ["props"] }] }); }
42062
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LoginComponent, isStandalone: true, selector: "val-login", inputs: { props: "props" }, outputs: { onSuccess: "onSuccess", onError: "onError", onMFARequired: "onMFARequired" }, ngImport: i0, template: "<div class=\"val-login\" [class.val-login--card]=\"config.showCard\">\n <!-- Logo \u2014 default de marca (--main-logo) si el consumer no pasa logo -->\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n\n <!-- Login Form -->\n <val-form [props]=\"loginFormProps()\" (onSubmit)=\"loginHandler($event)\" />\n\n <!-- OAuth Section -->\n @if (config.showOAuth && config.oauthProviders.length > 0) {\n <div class=\"oauth-separator\">\n <span>{{ t('orContinueWith') }}</span>\n </div>\n\n <div class=\"oauth-buttons\">\n @for (provider of config.oauthProviders; track provider) {\n <ion-button\n expand=\"block\"\n fill=\"outline\"\n color=\"dark\"\n (click)=\"loginWithOAuth(provider)\"\n [disabled]=\"isOAuthLoading\"\n >\n @switch (provider) { @case ('google') {\n <ion-icon slot=\"start\" name=\"logo-google\" aria-hidden=\"true\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithGoogle') }} } @case ('apple') {\n <ion-icon slot=\"start\" name=\"logo-apple\" aria-hidden=\"true\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithApple') }} } @case ('microsoft') {\n <ion-icon slot=\"start\" name=\"logo-microsoft\" aria-hidden=\"true\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithMicrosoft') }} } }\n </ion-button>\n }\n </div>\n }\n\n <!-- Register Link -->\n @if (config.showRegister) {\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('noAccount') }}\n <a (click)=\"openRegisterModal()\">{{ t('register') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Forgot Password Link -->\n @if (config.showForgotPassword) {\n <div class=\"auth-link forgot-password\">\n <ion-text color=\"dark\">\n {{ t('forgotLink') }}\n <a (click)=\"openForgotPasswordModal()\">{{ t('recoverPassword') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Legal Notice -->\n @if (props.legal) {\n <div class=\"legal-notice\">\n <ion-text color=\"dark\">\n <p>\n {{ t('legalPrefix') }} @if (resolvedCompanyLink) {\n <a [href]=\"resolvedCompanyLink\" target=\"_blank\" rel=\"noopener noreferrer\"\n ><strong>{{ props.legal.companyName }}</strong></a\n >\n } @else {\n <strong>{{ props.legal.companyName }}</strong>\n } {{ t('legalSuffix') }} @if (props.legal.termsLink) {\n <a [href]=\"props.legal.termsLink\">{{ t('termsAndConditions') }}</a>\n } @else {\n <span>{{ t('termsAndConditions') }}</span>\n } {{ t('and') }} @if (props.legal.privacyLink) {\n <a [href]=\"props.legal.privacyLink\">{{ t('privacyPolicy') }}</a>\n } @else {\n <span>{{ t('privacyPolicy') }}</span>\n }.\n </p>\n </ion-text>\n </div>\n }\n</div>\n\n<!-- Register Modal -->\n<ion-modal [isOpen]=\"isRegisterModalOpen\" (didDismiss)=\"closeRegisterModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeRegisterModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"registerFormProps()\" (onSubmit)=\"registerHandler($event)\" />\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('hasAccount') }}\n <a (click)=\"onRegisterSwitchToLogin()\">{{ t('signIn') }}</a>\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Verify Email Modal -->\n<ion-modal [isOpen]=\"isVerifyModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeVerifyModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"verifyFormProps()\" (onSubmit)=\"verifyHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Forgot Password Modal -->\n<ion-modal [isOpen]=\"isForgotPasswordModalOpen\" (didDismiss)=\"closeForgotPasswordModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeForgotPasswordModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"forgotPasswordFormProps()\" (onSubmit)=\"forgotPasswordHandler($event)\" />\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Reset Password Modal -->\n<ion-modal [isOpen]=\"isResetPasswordModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeResetPasswordModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"resetPasswordFormProps()\" (onSubmit)=\"resetPasswordHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resetResendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resetResendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendResetCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- MFA Verify Modal -->\n<ion-modal [isOpen]=\"isMFAVerifyModalOpen\" [backdropDismiss]=\"false\" (didDismiss)=\"onMFAVerifyDismissed()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeMFAVerifyModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"mfaVerifyFormProps()\" (onSubmit)=\"verifyMFAHandler($event)\" />\n @if (mfaMethod() === 'TOTP') {\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n @if (mfaUseBackupCode()) {\n <a (click)=\"toggleMFABackupCode()\">{{ t('mfaUseTotpAction') }}</a>\n } @else { {{ t('mfaUseBackupLink') }}\n <a (click)=\"toggleMFABackupCode()\">{{ t('mfaUseBackupAction') }}</a>\n }\n </ion-text>\n </div>\n }\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('mfaLostBackupLink') }}\n <a (click)=\"openMFAResetModal()\">{{ t('mfaResetAction') }}</a>\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- MFA Reset Modal (B) \u2014 recovery por email cuando no hay backup codes -->\n<ion-modal [isOpen]=\"isMFAResetModalOpen\" [backdropDismiss]=\"false\" (didDismiss)=\"closeMFAResetModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeMFAResetModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n @if (mfaResetStep() === 'request') {\n <val-form [props]=\"mfaResetRequestFormProps()\" (onSubmit)=\"mfaResetRequestHandler($event)\" />\n } @else {\n <val-form [props]=\"mfaResetConfirmFormProps()\" (onSubmit)=\"mfaResetConfirmHandler($event)\" />\n }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".val-login{width:100%}.val-login--card{padding:1rem .75rem;background:var(--ion-color-light);border-radius:16px;box-shadow:0 2px 8px #00000014}.logo-container{max-width:130px;margin-bottom:1.5rem}.auth-link{text-align:center;margin-top:1rem;font-size:.9rem}.auth-link a{color:var(--ion-color-primary);text-decoration:none;font-weight:500;cursor:pointer}.auth-link a:hover{text-decoration:underline}.oauth-separator{display:flex;align-items:center;margin:1.5rem 0}.oauth-separator:before,.oauth-separator:after{content:\"\";flex:1;height:1px;background:var(--ion-color-medium-tint)}.oauth-separator span{padding:0 1rem;color:var(--ion-color-dark);font-size:.85rem}.oauth-buttons{margin-bottom:1rem}.oauth-buttons ion-button{--border-radius: 8px;--border-width: 1px}.oauth-buttons ion-icon{font-size:1.2rem;margin-right:.5rem}.legal-notice{margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--ion-color-medium-tint)}.legal-notice p{font-size:.75rem;line-height:1.5;text-align:center;margin:0}.legal-notice a{color:var(--ion-color-primary);text-decoration:none}.legal-notice a:hover{text-decoration:underline}.resend-link{text-align:center;margin-top:1rem;font-size:.9rem}.resend-link a{color:var(--ion-color-primary);cursor:pointer;font-weight:500}.resend-link a:hover{text-decoration:underline}.resend-link .cooldown{color:var(--ion-color-medium)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonModal, selector: "ion-modal" }, { kind: "component", type: IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: ImageComponent, selector: "val-image", inputs: ["props"] }] }); }
42038
42063
  }
42039
42064
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LoginComponent, decorators: [{
42040
42065
  type: Component,
@@ -42050,7 +42075,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
42050
42075
  IonToolbar,
42051
42076
  FormComponent,
42052
42077
  ImageComponent,
42053
- ], template: "<div class=\"val-login\" [class.val-login--card]=\"config.showCard\">\n <!-- Logo \u2014 default de marca (--main-logo) si el consumer no pasa logo -->\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n\n <!-- Login Form -->\n <val-form [props]=\"loginFormProps()\" (onSubmit)=\"loginHandler($event)\" />\n\n <!-- OAuth Section -->\n @if (config.showOAuth && config.oauthProviders.length > 0) {\n <div class=\"oauth-separator\">\n <span>{{ t('orContinueWith') }}</span>\n </div>\n\n <div class=\"oauth-buttons\">\n @for (provider of config.oauthProviders; track provider) {\n <ion-button\n expand=\"block\"\n fill=\"outline\"\n color=\"dark\"\n (click)=\"loginWithOAuth(provider)\"\n [disabled]=\"isOAuthLoading\"\n >\n @switch (provider) { @case ('google') {\n <ion-icon slot=\"start\" name=\"logo-google\" aria-hidden=\"true\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithGoogle') }} } @case ('apple') {\n <ion-icon slot=\"start\" name=\"logo-apple\" aria-hidden=\"true\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithApple') }} } @case ('microsoft') {\n <ion-icon slot=\"start\" name=\"logo-microsoft\" aria-hidden=\"true\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithMicrosoft') }} } }\n </ion-button>\n }\n </div>\n }\n\n <!-- Register Link -->\n @if (config.showRegister) {\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('noAccount') }}\n <a (click)=\"openRegisterModal()\">{{ t('register') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Forgot Password Link -->\n @if (config.showForgotPassword) {\n <div class=\"auth-link forgot-password\">\n <ion-text color=\"dark\">\n {{ t('forgotLink') }}\n <a (click)=\"openForgotPasswordModal()\">{{ t('recoverPassword') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Legal Notice -->\n @if (props.legal) {\n <div class=\"legal-notice\">\n <ion-text color=\"dark\">\n <p>\n {{ t('legalPrefix') }} @if (resolvedCompanyLink) {\n <a [href]=\"resolvedCompanyLink\" target=\"_blank\" rel=\"noopener noreferrer\"\n ><strong>{{ props.legal.companyName }}</strong></a\n >\n } @else {\n <strong>{{ props.legal.companyName }}</strong>\n } {{ t('legalSuffix') }} @if (props.legal.termsLink) {\n <a [href]=\"props.legal.termsLink\">{{ t('termsAndConditions') }}</a>\n } @else {\n <span>{{ t('termsAndConditions') }}</span>\n } {{ t('and') }} @if (props.legal.privacyLink) {\n <a [href]=\"props.legal.privacyLink\">{{ t('privacyPolicy') }}</a>\n } @else {\n <span>{{ t('privacyPolicy') }}</span>\n }.\n </p>\n </ion-text>\n </div>\n }\n</div>\n\n<!-- Register Modal -->\n<ion-modal [isOpen]=\"isRegisterModalOpen\" (didDismiss)=\"closeRegisterModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeRegisterModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"registerFormProps()\" (onSubmit)=\"registerHandler($event)\" />\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('hasAccount') }}\n <a (click)=\"closeRegisterModal()\">{{ t('signIn') }}</a>\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Verify Email Modal -->\n<ion-modal [isOpen]=\"isVerifyModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeVerifyModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"verifyFormProps()\" (onSubmit)=\"verifyHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Forgot Password Modal -->\n<ion-modal [isOpen]=\"isForgotPasswordModalOpen\" (didDismiss)=\"closeForgotPasswordModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeForgotPasswordModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"forgotPasswordFormProps()\" (onSubmit)=\"forgotPasswordHandler($event)\" />\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Reset Password Modal -->\n<ion-modal [isOpen]=\"isResetPasswordModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeResetPasswordModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"resetPasswordFormProps()\" (onSubmit)=\"resetPasswordHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resetResendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resetResendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendResetCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- MFA Verify Modal -->\n<ion-modal [isOpen]=\"isMFAVerifyModalOpen\" [backdropDismiss]=\"false\" (didDismiss)=\"onMFAVerifyDismissed()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeMFAVerifyModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"mfaVerifyFormProps()\" (onSubmit)=\"verifyMFAHandler($event)\" />\n @if (mfaMethod() === 'TOTP') {\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n @if (mfaUseBackupCode()) {\n <a (click)=\"toggleMFABackupCode()\">{{ t('mfaUseTotpAction') }}</a>\n } @else { {{ t('mfaUseBackupLink') }}\n <a (click)=\"toggleMFABackupCode()\">{{ t('mfaUseBackupAction') }}</a>\n }\n </ion-text>\n </div>\n }\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('mfaLostBackupLink') }}\n <a (click)=\"openMFAResetModal()\">{{ t('mfaResetAction') }}</a>\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- MFA Reset Modal (B) \u2014 recovery por email cuando no hay backup codes -->\n<ion-modal [isOpen]=\"isMFAResetModalOpen\" [backdropDismiss]=\"false\" (didDismiss)=\"closeMFAResetModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeMFAResetModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n @if (mfaResetStep() === 'request') {\n <val-form [props]=\"mfaResetRequestFormProps()\" (onSubmit)=\"mfaResetRequestHandler($event)\" />\n } @else {\n <val-form [props]=\"mfaResetConfirmFormProps()\" (onSubmit)=\"mfaResetConfirmHandler($event)\" />\n }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".val-login{width:100%}.val-login--card{padding:1rem .75rem;background:var(--ion-color-light);border-radius:16px;box-shadow:0 2px 8px #00000014}.logo-container{max-width:130px;margin-bottom:1.5rem}.auth-link{text-align:center;margin-top:1rem;font-size:.9rem}.auth-link a{color:var(--ion-color-primary);text-decoration:none;font-weight:500;cursor:pointer}.auth-link a:hover{text-decoration:underline}.oauth-separator{display:flex;align-items:center;margin:1.5rem 0}.oauth-separator:before,.oauth-separator:after{content:\"\";flex:1;height:1px;background:var(--ion-color-medium-tint)}.oauth-separator span{padding:0 1rem;color:var(--ion-color-dark);font-size:.85rem}.oauth-buttons{margin-bottom:1rem}.oauth-buttons ion-button{--border-radius: 8px;--border-width: 1px}.oauth-buttons ion-icon{font-size:1.2rem;margin-right:.5rem}.legal-notice{margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--ion-color-medium-tint)}.legal-notice p{font-size:.75rem;line-height:1.5;text-align:center;margin:0}.legal-notice a{color:var(--ion-color-primary);text-decoration:none}.legal-notice a:hover{text-decoration:underline}.resend-link{text-align:center;margin-top:1rem;font-size:.9rem}.resend-link a{color:var(--ion-color-primary);cursor:pointer;font-weight:500}.resend-link a:hover{text-decoration:underline}.resend-link .cooldown{color:var(--ion-color-medium)}\n"] }]
42078
+ ], template: "<div class=\"val-login\" [class.val-login--card]=\"config.showCard\">\n <!-- Logo \u2014 default de marca (--main-logo) si el consumer no pasa logo -->\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n\n <!-- Login Form -->\n <val-form [props]=\"loginFormProps()\" (onSubmit)=\"loginHandler($event)\" />\n\n <!-- OAuth Section -->\n @if (config.showOAuth && config.oauthProviders.length > 0) {\n <div class=\"oauth-separator\">\n <span>{{ t('orContinueWith') }}</span>\n </div>\n\n <div class=\"oauth-buttons\">\n @for (provider of config.oauthProviders; track provider) {\n <ion-button\n expand=\"block\"\n fill=\"outline\"\n color=\"dark\"\n (click)=\"loginWithOAuth(provider)\"\n [disabled]=\"isOAuthLoading\"\n >\n @switch (provider) { @case ('google') {\n <ion-icon slot=\"start\" name=\"logo-google\" aria-hidden=\"true\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithGoogle') }} } @case ('apple') {\n <ion-icon slot=\"start\" name=\"logo-apple\" aria-hidden=\"true\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithApple') }} } @case ('microsoft') {\n <ion-icon slot=\"start\" name=\"logo-microsoft\" aria-hidden=\"true\"></ion-icon>\n {{ isOAuthLoading ? t('connecting') : t('continueWithMicrosoft') }} } }\n </ion-button>\n }\n </div>\n }\n\n <!-- Register Link -->\n @if (config.showRegister) {\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('noAccount') }}\n <a (click)=\"openRegisterModal()\">{{ t('register') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Forgot Password Link -->\n @if (config.showForgotPassword) {\n <div class=\"auth-link forgot-password\">\n <ion-text color=\"dark\">\n {{ t('forgotLink') }}\n <a (click)=\"openForgotPasswordModal()\">{{ t('recoverPassword') }}</a>\n </ion-text>\n </div>\n }\n\n <!-- Legal Notice -->\n @if (props.legal) {\n <div class=\"legal-notice\">\n <ion-text color=\"dark\">\n <p>\n {{ t('legalPrefix') }} @if (resolvedCompanyLink) {\n <a [href]=\"resolvedCompanyLink\" target=\"_blank\" rel=\"noopener noreferrer\"\n ><strong>{{ props.legal.companyName }}</strong></a\n >\n } @else {\n <strong>{{ props.legal.companyName }}</strong>\n } {{ t('legalSuffix') }} @if (props.legal.termsLink) {\n <a [href]=\"props.legal.termsLink\">{{ t('termsAndConditions') }}</a>\n } @else {\n <span>{{ t('termsAndConditions') }}</span>\n } {{ t('and') }} @if (props.legal.privacyLink) {\n <a [href]=\"props.legal.privacyLink\">{{ t('privacyPolicy') }}</a>\n } @else {\n <span>{{ t('privacyPolicy') }}</span>\n }.\n </p>\n </ion-text>\n </div>\n }\n</div>\n\n<!-- Register Modal -->\n<ion-modal [isOpen]=\"isRegisterModalOpen\" (didDismiss)=\"closeRegisterModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeRegisterModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"registerFormProps()\" (onSubmit)=\"registerHandler($event)\" />\n <div class=\"auth-link\">\n <ion-text color=\"dark\">\n {{ t('hasAccount') }}\n <a (click)=\"onRegisterSwitchToLogin()\">{{ t('signIn') }}</a>\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Verify Email Modal -->\n<ion-modal [isOpen]=\"isVerifyModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeVerifyModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"verifyFormProps()\" (onSubmit)=\"verifyHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Forgot Password Modal -->\n<ion-modal [isOpen]=\"isForgotPasswordModalOpen\" (didDismiss)=\"closeForgotPasswordModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeForgotPasswordModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"forgotPasswordFormProps()\" (onSubmit)=\"forgotPasswordHandler($event)\" />\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- Reset Password Modal -->\n<ion-modal [isOpen]=\"isResetPasswordModalOpen\" [backdropDismiss]=\"false\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeResetPasswordModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"resetPasswordFormProps()\" (onSubmit)=\"resetPasswordHandler($event)\" />\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('noCodeReceived') }} @if (resetResendCooldown > 0) {\n <span class=\"cooldown\">{{ t('resendIn', { seconds: resetResendCooldown.toString() }) }}</span>\n } @else {\n <a (click)=\"resendResetCode()\">{{ t('resend') }}</a>\n }\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- MFA Verify Modal -->\n<ion-modal [isOpen]=\"isMFAVerifyModalOpen\" [backdropDismiss]=\"false\" (didDismiss)=\"onMFAVerifyDismissed()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeMFAVerifyModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n <val-form [props]=\"mfaVerifyFormProps()\" (onSubmit)=\"verifyMFAHandler($event)\" />\n @if (mfaMethod() === 'TOTP') {\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n @if (mfaUseBackupCode()) {\n <a (click)=\"toggleMFABackupCode()\">{{ t('mfaUseTotpAction') }}</a>\n } @else { {{ t('mfaUseBackupLink') }}\n <a (click)=\"toggleMFABackupCode()\">{{ t('mfaUseBackupAction') }}</a>\n }\n </ion-text>\n </div>\n }\n <div class=\"resend-link\">\n <ion-text color=\"dark\">\n {{ t('mfaLostBackupLink') }}\n <a (click)=\"openMFAResetModal()\">{{ t('mfaResetAction') }}</a>\n </ion-text>\n </div>\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n\n<!-- MFA Reset Modal (B) \u2014 recovery por email cuando no hay backup codes -->\n<ion-modal [isOpen]=\"isMFAResetModalOpen\" [backdropDismiss]=\"false\" (didDismiss)=\"closeMFAResetModal()\">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"end\">\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"closeMFAResetModal()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content class=\"ion-padding\">\n <section class=\"modal-form-section\">\n <div class=\"logo-container\">\n <val-image [props]=\"resolvedLogo\" />\n </div>\n @if (mfaResetStep() === 'request') {\n <val-form [props]=\"mfaResetRequestFormProps()\" (onSubmit)=\"mfaResetRequestHandler($event)\" />\n } @else {\n <val-form [props]=\"mfaResetConfirmFormProps()\" (onSubmit)=\"mfaResetConfirmHandler($event)\" />\n }\n </section>\n </ion-content>\n </ng-template>\n</ion-modal>\n", styles: [".val-login{width:100%}.val-login--card{padding:1rem .75rem;background:var(--ion-color-light);border-radius:16px;box-shadow:0 2px 8px #00000014}.logo-container{max-width:130px;margin-bottom:1.5rem}.auth-link{text-align:center;margin-top:1rem;font-size:.9rem}.auth-link a{color:var(--ion-color-primary);text-decoration:none;font-weight:500;cursor:pointer}.auth-link a:hover{text-decoration:underline}.oauth-separator{display:flex;align-items:center;margin:1.5rem 0}.oauth-separator:before,.oauth-separator:after{content:\"\";flex:1;height:1px;background:var(--ion-color-medium-tint)}.oauth-separator span{padding:0 1rem;color:var(--ion-color-dark);font-size:.85rem}.oauth-buttons{margin-bottom:1rem}.oauth-buttons ion-button{--border-radius: 8px;--border-width: 1px}.oauth-buttons ion-icon{font-size:1.2rem;margin-right:.5rem}.legal-notice{margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--ion-color-medium-tint)}.legal-notice p{font-size:.75rem;line-height:1.5;text-align:center;margin:0}.legal-notice a{color:var(--ion-color-primary);text-decoration:none}.legal-notice a:hover{text-decoration:underline}.resend-link{text-align:center;margin-top:1rem;font-size:.9rem}.resend-link a{color:var(--ion-color-primary);cursor:pointer;font-weight:500}.resend-link a:hover{text-decoration:underline}.resend-link .cooldown{color:var(--ion-color-medium)}\n"] }]
42054
42079
  }], propDecorators: { props: [{
42055
42080
  type: Input
42056
42081
  }], onSuccess: [{
@@ -60205,7 +60230,7 @@ class TicketCardImageService {
60205
60230
  }
60206
60231
  if (config.brandName) {
60207
60232
  ctx.fillStyle = '#ffffff';
60208
- ctx.font = `bold 1.125rem ${FONT_STACK}`;
60233
+ ctx.font = `bold 1.75rem ${FONT_STACK}`;
60209
60234
  ctx.textAlign = 'center';
60210
60235
  ctx.textBaseline = 'middle';
60211
60236
  ctx.fillText(config.brandName, width / 2, textY, width - logoPad * 2);
@@ -60225,11 +60250,11 @@ class TicketCardImageService {
60225
60250
  ctx.strokeStyle = '#e0e0e0';
60226
60251
  ctx.strokeRect(qrX, qrY, QR_SIZE, QR_SIZE);
60227
60252
  }
60228
- ctx.fillStyle = '#92949c';
60229
- ctx.font = `0.75rem ${FONT_STACK}`;
60253
+ ctx.fillStyle = '#2f2a36';
60254
+ ctx.font = `0.9375rem ${FONT_STACK}`;
60230
60255
  ctx.textAlign = 'center';
60231
60256
  ctx.textBaseline = 'top';
60232
- ctx.fillText('Escanea para verificar', width / 2, qrY + QR_SIZE + 10);
60257
+ ctx.fillText('Escanea para verificar', width / 2, qrY + QR_SIZE + 12);
60233
60258
  }
60234
60259
  drawFooter(ctx, config, width) {
60235
60260
  const footerTop = HEADER_H + QR_ZONE_H;
@@ -60243,21 +60268,21 @@ class TicketCardImageService {
60243
60268
  const label = config.folioLabel ?? 'Entrada';
60244
60269
  const folioText = `${label} #${config.folio}`;
60245
60270
  ctx.fillStyle = '#1a0b2e';
60246
- ctx.font = `bold 2.5rem ${FONT_STACK}`;
60271
+ ctx.font = `bold 3rem ${FONT_STACK}`;
60247
60272
  ctx.textAlign = 'center';
60248
60273
  ctx.textBaseline = 'top';
60249
60274
  ctx.fillText(folioText, width / 2, contentY, width - 40);
60250
60275
  contentY += 56;
60251
60276
  }
60252
60277
  if (config.buyerName) {
60253
- ctx.fillStyle = '#6b6675';
60254
- ctx.font = `1.125rem ${FONT_STACK}`;
60278
+ ctx.fillStyle = '#2f2a36';
60279
+ ctx.font = `1.25rem ${FONT_STACK}`;
60255
60280
  ctx.textAlign = 'center';
60256
60281
  ctx.textBaseline = 'top';
60257
60282
  ctx.fillText(config.buyerName, width / 2, contentY, width - 40);
60258
60283
  }
60259
- ctx.fillStyle = '#c0c0c0';
60260
- ctx.font = `0.625rem ${FONT_STACK}`;
60284
+ ctx.fillStyle = '#6b6675';
60285
+ ctx.font = `0.75rem ${FONT_STACK}`;
60261
60286
  ctx.textAlign = 'right';
60262
60287
  ctx.textBaseline = 'bottom';
60263
60288
  ctx.fillText('Valtech', width - 16, footerTop + FOOTER_H - 12);