@yelon/bis 14.2.0 → 15.0.0-beta.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/LICENSE +1 -1
- package/README.md +23 -1
- package/esm2020/bis.mjs +2 -2
- package/esm2020/index.mjs +2 -0
- package/esm2020/public_api.mjs +2 -2
- package/esm2020/src/bis.config.mjs +11 -0
- package/esm2020/src/icon/style-icons.mjs +796 -0
- package/esm2020/src/index.mjs +12 -0
- package/esm2020/src/layout-basic/index.mjs +4 -0
- package/esm2020/src/layout-basic/interface.mjs +7 -0
- package/esm2020/src/layout-basic/layout-basic.component.mjs +312 -0
- package/esm2020/src/layout-basic/layout-display.service.mjs +87 -0
- package/esm2020/src/layout-nav/index.mjs +5 -0
- package/esm2020/src/layout-nav/layout-nav-application.component.mjs +262 -0
- package/esm2020/{layout/widgets/yz.application.group.component.mjs → src/layout-nav/layout-nav-group.component.mjs} +23 -21
- package/esm2020/src/layout-nav/layout-nav-tile.component.mjs +15 -0
- package/esm2020/src/layout-nav/types.mjs +7 -0
- package/esm2020/src/widgets/index.mjs +7 -0
- package/esm2020/src/widgets/yunzai-clear-storage.component.mjs +45 -0
- package/esm2020/src/widgets/yunzai-fullscreen.component.mjs +45 -0
- package/esm2020/src/widgets/yunzai-i18n.component.mjs +115 -0
- package/esm2020/src/widgets/yunzai-notify.component.mjs +183 -0
- package/esm2020/src/widgets/yunzai-theme-btn.component.mjs +195 -0
- package/esm2020/{layout/widgets/yz.user.component.mjs → src/widgets/yunzai-user.component.mjs} +6 -6
- package/esm2020/src/yunzai-act.guard.mjs +107 -0
- package/esm2020/src/yunzai-auth.service.mjs +153 -0
- package/esm2020/src/yunzai-default.interceptor.mjs +207 -0
- package/esm2020/src/yunzai-i18n.service.mjs +94 -0
- package/esm2020/src/yunzai-layout.module.mjs +76 -0
- package/esm2020/src/yunzai-startup.service.mjs +157 -0
- package/fesm2015/bis.mjs +2960 -1
- package/fesm2015/bis.mjs.map +1 -1
- package/fesm2020/bis.mjs +2968 -1
- package/fesm2020/bis.mjs.map +1 -1
- package/index.d.ts +0 -4
- package/index.less +1 -1
- package/package.json +12 -27
- package/public_api.d.ts +1 -2
- package/{layout → src}/bis.config.d.ts +0 -0
- package/{shared → src/icon}/style-icons.d.ts +0 -0
- package/src/index.d.ts +11 -0
- package/src/layout-basic/index.d.ts +3 -0
- package/src/layout-basic/interface.d.ts +24 -0
- package/src/layout-basic/layout-basic.component.d.ts +33 -0
- package/src/layout-basic/layout-display.service.d.ts +15 -0
- package/src/layout-nav/index.d.ts +4 -0
- package/src/layout-nav/layout-nav-application.component.d.ts +26 -0
- package/src/layout-nav/layout-nav-group.component.d.ts +17 -0
- package/src/layout-nav/layout-nav-tile.component.d.ts +6 -0
- package/src/layout-nav/types.d.ts +20 -0
- package/src/widgets/index.d.ts +6 -0
- package/{layout/widgets/yz.clear-storage.component.d.ts → src/widgets/yunzai-clear-storage.component.d.ts} +3 -3
- package/src/widgets/yunzai-fullscreen.component.d.ts +8 -0
- package/{layout/widgets/yz.i18n.component.d.ts → src/widgets/yunzai-i18n.component.d.ts} +5 -5
- package/{layout/widgets/yz.notify.component.d.ts → src/widgets/yunzai-notify.component.d.ts} +5 -5
- package/{layout/widgets/yz.them-btn.component.d.ts → src/widgets/yunzai-theme-btn.component.d.ts} +5 -5
- package/{layout/widgets/yz.user.component.d.ts → src/widgets/yunzai-user.component.d.ts} +3 -3
- package/{layout/act.guard.d.ts → src/yunzai-act.guard.d.ts} +1 -2
- package/{layout/yz.auth.service.d.ts → src/yunzai-auth.service.d.ts} +6 -7
- package/{layout/yz.default.interceptor.d.ts → src/yunzai-default.interceptor.d.ts} +4 -6
- package/{layout/yz.i18n.service.d.ts → src/yunzai-i18n.service.d.ts} +4 -3
- package/src/yunzai-layout.module.d.ts +21 -0
- package/src/yunzai-startup.service.d.ts +37 -0
- package/esm2020/layout/act.guard.mjs +0 -108
- package/esm2020/layout/bis.config.mjs +0 -11
- package/esm2020/layout/contact/contact.component.mjs +0 -492
- package/esm2020/layout/contact/contact.service.mjs +0 -146
- package/esm2020/layout/layout.mjs +0 -5
- package/esm2020/layout/layout.module.mjs +0 -76
- package/esm2020/layout/path-to-regexp.service.mjs +0 -238
- package/esm2020/layout/public_api.mjs +0 -15
- package/esm2020/layout/stomp.config.mjs +0 -18
- package/esm2020/layout/widgets/index.mjs +0 -9
- package/esm2020/layout/widgets/yz.application.component.mjs +0 -271
- package/esm2020/layout/widgets/yz.clear-storage.component.mjs +0 -45
- package/esm2020/layout/widgets/yz.fullscreen.component.mjs +0 -45
- package/esm2020/layout/widgets/yz.i18n.component.mjs +0 -115
- package/esm2020/layout/widgets/yz.notify.component.mjs +0 -183
- package/esm2020/layout/widgets/yz.them-btn.component.mjs +0 -195
- package/esm2020/layout/yz.auth.service.mjs +0 -155
- package/esm2020/layout/yz.basic.component.mjs +0 -269
- package/esm2020/layout/yz.default.interceptor.mjs +0 -207
- package/esm2020/layout/yz.i18n.service.mjs +0 -93
- package/esm2020/layout/yz.startup.service.mjs +0 -139
- package/esm2020/layout/yz.stomp.service.mjs +0 -88
- package/esm2020/shared/public_api.mjs +0 -5
- package/esm2020/shared/shared-yelon.module.mjs +0 -106
- package/esm2020/shared/shared-zorro.module.mjs +0 -81
- package/esm2020/shared/shared.mjs +0 -5
- package/esm2020/shared/shared.module.mjs +0 -115
- package/esm2020/shared/style-icons.mjs +0 -796
- package/fesm2015/layout.mjs +0 -2968
- package/fesm2015/layout.mjs.map +0 -1
- package/fesm2015/shared.mjs +0 -1103
- package/fesm2015/shared.mjs.map +0 -1
- package/fesm2020/layout.mjs +0 -2977
- package/fesm2020/layout.mjs.map +0 -1
- package/fesm2020/shared.mjs +0 -1103
- package/fesm2020/shared.mjs.map +0 -1
- package/layout/contact/contact.component.d.ts +0 -169
- package/layout/contact/contact.service.d.ts +0 -118
- package/layout/index.d.ts +0 -5
- package/layout/layout.module.d.ts +0 -21
- package/layout/path-to-regexp.service.d.ts +0 -26
- package/layout/public_api.d.ts +0 -14
- package/layout/stomp.config.d.ts +0 -3
- package/layout/style/index.less +0 -155
- package/layout/widgets/index.d.ts +0 -8
- package/layout/widgets/yz.application.component.d.ts +0 -49
- package/layout/widgets/yz.application.group.component.d.ts +0 -19
- package/layout/widgets/yz.fullscreen.component.d.ts +0 -8
- package/layout/yz.basic.component.d.ts +0 -27
- package/layout/yz.startup.service.d.ts +0 -36
- package/layout/yz.stomp.service.d.ts +0 -42
- package/shared/index.d.ts +0 -5
- package/shared/public_api.d.ts +0 -4
- package/shared/shared-yelon.module.d.ts +0 -3
- package/shared/shared-zorro.module.d.ts +0 -2
- package/shared/shared.module.d.ts +0 -94
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, Inject } from '@angular/core';
|
|
2
|
-
import { forkJoin, map } from 'rxjs';
|
|
3
|
-
import { formatDistanceToNow } from 'date-fns';
|
|
4
|
-
import { YUNZAI_I18N_TOKEN } from '@yelon/theme';
|
|
5
|
-
import { WINDOW } from '@yelon/util';
|
|
6
|
-
import { log } from '@yelon/util/other';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "ng-zorro-antd/message";
|
|
9
|
-
import * as i2 from "ng-zorro-antd/i18n";
|
|
10
|
-
import * as i3 from "@yelon/theme";
|
|
11
|
-
import * as i4 from "@yelon/abc/notice-icon";
|
|
12
|
-
import * as i5 from "../yz.i18n.service";
|
|
13
|
-
export class YzHeaderNotifyComponent {
|
|
14
|
-
constructor(injector, msg, y18n, nzI18n, cdr, httpClient) {
|
|
15
|
-
this.injector = injector;
|
|
16
|
-
this.msg = msg;
|
|
17
|
-
this.y18n = y18n;
|
|
18
|
-
this.nzI18n = nzI18n;
|
|
19
|
-
this.cdr = cdr;
|
|
20
|
-
this.httpClient = httpClient;
|
|
21
|
-
this.data = [
|
|
22
|
-
{
|
|
23
|
-
key: 'msg',
|
|
24
|
-
title: this.y18n.fanyi('notify.message'),
|
|
25
|
-
list: [],
|
|
26
|
-
emptyText: this.y18n.fanyi('notify.message.emptyText'),
|
|
27
|
-
emptyImage: './assets/tmp/img/message.svg',
|
|
28
|
-
clearText: this.y18n.fanyi('notify.message.clearText')
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
key: 'todo',
|
|
32
|
-
title: this.y18n.fanyi('notify.todo'),
|
|
33
|
-
list: [],
|
|
34
|
-
emptyText: this.y18n.fanyi('notify.todo.emptyText'),
|
|
35
|
-
emptyImage: './assets/tmp/img/todo.svg',
|
|
36
|
-
clearText: this.y18n.fanyi('notify.todo.clearText')
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
key: 'notice',
|
|
40
|
-
title: this.y18n.fanyi('notify.notice'),
|
|
41
|
-
list: [],
|
|
42
|
-
emptyText: this.y18n.fanyi('notify.notice.emptyText'),
|
|
43
|
-
emptyImage: './assets/tmp/img/notice.svg',
|
|
44
|
-
clearText: this.y18n.fanyi('notify.notice.clearText')
|
|
45
|
-
}
|
|
46
|
-
];
|
|
47
|
-
this.loading = false;
|
|
48
|
-
this.count = 0;
|
|
49
|
-
this.subs = [];
|
|
50
|
-
}
|
|
51
|
-
ngOnInit() {
|
|
52
|
-
this.loadData();
|
|
53
|
-
}
|
|
54
|
-
loadData() {
|
|
55
|
-
this.count = 0;
|
|
56
|
-
this.loading = true;
|
|
57
|
-
this.subs.push(forkJoin(this.loadTodo(), this.loadMessage()).subscribe(() => {
|
|
58
|
-
this.loading = false;
|
|
59
|
-
this.cdr.detectChanges();
|
|
60
|
-
}));
|
|
61
|
-
}
|
|
62
|
-
loadMessage() {
|
|
63
|
-
log('notify.component: ', 'fetch message list');
|
|
64
|
-
const formatMessageStatus = (status) => {
|
|
65
|
-
switch (status) {
|
|
66
|
-
case '0':
|
|
67
|
-
return { extra: this.y18n.fanyi('notify.unread'), color: 'red' };
|
|
68
|
-
case '1':
|
|
69
|
-
return { extra: this.y18n.fanyi('notify.readed'), color: 'green' };
|
|
70
|
-
default:
|
|
71
|
-
return { extra: this.y18n.fanyi('notify.nostatus'), color: 'primary' };
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
return this.httpClient
|
|
75
|
-
.post(`/message-center-3/my-msg-and-todo/msg-list`, {
|
|
76
|
-
pageNum: 1,
|
|
77
|
-
pageSize: 10,
|
|
78
|
-
status: '0'
|
|
79
|
-
})
|
|
80
|
-
.pipe(map((response) => {
|
|
81
|
-
const viewMessage = this.data.filter(d => d.key === 'msg')[0];
|
|
82
|
-
viewMessage.list = response.data.list.map((m) => {
|
|
83
|
-
return {
|
|
84
|
-
...m,
|
|
85
|
-
avatar: m?.imgUrl || './assets/tmp/img/message.png',
|
|
86
|
-
title: m.systemName,
|
|
87
|
-
description: m.content,
|
|
88
|
-
extra: formatMessageStatus(m.status).extra,
|
|
89
|
-
color: formatMessageStatus(m.status).color,
|
|
90
|
-
datetime: formatDistanceToNow(new Date(m.date), { locale: this.nzI18n.getDateLocale() })
|
|
91
|
-
};
|
|
92
|
-
});
|
|
93
|
-
this.count += viewMessage.list.length;
|
|
94
|
-
}));
|
|
95
|
-
}
|
|
96
|
-
loadTodo() {
|
|
97
|
-
log('notify.component: ', 'fetch todo list');
|
|
98
|
-
const formatTodoStatus = (status) => {
|
|
99
|
-
switch (status) {
|
|
100
|
-
case '0':
|
|
101
|
-
return { extra: this.y18n.fanyi('notify.unstart'), color: 'red' };
|
|
102
|
-
case '1':
|
|
103
|
-
return { extra: this.y18n.fanyi('notify.started'), color: 'green' };
|
|
104
|
-
default:
|
|
105
|
-
return { extra: this.y18n.fanyi('notify.nostatus'), color: 'primary' };
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
return this.httpClient
|
|
109
|
-
.post(`/message-center-3/my-msg-and-todo/todo-list`, {
|
|
110
|
-
pageNum: 1,
|
|
111
|
-
pageSize: 10,
|
|
112
|
-
status: '0'
|
|
113
|
-
})
|
|
114
|
-
.pipe(map((response) => {
|
|
115
|
-
const viewTodo = this.data.filter(d => d.key === 'todo')[0];
|
|
116
|
-
viewTodo.list = response.data.list.map((t) => {
|
|
117
|
-
return {
|
|
118
|
-
...t,
|
|
119
|
-
avatar: t?.imgUrl || './assets/tmp/img/todo.png',
|
|
120
|
-
title: t.systemName,
|
|
121
|
-
description: t.content,
|
|
122
|
-
datetime: formatDistanceToNow(new Date(t.date), { locale: this.nzI18n.getDateLocale() }),
|
|
123
|
-
extra: formatTodoStatus(t.status).extra,
|
|
124
|
-
color: formatTodoStatus(t.status).color
|
|
125
|
-
};
|
|
126
|
-
});
|
|
127
|
-
this.count += viewTodo.list.length;
|
|
128
|
-
}));
|
|
129
|
-
}
|
|
130
|
-
clear(type) {
|
|
131
|
-
const t = this.data.filter(d => d.title === type)[0];
|
|
132
|
-
if (t.key == 'msg' || t.key == 'notice') {
|
|
133
|
-
this.subs.push(this.httpClient.post(`/message-center-3/my-msg-and-todo/msg-clear`, {}).subscribe(_ => {
|
|
134
|
-
this.msg.success(`${this.y18n.fanyi('notify.clear')} ${type}`);
|
|
135
|
-
this.loadData();
|
|
136
|
-
}));
|
|
137
|
-
}
|
|
138
|
-
if (t.key == 'todo') {
|
|
139
|
-
this.loadData();
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
select(res) {
|
|
143
|
-
this.injector.get(WINDOW).open(res.item.url);
|
|
144
|
-
this.loadData();
|
|
145
|
-
}
|
|
146
|
-
ngOnDestroy() {
|
|
147
|
-
this.subs.forEach(a => a.unsubscribe());
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
YzHeaderNotifyComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: YzHeaderNotifyComponent, deps: [{ token: i0.Injector }, { token: i1.NzMessageService }, { token: YUNZAI_I18N_TOKEN }, { token: i2.NzI18nService }, { token: i0.ChangeDetectorRef }, { token: i3._HttpClient }], target: i0.ɵɵFactoryTarget.Component });
|
|
151
|
-
YzHeaderNotifyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.11", type: YzHeaderNotifyComponent, selector: "yz-header-notify", ngImport: i0, template: `
|
|
152
|
-
<notice-icon
|
|
153
|
-
[data]="data"
|
|
154
|
-
[count]="count"
|
|
155
|
-
[loading]="loading"
|
|
156
|
-
btnClass="yunzai-default__nav-item"
|
|
157
|
-
btnIconClass="yunzai-default__nav-item-icon"
|
|
158
|
-
(select)="select($event)"
|
|
159
|
-
(clear)="clear($event)"
|
|
160
|
-
></notice-icon>
|
|
161
|
-
`, isInline: true, dependencies: [{ kind: "component", type: i4.NoticeIconComponent, selector: "notice-icon", inputs: ["data", "count", "loading", "popoverVisible", "btnClass", "btnIconClass", "centered"], outputs: ["select", "clear", "popoverVisibleChange"], exportAs: ["noticeIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
162
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: YzHeaderNotifyComponent, decorators: [{
|
|
163
|
-
type: Component,
|
|
164
|
-
args: [{
|
|
165
|
-
selector: 'yz-header-notify',
|
|
166
|
-
template: `
|
|
167
|
-
<notice-icon
|
|
168
|
-
[data]="data"
|
|
169
|
-
[count]="count"
|
|
170
|
-
[loading]="loading"
|
|
171
|
-
btnClass="yunzai-default__nav-item"
|
|
172
|
-
btnIconClass="yunzai-default__nav-item-icon"
|
|
173
|
-
(select)="select($event)"
|
|
174
|
-
(clear)="clear($event)"
|
|
175
|
-
></notice-icon>
|
|
176
|
-
`,
|
|
177
|
-
changeDetection: ChangeDetectionStrategy.OnPush
|
|
178
|
-
}]
|
|
179
|
-
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.NzMessageService }, { type: i5.YzI18NService, decorators: [{
|
|
180
|
-
type: Inject,
|
|
181
|
-
args: [YUNZAI_I18N_TOKEN]
|
|
182
|
-
}] }, { type: i2.NzI18nService }, { type: i0.ChangeDetectorRef }, { type: i3._HttpClient }]; } });
|
|
183
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieXoubm90aWZ5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Jpcy9sYXlvdXQvd2lkZ2V0cy95ei5ub3RpZnkuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULE1BQU0sRUFJUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUE0QixHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0QsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRy9DLE9BQU8sRUFBRSxpQkFBaUIsRUFBZSxNQUFNLGNBQWMsQ0FBQztBQUM5RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7Ozs7OztBQXNCeEMsTUFBTSxPQUFPLHVCQUF1QjtJQStCbEMsWUFDVSxRQUFrQixFQUNsQixHQUFxQixFQUNNLElBQW1CLEVBQzlDLE1BQXFCLEVBQ3JCLEdBQXNCLEVBQ3RCLFVBQXVCO1FBTHZCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsUUFBRyxHQUFILEdBQUcsQ0FBa0I7UUFDTSxTQUFJLEdBQUosSUFBSSxDQUFlO1FBQzlDLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsZUFBVSxHQUFWLFVBQVUsQ0FBYTtRQXBDakMsU0FBSSxHQUFpQjtZQUNuQjtnQkFDRSxHQUFHLEVBQUUsS0FBSztnQkFDVixLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ3hDLElBQUksRUFBRSxFQUFFO2dCQUNSLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQztnQkFDdEQsVUFBVSxFQUFFLDhCQUE4QjtnQkFDMUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDO2FBQ3ZEO1lBQ0Q7Z0JBQ0UsR0FBRyxFQUFFLE1BQU07Z0JBQ1gsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQztnQkFDckMsSUFBSSxFQUFFLEVBQUU7Z0JBQ1IsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDO2dCQUNuRCxVQUFVLEVBQUUsMkJBQTJCO2dCQUN2QyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUM7YUFDcEQ7WUFDRDtnQkFDRSxHQUFHLEVBQUUsUUFBUTtnQkFDYixLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDO2dCQUN2QyxJQUFJLEVBQUUsRUFBRTtnQkFDUixTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUM7Z0JBQ3JELFVBQVUsRUFBRSw2QkFBNkI7Z0JBQ3pDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQzthQUN0RDtTQUNGLENBQUM7UUFDRixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLFVBQUssR0FBRyxDQUFDLENBQUM7UUFDVixTQUFJLEdBQW1CLEVBQUUsQ0FBQztJQVN2QixDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQzNELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxXQUFXO1FBQ1QsR0FBRyxDQUFDLG9CQUFvQixFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDaEQsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLE1BQWMsRUFBYSxFQUFFO1lBQ3hELFFBQVEsTUFBTSxFQUFFO2dCQUNkLEtBQUssR0FBRztvQkFDTixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztnQkFDbkUsS0FBSyxHQUFHO29CQUNOLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUNyRTtvQkFDRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDO2FBQzFFO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsVUFBVTthQUNuQixJQUFJLENBQUMsNENBQTRDLEVBQUU7WUFDbEQsT0FBTyxFQUFFLENBQUM7WUFDVixRQUFRLEVBQUUsRUFBRTtZQUNaLE1BQU0sRUFBRSxHQUFHO1NBQ1osQ0FBQzthQUNELElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxRQUFtQixFQUFFLEVBQUU7WUFDMUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlELFdBQVcsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBWSxFQUFFLEVBQUU7Z0JBQ3pELE9BQU87b0JBQ0wsR0FBRyxDQUFDO29CQUNKLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxJQUFJLDhCQUE4QjtvQkFDbkQsS0FBSyxFQUFFLENBQUMsQ0FBQyxVQUFVO29CQUNuQixXQUFXLEVBQUUsQ0FBQyxDQUFDLE9BQU87b0JBQ3RCLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSztvQkFDMUMsS0FBSyxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLO29CQUMxQyxRQUFRLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztpQkFDekYsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLEtBQUssSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ04sQ0FBQztJQUVELFFBQVE7UUFDTixHQUFHLENBQUMsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUM3QyxNQUFNLGdCQUFnQixHQUFHLENBQUMsTUFBYyxFQUFhLEVBQUU7WUFDckQsUUFBUSxNQUFNLEVBQUU7Z0JBQ2QsS0FBSyxHQUFHO29CQUNOLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7Z0JBQ3BFLEtBQUssR0FBRztvQkFDTixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO2dCQUN0RTtvQkFDRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDO2FBQzFFO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsVUFBVTthQUNuQixJQUFJLENBQUMsNkNBQTZDLEVBQUU7WUFDbkQsT0FBTyxFQUFFLENBQUM7WUFDVixRQUFRLEVBQUUsRUFBRTtZQUNaLE1BQU0sRUFBRSxHQUFHO1NBQ1osQ0FBQzthQUNELElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxRQUFtQixFQUFFLEVBQUU7WUFDMUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVELFFBQVEsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBWSxFQUFFLEVBQUU7Z0JBQ3RELE9BQU87b0JBQ0wsR0FBRyxDQUFDO29CQUNKLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxJQUFJLDJCQUEyQjtvQkFDaEQsS0FBSyxFQUFFLENBQUMsQ0FBQyxVQUFVO29CQUNuQixXQUFXLEVBQUUsQ0FBQyxDQUFDLE9BQU87b0JBQ3RCLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDO29CQUN4RixLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUs7b0JBQ3ZDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSztpQkFDeEMsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ04sQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFZO1FBQ2hCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksUUFBUSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNaLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDcEYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztTQUNIO1FBQ0QsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLE1BQU0sRUFBRTtZQUNuQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDakI7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQXFCO1FBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQzs7cUhBdkpVLHVCQUF1QiwwRUFrQ3hCLGlCQUFpQjt5R0FsQ2hCLHVCQUF1Qix3REFieEI7Ozs7Ozs7Ozs7R0FVVDs0RkFHVSx1QkFBdUI7a0JBZm5DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsUUFBUSxFQUFFOzs7Ozs7Ozs7O0dBVVQ7b0JBQ0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQ2hEOzswQkFtQ0ksTUFBTTsyQkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5qZWN0LFxuICBJbmplY3RvcixcbiAgT25EZXN0cm95LFxuICBPbkluaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCBtYXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgZm9ybWF0RGlzdGFuY2VUb05vdyB9IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgTm90aWNlSWNvblNlbGVjdCwgTm90aWNlSXRlbSB9IGZyb20gJ0B5ZWxvbi9hYmMvbm90aWNlLWljb24nO1xuaW1wb3J0IHsgWVVOWkFJX0kxOE5fVE9LRU4sIF9IdHRwQ2xpZW50IH0gZnJvbSAnQHllbG9uL3RoZW1lJztcbmltcG9ydCB7IFdJTkRPVyB9IGZyb20gJ0B5ZWxvbi91dGlsJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJ0B5ZWxvbi91dGlsL290aGVyJztcbmltcG9ydCB7IE56U2FmZUFueSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5pbXBvcnQgeyBOekkxOG5TZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9pMThuJztcbmltcG9ydCB7IE56TWVzc2FnZVNlcnZpY2UgfSBmcm9tICduZy16b3Jyby1hbnRkL21lc3NhZ2UnO1xuXG5pbXBvcnQgeyBZekkxOE5TZXJ2aWNlIH0gZnJvbSAnLi4veXouaTE4bi5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAneXotaGVhZGVyLW5vdGlmeScsXG4gIHRlbXBsYXRlOiBgXG4gICAgPG5vdGljZS1pY29uXG4gICAgICBbZGF0YV09XCJkYXRhXCJcbiAgICAgIFtjb3VudF09XCJjb3VudFwiXG4gICAgICBbbG9hZGluZ109XCJsb2FkaW5nXCJcbiAgICAgIGJ0bkNsYXNzPVwieXVuemFpLWRlZmF1bHRfX25hdi1pdGVtXCJcbiAgICAgIGJ0bkljb25DbGFzcz1cInl1bnphaS1kZWZhdWx0X19uYXYtaXRlbS1pY29uXCJcbiAgICAgIChzZWxlY3QpPVwic2VsZWN0KCRldmVudClcIlxuICAgICAgKGNsZWFyKT1cImNsZWFyKCRldmVudClcIlxuICAgID48L25vdGljZS1pY29uPlxuICBgLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBZekhlYWRlck5vdGlmeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgZGF0YTogTm90aWNlSXRlbVtdID0gW1xuICAgIHtcbiAgICAgIGtleTogJ21zZycsXG4gICAgICB0aXRsZTogdGhpcy55MThuLmZhbnlpKCdub3RpZnkubWVzc2FnZScpLFxuICAgICAgbGlzdDogW10sXG4gICAgICBlbXB0eVRleHQ6IHRoaXMueTE4bi5mYW55aSgnbm90aWZ5Lm1lc3NhZ2UuZW1wdHlUZXh0JyksXG4gICAgICBlbXB0eUltYWdlOiAnLi9hc3NldHMvdG1wL2ltZy9tZXNzYWdlLnN2ZycsXG4gICAgICBjbGVhclRleHQ6IHRoaXMueTE4bi5mYW55aSgnbm90aWZ5Lm1lc3NhZ2UuY2xlYXJUZXh0JylcbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ3RvZG8nLFxuICAgICAgdGl0bGU6IHRoaXMueTE4bi5mYW55aSgnbm90aWZ5LnRvZG8nKSxcbiAgICAgIGxpc3Q6IFtdLFxuICAgICAgZW1wdHlUZXh0OiB0aGlzLnkxOG4uZmFueWkoJ25vdGlmeS50b2RvLmVtcHR5VGV4dCcpLFxuICAgICAgZW1wdHlJbWFnZTogJy4vYXNzZXRzL3RtcC9pbWcvdG9kby5zdmcnLFxuICAgICAgY2xlYXJUZXh0OiB0aGlzLnkxOG4uZmFueWkoJ25vdGlmeS50b2RvLmNsZWFyVGV4dCcpXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdub3RpY2UnLFxuICAgICAgdGl0bGU6IHRoaXMueTE4bi5mYW55aSgnbm90aWZ5Lm5vdGljZScpLFxuICAgICAgbGlzdDogW10sXG4gICAgICBlbXB0eVRleHQ6IHRoaXMueTE4bi5mYW55aSgnbm90aWZ5Lm5vdGljZS5lbXB0eVRleHQnKSxcbiAgICAgIGVtcHR5SW1hZ2U6ICcuL2Fzc2V0cy90bXAvaW1nL25vdGljZS5zdmcnLFxuICAgICAgY2xlYXJUZXh0OiB0aGlzLnkxOG4uZmFueWkoJ25vdGlmeS5ub3RpY2UuY2xlYXJUZXh0JylcbiAgICB9XG4gIF07XG4gIGxvYWRpbmcgPSBmYWxzZTtcbiAgY291bnQgPSAwO1xuICBzdWJzOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgbXNnOiBOek1lc3NhZ2VTZXJ2aWNlLFxuICAgIEBJbmplY3QoWVVOWkFJX0kxOE5fVE9LRU4pIHByaXZhdGUgeTE4bjogWXpJMThOU2VydmljZSxcbiAgICBwcml2YXRlIG56STE4bjogTnpJMThuU2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBodHRwQ2xpZW50OiBfSHR0cENsaWVudFxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkRGF0YSgpO1xuICB9XG5cbiAgbG9hZERhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5jb3VudCA9IDA7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnN1YnMucHVzaChcbiAgICAgIGZvcmtKb2luKHRoaXMubG9hZFRvZG8oKSwgdGhpcy5sb2FkTWVzc2FnZSgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbG9hZE1lc3NhZ2UoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgbG9nKCdub3RpZnkuY29tcG9uZW50OiAnLCAnZmV0Y2ggbWVzc2FnZSBsaXN0Jyk7XG4gICAgY29uc3QgZm9ybWF0TWVzc2FnZVN0YXR1cyA9IChzdGF0dXM6IHN0cmluZyk6IE56U2FmZUFueSA9PiB7XG4gICAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgICBjYXNlICcwJzpcbiAgICAgICAgICByZXR1cm4geyBleHRyYTogdGhpcy55MThuLmZhbnlpKCdub3RpZnkudW5yZWFkJyksIGNvbG9yOiAncmVkJyB9O1xuICAgICAgICBjYXNlICcxJzpcbiAgICAgICAgICByZXR1cm4geyBleHRyYTogdGhpcy55MThuLmZhbnlpKCdub3RpZnkucmVhZGVkJyksIGNvbG9yOiAnZ3JlZW4nIH07XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHsgZXh0cmE6IHRoaXMueTE4bi5mYW55aSgnbm90aWZ5Lm5vc3RhdHVzJyksIGNvbG9yOiAncHJpbWFyeScgfTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnRcbiAgICAgIC5wb3N0KGAvbWVzc2FnZS1jZW50ZXItMy9teS1tc2ctYW5kLXRvZG8vbXNnLWxpc3RgLCB7XG4gICAgICAgIHBhZ2VOdW06IDEsXG4gICAgICAgIHBhZ2VTaXplOiAxMCxcbiAgICAgICAgc3RhdHVzOiAnMCdcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNwb25zZTogTnpTYWZlQW55KSA9PiB7XG4gICAgICAgICAgY29uc3Qgdmlld01lc3NhZ2UgPSB0aGlzLmRhdGEuZmlsdGVyKGQgPT4gZC5rZXkgPT09ICdtc2cnKVswXTtcbiAgICAgICAgICB2aWV3TWVzc2FnZS5saXN0ID0gcmVzcG9uc2UuZGF0YS5saXN0Lm1hcCgobTogTnpTYWZlQW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5tLFxuICAgICAgICAgICAgICBhdmF0YXI6IG0/LmltZ1VybCB8fCAnLi9hc3NldHMvdG1wL2ltZy9tZXNzYWdlLnBuZycsXG4gICAgICAgICAgICAgIHRpdGxlOiBtLnN5c3RlbU5hbWUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBtLmNvbnRlbnQsXG4gICAgICAgICAgICAgIGV4dHJhOiBmb3JtYXRNZXNzYWdlU3RhdHVzKG0uc3RhdHVzKS5leHRyYSxcbiAgICAgICAgICAgICAgY29sb3I6IGZvcm1hdE1lc3NhZ2VTdGF0dXMobS5zdGF0dXMpLmNvbG9yLFxuICAgICAgICAgICAgICBkYXRldGltZTogZm9ybWF0RGlzdGFuY2VUb05vdyhuZXcgRGF0ZShtLmRhdGUpLCB7IGxvY2FsZTogdGhpcy5uekkxOG4uZ2V0RGF0ZUxvY2FsZSgpIH0pXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuY291bnQgKz0gdmlld01lc3NhZ2UubGlzdC5sZW5ndGg7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgbG9hZFRvZG8oKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgbG9nKCdub3RpZnkuY29tcG9uZW50OiAnLCAnZmV0Y2ggdG9kbyBsaXN0Jyk7XG4gICAgY29uc3QgZm9ybWF0VG9kb1N0YXR1cyA9IChzdGF0dXM6IHN0cmluZyk6IE56U2FmZUFueSA9PiB7XG4gICAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgICBjYXNlICcwJzpcbiAgICAgICAgICByZXR1cm4geyBleHRyYTogdGhpcy55MThuLmZhbnlpKCdub3RpZnkudW5zdGFydCcpLCBjb2xvcjogJ3JlZCcgfTtcbiAgICAgICAgY2FzZSAnMSc6XG4gICAgICAgICAgcmV0dXJuIHsgZXh0cmE6IHRoaXMueTE4bi5mYW55aSgnbm90aWZ5LnN0YXJ0ZWQnKSwgY29sb3I6ICdncmVlbicgfTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4geyBleHRyYTogdGhpcy55MThuLmZhbnlpKCdub3RpZnkubm9zdGF0dXMnKSwgY29sb3I6ICdwcmltYXJ5JyB9O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxuICAgICAgLnBvc3QoYC9tZXNzYWdlLWNlbnRlci0zL215LW1zZy1hbmQtdG9kby90b2RvLWxpc3RgLCB7XG4gICAgICAgIHBhZ2VOdW06IDEsXG4gICAgICAgIHBhZ2VTaXplOiAxMCxcbiAgICAgICAgc3RhdHVzOiAnMCdcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNwb25zZTogTnpTYWZlQW55KSA9PiB7XG4gICAgICAgICAgY29uc3Qgdmlld1RvZG8gPSB0aGlzLmRhdGEuZmlsdGVyKGQgPT4gZC5rZXkgPT09ICd0b2RvJylbMF07XG4gICAgICAgICAgdmlld1RvZG8ubGlzdCA9IHJlc3BvbnNlLmRhdGEubGlzdC5tYXAoKHQ6IE56U2FmZUFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4udCxcbiAgICAgICAgICAgICAgYXZhdGFyOiB0Py5pbWdVcmwgfHwgJy4vYXNzZXRzL3RtcC9pbWcvdG9kby5wbmcnLFxuICAgICAgICAgICAgICB0aXRsZTogdC5zeXN0ZW1OYW1lLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogdC5jb250ZW50LFxuICAgICAgICAgICAgICBkYXRldGltZTogZm9ybWF0RGlzdGFuY2VUb05vdyhuZXcgRGF0ZSh0LmRhdGUpLCB7IGxvY2FsZTogdGhpcy5uekkxOG4uZ2V0RGF0ZUxvY2FsZSgpIH0pLFxuICAgICAgICAgICAgICBleHRyYTogZm9ybWF0VG9kb1N0YXR1cyh0LnN0YXR1cykuZXh0cmEsXG4gICAgICAgICAgICAgIGNvbG9yOiBmb3JtYXRUb2RvU3RhdHVzKHQuc3RhdHVzKS5jb2xvclxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLmNvdW50ICs9IHZpZXdUb2RvLmxpc3QubGVuZ3RoO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIGNsZWFyKHR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHQgPSB0aGlzLmRhdGEuZmlsdGVyKGQgPT4gZC50aXRsZSA9PT0gdHlwZSlbMF07XG4gICAgaWYgKHQua2V5ID09ICdtc2cnIHx8IHQua2V5ID09ICdub3RpY2UnKSB7XG4gICAgICB0aGlzLnN1YnMucHVzaChcbiAgICAgICAgdGhpcy5odHRwQ2xpZW50LnBvc3QoYC9tZXNzYWdlLWNlbnRlci0zL215LW1zZy1hbmQtdG9kby9tc2ctY2xlYXJgLCB7fSkuc3Vic2NyaWJlKF8gPT4ge1xuICAgICAgICAgIHRoaXMubXNnLnN1Y2Nlc3MoYCR7dGhpcy55MThuLmZhbnlpKCdub3RpZnkuY2xlYXInKX0gJHt0eXBlfWApO1xuICAgICAgICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0LmtleSA9PSAndG9kbycpIHtcbiAgICAgIHRoaXMubG9hZERhdGEoKTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3QocmVzOiBOb3RpY2VJY29uU2VsZWN0KTogdm9pZCB7XG4gICAgdGhpcy5pbmplY3Rvci5nZXQoV0lORE9XKS5vcGVuKHJlcy5pdGVtLnVybCk7XG4gICAgdGhpcy5sb2FkRGF0YSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzLmZvckVhY2goYSA9PiBhLnVuc3Vic2NyaWJlKCkpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
import { DOCUMENT } from '@angular/common';
|
|
2
|
-
import { ChangeDetectionStrategy, Component, Input, Inject, Optional } from '@angular/core';
|
|
3
|
-
import { Subject, takeUntil } from 'rxjs';
|
|
4
|
-
import { YUNZAI_THEME_BTN_KEYS } from '@yelon/theme/theme-btn';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@yelon/util/config";
|
|
7
|
-
import * as i2 from "@angular/cdk/platform";
|
|
8
|
-
import * as i3 from "@angular/cdk/bidi";
|
|
9
|
-
import * as i4 from "@angular/common";
|
|
10
|
-
import * as i5 from "ng-zorro-antd/core/transition-patch";
|
|
11
|
-
import * as i6 from "ng-zorro-antd/menu";
|
|
12
|
-
import * as i7 from "ng-zorro-antd/dropdown";
|
|
13
|
-
import * as i8 from "ng-zorro-antd/tooltip";
|
|
14
|
-
import * as i9 from "ng-zorro-antd/icon";
|
|
15
|
-
import * as i10 from "@yelon/theme";
|
|
16
|
-
export class YzHeaderThemBtnComponent {
|
|
17
|
-
constructor(renderer, configSrv, platform, doc, directionality, KEYS) {
|
|
18
|
-
this.renderer = renderer;
|
|
19
|
-
this.configSrv = configSrv;
|
|
20
|
-
this.platform = platform;
|
|
21
|
-
this.doc = doc;
|
|
22
|
-
this.directionality = directionality;
|
|
23
|
-
this.KEYS = KEYS;
|
|
24
|
-
this.theme = 'default';
|
|
25
|
-
this.types = [
|
|
26
|
-
{ key: 'default', text: 'theme.default', color: '#2163ff' },
|
|
27
|
-
{ key: 'compact', text: 'theme.compact', color: '#2163ff' },
|
|
28
|
-
{ key: 'dark', text: 'theme.dark', color: '#020202' },
|
|
29
|
-
{ key: 'yuhong', text: 'theme.yuhong', color: '#C04851' },
|
|
30
|
-
{ key: 'danjuhuang', text: 'theme.danjuhuang', color: '#FBA414' },
|
|
31
|
-
{ key: 'xinghuang', text: 'theme.xinghuang', color: '#F28E16' },
|
|
32
|
-
{ key: 'shilv', text: 'theme.shilv', color: '#57C3C2' },
|
|
33
|
-
{ key: 'zhulv', text: 'theme.zhulv', color: '#1BA784' },
|
|
34
|
-
{ key: 'youlan', text: 'theme.youlan', color: '#1781B5' },
|
|
35
|
-
{ key: 'dianqing', text: 'theme.dianqing', color: '#1661AB' },
|
|
36
|
-
{ key: 'shangengzi', text: 'theme.shangengzi', color: '#61649F' },
|
|
37
|
-
{ key: 'shuiniuhui', text: 'theme.shuiniuhui', color: '#2F2F35' }
|
|
38
|
-
];
|
|
39
|
-
this.devTips = `When the dark.css file can't be found, you need to run it once: npm run theme`;
|
|
40
|
-
this.deployUrl = '';
|
|
41
|
-
this.destroy$ = new Subject();
|
|
42
|
-
this.dir = 'ltr';
|
|
43
|
-
}
|
|
44
|
-
ngOnInit() {
|
|
45
|
-
this.dir = this.directionality.value;
|
|
46
|
-
this.directionality.change?.pipe(takeUntil(this.destroy$)).subscribe((direction) => {
|
|
47
|
-
this.dir = direction;
|
|
48
|
-
});
|
|
49
|
-
this.initTheme();
|
|
50
|
-
}
|
|
51
|
-
initTheme() {
|
|
52
|
-
if (!this.platform.isBrowser) {
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
this.theme = localStorage.getItem(this.KEYS) || 'default';
|
|
56
|
-
this.updateChartTheme();
|
|
57
|
-
this.onThemeChange(this.theme);
|
|
58
|
-
}
|
|
59
|
-
updateChartTheme() {
|
|
60
|
-
this.configSrv.set('chart', { theme: this.theme === 'dark' ? 'dark' : '' });
|
|
61
|
-
}
|
|
62
|
-
onThemeChange(theme) {
|
|
63
|
-
if (!this.platform.isBrowser) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
this.theme = theme;
|
|
67
|
-
this.renderer.setAttribute(this.doc.body, 'data-theme', theme);
|
|
68
|
-
const dom = this.doc.getElementById(this.KEYS);
|
|
69
|
-
if (dom) {
|
|
70
|
-
dom.remove();
|
|
71
|
-
}
|
|
72
|
-
localStorage.removeItem(this.KEYS);
|
|
73
|
-
if (theme !== 'default') {
|
|
74
|
-
const el = this.doc.createElement('link');
|
|
75
|
-
el.type = 'text/css';
|
|
76
|
-
el.rel = 'stylesheet';
|
|
77
|
-
el.id = this.KEYS;
|
|
78
|
-
el.href = `${this.deployUrl}assets/style.${theme}.css`;
|
|
79
|
-
localStorage.setItem(this.KEYS, theme);
|
|
80
|
-
this.doc.body.append(el);
|
|
81
|
-
}
|
|
82
|
-
this.updateChartTheme();
|
|
83
|
-
}
|
|
84
|
-
ngOnDestroy() {
|
|
85
|
-
const el = this.doc.getElementById(this.KEYS);
|
|
86
|
-
if (el != null) {
|
|
87
|
-
this.doc.body.removeChild(el);
|
|
88
|
-
}
|
|
89
|
-
this.destroy$.next();
|
|
90
|
-
this.destroy$.complete();
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
YzHeaderThemBtnComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: YzHeaderThemBtnComponent, deps: [{ token: i0.Renderer2 }, { token: i1.YunzaiConfigService }, { token: i2.Platform }, { token: DOCUMENT }, { token: i3.Directionality, optional: true }, { token: YUNZAI_THEME_BTN_KEYS }], target: i0.ɵɵFactoryTarget.Component });
|
|
94
|
-
YzHeaderThemBtnComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.11", type: YzHeaderThemBtnComponent, selector: "yz-header-theme-btn", inputs: { types: "types", devTips: "devTips", deployUrl: "deployUrl" }, ngImport: i0, template: `
|
|
95
|
-
<div
|
|
96
|
-
class="yunzai-default__nav-item"
|
|
97
|
-
nz-dropdown
|
|
98
|
-
[nzDropdownMenu]="iconMenu"
|
|
99
|
-
nzTrigger="click"
|
|
100
|
-
nzPlacement="bottomRight"
|
|
101
|
-
>
|
|
102
|
-
<svg nz-tooltip class="anticon" role="img" width="21" height="21" viewBox="0 0 21 21" fill="currentColor">
|
|
103
|
-
<g fill-rule="evenodd">
|
|
104
|
-
<g fill-rule="nonzero">
|
|
105
|
-
<path
|
|
106
|
-
d="M7.02 3.635l12.518 12.518a1.863 1.863 0 010 2.635l-1.317 1.318a1.863 1.863 0 01-2.635 0L3.068 7.588A2.795 2.795 0 117.02 3.635zm2.09 14.428a.932.932 0 110 1.864.932.932 0 010-1.864zm-.043-9.747L7.75 9.635l9.154 9.153 1.318-1.317-9.154-9.155zM3.52 12.473c.514 0 .931.417.931.931v.932h.932a.932.932 0 110 1.864h-.932v.931a.932.932 0 01-1.863 0l-.001-.931h-.93a.932.932 0 010-1.864h.93v-.932c0-.514.418-.931.933-.931zm15.374-3.727a1.398 1.398 0 110 2.795 1.398 1.398 0 010-2.795zM4.385 4.953a.932.932 0 000 1.317l2.046 2.047L7.75 7 5.703 4.953a.932.932 0 00-1.318 0zM14.701.36a.932.932 0 01.931.932v.931h.932a.932.932 0 010 1.864h-.933l.001.932a.932.932 0 11-1.863 0l-.001-.932h-.93a.932.932 0 110-1.864h.93v-.931a.932.932 0 01.933-.932z"
|
|
107
|
-
></path>
|
|
108
|
-
</g>
|
|
109
|
-
</g>
|
|
110
|
-
</svg>
|
|
111
|
-
</div>
|
|
112
|
-
<nz-dropdown-menu #iconMenu="nzDropdownMenu">
|
|
113
|
-
<ul nz-menu>
|
|
114
|
-
<li
|
|
115
|
-
nz-menu-item
|
|
116
|
-
*ngFor="let theme of types"
|
|
117
|
-
(click)="onThemeChange(theme.key)"
|
|
118
|
-
[style]="{ color: theme.color }"
|
|
119
|
-
>
|
|
120
|
-
<i nz-icon nzType="bg-colors"></i>
|
|
121
|
-
{{ theme.text | i18n }}
|
|
122
|
-
</li>
|
|
123
|
-
</ul>
|
|
124
|
-
<!-- <div nz-menu class="wd-xl animated jello">-->
|
|
125
|
-
<!-- <div nz-row [nzJustify]="'space-between'" [nzAlign]="'middle'" class="app-icons">-->
|
|
126
|
-
<!-- <div nz-col [nzSpan]="4" *ngFor="let theme of types" (click)="onThemeChange(theme.key)">-->
|
|
127
|
-
<!-- <i nz-icon nzType="bg-colors" class="text-white" [style]="{ backgroundColor: theme.color }"></i>-->
|
|
128
|
-
<!-- <span [ngStyle]="{ color: theme.color }">{{ theme.text | i18n }}</span>-->
|
|
129
|
-
<!-- </div>-->
|
|
130
|
-
<!-- </div>-->
|
|
131
|
-
<!-- </div>-->
|
|
132
|
-
</nz-dropdown-menu>
|
|
133
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i6.NzMenuDirective, selector: "[nz-menu]", inputs: ["nzInlineIndent", "nzTheme", "nzMode", "nzInlineCollapsed", "nzSelectable"], outputs: ["nzClick"], exportAs: ["nzMenu"] }, { kind: "directive", type: i6.NzMenuItemDirective, selector: "[nz-menu-item]", inputs: ["nzPaddingLeft", "nzDisabled", "nzSelected", "nzDanger", "nzMatchRouterExact", "nzMatchRouter"], exportAs: ["nzMenuItem"] }, { kind: "directive", type: i7.NzDropDownDirective, selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { kind: "component", type: i7.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { kind: "directive", type: i8.NzTooltipDirective, selector: "[nz-tooltip]", inputs: ["nzTooltipTitle", "nzTooltipTitleContext", "nz-tooltip", "nzTooltipTrigger", "nzTooltipPlacement", "nzTooltipOrigin", "nzTooltipVisible", "nzTooltipMouseEnterDelay", "nzTooltipMouseLeaveDelay", "nzTooltipOverlayClassName", "nzTooltipOverlayStyle", "nzTooltipArrowPointAtCenter", "nzTooltipColor"], outputs: ["nzTooltipVisibleChange"], exportAs: ["nzTooltip"] }, { kind: "directive", type: i9.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "pipe", type: i10.I18nPipe, name: "i18n" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
134
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: YzHeaderThemBtnComponent, decorators: [{
|
|
135
|
-
type: Component,
|
|
136
|
-
args: [{
|
|
137
|
-
selector: 'yz-header-theme-btn',
|
|
138
|
-
template: `
|
|
139
|
-
<div
|
|
140
|
-
class="yunzai-default__nav-item"
|
|
141
|
-
nz-dropdown
|
|
142
|
-
[nzDropdownMenu]="iconMenu"
|
|
143
|
-
nzTrigger="click"
|
|
144
|
-
nzPlacement="bottomRight"
|
|
145
|
-
>
|
|
146
|
-
<svg nz-tooltip class="anticon" role="img" width="21" height="21" viewBox="0 0 21 21" fill="currentColor">
|
|
147
|
-
<g fill-rule="evenodd">
|
|
148
|
-
<g fill-rule="nonzero">
|
|
149
|
-
<path
|
|
150
|
-
d="M7.02 3.635l12.518 12.518a1.863 1.863 0 010 2.635l-1.317 1.318a1.863 1.863 0 01-2.635 0L3.068 7.588A2.795 2.795 0 117.02 3.635zm2.09 14.428a.932.932 0 110 1.864.932.932 0 010-1.864zm-.043-9.747L7.75 9.635l9.154 9.153 1.318-1.317-9.154-9.155zM3.52 12.473c.514 0 .931.417.931.931v.932h.932a.932.932 0 110 1.864h-.932v.931a.932.932 0 01-1.863 0l-.001-.931h-.93a.932.932 0 010-1.864h.93v-.932c0-.514.418-.931.933-.931zm15.374-3.727a1.398 1.398 0 110 2.795 1.398 1.398 0 010-2.795zM4.385 4.953a.932.932 0 000 1.317l2.046 2.047L7.75 7 5.703 4.953a.932.932 0 00-1.318 0zM14.701.36a.932.932 0 01.931.932v.931h.932a.932.932 0 010 1.864h-.933l.001.932a.932.932 0 11-1.863 0l-.001-.932h-.93a.932.932 0 110-1.864h.93v-.931a.932.932 0 01.933-.932z"
|
|
151
|
-
></path>
|
|
152
|
-
</g>
|
|
153
|
-
</g>
|
|
154
|
-
</svg>
|
|
155
|
-
</div>
|
|
156
|
-
<nz-dropdown-menu #iconMenu="nzDropdownMenu">
|
|
157
|
-
<ul nz-menu>
|
|
158
|
-
<li
|
|
159
|
-
nz-menu-item
|
|
160
|
-
*ngFor="let theme of types"
|
|
161
|
-
(click)="onThemeChange(theme.key)"
|
|
162
|
-
[style]="{ color: theme.color }"
|
|
163
|
-
>
|
|
164
|
-
<i nz-icon nzType="bg-colors"></i>
|
|
165
|
-
{{ theme.text | i18n }}
|
|
166
|
-
</li>
|
|
167
|
-
</ul>
|
|
168
|
-
<!-- <div nz-menu class="wd-xl animated jello">-->
|
|
169
|
-
<!-- <div nz-row [nzJustify]="'space-between'" [nzAlign]="'middle'" class="app-icons">-->
|
|
170
|
-
<!-- <div nz-col [nzSpan]="4" *ngFor="let theme of types" (click)="onThemeChange(theme.key)">-->
|
|
171
|
-
<!-- <i nz-icon nzType="bg-colors" class="text-white" [style]="{ backgroundColor: theme.color }"></i>-->
|
|
172
|
-
<!-- <span [ngStyle]="{ color: theme.color }">{{ theme.text | i18n }}</span>-->
|
|
173
|
-
<!-- </div>-->
|
|
174
|
-
<!-- </div>-->
|
|
175
|
-
<!-- </div>-->
|
|
176
|
-
</nz-dropdown-menu>
|
|
177
|
-
`,
|
|
178
|
-
changeDetection: ChangeDetectionStrategy.OnPush
|
|
179
|
-
}]
|
|
180
|
-
}], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i1.YunzaiConfigService }, { type: i2.Platform }, { type: undefined, decorators: [{
|
|
181
|
-
type: Inject,
|
|
182
|
-
args: [DOCUMENT]
|
|
183
|
-
}] }, { type: i3.Directionality, decorators: [{
|
|
184
|
-
type: Optional
|
|
185
|
-
}] }, { type: undefined, decorators: [{
|
|
186
|
-
type: Inject,
|
|
187
|
-
args: [YUNZAI_THEME_BTN_KEYS]
|
|
188
|
-
}] }]; }, propDecorators: { types: [{
|
|
189
|
-
type: Input
|
|
190
|
-
}], devTips: [{
|
|
191
|
-
type: Input
|
|
192
|
-
}], deployUrl: [{
|
|
193
|
-
type: Input
|
|
194
|
-
}] } });
|
|
195
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieXoudGhlbS1idG4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYmlzL2xheW91dC93aWRnZXRzL3l6LnRoZW0tYnRuLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUlMLE1BQU0sRUFDTixRQUFRLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFMUMsT0FBTyxFQUFnQixxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7Ozs7QUFvRDdFLE1BQU0sT0FBTyx3QkFBd0I7SUFxQm5DLFlBQ1UsUUFBbUIsRUFDbkIsU0FBOEIsRUFDOUIsUUFBa0IsRUFDQSxHQUFjLEVBQ3BCLGNBQThCLEVBQ1gsSUFBWTtRQUwzQyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLGNBQVMsR0FBVCxTQUFTLENBQXFCO1FBQzlCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDQSxRQUFHLEdBQUgsR0FBRyxDQUFXO1FBQ3BCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUNYLFNBQUksR0FBSixJQUFJLENBQVE7UUExQjdDLFVBQUssR0FBRyxTQUFTLENBQUM7UUFDakIsVUFBSyxHQUFxQjtZQUNqQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO1lBQzNELEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7WUFDM0QsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtZQUNyRCxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO1lBQ3pELEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtZQUNqRSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7WUFDL0QsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtZQUN2RCxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO1lBQ3ZELEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7WUFDekQsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO1lBQzdELEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtZQUNqRSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7U0FDbEUsQ0FBQztRQUNPLFlBQU8sR0FBRywrRUFBK0UsQ0FBQztRQUMxRixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ3ZDLFFBQUcsR0FBYyxLQUFLLENBQUM7SUFTcEIsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBb0IsRUFBRSxFQUFFO1lBQzVGLElBQUksQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFTyxTQUFTO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFO1lBQzVCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDO1FBQzFELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFhO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRTtZQUM1QixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDL0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9DLElBQUksR0FBRyxFQUFFO1lBQ1AsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ2Q7UUFDRCxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDdkIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUMsRUFBRSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7WUFDckIsRUFBRSxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUM7WUFDdEIsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ2xCLEVBQUUsQ0FBQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxnQkFBZ0IsS0FBSyxNQUFNLENBQUM7WUFFdkQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMxQjtRQUNELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxXQUFXO1FBQ1QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlDLElBQUksRUFBRSxJQUFJLElBQUksRUFBRTtZQUNkLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUMvQjtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDOztzSEFsRlUsd0JBQXdCLHNHQXlCekIsUUFBUSwyREFFUixxQkFBcUI7MEdBM0JwQix3QkFBd0IsbUlBMUN6Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUNUOzRGQUdVLHdCQUF3QjtrQkE1Q3BDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHFCQUFxQjtvQkFDL0IsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Q1Q7b0JBQ0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQ2hEOzswQkEwQkksTUFBTTsyQkFBQyxRQUFROzswQkFDZixRQUFROzswQkFDUixNQUFNOzJCQUFDLHFCQUFxQjs0Q0F6QnRCLEtBQUs7c0JBQWIsS0FBSztnQkFjRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGlvbiwgRGlyZWN0aW9uYWxpdHkgfSBmcm9tICdAYW5ndWxhci9jZGsvYmlkaSc7XG5pbXBvcnQgeyBQbGF0Zm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wbGF0Zm9ybSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFJlbmRlcmVyMixcbiAgSW5qZWN0LFxuICBPcHRpb25hbFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBUaGVtZUJ0blR5cGUsIFlVTlpBSV9USEVNRV9CVE5fS0VZUyB9IGZyb20gJ0B5ZWxvbi90aGVtZS90aGVtZS1idG4nO1xuaW1wb3J0IHsgWXVuemFpQ29uZmlnU2VydmljZSB9IGZyb20gJ0B5ZWxvbi91dGlsL2NvbmZpZyc7XG5pbXBvcnQgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFl6VGhlbWVCdG5UeXBlIGV4dGVuZHMgVGhlbWVCdG5UeXBlIHtcbiAgY29sb3I/OiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3l6LWhlYWRlci10aGVtZS1idG4nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwieXVuemFpLWRlZmF1bHRfX25hdi1pdGVtXCJcbiAgICAgIG56LWRyb3Bkb3duXG4gICAgICBbbnpEcm9wZG93bk1lbnVdPVwiaWNvbk1lbnVcIlxuICAgICAgbnpUcmlnZ2VyPVwiY2xpY2tcIlxuICAgICAgbnpQbGFjZW1lbnQ9XCJib3R0b21SaWdodFwiXG4gICAgPlxuICAgICAgPHN2ZyBuei10b29sdGlwIGNsYXNzPVwiYW50aWNvblwiIHJvbGU9XCJpbWdcIiB3aWR0aD1cIjIxXCIgaGVpZ2h0PVwiMjFcIiB2aWV3Qm94PVwiMCAwIDIxIDIxXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPlxuICAgICAgICA8ZyBmaWxsLXJ1bGU9XCJldmVub2RkXCI+XG4gICAgICAgICAgPGcgZmlsbC1ydWxlPVwibm9uemVyb1wiPlxuICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgZD1cIk03LjAyIDMuNjM1bDEyLjUxOCAxMi41MThhMS44NjMgMS44NjMgMCAwMTAgMi42MzVsLTEuMzE3IDEuMzE4YTEuODYzIDEuODYzIDAgMDEtMi42MzUgMEwzLjA2OCA3LjU4OEEyLjc5NSAyLjc5NSAwIDExNy4wMiAzLjYzNXptMi4wOSAxNC40MjhhLjkzMi45MzIgMCAxMTAgMS44NjQuOTMyLjkzMiAwIDAxMC0xLjg2NHptLS4wNDMtOS43NDdMNy43NSA5LjYzNWw5LjE1NCA5LjE1MyAxLjMxOC0xLjMxNy05LjE1NC05LjE1NXpNMy41MiAxMi40NzNjLjUxNCAwIC45MzEuNDE3LjkzMS45MzF2LjkzMmguOTMyYS45MzIuOTMyIDAgMTEwIDEuODY0aC0uOTMydi45MzFhLjkzMi45MzIgMCAwMS0xLjg2MyAwbC0uMDAxLS45MzFoLS45M2EuOTMyLjkzMiAwIDAxMC0xLjg2NGguOTN2LS45MzJjMC0uNTE0LjQxOC0uOTMxLjkzMy0uOTMxem0xNS4zNzQtMy43MjdhMS4zOTggMS4zOTggMCAxMTAgMi43OTUgMS4zOTggMS4zOTggMCAwMTAtMi43OTV6TTQuMzg1IDQuOTUzYS45MzIuOTMyIDAgMDAwIDEuMzE3bDIuMDQ2IDIuMDQ3TDcuNzUgNyA1LjcwMyA0Ljk1M2EuOTMyLjkzMiAwIDAwLTEuMzE4IDB6TTE0LjcwMS4zNmEuOTMyLjkzMiAwIDAxLjkzMS45MzJ2LjkzMWguOTMyYS45MzIuOTMyIDAgMDEwIDEuODY0aC0uOTMzbC4wMDEuOTMyYS45MzIuOTMyIDAgMTEtMS44NjMgMGwtLjAwMS0uOTMyaC0uOTNhLjkzMi45MzIgMCAxMTAtMS44NjRoLjkzdi0uOTMxYS45MzIuOTMyIDAgMDEuOTMzLS45MzJ6XCJcbiAgICAgICAgICAgID48L3BhdGg+XG4gICAgICAgICAgPC9nPlxuICAgICAgICA8L2c+XG4gICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbiAgICA8bnotZHJvcGRvd24tbWVudSAjaWNvbk1lbnU9XCJuekRyb3Bkb3duTWVudVwiPlxuICAgICAgPHVsIG56LW1lbnU+XG4gICAgICAgIDxsaVxuICAgICAgICAgIG56LW1lbnUtaXRlbVxuICAgICAgICAgICpuZ0Zvcj1cImxldCB0aGVtZSBvZiB0eXBlc1wiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uVGhlbWVDaGFuZ2UodGhlbWUua2V5KVwiXG4gICAgICAgICAgW3N0eWxlXT1cInsgY29sb3I6IHRoZW1lLmNvbG9yIH1cIlxuICAgICAgICA+XG4gICAgICAgICAgPGkgbnotaWNvbiBuelR5cGU9XCJiZy1jb2xvcnNcIj48L2k+XG4gICAgICAgICAge3sgdGhlbWUudGV4dCB8IGkxOG4gfX1cbiAgICAgICAgPC9saT5cbiAgICAgIDwvdWw+XG4gICAgICA8IS0tICAgICAgPGRpdiBuei1tZW51IGNsYXNzPVwid2QteGwgYW5pbWF0ZWQgamVsbG9cIj4tLT5cbiAgICAgIDwhLS0gICAgICAgIDxkaXYgbnotcm93IFtuekp1c3RpZnldPVwiJ3NwYWNlLWJldHdlZW4nXCIgW256QWxpZ25dPVwiJ21pZGRsZSdcIiBjbGFzcz1cImFwcC1pY29uc1wiPi0tPlxuICAgICAgPCEtLSAgICAgICAgICA8ZGl2IG56LWNvbCBbbnpTcGFuXT1cIjRcIiAqbmdGb3I9XCJsZXQgdGhlbWUgb2YgdHlwZXNcIiAoY2xpY2spPVwib25UaGVtZUNoYW5nZSh0aGVtZS5rZXkpXCI+LS0+XG4gICAgICA8IS0tICAgICAgICAgICAgPGkgbnotaWNvbiBuelR5cGU9XCJiZy1jb2xvcnNcIiBjbGFzcz1cInRleHQtd2hpdGVcIiBbc3R5bGVdPVwieyBiYWNrZ3JvdW5kQ29sb3I6IHRoZW1lLmNvbG9yIH1cIj48L2k+LS0+XG4gICAgICA8IS0tICAgICAgICAgICAgPHNwYW4gW25nU3R5bGVdPVwieyBjb2xvcjogdGhlbWUuY29sb3IgfVwiPnt7IHRoZW1lLnRleHQgfCBpMThuIH19PC9zcGFuPi0tPlxuICAgICAgPCEtLSAgICAgICAgICA8L2Rpdj4tLT5cbiAgICAgIDwhLS0gICAgICAgIDwvZGl2Pi0tPlxuICAgICAgPCEtLSAgICAgIDwvZGl2Pi0tPlxuICAgIDwvbnotZHJvcGRvd24tbWVudT5cbiAgYCxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgWXpIZWFkZXJUaGVtQnRuQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHRoZW1lID0gJ2RlZmF1bHQnO1xuICBASW5wdXQoKSB0eXBlczogWXpUaGVtZUJ0blR5cGVbXSA9IFtcbiAgICB7IGtleTogJ2RlZmF1bHQnLCB0ZXh0OiAndGhlbWUuZGVmYXVsdCcsIGNvbG9yOiAnIzIxNjNmZicgfSxcbiAgICB7IGtleTogJ2NvbXBhY3QnLCB0ZXh0OiAndGhlbWUuY29tcGFjdCcsIGNvbG9yOiAnIzIxNjNmZicgfSxcbiAgICB7IGtleTogJ2RhcmsnLCB0ZXh0OiAndGhlbWUuZGFyaycsIGNvbG9yOiAnIzAyMDIwMicgfSxcbiAgICB7IGtleTogJ3l1aG9uZycsIHRleHQ6ICd0aGVtZS55dWhvbmcnLCBjb2xvcjogJyNDMDQ4NTEnIH0sXG4gICAgeyBrZXk6ICdkYW5qdWh1YW5nJywgdGV4dDogJ3RoZW1lLmRhbmp1aHVhbmcnLCBjb2xvcjogJyNGQkE0MTQnIH0sXG4gICAgeyBrZXk6ICd4aW5naHVhbmcnLCB0ZXh0OiAndGhlbWUueGluZ2h1YW5nJywgY29sb3I6ICcjRjI4RTE2JyB9LFxuICAgIHsga2V5OiAnc2hpbHYnLCB0ZXh0OiAndGhlbWUuc2hpbHYnLCBjb2xvcjogJyM1N0MzQzInIH0sXG4gICAgeyBrZXk6ICd6aHVsdicsIHRleHQ6ICd0aGVtZS56aHVsdicsIGNvbG9yOiAnIzFCQTc4NCcgfSxcbiAgICB7IGtleTogJ3lvdWxhbicsIHRleHQ6ICd0aGVtZS55b3VsYW4nLCBjb2xvcjogJyMxNzgxQjUnIH0sXG4gICAgeyBrZXk6ICdkaWFucWluZycsIHRleHQ6ICd0aGVtZS5kaWFucWluZycsIGNvbG9yOiAnIzE2NjFBQicgfSxcbiAgICB7IGtleTogJ3NoYW5nZW5nemknLCB0ZXh0OiAndGhlbWUuc2hhbmdlbmd6aScsIGNvbG9yOiAnIzYxNjQ5RicgfSxcbiAgICB7IGtleTogJ3NodWluaXVodWknLCB0ZXh0OiAndGhlbWUuc2h1aW5pdWh1aScsIGNvbG9yOiAnIzJGMkYzNScgfVxuICBdO1xuICBASW5wdXQoKSBkZXZUaXBzID0gYFdoZW4gdGhlIGRhcmsuY3NzIGZpbGUgY2FuJ3QgYmUgZm91bmQsIHlvdSBuZWVkIHRvIHJ1biBpdCBvbmNlOiBucG0gcnVuIHRoZW1lYDtcbiAgQElucHV0KCkgZGVwbG95VXJsID0gJyc7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBkaXI6IERpcmVjdGlvbiA9ICdsdHInO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGNvbmZpZ1NydjogWXVuemFpQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHBsYXRmb3JtOiBQbGF0Zm9ybSxcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvYzogTnpTYWZlQW55LFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZGlyZWN0aW9uYWxpdHk6IERpcmVjdGlvbmFsaXR5LFxuICAgIEBJbmplY3QoWVVOWkFJX1RIRU1FX0JUTl9LRVlTKSBwcml2YXRlIEtFWVM6IHN0cmluZ1xuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5kaXIgPSB0aGlzLmRpcmVjdGlvbmFsaXR5LnZhbHVlO1xuICAgIHRoaXMuZGlyZWN0aW9uYWxpdHkuY2hhbmdlPy5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChkaXJlY3Rpb246IERpcmVjdGlvbikgPT4ge1xuICAgICAgdGhpcy5kaXIgPSBkaXJlY3Rpb247XG4gICAgfSk7XG4gICAgdGhpcy5pbml0VGhlbWUoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFRoZW1lKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wbGF0Zm9ybS5pc0Jyb3dzZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50aGVtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuS0VZUykgfHwgJ2RlZmF1bHQnO1xuICAgIHRoaXMudXBkYXRlQ2hhcnRUaGVtZSgpO1xuICAgIHRoaXMub25UaGVtZUNoYW5nZSh0aGlzLnRoZW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ2hhcnRUaGVtZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZ1Nydi5zZXQoJ2NoYXJ0JywgeyB0aGVtZTogdGhpcy50aGVtZSA9PT0gJ2RhcmsnID8gJ2RhcmsnIDogJycgfSk7XG4gIH1cblxuICBvblRoZW1lQ2hhbmdlKHRoZW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGxhdGZvcm0uaXNCcm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudGhlbWUgPSB0aGVtZTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLmRvYy5ib2R5LCAnZGF0YS10aGVtZScsIHRoZW1lKTtcbiAgICBjb25zdCBkb20gPSB0aGlzLmRvYy5nZXRFbGVtZW50QnlJZCh0aGlzLktFWVMpO1xuICAgIGlmIChkb20pIHtcbiAgICAgIGRvbS5yZW1vdmUoKTtcbiAgICB9XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5LRVlTKTtcbiAgICBpZiAodGhlbWUgIT09ICdkZWZhdWx0Jykge1xuICAgICAgY29uc3QgZWwgPSB0aGlzLmRvYy5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICBlbC50eXBlID0gJ3RleHQvY3NzJztcbiAgICAgIGVsLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgIGVsLmlkID0gdGhpcy5LRVlTO1xuICAgICAgZWwuaHJlZiA9IGAke3RoaXMuZGVwbG95VXJsfWFzc2V0cy9zdHlsZS4ke3RoZW1lfS5jc3NgO1xuXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLktFWVMsIHRoZW1lKTtcbiAgICAgIHRoaXMuZG9jLmJvZHkuYXBwZW5kKGVsKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVDaGFydFRoZW1lKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IHRoaXMuZG9jLmdldEVsZW1lbnRCeUlkKHRoaXMuS0VZUyk7XG4gICAgaWYgKGVsICE9IG51bGwpIHtcbiAgICAgIHRoaXMuZG9jLmJvZHkucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIH1cbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { forkJoin, of, map, mergeAll, mergeMap } from 'rxjs';
|
|
3
|
-
import { mergeConfig as mergeAuthConfig, YA_SERVICE_TOKEN } from '@yelon/auth';
|
|
4
|
-
import { CacheService } from '@yelon/cache';
|
|
5
|
-
import { _HttpClient } from '@yelon/theme';
|
|
6
|
-
import { WINDOW } from '@yelon/util';
|
|
7
|
-
import { YunzaiConfigService } from '@yelon/util/config';
|
|
8
|
-
import { log } from '@yelon/util/other';
|
|
9
|
-
import { mergeBisConfig } from './bis.config';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
export class YzAuthService {
|
|
12
|
-
constructor(injector) {
|
|
13
|
-
this.injector = injector;
|
|
14
|
-
this.option = mergeAuthConfig(this.csr);
|
|
15
|
-
this.bis = mergeBisConfig(this.csr);
|
|
16
|
-
}
|
|
17
|
-
get csr() {
|
|
18
|
-
return this.injector.get(YunzaiConfigService);
|
|
19
|
-
}
|
|
20
|
-
get tokenService() {
|
|
21
|
-
return this.injector.get(YA_SERVICE_TOKEN);
|
|
22
|
-
}
|
|
23
|
-
get httpClient() {
|
|
24
|
-
return this.injector.get(_HttpClient);
|
|
25
|
-
}
|
|
26
|
-
get cacheService() {
|
|
27
|
-
return this.injector.get(CacheService);
|
|
28
|
-
}
|
|
29
|
-
askToken() {
|
|
30
|
-
log('yz.auth.service: ', 'askToken');
|
|
31
|
-
if (this.tokenService.get()?.token) {
|
|
32
|
-
return of(this.tokenService.get());
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
if (this.bis.loginForm) {
|
|
36
|
-
return this.fetchTokenByUP();
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
return this.fetchTokenByCas();
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
fetchTokenByUP() {
|
|
44
|
-
log('yz.auth.service: ', 'fetchTokenByUP');
|
|
45
|
-
return this.httpClient.post(`/auth/oauth/token?_allow_anonymous=true`, this.bis.loginForm).pipe(map((response) => {
|
|
46
|
-
const { access_token, expires_in, refresh_token, scope, token_type } = response;
|
|
47
|
-
return {
|
|
48
|
-
token: access_token,
|
|
49
|
-
expired: expires_in,
|
|
50
|
-
refreshToken: refresh_token,
|
|
51
|
-
tokenType: token_type,
|
|
52
|
-
scope
|
|
53
|
-
};
|
|
54
|
-
}));
|
|
55
|
-
}
|
|
56
|
-
fetchTokenByCas() {
|
|
57
|
-
log('yz.auth.service: ', 'fetchTokenByCas');
|
|
58
|
-
const uri = encodeURIComponent(this.injector.get(WINDOW).location.href);
|
|
59
|
-
return this.httpClient
|
|
60
|
-
.get(`/cas-proxy/app/validate_full?callback=${uri}&_allow_anonymous=true×tamp=${new Date().getTime()}`)
|
|
61
|
-
.pipe(map((response) => {
|
|
62
|
-
switch (response.errcode) {
|
|
63
|
-
case 2000:
|
|
64
|
-
const { access_token, expires_in, refresh_token, scope, token_type } = response.data;
|
|
65
|
-
return {
|
|
66
|
-
token: access_token,
|
|
67
|
-
expired: expires_in,
|
|
68
|
-
refreshToken: refresh_token,
|
|
69
|
-
tokenType: token_type,
|
|
70
|
-
scope
|
|
71
|
-
};
|
|
72
|
-
case 2001:
|
|
73
|
-
this.injector.get(WINDOW).location.href = response.msg;
|
|
74
|
-
throw Error("Cookie Error: Can't find Cas Cookie,So jump to login!");
|
|
75
|
-
default:
|
|
76
|
-
if (response.data) {
|
|
77
|
-
console.error(response.data);
|
|
78
|
-
throw Error(response.data);
|
|
79
|
-
}
|
|
80
|
-
else if (response.msg) {
|
|
81
|
-
console.error(response.msg);
|
|
82
|
-
throw Error(response.msg);
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
console.error('cas unknown error');
|
|
86
|
-
throw Error('Unknown Error: Cas auth exception!');
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}));
|
|
90
|
-
}
|
|
91
|
-
login() {
|
|
92
|
-
log('yz.auth.service: ', 'login white login form->', this.bis.loginForm);
|
|
93
|
-
return this.askToken().pipe(mergeMap(token => {
|
|
94
|
-
log('yz.auth.service: get token->', token);
|
|
95
|
-
this.csr.set('auth', {
|
|
96
|
-
token_send_key: 'Authorization',
|
|
97
|
-
token_send_template: `${token.tokenType} \${token}`,
|
|
98
|
-
token_send_place: 'header'
|
|
99
|
-
});
|
|
100
|
-
log('yz.auth.service: ', 'set token');
|
|
101
|
-
this.tokenService.set(token);
|
|
102
|
-
return this.cacheInit();
|
|
103
|
-
}), mergeAll());
|
|
104
|
-
}
|
|
105
|
-
cacheInit() {
|
|
106
|
-
log('yz.auth.service: ', 'cacheInit');
|
|
107
|
-
const user = this.cacheService.get('_yz_user', { mode: 'none' });
|
|
108
|
-
const header = this.cacheService.get('_yz_header', { mode: 'none' });
|
|
109
|
-
const project = this.cacheService.get('_yz_project_info', { mode: 'none' });
|
|
110
|
-
return forkJoin(of(user), of(header), of(project)).pipe(mergeMap(([u, h, p]) => {
|
|
111
|
-
let list = [];
|
|
112
|
-
// user cache
|
|
113
|
-
if (!u) {
|
|
114
|
-
log('yz.auth.service: ', 'fetch user cache');
|
|
115
|
-
list.push(this.httpClient.get(`/auth/user`).pipe(map((user) => {
|
|
116
|
-
this.cacheService.set('_yz_user', user.principal);
|
|
117
|
-
})));
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
log('yz.auth.service: ', 'user recache');
|
|
121
|
-
list.push(of(() => { }));
|
|
122
|
-
}
|
|
123
|
-
// header cache
|
|
124
|
-
if (!h) {
|
|
125
|
-
log('yz.auth.service: ', 'fetch header cache');
|
|
126
|
-
list.push(this.httpClient.get(`/auth/allheader/v2`).pipe(map((header) => {
|
|
127
|
-
this.cacheService.set('_yz_header', header.data);
|
|
128
|
-
})));
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
log('yz.auth.service: ', 'header recache');
|
|
132
|
-
list.push(of(() => { }));
|
|
133
|
-
}
|
|
134
|
-
// project cache
|
|
135
|
-
if (!p) {
|
|
136
|
-
log('yz.auth.service: ', 'fetch project cache');
|
|
137
|
-
list.push(this.httpClient.get(`/app-manager/project/info`).pipe(map((info) => {
|
|
138
|
-
this.cacheService.set('_yz_project_info', info.data);
|
|
139
|
-
})));
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
log('yz.auth.service: ', 'project recache');
|
|
143
|
-
list.push(of(() => { }));
|
|
144
|
-
}
|
|
145
|
-
return forkJoin(list);
|
|
146
|
-
}));
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
YzAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: YzAuthService, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
150
|
-
YzAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: YzAuthService, providedIn: 'root' });
|
|
151
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: YzAuthService, decorators: [{
|
|
152
|
-
type: Injectable,
|
|
153
|
-
args: [{ providedIn: 'root' }]
|
|
154
|
-
}], ctorParameters: function () { return [{ type: i0.Injector }]; } });
|
|
155
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieXouYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYmlzL2xheW91dC95ei5hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV6RSxPQUFPLEVBQThCLFdBQVcsSUFBSSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0csT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM1QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQTBDLE1BQU0sYUFBYSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUd4QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDOztBQUc5QyxNQUFNLE9BQU8sYUFBYTtJQUl4QixZQUFvQixRQUFrQjtRQUFsQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ3BDLElBQUksQ0FBQyxNQUFNLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQVksR0FBRztRQUNiLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsSUFBWSxZQUFZO1FBQ3RCLE9BQU8sSUFBSSxD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QztRQUN4QixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQzs7MkdBaktVLGFBQWE7K0dBQWIsYUFBYSxjQURBLE1BQU07NEZBQ25CLGFBQWE7a0JBRHpCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiwgbWFwLCBtZXJnZUFsbCwgbWVyZ2VNYXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgSVRva2VuTW9kZWwsIElUb2tlblNlcnZpY2UsIG1lcmdlQ29uZmlnIGFzIG1lcmdlQXV0aENvbmZpZywgWUFfU0VSVklDRV9UT0tFTiB9IGZyb20gJ0B5ZWxvbi9hdXRoJztcbmltcG9ydCB7IENhY2hlU2VydmljZSB9IGZyb20gJ0B5ZWxvbi9jYWNoZSc7XG5pbXBvcnQgeyBfSHR0cENsaWVudCB9IGZyb20gJ0B5ZWxvbi90aGVtZSc7XG5pbXBvcnQgeyBXSU5ET1csIFl1bnphaUF1dGhDb25maWcsIFl1bnphaUJ1c2luZXNzQ29uZmlnIH0gZnJvbSAnQHllbG9uL3V0aWwnO1xuaW1wb3J0IHsgWXVuemFpQ29uZmlnU2VydmljZSB9IGZyb20gJ0B5ZWxvbi91dGlsL2NvbmZpZyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICdAeWVsb24vdXRpbC9vdGhlcic7XG5pbXBvcnQgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuXG5pbXBvcnQgeyBtZXJnZUJpc0NvbmZpZyB9IGZyb20gJy4vYmlzLmNvbmZpZyc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgWXpBdXRoU2VydmljZSB7XG4gIHByb3RlY3RlZCBvcHRpb246IFl1bnphaUF1dGhDb25maWc7XG4gIHByb3RlY3RlZCBiaXM6IFl1bnphaUJ1c2luZXNzQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgdGhpcy5vcHRpb24gPSBtZXJnZUF1dGhDb25maWcodGhpcy5jc3IpO1xuICAgIHRoaXMuYmlzID0gbWVyZ2VCaXNDb25maWcodGhpcy5jc3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY3NyKCk6IFl1bnphaUNvbmZpZ1NlcnZpY2Uge1xuICAgIHJldHVybiB0aGlzLmluamVjdG9yLmdldChZdW56YWlDb25maWdTZXJ2aWNlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHRva2VuU2VydmljZSgpOiBJVG9rZW5TZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5nZXQoWUFfU0VSVklDRV9UT0tFTik7XG4gIH1cblxuICBwcml2YXRlIGdldCBodHRwQ2xpZW50KCk6IF9IdHRwQ2xpZW50IHtcbiAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5nZXQoX0h0dHBDbGllbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY2FjaGVTZXJ2aWNlKCk6IENhY2hlU2VydmljZSB7XG4gICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IuZ2V0KENhY2hlU2VydmljZSk7XG4gIH1cblxuICBhc2tUb2tlbigpOiBPYnNlcnZhYmxlPElUb2tlbk1vZGVsPiB7XG4gICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICdhc2tUb2tlbicpO1xuICAgIGlmICh0aGlzLnRva2VuU2VydmljZS5nZXQoKT8udG9rZW4pIHtcbiAgICAgIHJldHVybiBvZih0aGlzLnRva2VuU2VydmljZS5nZXQoKSEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5iaXMubG9naW5Gb3JtKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoVG9rZW5CeVVQKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaFRva2VuQnlDYXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmZXRjaFRva2VuQnlVUCgpOiBPYnNlcnZhYmxlPElUb2tlbk1vZGVsPiB7XG4gICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICdmZXRjaFRva2VuQnlVUCcpO1xuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdChgL2F1dGgvb2F1dGgvdG9rZW4/X2FsbG93X2Fub255bW91cz10cnVlYCwgdGhpcy5iaXMubG9naW5Gb3JtKS5waXBlKFxuICAgICAgbWFwKChyZXNwb25zZTogTnpTYWZlQW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgYWNjZXNzX3Rva2VuLCBleHBpcmVzX2luLCByZWZyZXNoX3Rva2VuLCBzY29wZSwgdG9rZW5fdHlwZSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9rZW46IGFjY2Vzc190b2tlbixcbiAgICAgICAgICBleHBpcmVkOiBleHBpcmVzX2luLFxuICAgICAgICAgIHJlZnJlc2hUb2tlbjogcmVmcmVzaF90b2tlbixcbiAgICAgICAgICB0b2tlblR5cGU6IHRva2VuX3R5cGUsXG4gICAgICAgICAgc2NvcGVcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGZldGNoVG9rZW5CeUNhcygpOiBPYnNlcnZhYmxlPElUb2tlbk1vZGVsPiB7XG4gICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICdmZXRjaFRva2VuQnlDYXMnKTtcbiAgICBjb25zdCB1cmkgPSBlbmNvZGVVUklDb21wb25lbnQodGhpcy5pbmplY3Rvci5nZXQoV0lORE9XKS5sb2NhdGlvbi5ocmVmKTtcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50XG4gICAgICAuZ2V0KGAvY2FzLXByb3h5L2FwcC92YWxpZGF0ZV9mdWxsP2NhbGxiYWNrPSR7dXJpfSZfYWxsb3dfYW5vbnltb3VzPXRydWUmdGltZXN0YW1wPSR7bmV3IERhdGUoKS5nZXRUaW1lKCl9YClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHJlc3BvbnNlOiBOelNhZmVBbnkpID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHJlc3BvbnNlLmVycmNvZGUpIHtcbiAgICAgICAgICAgIGNhc2UgMjAwMDpcbiAgICAgICAgICAgICAgY29uc3QgeyBhY2Nlc3NfdG9rZW4sIGV4cGlyZXNfaW4sIHJlZnJlc2hfdG9rZW4sIHNjb3BlLCB0b2tlbl90eXBlIH0gPSByZXNwb25zZS5kYXRhO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRva2VuOiBhY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgICAgICAgZXhwaXJlZDogZXhwaXJlc19pbixcbiAgICAgICAgICAgICAgICByZWZyZXNoVG9rZW46IHJlZnJlc2hfdG9rZW4sXG4gICAgICAgICAgICAgICAgdG9rZW5UeXBlOiB0b2tlbl90eXBlLFxuICAgICAgICAgICAgICAgIHNjb3BlXG4gICAgICAgICAgICAgIH0gYXMgSVRva2VuTW9kZWw7XG4gICAgICAgICAgICBjYXNlIDIwMDE6XG4gICAgICAgICAgICAgIHRoaXMuaW5qZWN0b3IuZ2V0KFdJTkRPVykubG9jYXRpb24uaHJlZiA9IHJlc3BvbnNlLm1zZztcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJDb29raWUgRXJyb3I6IENhbid0IGZpbmQgQ2FzIENvb2tpZSxTbyBqdW1wIHRvIGxvZ2luIVwiKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihyZXNwb25zZS5kYXRhKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5tc2cpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKHJlc3BvbnNlLm1zZyk7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IocmVzcG9uc2UubXNnKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdjYXMgdW5rbm93biBlcnJvcicpO1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdVbmtub3duIEVycm9yOiBDYXMgYXV0aCBleGNlcHRpb24hJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgbG9naW4oKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICdsb2dpbiB3aGl0ZSBsb2dpbiBmb3JtLT4nLCB0aGlzLmJpcy5sb2dpbkZvcm0pO1xuICAgIHJldHVybiB0aGlzLmFza1Rva2VuKCkucGlwZShcbiAgICAgIG1lcmdlTWFwKHRva2VuID0+IHtcbiAgICAgICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6IGdldCB0b2tlbi0+JywgdG9rZW4pO1xuICAgICAgICB0aGlzLmNzci5zZXQoJ2F1dGgnLCB7XG4gICAgICAgICAgdG9rZW5fc2VuZF9rZXk6ICdBdXRob3JpemF0aW9uJyxcbiAgICAgICAgICB0b2tlbl9zZW5kX3RlbXBsYXRlOiBgJHt0b2tlbi50b2tlblR5cGV9IFxcJHt0b2tlbn1gLFxuICAgICAgICAgIHRva2VuX3NlbmRfcGxhY2U6ICdoZWFkZXInXG4gICAgICAgIH0pO1xuICAgICAgICBsb2coJ3l6LmF1dGguc2VydmljZTogJywgJ3NldCB0b2tlbicpO1xuICAgICAgICB0aGlzLnRva2VuU2VydmljZS5zZXQodG9rZW4pO1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZUluaXQoKTtcbiAgICAgIH0pLFxuICAgICAgbWVyZ2VBbGwoKVxuICAgICk7XG4gIH1cblxuICBjYWNoZUluaXQoKTogT2JzZXJ2YWJsZTx2b2lkW10+IHtcbiAgICBsb2coJ3l6LmF1dGguc2VydmljZTogJywgJ2NhY2hlSW5pdCcpO1xuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmNhY2hlU2VydmljZS5nZXQoJ195el91c2VyJywgeyBtb2RlOiAnbm9uZScgfSk7XG4gICAgY29uc3QgaGVhZGVyID0gdGhpcy5jYWNoZVNlcnZpY2UuZ2V0KCdfeXpfaGVhZGVyJywgeyBtb2RlOiAnbm9uZScgfSk7XG4gICAgY29uc3QgcHJvamVjdCA9IHRoaXMuY2FjaGVTZXJ2aWNlLmdldCgnX3l6X3Byb2plY3RfaW5mbycsIHsgbW9kZTogJ25vbmUnIH0pO1xuICAgIHJldHVybiBmb3JrSm9pbihvZih1c2VyKSwgb2YoaGVhZGVyKSwgb2YocHJvamVjdCkpLnBpcGUoXG4gICAgICBtZXJnZU1hcCgoW3UsIGgsIHBdKSA9PiB7XG4gICAgICAgIGxldCBsaXN0ID0gW107XG4gICAgICAgIC8vIHVzZXIgY2FjaGVcbiAgICAgICAgaWYgKCF1KSB7XG4gICAgICAgICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICdmZXRjaCB1c2VyIGNhY2hlJyk7XG4gICAgICAgICAgbGlzdC5wdXNoKFxuICAgICAgICAgICAgdGhpcy5odHRwQ2xpZW50LmdldChgL2F1dGgvdXNlcmApLnBpcGUoXG4gICAgICAgICAgICAgIG1hcCgodXNlcjogTnpTYWZlQW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVNlcnZpY2Uuc2V0KCdfeXpfdXNlcicsIHVzZXIucHJpbmNpcGFsKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZygneXouYXV0aC5zZXJ2aWNlOiAnLCAndXNlciByZWNhY2hlJyk7XG4gICAgICAgICAgbGlzdC5wdXNoKG9mPE56U2FmZUFueT4oKCkgPT4ge30pKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBoZWFkZXIgY2FjaGVcbiAgICAgICAgaWYgKCFoKSB7XG4gICAgICAgICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICdmZXRjaCBoZWFkZXIgY2FjaGUnKTtcbiAgICAgICAgICBsaXN0LnB1c2goXG4gICAgICAgICAgICB0aGlzLmh0dHBDbGllbnQuZ2V0KGAvYXV0aC9hbGxoZWFkZXIvdjJgKS5waXBlKFxuICAgICAgICAgICAgICBtYXAoKGhlYWRlcjogTnpTYWZlQW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWNoZVNlcnZpY2Uuc2V0KCdfeXpfaGVhZGVyJywgaGVhZGVyLmRhdGEpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICdoZWFkZXIgcmVjYWNoZScpO1xuICAgICAgICAgIGxpc3QucHVzaChvZjxOelNhZmVBbnk+KCgpID0+IHt9KSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcHJvamVjdCBjYWNoZVxuICAgICAgICBpZiAoIXApIHtcbiAgICAgICAgICBsb2coJ3l6LmF1dGguc2VydmljZTogJywgJ2ZldGNoIHByb2plY3QgY2FjaGUnKTtcbiAgICAgICAgICBsaXN0LnB1c2goXG4gICAgICAgICAgICB0aGlzLmh0dHBDbGllbnQuZ2V0KGAvYXBwLW1hbmFnZXIvcHJvamVjdC9pbmZvYCkucGlwZShcbiAgICAgICAgICAgICAgbWFwKChpbmZvOiBOelNhZmVBbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlU2VydmljZS5zZXQoJ195el9wcm9qZWN0X2luZm8nLCBpbmZvLmRhdGEpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nKCd5ei5hdXRoLnNlcnZpY2U6ICcsICdwcm9qZWN0IHJlY2FjaGUnKTtcbiAgICAgICAgICBsaXN0LnB1c2gob2Y8TnpTYWZlQW55PigoKSA9PiB7fSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JrSm9pbihsaXN0KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIl19
|