@solar-angular/platform-browser 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # platform-browser
2
+
3
+ This library was generated with [Nx](https://nx.dev).
4
+
5
+ ## Running unit tests
6
+
7
+ Run `nx test platform-browser` to execute the unit tests.
@@ -0,0 +1,45 @@
1
+ import { DOCUMENT } from '@angular/common';
2
+ import { inject, Injectable } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ export class FileManager {
5
+ constructor() {
6
+ this.document = inject(DOCUMENT);
7
+ }
8
+ /**
9
+ * Opens a file selection dialog.
10
+ * @param options - Options for the file selection.
11
+ * @returns A promise that resolves to an array of selected files.
12
+ * @see https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
13
+ */
14
+ pick(options) {
15
+ const input = this.document.createElement('input');
16
+ input.type = 'file';
17
+ input.accept = options.accept || '';
18
+ input.multiple = !!options.multiple;
19
+ return new Promise((resolve, reject) => {
20
+ input.onchange = () => {
21
+ resolve(Array.from(input.files || []));
22
+ };
23
+ input.onerror = reject;
24
+ input.click();
25
+ });
26
+ }
27
+ async download(url, filename) {
28
+ const response = await fetch(url);
29
+ const blob = await response.blob();
30
+ const anchor = this.document.createElement('a');
31
+ anchor.href = URL.createObjectURL(blob);
32
+ anchor.download = filename ?? new URL(url).pathname.split('/').pop();
33
+ anchor.click();
34
+ return blob;
35
+ }
36
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FileManager, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
37
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FileManager, providedIn: 'root' }); }
38
+ }
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FileManager, decorators: [{
40
+ type: Injectable,
41
+ args: [{
42
+ providedIn: 'root'
43
+ }]
44
+ }] });
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9zcmMvZmlsZS1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFLbkQsTUFBTSxPQUFPLFdBQVc7SUFIeEI7UUFJbUIsYUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztLQWlDOUM7SUEvQkM7Ozs7O09BS0c7SUFDSCxJQUFJLENBQUMsT0FBZ0Q7UUFDbkQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkQsS0FBSyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7UUFDcEIsS0FBSyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUNwQyxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1FBRXBDLE9BQU8sSUFBSSxPQUFPLENBQVMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDN0MsS0FBSyxDQUFDLFFBQVEsR0FBRyxHQUFHLEVBQUU7Z0JBQ3BCLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN6QyxDQUFDLENBQUM7WUFDRixLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztZQUN2QixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFXLEVBQUUsUUFBaUI7UUFDM0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFaEQsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFHLENBQUM7UUFDdEUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOytHQWpDVSxXQUFXO21IQUFYLFdBQVcsY0FGVixNQUFNOzs0RkFFUCxXQUFXO2tCQUh2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBGaWxlTWFuYWdlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuXG4gIC8qKlxuICAgKiBPcGVucyBhIGZpbGUgc2VsZWN0aW9uIGRpYWxvZy5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgZmlsZSBzZWxlY3Rpb24uXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIHNlbGVjdGVkIGZpbGVzLlxuICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL3poLUNOL2RvY3MvV2ViL0hUVFAvQmFzaWNzX29mX0hUVFAvTUlNRV90eXBlcy9Db21tb25fdHlwZXNcbiAgICovXG4gIHBpY2sob3B0aW9uczogeyBhY2NlcHQ/OiBzdHJpbmc7IG11bHRpcGxlPzogYm9vbGVhbiB9KSB7XG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgaW5wdXQudHlwZSA9ICdmaWxlJztcbiAgICBpbnB1dC5hY2NlcHQgPSBvcHRpb25zLmFjY2VwdCB8fCAnJztcbiAgICBpbnB1dC5tdWx0aXBsZSA9ICEhb3B0aW9ucy5tdWx0aXBsZTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxGaWxlW10+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlucHV0Lm9uY2hhbmdlID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKEFycmF5LmZyb20oaW5wdXQuZmlsZXMgfHwgW10pKTtcbiAgICAgIH07XG4gICAgICBpbnB1dC5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgaW5wdXQuY2xpY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRvd25sb2FkKHVybDogc3RyaW5nLCBmaWxlbmFtZT86IHN0cmluZykge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICBjb25zdCBibG9iID0gYXdhaXQgcmVzcG9uc2UuYmxvYigpO1xuICAgIGNvbnN0IGFuY2hvciA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXG4gICAgYW5jaG9yLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIGFuY2hvci5kb3dubG9hZCA9IGZpbGVuYW1lID8/IG5ldyBVUkwodXJsKS5wYXRobmFtZS5zcGxpdCgnLycpLnBvcCgpITtcbiAgICBhbmNob3IuY2xpY2soKTtcbiAgICByZXR1cm4gYmxvYjtcbiAgfVxufVxuIl19
@@ -0,0 +1,35 @@
1
+ import { DOCUMENT } from '@angular/common';
2
+ import { inject, Injectable } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ export class FullscreenService {
5
+ constructor() {
6
+ this.document = inject(DOCUMENT);
7
+ }
8
+ /**
9
+ * 切换全屏
10
+ * @param target
11
+ * @param options
12
+ */
13
+ toggle(target = this.document.documentElement, options) {
14
+ if (this.isFullscreen(target)) {
15
+ return this.document.exitFullscreen();
16
+ }
17
+ return target.requestFullscreen(options);
18
+ }
19
+ /**
20
+ * 元素是否为全屏
21
+ * @param target
22
+ */
23
+ isFullscreen(target = this.document.documentElement) {
24
+ return target === this.document.fullscreenElement;
25
+ }
26
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FullscreenService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
27
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FullscreenService, providedIn: 'root' }); }
28
+ }
29
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FullscreenService, decorators: [{
30
+ type: Injectable,
31
+ args: [{
32
+ providedIn: 'root'
33
+ }]
34
+ }] });
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVsbHNjcmVlbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9zcmMvZnVsbHNjcmVlbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFLbkQsTUFBTSxPQUFPLGlCQUFpQjtJQUg5QjtRQUltQixhQUFRLEdBQWEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBc0J4RDtJQXBCQzs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLFNBQXNCLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLE9BQTJCO1FBQ3JGLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzlCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4QyxDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVksQ0FBQyxTQUFzQixJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWU7UUFDOUQsT0FBTyxNQUFNLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztJQUNwRCxDQUFDOytHQXRCVSxpQkFBaUI7bUhBQWpCLGlCQUFpQixjQUZoQixNQUFNOzs0RkFFUCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEZ1bGxzY3JlZW5TZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudDogRG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuXG4gIC8qKlxuICAgKiDliIfmjaLlhajlsY9cbiAgICogQHBhcmFtIHRhcmdldFxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgdG9nZ2xlKHRhcmdldDogSFRNTEVsZW1lbnQgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgb3B0aW9ucz86IEZ1bGxzY3JlZW5PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNGdWxsc2NyZWVuKHRhcmdldCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldC5yZXF1ZXN0RnVsbHNjcmVlbihvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDlhYPntKDmmK/lkKbkuLrlhajlsY9cbiAgICogQHBhcmFtIHRhcmdldFxuICAgKi9cbiAgaXNGdWxsc2NyZWVuKHRhcmdldDogSFRNTEVsZW1lbnQgPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0YXJnZXQgPT09IHRoaXMuZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQ7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,169 @@
1
+ import { DOCUMENT } from '@angular/common';
2
+ import { Injectable, InjectionToken, inject } from '@angular/core';
3
+ import { Observable, from } from 'rxjs';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * 目前 NG 库 中还不能包含 WebWorker,这里使用 DI 的方式,由 App 提供 WebWorker:
7
+ * ```ts
8
+ * {
9
+ * provide: IMAGE_COMPRESSOR_WEBWORKER_FACTORY,
10
+ * useValue: () => new Worker(new URL('xxx.worker', import.meta.url), { type: 'module' })
11
+ * }
12
+ * ```
13
+ * https://github.com/angular/angular-cli/issues/15059
14
+ */
15
+ export const SUN_IMAGE_COMPRESSOR_WORKER_FACTORY = new InjectionToken('ImageCompressorWorkerFactory');
16
+ export class ImageCompressor {
17
+ constructor() {
18
+ this.document = inject(DOCUMENT);
19
+ this.workerFactory = inject(SUN_IMAGE_COMPRESSOR_WORKER_FACTORY, { optional: true });
20
+ this.canvas = this.document.createElement('canvas');
21
+ }
22
+ /** 最佳图片格式,优先级:webp -> jpeg -> png */
23
+ get format() {
24
+ return this._format || (this._format = this.isSupportWEBP ? 'webp' : this.isSupportJPEG ? 'jpeg' : 'png');
25
+ }
26
+ /**
27
+ * 是否支持WebP格式
28
+ */
29
+ get isSupportWEBP() {
30
+ try {
31
+ return this.canvas.toDataURL('image/webp').startsWith('data:image/webp');
32
+ }
33
+ catch (e) {
34
+ return false;
35
+ }
36
+ }
37
+ /**
38
+ * 是否支持JPEG格式
39
+ */
40
+ get isSupportJPEG() {
41
+ try {
42
+ return this.canvas.toDataURL('image/jpeg').startsWith('data:image/jpeg');
43
+ }
44
+ catch (e) {
45
+ return false;
46
+ }
47
+ }
48
+ /**
49
+ * 压缩图片
50
+ * @param src 图片URL
51
+ * @param quality 质量
52
+ */
53
+ compress(src, quality = 0.85) {
54
+ const format = this.format;
55
+ const img = new Image();
56
+ img.crossOrigin = 'anonymous';
57
+ return new Observable((observer) => {
58
+ img.onload = () => {
59
+ this.resize(img);
60
+ (('OffscreenCanvas' in window && this.workerFactory) ? this.drawInWorker(img, quality, format) : this.draw(img, quality, format)).subscribe(blob => {
61
+ observer.next(blob);
62
+ observer.complete();
63
+ });
64
+ };
65
+ img.onerror = (error) => {
66
+ observer.error(error);
67
+ observer.complete();
68
+ };
69
+ img.src = src;
70
+ });
71
+ }
72
+ /**
73
+ * 调整图像尺寸
74
+ * @param img
75
+ */
76
+ resize(img) {
77
+ const maxWidth = 1280;
78
+ const maxHeight = 720;
79
+ if (img.width > maxWidth) {
80
+ const divisor = img.width / maxWidth;
81
+ img.width /= divisor;
82
+ img.height /= divisor;
83
+ }
84
+ if (img.height > maxHeight) {
85
+ const divisor = img.height / maxHeight;
86
+ img.width /= divisor;
87
+ img.height /= divisor;
88
+ }
89
+ }
90
+ /**
91
+ * 在主线程中绘制
92
+ * @param img 图像
93
+ * @param quality 质量
94
+ * @param format 格式
95
+ */
96
+ draw(img, quality, format) {
97
+ return new Observable(observer => {
98
+ const canvas = document.createElement('canvas');
99
+ canvas.width = img.width;
100
+ canvas.height = img.height;
101
+ const ctx = canvas.getContext('2d');
102
+ ctx.drawImage(img, 0, 0, img.width, img.height);
103
+ canvas.toBlob(blob => {
104
+ observer.next(blob);
105
+ observer.complete();
106
+ }, 'image/' + format, quality);
107
+ });
108
+ }
109
+ /**
110
+ * 在WebWorker线程中绘制
111
+ * @param img 图像
112
+ * @param quality 质量
113
+ * @param format 格式
114
+ */
115
+ drawInWorker(img, quality, format) {
116
+ const worker = this.workerFactory();
117
+ return new Observable(observer => {
118
+ const complete = () => {
119
+ worker.terminate();
120
+ observer.complete();
121
+ };
122
+ this.createImageBitmap(img).subscribe({
123
+ next: imageBitmap => {
124
+ worker.onmessage = ({ data }) => {
125
+ observer.next(data);
126
+ complete();
127
+ };
128
+ worker.onerror = error => {
129
+ observer.error(error);
130
+ complete();
131
+ };
132
+ worker.postMessage({ quality, format, imageBitmap }, [imageBitmap]);
133
+ },
134
+ error: error => {
135
+ observer.error(error);
136
+ complete();
137
+ }
138
+ });
139
+ });
140
+ }
141
+ /**
142
+ * 创建图像位图
143
+ * @param img 图像源
144
+ */
145
+ createImageBitmap(img) {
146
+ return from(window.createImageBitmap(img, {
147
+ resizeWidth: img.width,
148
+ resizeHeight: img.height
149
+ }).then(bitmap => {
150
+ // 某些情况下,图片宽度与高度会调换,因此这里要做一个判断
151
+ if (bitmap.width !== img.width) {
152
+ return window.createImageBitmap(img, {
153
+ resizeWidth: img.height,
154
+ resizeHeight: img.width
155
+ });
156
+ }
157
+ return bitmap;
158
+ }));
159
+ }
160
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ImageCompressor, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
161
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ImageCompressor, providedIn: 'root' }); }
162
+ }
163
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ImageCompressor, decorators: [{
164
+ type: Injectable,
165
+ args: [{
166
+ providedIn: 'root'
167
+ }]
168
+ }] });
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtY29tcHJlc3Nvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2ltYWdlLWNvbXByZXNzb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFFeEM7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUNBQW1DLEdBQUcsSUFBSSxjQUFjLENBQ25FLDhCQUE4QixDQUMvQixDQUFDO0FBS0YsTUFBTSxPQUFPLGVBQWU7SUFINUI7UUFLVSxhQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVCLGtCQUFhLEdBQUcsTUFBTSxDQUFDLG1DQUFtQyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEYsV0FBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBK0p4RDtJQTdKQyxxQ0FBcUM7SUFDckMsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxhQUFhO1FBQ2YsSUFBSSxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENB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ZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGZyb20gfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiDnm67liY0gTkcg5bqTIOS4rei/mOS4jeiDveWMheWQqyBXZWJXb3JrZXLvvIzov5nph4zkvb/nlKggREkg55qE5pa55byP77yM55SxIEFwcCDmj5DkvpsgV2ViV29ya2Vy77yaXG4gKiBgYGB0c1xuICoge1xuICogICAgcHJvdmlkZTogSU1BR0VfQ09NUFJFU1NPUl9XRUJXT1JLRVJfRkFDVE9SWSxcbiAqICAgIHVzZVZhbHVlOiAoKSA9PiBuZXcgV29ya2VyKG5ldyBVUkwoJ3h4eC53b3JrZXInLCBpbXBvcnQubWV0YS51cmwpLCB7IHR5cGU6ICdtb2R1bGUnIH0pXG4gKiB9XG4gKiBgYGBcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXItY2xpL2lzc3Vlcy8xNTA1OVxuICovXG5leHBvcnQgY29uc3QgU1VOX0lNQUdFX0NPTVBSRVNTT1JfV09SS0VSX0ZBQ1RPUlkgPSBuZXcgSW5qZWN0aW9uVG9rZW48KCkgPT4gV29ya2VyPihcbiAgJ0ltYWdlQ29tcHJlc3NvcldvcmtlckZhY3RvcnknXG4pO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBJbWFnZUNvbXByZXNzb3Ige1xuICBwcml2YXRlIF9mb3JtYXQ/OiAnd2VicCcgfCAnanBlZycgfCAncG5nJztcbiAgcHJpdmF0ZSBkb2N1bWVudCA9IGluamVjdChET0NVTUVOVCk7XG4gIHByaXZhdGUgd29ya2VyRmFjdG9yeSA9IGluamVjdChTVU5fSU1BR0VfQ09NUFJFU1NPUl9XT1JLRVJfRkFDVE9SWSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSBjYW52YXMgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuXG4gIC8qKiDmnIDkvbPlm77niYfmoLzlvI/vvIzkvJjlhYjnuqfvvJp3ZWJwIC0+IGpwZWcgLT4gcG5nICovXG4gIGdldCBmb3JtYXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1hdCB8fCAodGhpcy5fZm9ybWF0ID0gdGhpcy5pc1N1cHBvcnRXRUJQID8gJ3dlYnAnIDogdGhpcy5pc1N1cHBvcnRKUEVHID8gJ2pwZWcnIDogJ3BuZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIOaYr+WQpuaUr+aMgVdlYlDmoLzlvI9cbiAgICovXG4gIGdldCBpc1N1cHBvcnRXRUJQKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5jYW52YXMudG9EYXRhVVJMKCdpbWFnZS93ZWJwJykuc3RhcnRzV2l0aCgnZGF0YTppbWFnZS93ZWJwJyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmmK/lkKbmlK/mjIFKUEVH5qC85byPXG4gICAqL1xuICBnZXQgaXNTdXBwb3J0SlBFRygpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycpLnN0YXJ0c1dpdGgoJ2RhdGE6aW1hZ2UvanBlZycpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Y6L57yp5Zu+54mHXG4gICAqIEBwYXJhbSBzcmMg5Zu+54mHVVJMXG4gICAqIEBwYXJhbSBxdWFsaXR5IOi0qOmHj1xuICAgKi9cbiAgY29tcHJlc3Moc3JjOiBzdHJpbmcsIHF1YWxpdHkgPSAwLjg1KTogT2JzZXJ2YWJsZTxCbG9iPiB7XG4gICAgY29uc3QgZm9ybWF0ID0gdGhpcy5mb3JtYXQ7XG4gICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgaW1nLmNyb3NzT3JpZ2luID0gJ2Fub255bW91cyc7XG5cbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8QmxvYj4oKG9ic2VydmVyKSA9PiB7XG4gICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnJlc2l6ZShpbWcpO1xuXG4gICAgICAgICgoJ09mZnNjcmVlbkNhbnZhcycgaW4gd2luZG93ICYmIHRoaXMud29ya2VyRmFjdG9yeSkgPyB0aGlzLmRyYXdJbldvcmtlcihpbWcsIHF1YWxpdHksIGZvcm1hdCkgOiB0aGlzLmRyYXcoaW1nLCBxdWFsaXR5LCBmb3JtYXQpKS5zdWJzY3JpYmUoYmxvYiA9PiB7XG4gICAgICAgICAgb2JzZXJ2ZXIubmV4dChibG9iKTtcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGltZy5vbmVycm9yID0gKGVycm9yOiBFdmVudCB8IHN0cmluZykgPT4ge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9O1xuXG4gICAgICBpbWcuc3JjID0gc3JjO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOiwg+aVtOWbvuWDj+WwuuWvuFxuICAgKiBAcGFyYW0gaW1nXG4gICAqL1xuICBwcml2YXRlIHJlc2l6ZShpbWc6IEhUTUxJbWFnZUVsZW1lbnQpIHtcbiAgICBjb25zdCBtYXhXaWR0aCA9IDEyODA7XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gNzIwO1xuXG4gICAgaWYgKGltZy53aWR0aCA+IG1heFdpZHRoKSB7XG4gICAgICBjb25zdCBkaXZpc29yID0gaW1nLndpZHRoIC8gbWF4V2lkdGg7XG4gICAgICBpbWcud2lkdGggLz0gZGl2aXNvcjtcbiAgICAgIGltZy5oZWlnaHQgLz0gZGl2aXNvcjtcbiAgICB9XG5cbiAgICBpZiAoaW1nLmhlaWdodCA+IG1heEhlaWdodCkge1xuICAgICAgY29uc3QgZGl2aXNvciA9IGltZy5oZWlnaHQgLyBtYXhIZWlnaHQ7XG4gICAgICBpbWcud2lkdGggLz0gZGl2aXNvcjtcbiAgICAgIGltZy5oZWlnaHQgLz0gZGl2aXNvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Zyo5Li757q/56iL5Lit57uY5Yi2XG4gICAqIEBwYXJhbSBpbWcg5Zu+5YOPXG4gICAqIEBwYXJhbSBxdWFsaXR5IOi0qOmHj1xuICAgKiBAcGFyYW0gZm9ybWF0IOagvOW8j1xuICAgKi9cbiAgZHJhdyhpbWc6IEhUTUxJbWFnZUVsZW1lbnQsIHF1YWxpdHk6IG51bWJlciwgZm9ybWF0OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8QmxvYj4ob2JzZXJ2ZXIgPT4ge1xuICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodDtcblxuICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykhO1xuICAgICAgY3R4LmRyYXdJbWFnZShpbWcsIDAsIDAsIGltZy53aWR0aCwgaW1nLmhlaWdodCk7XG5cbiAgICAgIGNhbnZhcy50b0Jsb2IoYmxvYiA9PiB7XG4gICAgICAgIG9ic2VydmVyLm5leHQoYmxvYiEpO1xuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfSwgJ2ltYWdlLycgKyBmb3JtYXQsIHF1YWxpdHkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOWcqFdlYldvcmtlcue6v+eoi+S4ree7mOWItlxuICAgKiBAcGFyYW0gaW1nIOWbvuWDj1xuICAgKiBAcGFyYW0gcXVhbGl0eSDotKjph49cbiAgICogQHBhcmFtIGZvcm1hdCDmoLzlvI9cbiAgICovXG4gIGRyYXdJbldvcmtlcihpbWc6IEhUTUxJbWFnZUVsZW1lbnQsIHF1YWxpdHk6IG51bWJlciwgZm9ybWF0OiBzdHJpbmcpIHtcbiAgICBjb25zdCB3b3JrZXIgPSB0aGlzLndvcmtlckZhY3RvcnkhKCk7XG5cbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8QmxvYj4ob2JzZXJ2ZXIgPT4ge1xuICAgICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY3JlYXRlSW1hZ2VCaXRtYXAoaW1nKS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiBpbWFnZUJpdG1hcCA9PiB7XG4gICAgICAgICAgd29ya2VyLm9ubWVzc2FnZSA9ICh7IGRhdGEgfSkgPT4ge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChkYXRhKTtcbiAgICAgICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHdvcmtlci5vbmVycm9yID0gZXJyb3IgPT4ge1xuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgY29tcGxldGUoKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHsgcXVhbGl0eSwgZm9ybWF0LCBpbWFnZUJpdG1hcCB9LCBbaW1hZ2VCaXRtYXBdKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IGVycm9yID0+IHtcbiAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XG4gICAgICAgICAgY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICog5Yib5bu65Zu+5YOP5L2N5Zu+XG4gICAqIEBwYXJhbSBpbWcg5Zu+5YOP5rqQXG4gICAqL1xuICBjcmVhdGVJbWFnZUJpdG1hcChpbWc6IEhUTUxJbWFnZUVsZW1lbnQpOiBPYnNlcnZhYmxlPEltYWdlQml0bWFwPiB7XG4gICAgcmV0dXJuIGZyb20od2luZG93LmNyZWF0ZUltYWdlQml0bWFwKGltZywge1xuICAgICAgcmVzaXplV2lkdGg6IGltZy53aWR0aCxcbiAgICAgIHJlc2l6ZUhlaWdodDogaW1nLmhlaWdodFxuICAgIH0pLnRoZW4oYml0bWFwID0+IHtcbiAgICAgIC8vIOafkOS6m+aDheWGteS4i++8jOWbvueJh+WuveW6puS4jumrmOW6puS8muiwg+aNou+8jOWboOatpOi/memHjOimgeWBmuS4gOS4quWIpOaWrVxuICAgICAgaWYgKGJpdG1hcC53aWR0aCAhPT0gaW1nLndpZHRoKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuY3JlYXRlSW1hZ2VCaXRtYXAoaW1nLCB7XG4gICAgICAgICAgcmVzaXplV2lkdGg6IGltZy5oZWlnaHQsXG4gICAgICAgICAgcmVzaXplSGVpZ2h0OiBpbWcud2lkdGhcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBiaXRtYXA7XG4gICAgfSkpO1xuICB9XG5cbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ export * from './file-manager';
2
+ export * from './fullscreen.service';
3
+ export * from './image-compressor';
4
+ export * from './resource-loader';
5
+ export * from './spreadsheet.service';
6
+ export * from './storage';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlcy9wbGF0Zm9ybS1icm93c2VyL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2ZpbGUtbWFuYWdlcic7XG5leHBvcnQgKiBmcm9tICcuL2Z1bGxzY3JlZW4uc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2ltYWdlLWNvbXByZXNzb3InO1xuZXhwb3J0ICogZnJvbSAnLi9yZXNvdXJjZS1sb2FkZXInO1xuZXhwb3J0ICogZnJvbSAnLi9zcHJlYWRzaGVldC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZSc7XG4iXX0=
@@ -0,0 +1,44 @@
1
+ import { DOCUMENT } from '@angular/common';
2
+ import { inject, Injectable } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ export class ResourceLoader {
5
+ constructor() {
6
+ this.document = inject(DOCUMENT);
7
+ }
8
+ loadScript(url) {
9
+ return new Promise((resolve, reject) => {
10
+ const script = this.document.createElement('script');
11
+ script.type = 'text/javascript';
12
+ script.src = url;
13
+ script.onload = () => resolve();
14
+ script.onerror = () => {
15
+ this.document.head.removeChild(script);
16
+ reject();
17
+ };
18
+ this.document.head.appendChild(script);
19
+ });
20
+ }
21
+ loadStylesheet(url) {
22
+ return new Promise((resolve, reject) => {
23
+ const link = this.document.createElement('link');
24
+ link.rel = 'stylesheet';
25
+ link.type = 'text/css';
26
+ link.href = url;
27
+ link.onload = () => resolve();
28
+ link.onerror = () => {
29
+ this.document.head.removeChild(link);
30
+ reject();
31
+ };
32
+ this.document.head.appendChild(link);
33
+ });
34
+ }
35
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResourceLoader, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
36
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResourceLoader, providedIn: 'root' }); }
37
+ }
38
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResourceLoader, decorators: [{
39
+ type: Injectable,
40
+ args: [{
41
+ providedIn: 'root'
42
+ }]
43
+ }] });
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtbG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9zcmMvcmVzb3VyY2UtbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFLbkQsTUFBTSxPQUFPLGNBQWM7SUFIM0I7UUFJbUIsYUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztLQWtDOUM7SUFoQ0MsVUFBVSxDQUFDLEdBQVc7UUFDcEIsT0FBTyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMzQyxNQUFNLE1BQU0sR0FBc0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDeEUsTUFBTSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztZQUNoQyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUVqQixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFO2dCQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZDLE1BQU0sRUFBRSxDQUFDO1lBQ1gsQ0FBQyxDQUFDO1lBRUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGNBQWMsQ0FBQyxHQUFXO1FBQ3hCLE9BQU8sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDM0MsTUFBTSxJQUFJLEdBQW9CLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1lBRWhCLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckMsTUFBTSxFQUFFLENBQUM7WUFDWCxDQUFDLENBQUM7WUFFRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOytHQWxDVSxjQUFjO21IQUFkLGNBQWMsY0FGYixNQUFNOzs0RkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUxvYWRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuXG4gIGxvYWRTY3JpcHQodXJsOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc2NyaXB0OiBIVE1MU2NyaXB0RWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xuICAgICAgc2NyaXB0LnNyYyA9IHVybDtcblxuICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgIHNjcmlwdC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQoc2NyaXB0KTtcbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0KTtcbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRTdHlsZXNoZWV0KHVybDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGxpbms6IEhUTUxMaW5rRWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO1xuICAgICAgbGluay5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICBsaW5rLnR5cGUgPSAndGV4dC9jc3MnO1xuICAgICAgbGluay5ocmVmID0gdXJsO1xuXG4gICAgICBsaW5rLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgIGxpbmsub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5kb2N1bWVudC5oZWFkLnJlbW92ZUNoaWxkKGxpbmspO1xuICAgICAgICByZWplY3QoKTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29sYXItYW5ndWxhci1wbGF0Zm9ybS1icm93c2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9zcmMvc29sYXItYW5ndWxhci1wbGF0Zm9ybS1icm93c2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19