design-angular-kit 1.0.0-1 → 1.0.0-2
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 +152 -18
- package/assets/i18n/it.json +81 -0
- package/esm2020/lib/abstracts/abstract-form-component.mjs +165 -0
- package/esm2020/lib/abstracts/abstract.component.mjs +20 -0
- package/esm2020/lib/components/core/accordion/accordion.component.mjs +20 -0
- package/esm2020/lib/components/core/alert/alert.component.mjs +29 -0
- package/esm2020/lib/components/core/badge/badge.directive.mjs +34 -0
- package/esm2020/lib/components/core/button/button.directive.mjs +78 -0
- package/esm2020/lib/components/core/callout/callout.component.mjs +59 -0
- package/esm2020/lib/components/core/card/card.component.mjs +58 -0
- package/esm2020/lib/components/core/carousel/carousel/carousel.component.mjs +66 -0
- package/esm2020/lib/components/core/carousel/carousel-item/carousel-item.component.mjs +14 -0
- package/esm2020/lib/components/core/chip/chip.component.mjs +89 -0
- package/esm2020/lib/components/core/collapse/collapse.component.mjs +96 -0
- package/esm2020/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.mjs +24 -0
- package/esm2020/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.mjs +11 -0
- package/esm2020/lib/components/core/dimmer/dimmer.component.mjs +59 -0
- package/esm2020/lib/components/core/dropdown/dropdown/dropdown.component.mjs +60 -0
- package/esm2020/lib/components/core/dropdown/dropdown-item/dropdown-item.component.mjs +71 -0
- package/esm2020/lib/components/core/forward/forward.directive.mjs +51 -0
- package/esm2020/lib/components/core/link/link.component.mjs +39 -0
- package/esm2020/lib/components/core/list/list/list.component.mjs +13 -0
- package/esm2020/lib/components/core/list/list-item/list-item.component.mjs +36 -0
- package/esm2020/lib/components/core/modal/modal.component.mjs +98 -0
- package/esm2020/lib/components/core/notifications/notifications.component.mjs +66 -0
- package/esm2020/lib/components/core/pagination/pagination.component.mjs +51 -0
- package/esm2020/lib/components/core/popover/popover.directive.mjs +176 -0
- package/esm2020/lib/components/core/progress-bar/progress-bar.component.mjs +34 -0
- package/esm2020/lib/components/core/progress-button/progress-button.component.mjs +27 -0
- package/esm2020/lib/components/core/spinner/spinner.component.mjs +35 -0
- package/esm2020/lib/components/core/tab/tab-container/tab-container.component.mjs +33 -0
- package/esm2020/lib/components/core/tab/tab-item/tab-item.component.mjs +36 -0
- package/esm2020/lib/components/core/table/table.component.mjs +57 -0
- package/esm2020/lib/components/core/tooltip/tooltip.directive.mjs +140 -0
- package/esm2020/lib/components/form/checkbox/checkbox.component.mjs +40 -0
- package/esm2020/lib/components/form/input/input.component.mjs +159 -0
- package/esm2020/lib/components/form/password-input/password-input.component.mjs +112 -0
- package/esm2020/lib/components/form/radio-button/radio-button.component.mjs +53 -0
- package/esm2020/lib/components/form/select/select.component.mjs +62 -0
- package/esm2020/lib/components/form/textarea/textarea.component.mjs +46 -0
- package/esm2020/lib/components/form/upload-drag-drop/upload-drag-drop.component.mjs +134 -0
- package/esm2020/lib/components/form/upload-file-list/upload-file-list.component.mjs +99 -0
- package/esm2020/lib/components/navigation/back-button/back-button.component.mjs +69 -0
- package/esm2020/lib/components/navigation/back-to-top/back-to-top.component.mjs +39 -0
- package/esm2020/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.mjs +45 -0
- package/esm2020/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.mjs +23 -0
- package/esm2020/lib/components/navigation/header/header.component.mjs +61 -0
- package/esm2020/lib/components/utils/icon/icon.component.mjs +54 -0
- package/esm2020/lib/components/utils/not-found-page/not-found-page.component.mjs +13 -0
- package/esm2020/lib/design-angular-kit.module.mjs +32 -132
- package/esm2020/lib/interfaces/core.mjs +16 -0
- package/esm2020/lib/interfaces/form.mjs +2 -0
- package/esm2020/lib/interfaces/icon.mjs +2 -0
- package/esm2020/lib/modules/components.module.mjs +241 -0
- package/esm2020/lib/services/notifications/notifications.service.mjs +122 -0
- package/esm2020/lib/utils/boolean-input.mjs +15 -0
- package/esm2020/lib/utils/file-utils.mjs +65 -0
- package/esm2020/lib/utils/regex.mjs +26 -0
- package/esm2020/lib/validators/it-validators.mjs +131 -0
- package/esm2020/public_api.mjs +60 -36
- package/fesm2015/design-angular-kit.mjs +2750 -2660
- package/fesm2015/design-angular-kit.mjs.map +1 -1
- package/fesm2020/design-angular-kit.mjs +2726 -2655
- package/fesm2020/design-angular-kit.mjs.map +1 -1
- package/lib/abstracts/abstract-form-component.d.ts +84 -0
- package/lib/abstracts/abstract.component.d.ts +14 -0
- package/lib/components/core/accordion/accordion.component.d.ts +16 -0
- package/lib/components/core/alert/alert.component.d.ts +17 -0
- package/lib/components/core/badge/badge.directive.d.ts +16 -0
- package/lib/components/core/button/button.directive.d.ts +38 -0
- package/lib/components/core/callout/callout.component.d.ts +36 -0
- package/lib/components/core/card/card.component.d.ts +41 -0
- package/lib/components/core/carousel/carousel/carousel.component.d.ts +46 -0
- package/lib/components/core/carousel/carousel-item/carousel-item.component.d.ts +10 -0
- package/lib/components/core/chip/chip.component.d.ts +62 -0
- package/lib/components/core/collapse/collapse.component.d.ts +59 -0
- package/lib/components/core/dimmer/dimmer-buttons/dimmer-buttons.component.d.ts +12 -0
- package/lib/components/core/dimmer/dimmer-icon/dimmer-icon.component.d.ts +5 -0
- package/lib/components/core/dimmer/dimmer.component.d.ts +24 -0
- package/lib/components/core/dropdown/dropdown/dropdown.component.d.ts +43 -0
- package/lib/components/core/dropdown/dropdown-item/dropdown-item.component.d.ts +44 -0
- package/lib/components/core/forward/forward.directive.d.ts +14 -0
- package/lib/components/core/link/link.component.d.ts +34 -0
- package/lib/components/core/list/list/list.component.d.ts +10 -0
- package/lib/components/core/list/list-item/list-item.component.d.ts +24 -0
- package/lib/components/core/modal/modal.component.d.ts +59 -0
- package/lib/components/core/notifications/notifications.component.d.ts +30 -0
- package/lib/components/core/pagination/pagination.component.d.ts +31 -0
- package/lib/components/core/popover/popover.directive.d.ts +97 -0
- package/lib/components/core/progress-bar/progress-bar.component.d.ts +28 -0
- package/lib/components/core/progress-button/progress-button.component.d.ts +22 -0
- package/lib/components/core/spinner/spinner.component.d.ts +21 -0
- package/lib/components/core/tab/tab-container/tab-container.component.d.ts +28 -0
- package/lib/components/core/tab/tab-item/tab-item.component.d.ts +34 -0
- package/lib/components/core/table/table.component.d.ts +54 -0
- package/lib/components/core/tooltip/tooltip.directive.d.ts +80 -0
- package/lib/components/form/checkbox/checkbox.component.d.ts +30 -0
- package/lib/components/form/input/input.component.d.ts +66 -0
- package/lib/components/form/password-input/password-input.component.d.ts +54 -0
- package/lib/components/form/radio-button/radio-button.component.d.ts +29 -0
- package/lib/components/form/select/select.component.d.ts +30 -0
- package/lib/components/form/textarea/textarea.component.d.ts +24 -0
- package/lib/components/form/upload-drag-drop/upload-drag-drop.component.d.ts +53 -0
- package/lib/components/form/upload-file-list/upload-file-list.component.d.ts +57 -0
- package/lib/components/navigation/back-button/back-button.component.d.ts +47 -0
- package/lib/components/navigation/back-to-top/back-to-top.component.d.ts +27 -0
- package/lib/components/navigation/breadcrumbs/breadcrumb/breadcrumb.component.d.ts +30 -0
- package/lib/components/navigation/breadcrumbs/breadcrumb-item/breadcrumb-item.component.d.ts +22 -0
- package/lib/components/navigation/header/header.component.d.ts +28 -0
- package/lib/components/utils/icon/icon.component.d.ts +40 -0
- package/lib/components/utils/not-found-page/not-found-page.component.d.ts +5 -0
- package/lib/design-angular-kit.module.d.ts +4 -24
- package/lib/interfaces/core.d.ts +36 -0
- package/lib/interfaces/form.d.ts +43 -0
- package/lib/interfaces/icon.d.ts +3 -0
- package/lib/modules/components.module.d.ts +57 -0
- package/lib/services/notifications/notifications.service.d.ts +63 -0
- package/lib/utils/boolean-input.d.ts +11 -0
- package/lib/utils/file-utils.d.ts +27 -0
- package/lib/utils/regex.d.ts +25 -0
- package/lib/validators/it-validators.d.ts +58 -0
- package/package.json +20 -13
- package/public_api.d.ts +53 -35
- package/esm2020/lib/badge/badge.directive.mjs +0 -83
- package/esm2020/lib/breadcrumb/breadcrumb-item.component.mjs +0 -66
- package/esm2020/lib/breadcrumb/breadcrumb.component.mjs +0 -89
- package/esm2020/lib/button/button.directive.mjs +0 -185
- package/esm2020/lib/button/button.module.mjs +0 -18
- package/esm2020/lib/checkbox/checkbox.component.mjs +0 -138
- package/esm2020/lib/collapse/collapse-group.component.mjs +0 -57
- package/esm2020/lib/collapse/collapse-item.component.mjs +0 -79
- package/esm2020/lib/collapse/collapse.config.mjs +0 -12
- package/esm2020/lib/collapse/collapse.directive.mjs +0 -55
- package/esm2020/lib/collapse/collapse.module.mjs +0 -22
- package/esm2020/lib/dropdown/dropdown-divider.component.mjs +0 -11
- package/esm2020/lib/dropdown/dropdown-item.component.mjs +0 -97
- package/esm2020/lib/dropdown/dropdown.component.mjs +0 -143
- package/esm2020/lib/dropdown/dropdown.config.mjs +0 -12
- package/esm2020/lib/dropdown/dropdown.directive.mjs +0 -156
- package/esm2020/lib/dropdown/dropdown.module.mjs +0 -25
- package/esm2020/lib/enums/icons.enum.mjs +0 -27
- package/esm2020/lib/form-input/form-input-password.utils.mjs +0 -154
- package/esm2020/lib/form-input/form-input.component.mjs +0 -495
- package/esm2020/lib/form-input/it-prefix.directive.mjs +0 -13
- package/esm2020/lib/form-input/it-suffix.directive.mjs +0 -13
- package/esm2020/lib/form-input/it-text-prefix.directive.mjs +0 -13
- package/esm2020/lib/form-input/it-text-suffix.directive.mjs +0 -13
- package/esm2020/lib/form-input/mark-matching-text.pipe.mjs +0 -36
- package/esm2020/lib/icon/icon.component.mjs +0 -87
- package/esm2020/lib/icon/icon.module.mjs +0 -18
- package/esm2020/lib/models/Alignment.mjs +0 -15
- package/esm2020/lib/models/ButtonSize.mjs +0 -15
- package/esm2020/lib/models/InputType.mjs +0 -44
- package/esm2020/lib/models/ThemeColor.mjs +0 -30
- package/esm2020/lib/popover/popover.config.mjs +0 -17
- package/esm2020/lib/popover/popover.directive.mjs +0 -33
- package/esm2020/lib/popover/popover.module.mjs +0 -19
- package/esm2020/lib/progress-bar/progress-bar.component.mjs +0 -98
- package/esm2020/lib/radio/radio.component.mjs +0 -287
- package/esm2020/lib/radio/unique-selection-dispatcher.mjs +0 -55
- package/esm2020/lib/tabs/tab-group.component.mjs +0 -177
- package/esm2020/lib/tabs/tab.component.mjs +0 -73
- package/esm2020/lib/tabs/tabs.module.mjs +0 -20
- package/esm2020/lib/toggle/toggle.component.mjs +0 -86
- package/esm2020/lib/tooltip/tooltip.config.mjs +0 -17
- package/esm2020/lib/tooltip/tooltip.directive.mjs +0 -43
- package/esm2020/lib/tooltip/tooltip.module.mjs +0 -19
- package/esm2020/lib/util/focus-mouse.directive.mjs +0 -32
- package/esm2020/lib/util/util.mjs +0 -12
- package/esm2020/lib/util/utils.module.mjs +0 -16
- package/lib/badge/badge.directive.d.ts +0 -33
- package/lib/breadcrumb/breadcrumb-item.component.d.ts +0 -33
- package/lib/breadcrumb/breadcrumb.component.d.ts +0 -33
- package/lib/button/button.directive.d.ts +0 -72
- package/lib/button/button.module.d.ts +0 -8
- package/lib/checkbox/checkbox.component.d.ts +0 -61
- package/lib/collapse/collapse-group.component.d.ts +0 -16
- package/lib/collapse/collapse-item.component.d.ts +0 -46
- package/lib/collapse/collapse.config.d.ts +0 -6
- package/lib/collapse/collapse.directive.d.ts +0 -25
- package/lib/collapse/collapse.module.d.ts +0 -12
- package/lib/dropdown/dropdown-divider.component.d.ts +0 -5
- package/lib/dropdown/dropdown-item.component.d.ts +0 -56
- package/lib/dropdown/dropdown.component.d.ts +0 -65
- package/lib/dropdown/dropdown.config.d.ts +0 -6
- package/lib/dropdown/dropdown.directive.d.ts +0 -77
- package/lib/dropdown/dropdown.module.d.ts +0 -15
- package/lib/enums/icons.enum.d.ts +0 -23
- package/lib/form-input/form-input-password.utils.d.ts +0 -45
- package/lib/form-input/form-input.component.d.ts +0 -283
- package/lib/form-input/it-prefix.directive.d.ts +0 -5
- package/lib/form-input/it-suffix.directive.d.ts +0 -5
- package/lib/form-input/it-text-prefix.directive.d.ts +0 -5
- package/lib/form-input/it-text-suffix.directive.d.ts +0 -5
- package/lib/form-input/mark-matching-text.pipe.d.ts +0 -10
- package/lib/icon/icon.component.d.ts +0 -34
- package/lib/icon/icon.module.d.ts +0 -8
- package/lib/models/Alignment.d.ts +0 -12
- package/lib/models/ButtonSize.d.ts +0 -11
- package/lib/models/InputType.d.ts +0 -36
- package/lib/models/ThemeColor.d.ts +0 -21
- package/lib/popover/popover.config.d.ts +0 -11
- package/lib/popover/popover.directive.d.ts +0 -20
- package/lib/popover/popover.module.d.ts +0 -9
- package/lib/progress-bar/progress-bar.component.d.ts +0 -55
- package/lib/radio/radio.component.d.ts +0 -116
- package/lib/radio/unique-selection-dispatcher.d.ts +0 -36
- package/lib/tabs/tab-group.component.d.ts +0 -71
- package/lib/tabs/tab.component.d.ts +0 -44
- package/lib/tabs/tabs.module.d.ts +0 -10
- package/lib/toggle/toggle.component.d.ts +0 -46
- package/lib/tooltip/tooltip.config.d.ts +0 -11
- package/lib/tooltip/tooltip.directive.d.ts +0 -27
- package/lib/tooltip/tooltip.module.d.ts +0 -9
- package/lib/util/focus-mouse.directive.d.ts +0 -13
- package/lib/util/util.d.ts +0 -5
- package/lib/util/utils.module.d.ts +0 -7
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Classe di utility creata sulla base del seguente sorgente di bootstrap-italia: https://github.com/italia/bootstrap-italia/blob/main/src/js/plugins/input-password.js
|
|
3
|
-
* TODO: Da sostituire una volta che i metodi scoreText, scoreColor, e calculateScore
|
|
4
|
-
* saranno importabili dalla libreria bootstrap-italia.
|
|
5
|
-
*/
|
|
6
|
-
export class FormInputPasswordUtils {
|
|
7
|
-
constructor(_config) {
|
|
8
|
-
this._config = _config;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Returns a value between -1 and 100 to score
|
|
12
|
-
* the user's password.
|
|
13
|
-
*
|
|
14
|
-
* @param string password The password to be checked.
|
|
15
|
-
* @return int
|
|
16
|
-
*/
|
|
17
|
-
calculateScore(password) {
|
|
18
|
-
var score = 0;
|
|
19
|
-
// empty password
|
|
20
|
-
if (password.trim().length === 0) {
|
|
21
|
-
return -2;
|
|
22
|
-
}
|
|
23
|
-
// password < this._config.minimumLength
|
|
24
|
-
if (password.length < this._config.minimumLength) {
|
|
25
|
-
return -1;
|
|
26
|
-
}
|
|
27
|
-
// password length
|
|
28
|
-
score += password.length * 4;
|
|
29
|
-
score += this._checkRepetition(1, password).length - password.length;
|
|
30
|
-
score += this._checkRepetition(2, password).length - password.length;
|
|
31
|
-
score += this._checkRepetition(3, password).length - password.length;
|
|
32
|
-
score += this._checkRepetition(4, password).length - password.length;
|
|
33
|
-
// password has 3 numbers
|
|
34
|
-
if (password.match(/(.*[0-9].*[0-9].*[0-9])/)) {
|
|
35
|
-
score += 5;
|
|
36
|
-
}
|
|
37
|
-
// password has at least 2 sybols
|
|
38
|
-
let symbols = '.*[!,@,#,$,%,^,&,*,?,_,~]';
|
|
39
|
-
symbols = new RegExp('(' + symbols + symbols + ')');
|
|
40
|
-
if (password.match(symbols)) {
|
|
41
|
-
score += 5;
|
|
42
|
-
}
|
|
43
|
-
// password has Upper and Lower chars
|
|
44
|
-
if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/)) {
|
|
45
|
-
score += 10;
|
|
46
|
-
}
|
|
47
|
-
// password has number and chars
|
|
48
|
-
if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/)) {
|
|
49
|
-
score += 15;
|
|
50
|
-
}
|
|
51
|
-
// password has number and symbol
|
|
52
|
-
if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([0-9])/)) {
|
|
53
|
-
score += 15;
|
|
54
|
-
}
|
|
55
|
-
// password has char and symbol
|
|
56
|
-
if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([a-zA-Z])/)) {
|
|
57
|
-
score += 15;
|
|
58
|
-
}
|
|
59
|
-
// password is just numbers or chars
|
|
60
|
-
if (password.match(/^\w+$/) || password.match(/^\d+$/)) {
|
|
61
|
-
score -= 10;
|
|
62
|
-
}
|
|
63
|
-
if (score > 100) {
|
|
64
|
-
score = 100;
|
|
65
|
-
}
|
|
66
|
-
if (score < 0) {
|
|
67
|
-
score = 0;
|
|
68
|
-
}
|
|
69
|
-
return score;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Checks for repetition of characters in
|
|
73
|
-
* a string
|
|
74
|
-
*
|
|
75
|
-
* @param int rLen Repetition length.
|
|
76
|
-
* @param string str The string to be checked.
|
|
77
|
-
* @return string
|
|
78
|
-
*/
|
|
79
|
-
_checkRepetition(rLen, str) {
|
|
80
|
-
var res = '', repeated = false;
|
|
81
|
-
for (var i = 0; i < str.length; i++) {
|
|
82
|
-
repeated = true;
|
|
83
|
-
for (var j = 0; j < rLen && j + i + rLen < str.length; j++) {
|
|
84
|
-
repeated = repeated && str.charAt(j + i) === str.charAt(j + i + rLen);
|
|
85
|
-
}
|
|
86
|
-
if (j < rLen) {
|
|
87
|
-
repeated = false;
|
|
88
|
-
}
|
|
89
|
-
if (repeated) {
|
|
90
|
-
i += rLen - 1;
|
|
91
|
-
repeated = false;
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
res += str.charAt(i);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return res;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Returns strings based on the score given.
|
|
101
|
-
*
|
|
102
|
-
* @param int score Score base.
|
|
103
|
-
* @return string
|
|
104
|
-
*/
|
|
105
|
-
scoreText(score) {
|
|
106
|
-
if (score === -1) {
|
|
107
|
-
return this._config.shortPass;
|
|
108
|
-
}
|
|
109
|
-
else if (score === -2) {
|
|
110
|
-
return this._config.enterPass;
|
|
111
|
-
}
|
|
112
|
-
score = score < 0 ? 0 : score;
|
|
113
|
-
if (score < 26) {
|
|
114
|
-
return this._config.shortPass;
|
|
115
|
-
}
|
|
116
|
-
if (score < 51) {
|
|
117
|
-
return this._config.badPass;
|
|
118
|
-
}
|
|
119
|
-
if (score < 76) {
|
|
120
|
-
return this._config.goodPass;
|
|
121
|
-
}
|
|
122
|
-
return this._config.strongPass;
|
|
123
|
-
}
|
|
124
|
-
scoreColor(score) {
|
|
125
|
-
if (score === -1) {
|
|
126
|
-
return 'danger';
|
|
127
|
-
}
|
|
128
|
-
if (score === -2) {
|
|
129
|
-
return 'muted';
|
|
130
|
-
}
|
|
131
|
-
score = score < 0 ? 0 : score;
|
|
132
|
-
if (score < 26) {
|
|
133
|
-
return 'danger';
|
|
134
|
-
}
|
|
135
|
-
if (score < 51) {
|
|
136
|
-
return 'warning';
|
|
137
|
-
}
|
|
138
|
-
if (score < 76) {
|
|
139
|
-
return 'success';
|
|
140
|
-
}
|
|
141
|
-
return 'success';
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
FormInputPasswordUtils.DEFAULT_CONFIG = {
|
|
145
|
-
shortPass: 'Password molto debole',
|
|
146
|
-
badPass: 'Password debole',
|
|
147
|
-
goodPass: 'Password sicura',
|
|
148
|
-
strongPass: 'Password molto sicura',
|
|
149
|
-
enterPass: 'Inserisci almeno 8 caratteri e una lettera maiuscola',
|
|
150
|
-
alertCaps: 'CAPS LOCK inserito',
|
|
151
|
-
showText: true,
|
|
152
|
-
minimumLength: 4,
|
|
153
|
-
};
|
|
154
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1pbnB1dC1wYXNzd29yZC51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbi1hbmd1bGFyLWtpdC9zcmMvbGliL2Zvcm0taW5wdXQvZm9ybS1pbnB1dC1wYXNzd29yZC51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLHNCQUFzQjtJQWFqQyxZQUFvQixPQUFvQztRQUFwQyxZQUFPLEdBQVAsT0FBTyxDQUE2QjtJQUFHLENBQUM7SUFFMUQ7Ozs7OztLQU1DO0lBQ0ksY0FBYyxDQUFDLFFBQWdCO1FBQ3BDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQTtRQUViLGlCQUFpQjtRQUNqQixJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2hDLE9BQU8sQ0FBQyxDQUFDLENBQUE7U0FDVjtRQUVELHdDQUF3QztRQUN4QyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUU7WUFDaEQsT0FBTyxDQUFDLENBQUMsQ0FBQTtTQUNWO1FBRUQsa0JBQWtCO1FBQ2xCLEtBQUssSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQTtRQUM1QixLQUFLLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQTtRQUNwRSxLQUFLLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQTtRQUNwRSxLQUFLLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQTtRQUNwRSxLQUFLLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQTtRQUVwRSx5QkFBeUI7UUFDekIsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLHlCQUF5QixDQUFDLEVBQUU7WUFDN0MsS0FBSyxJQUFJLENBQUMsQ0FBQTtTQUNYO1FBRUQsaUNBQWlDO1FBQ2pDLElBQUksT0FBTyxHQUFvQiwyQkFBMkIsQ0FBQztRQUMzRCxPQUFPLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLE9BQU8sR0FBRyxPQUFPLEdBQUcsR0FBRyxDQUFDLENBQUE7UUFDbkQsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzNCLEtBQUssSUFBSSxDQUFDLENBQUE7U0FDWDtRQUVELHFDQUFxQztRQUNyQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsK0JBQStCLENBQUMsRUFBRTtZQUNuRCxLQUFLLElBQUksRUFBRSxDQUFBO1NBQ1o7UUFFRCxnQ0FBZ0M7UUFDaEMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDN0QsS0FBSyxJQUFJLEVBQUUsQ0FBQTtTQUNaO1FBRUQsaUNBQWlDO1FBQ2pDLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDNUUsS0FBSyxJQUFJLEVBQUUsQ0FBQTtTQUNaO1FBRUQsK0JBQStCO1FBQy9CLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDL0UsS0FBSyxJQUFJLEVBQUUsQ0FBQTtTQUNaO1FBRUQsb0NBQW9DO1FBQ3BDLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3RELEtBQUssSUFBSSxFQUFFLENBQUE7U0FDWjtRQUVELElBQUksS0FBSyxHQUFHLEdBQUcsRUFBRTtZQUNmLEtBQUssR0FBRyxHQUFHLENBQUE7U0FDWjtRQUVELElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtZQUNiLEtBQUssR0FBRyxDQUFDLENBQUE7U0FDVjtRQUVELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsR0FBRztRQUNoQyxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQ1YsUUFBUSxHQUFHLEtBQUssQ0FBQTtRQUNsQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNuQyxRQUFRLEdBQUcsSUFBSSxDQUFBO1lBQ2YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMxRCxRQUFRLEdBQUcsUUFBUSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQTthQUN0RTtZQUNELElBQUksQ0FBQyxHQUFHLElBQUksRUFBRTtnQkFDWixRQUFRLEdBQUcsS0FBSyxDQUFBO2FBQ2pCO1lBQ0QsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUE7Z0JBQ2IsUUFBUSxHQUFHLEtBQUssQ0FBQTthQUNqQjtpQkFBTTtnQkFDTCxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQTthQUNyQjtTQUNGO1FBQ0QsT0FBTyxHQUFHLENBQUE7SUFDWixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxTQUFTLENBQUMsS0FBSztRQUVyQixJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNoQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1NBQy9CO2FBQU0sSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDdkIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztTQUMvQjtRQUVELEtBQUssR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtRQUU3QixJQUFJLEtBQUssR0FBRyxFQUFFLEVBQUU7WUFDZCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFBO1NBQzlCO1FBQ0QsSUFBSSxLQUFLLEdBQUcsRUFBRSxFQUFFO1lBQ2QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQTtTQUM1QjtRQUNELElBQUksS0FBSyxHQUFHLEVBQUUsRUFBRTtZQUNkLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUE7U0FDN0I7UUFFRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFBO0lBQ2hDLENBQUM7SUFFTSxVQUFVLENBQUMsS0FBSztRQUNyQixJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNoQixPQUFPLFFBQVEsQ0FBQTtTQUNoQjtRQUNELElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ2hCLE9BQU8sT0FBTyxDQUFBO1NBQ2Y7UUFFRCxLQUFLLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7UUFFN0IsSUFBSSxLQUFLLEdBQUcsRUFBRSxFQUFFO1lBQ2QsT0FBTyxRQUFRLENBQUE7U0FDaEI7UUFDRCxJQUFJLEtBQUssR0FBRyxFQUFFLEVBQUU7WUFDZCxPQUFPLFNBQVMsQ0FBQTtTQUNqQjtRQUNELElBQUksS0FBSyxHQUFHLEVBQUUsRUFBRTtZQUNkLE9BQU8sU0FBUyxDQUFBO1NBQ2pCO1FBRUQsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQzs7QUF2S3NCLHFDQUFjLEdBQUk7SUFDdkMsU0FBUyxFQUFFLHVCQUF1QjtJQUNsQyxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFFBQVEsRUFBRSxpQkFBaUI7SUFDM0IsVUFBVSxFQUFFLHVCQUF1QjtJQUNuQyxTQUFTLEVBQUUsc0RBQXNEO0lBQ2pFLFNBQVMsRUFBRSxvQkFBb0I7SUFDL0IsUUFBUSxFQUFFLElBQUk7SUFDZCxhQUFhLEVBQUUsQ0FBQztDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFzc3dvcmRTdHJlbmd0aE1ldGVyQ29uZmlnIH0gZnJvbSBcIi4vZm9ybS1pbnB1dC5jb21wb25lbnRcIlxuXG4vKipcbiAqIENsYXNzZSBkaSB1dGlsaXR5IGNyZWF0YSBzdWxsYSBiYXNlIGRlbCBzZWd1ZW50ZSBzb3JnZW50ZSBkaSBib290c3RyYXAtaXRhbGlhOiBodHRwczovL2dpdGh1Yi5jb20vaXRhbGlhL2Jvb3RzdHJhcC1pdGFsaWEvYmxvYi9tYWluL3NyYy9qcy9wbHVnaW5zL2lucHV0LXBhc3N3b3JkLmpzXG4gKiBUT0RPOiBEYSBzb3N0aXR1aXJlIHVuYSB2b2x0YSBjaGUgaSBtZXRvZGkgc2NvcmVUZXh0LCBzY29yZUNvbG9yLCBlIGNhbGN1bGF0ZVNjb3JlIFxuICogc2FyYW5ubyBpbXBvcnRhYmlsaSBkYWxsYSBsaWJyZXJpYSBib290c3RyYXAtaXRhbGlhLlxuICovXG5leHBvcnQgY2xhc3MgRm9ybUlucHV0UGFzc3dvcmRVdGlscyB7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0NPTkZJRyA9ICB7XG4gICAgc2hvcnRQYXNzOiAnUGFzc3dvcmQgbW9sdG8gZGVib2xlJyxcbiAgICBiYWRQYXNzOiAnUGFzc3dvcmQgZGVib2xlJyxcbiAgICBnb29kUGFzczogJ1Bhc3N3b3JkIHNpY3VyYScsXG4gICAgc3Ryb25nUGFzczogJ1Bhc3N3b3JkIG1vbHRvIHNpY3VyYScsXG4gICAgZW50ZXJQYXNzOiAnSW5zZXJpc2NpIGFsbWVubyA4IGNhcmF0dGVyaSBlIHVuYSBsZXR0ZXJhIG1haXVzY29sYScsXG4gICAgYWxlcnRDYXBzOiAnQ0FQUyBMT0NLIGluc2VyaXRvJyxcbiAgICBzaG93VGV4dDogdHJ1ZSxcbiAgICBtaW5pbXVtTGVuZ3RoOiA0LFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2NvbmZpZzogUGFzc3dvcmRTdHJlbmd0aE1ldGVyQ29uZmlnKSB7fVxuXG4gICAgLyoqXG4gICAqIFJldHVybnMgYSB2YWx1ZSBiZXR3ZWVuIC0xIGFuZCAxMDAgdG8gc2NvcmVcbiAgICogdGhlIHVzZXIncyBwYXNzd29yZC5cbiAgICpcbiAgICogQHBhcmFtICBzdHJpbmcgcGFzc3dvcmQgVGhlIHBhc3N3b3JkIHRvIGJlIGNoZWNrZWQuXG4gICAqIEByZXR1cm4gaW50XG4gICAqL1xuICBwdWJsaWMgY2FsY3VsYXRlU2NvcmUocGFzc3dvcmQ6IHN0cmluZykge1xuICAgIHZhciBzY29yZSA9IDBcblxuICAgIC8vIGVtcHR5IHBhc3N3b3JkXG4gICAgaWYgKHBhc3N3b3JkLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMlxuICAgIH1cblxuICAgIC8vIHBhc3N3b3JkIDwgdGhpcy5fY29uZmlnLm1pbmltdW1MZW5ndGhcbiAgICBpZiAocGFzc3dvcmQubGVuZ3RoIDwgdGhpcy5fY29uZmlnLm1pbmltdW1MZW5ndGgpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cblxuICAgIC8vIHBhc3N3b3JkIGxlbmd0aFxuICAgIHNjb3JlICs9IHBhc3N3b3JkLmxlbmd0aCAqIDRcbiAgICBzY29yZSArPSB0aGlzLl9jaGVja1JlcGV0aXRpb24oMSwgcGFzc3dvcmQpLmxlbmd0aCAtIHBhc3N3b3JkLmxlbmd0aFxuICAgIHNjb3JlICs9IHRoaXMuX2NoZWNrUmVwZXRpdGlvbigyLCBwYXNzd29yZCkubGVuZ3RoIC0gcGFzc3dvcmQubGVuZ3RoXG4gICAgc2NvcmUgKz0gdGhpcy5fY2hlY2tSZXBldGl0aW9uKDMsIHBhc3N3b3JkKS5sZW5ndGggLSBwYXNzd29yZC5sZW5ndGhcbiAgICBzY29yZSArPSB0aGlzLl9jaGVja1JlcGV0aXRpb24oNCwgcGFzc3dvcmQpLmxlbmd0aCAtIHBhc3N3b3JkLmxlbmd0aFxuXG4gICAgLy8gcGFzc3dvcmQgaGFzIDMgbnVtYmVyc1xuICAgIGlmIChwYXNzd29yZC5tYXRjaCgvKC4qWzAtOV0uKlswLTldLipbMC05XSkvKSkge1xuICAgICAgc2NvcmUgKz0gNVxuICAgIH1cblxuICAgIC8vIHBhc3N3b3JkIGhhcyBhdCBsZWFzdCAyIHN5Ym9sc1xuICAgIGxldCBzeW1ib2xzOiBSZWdFeHAgfCBzdHJpbmcgPSAnLipbISxALCMsJCwlLF4sJiwqLD8sXyx+XSc7XG4gICAgc3ltYm9scyA9IG5ldyBSZWdFeHAoJygnICsgc3ltYm9scyArIHN5bWJvbHMgKyAnKScpXG4gICAgaWYgKHBhc3N3b3JkLm1hdGNoKHN5bWJvbHMpKSB7XG4gICAgICBzY29yZSArPSA1XG4gICAgfVxuXG4gICAgLy8gcGFzc3dvcmQgaGFzIFVwcGVyIGFuZCBMb3dlciBjaGFyc1xuICAgIGlmIChwYXNzd29yZC5tYXRjaCgvKFthLXpdLipbQS1aXSl8KFtBLVpdLipbYS16XSkvKSkge1xuICAgICAgc2NvcmUgKz0gMTBcbiAgICB9XG5cbiAgICAvLyBwYXNzd29yZCBoYXMgbnVtYmVyIGFuZCBjaGFyc1xuICAgIGlmIChwYXNzd29yZC5tYXRjaCgvKFthLXpBLVpdKS8pICYmIHBhc3N3b3JkLm1hdGNoKC8oWzAtOV0pLykpIHtcbiAgICAgIHNjb3JlICs9IDE1XG4gICAgfVxuXG4gICAgLy8gcGFzc3dvcmQgaGFzIG51bWJlciBhbmQgc3ltYm9sXG4gICAgaWYgKHBhc3N3b3JkLm1hdGNoKC8oWyEsQCwjLCQsJSxeLCYsKiw/LF8sfl0pLykgJiYgcGFzc3dvcmQubWF0Y2goLyhbMC05XSkvKSkge1xuICAgICAgc2NvcmUgKz0gMTVcbiAgICB9XG5cbiAgICAvLyBwYXNzd29yZCBoYXMgY2hhciBhbmQgc3ltYm9sXG4gICAgaWYgKHBhc3N3b3JkLm1hdGNoKC8oWyEsQCwjLCQsJSxeLCYsKiw/LF8sfl0pLykgJiYgcGFzc3dvcmQubWF0Y2goLyhbYS16QS1aXSkvKSkge1xuICAgICAgc2NvcmUgKz0gMTVcbiAgICB9XG5cbiAgICAvLyBwYXNzd29yZCBpcyBqdXN0IG51bWJlcnMgb3IgY2hhcnNcbiAgICBpZiAocGFzc3dvcmQubWF0Y2goL15cXHcrJC8pIHx8IHBhc3N3b3JkLm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgc2NvcmUgLT0gMTBcbiAgICB9XG5cbiAgICBpZiAoc2NvcmUgPiAxMDApIHtcbiAgICAgIHNjb3JlID0gMTAwXG4gICAgfVxuXG4gICAgaWYgKHNjb3JlIDwgMCkge1xuICAgICAgc2NvcmUgPSAwXG4gICAgfVxuXG4gICAgcmV0dXJuIHNjb3JlXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGZvciByZXBldGl0aW9uIG9mIGNoYXJhY3RlcnMgaW5cbiAgICogYSBzdHJpbmdcbiAgICpcbiAgICogQHBhcmFtIGludCByTGVuIFJlcGV0aXRpb24gbGVuZ3RoLlxuICAgKiBAcGFyYW0gc3RyaW5nIHN0ciBUaGUgc3RyaW5nIHRvIGJlIGNoZWNrZWQuXG4gICAqIEByZXR1cm4gc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIF9jaGVja1JlcGV0aXRpb24ockxlbiwgc3RyKSB7XG4gICAgdmFyIHJlcyA9ICcnLFxuICAgICAgcmVwZWF0ZWQgPSBmYWxzZVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXBlYXRlZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgckxlbiAmJiBqICsgaSArIHJMZW4gPCBzdHIubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgcmVwZWF0ZWQgPSByZXBlYXRlZCAmJiBzdHIuY2hhckF0KGogKyBpKSA9PT0gc3RyLmNoYXJBdChqICsgaSArIHJMZW4pXG4gICAgICB9XG4gICAgICBpZiAoaiA8IHJMZW4pIHtcbiAgICAgICAgcmVwZWF0ZWQgPSBmYWxzZVxuICAgICAgfVxuICAgICAgaWYgKHJlcGVhdGVkKSB7XG4gICAgICAgIGkgKz0gckxlbiAtIDFcbiAgICAgICAgcmVwZWF0ZWQgPSBmYWxzZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzICs9IHN0ci5jaGFyQXQoaSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgc3RyaW5ncyBiYXNlZCBvbiB0aGUgc2NvcmUgZ2l2ZW4uXG4gICAqXG4gICAqIEBwYXJhbSBpbnQgc2NvcmUgU2NvcmUgYmFzZS5cbiAgICogQHJldHVybiBzdHJpbmdcbiAgICovXG4gICBwdWJsaWMgc2NvcmVUZXh0KHNjb3JlKSB7XG5cbiAgICBpZiAoc2NvcmUgPT09IC0xKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY29uZmlnLnNob3J0UGFzcztcbiAgICB9IGVsc2UgaWYgKHNjb3JlID09PSAtMikge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5lbnRlclBhc3M7XG4gICAgfVxuXG4gICAgc2NvcmUgPSBzY29yZSA8IDAgPyAwIDogc2NvcmVcblxuICAgIGlmIChzY29yZSA8IDI2KSB7XG4gICAgICByZXR1cm4gdGhpcy5fY29uZmlnLnNob3J0UGFzc1xuICAgIH1cbiAgICBpZiAoc2NvcmUgPCA1MSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5iYWRQYXNzXG4gICAgfVxuICAgIGlmIChzY29yZSA8IDc2KSB7XG4gICAgICByZXR1cm4gdGhpcy5fY29uZmlnLmdvb2RQYXNzXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5zdHJvbmdQYXNzXG4gIH1cblxuICBwdWJsaWMgc2NvcmVDb2xvcihzY29yZSkge1xuICAgIGlmIChzY29yZSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiAnZGFuZ2VyJ1xuICAgIH1cbiAgICBpZiAoc2NvcmUgPT09IC0yKSB7XG4gICAgICByZXR1cm4gJ211dGVkJ1xuICAgIH1cblxuICAgIHNjb3JlID0gc2NvcmUgPCAwID8gMCA6IHNjb3JlXG5cbiAgICBpZiAoc2NvcmUgPCAyNikge1xuICAgICAgcmV0dXJuICdkYW5nZXInXG4gICAgfVxuICAgIGlmIChzY29yZSA8IDUxKSB7XG4gICAgICByZXR1cm4gJ3dhcm5pbmcnXG4gICAgfVxuICAgIGlmIChzY29yZSA8IDc2KSB7XG4gICAgICByZXR1cm4gJ3N1Y2Nlc3MnXG4gICAgfVxuXG4gICAgcmV0dXJuICdzdWNjZXNzJ1xuICB9XG59Il19
|