@gravitee/ui-components 3.25.2 → 3.25.3-typescript-ad6021f

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.
Files changed (111) hide show
  1. package/CHANGELOG.md +1292 -0
  2. package/LICENSE.txt +202 -0
  3. package/README.md +195 -0
  4. package/package.json +17 -4
  5. package/src/.eslintrc.js +19 -0
  6. package/src/atoms/gv-autocomplete.js +156 -132
  7. package/src/atoms/gv-button.js +248 -73
  8. package/src/atoms/gv-checkbox.js +103 -45
  9. package/src/atoms/gv-date-picker-calendar.js +393 -312
  10. package/src/atoms/gv-date-picker-cell.js +81 -57
  11. package/src/atoms/gv-date-picker.js +319 -180
  12. package/src/atoms/gv-file-upload.js +195 -85
  13. package/src/atoms/gv-icon.js +34 -13
  14. package/src/atoms/gv-image.js +66 -31
  15. package/src/atoms/gv-input-message.js +37 -12
  16. package/src/atoms/gv-input.js +148 -117
  17. package/src/atoms/gv-link.js +125 -47
  18. package/src/atoms/gv-message.js +69 -18
  19. package/src/atoms/gv-metric.js +68 -19
  20. package/src/atoms/gv-relative-time.js +38 -67
  21. package/src/atoms/gv-select-native.js +215 -96
  22. package/src/atoms/gv-select.js +230 -110
  23. package/src/atoms/gv-spinner.js +26 -5
  24. package/src/atoms/gv-state.js +66 -25
  25. package/src/atoms/gv-switch.js +160 -40
  26. package/src/atoms/gv-tag.js +78 -26
  27. package/src/atoms/gv-text.js +83 -22
  28. package/src/charts/gv-chart-bar.js +18 -22
  29. package/src/charts/gv-chart-gauge.js +31 -28
  30. package/src/charts/gv-chart-histogram.js +10 -18
  31. package/src/charts/gv-chart-line.js +59 -70
  32. package/src/charts/gv-chart-map.js +42 -44
  33. package/src/charts/gv-chart-pie.js +14 -18
  34. package/src/index.js +0 -1
  35. package/src/lib/cron-expression.js +35 -40
  36. package/src/lib/date.js +1 -10
  37. package/src/lib/events.js +1 -3
  38. package/src/lib/http-client-schema-form.js +12 -13
  39. package/src/lib/http.js +56 -57
  40. package/src/lib/i18n.js +22 -30
  41. package/src/lib/item.js +12 -13
  42. package/src/lib/properties.js +42 -77
  43. package/src/lib/schema-form.js +5 -4
  44. package/src/lib/studio.js +60 -13
  45. package/src/lib/style.js +8 -8
  46. package/src/lib/text-format.js +7 -14
  47. package/src/lib/theme.js +5 -8
  48. package/src/lib/utils.js +18 -17
  49. package/src/mixins/chart-element.js +54 -31
  50. package/src/mixins/input-element.js +47 -60
  51. package/src/mixins/item-resource.js +32 -34
  52. package/src/mixins/keyboard-element.js +5 -6
  53. package/src/mixins/update-after-browser.js +1 -4
  54. package/src/mixins/with-resize-observer.js +13 -23
  55. package/src/mixins/with-skeleton-attribute.js +48 -54
  56. package/src/molecules/gv-card-full.js +147 -26
  57. package/src/molecules/gv-card-list.js +42 -13
  58. package/src/molecules/gv-card.js +91 -17
  59. package/src/molecules/gv-category-list.js +17 -6
  60. package/src/molecules/gv-category.js +103 -23
  61. package/src/molecules/gv-code.js +142 -80
  62. package/src/molecules/gv-confirm.js +71 -41
  63. package/src/molecules/gv-cron-editor.js +389 -143
  64. package/src/molecules/gv-dropdown-menu.js +46 -14
  65. package/src/molecules/gv-expandable.js +59 -31
  66. package/src/molecules/gv-expression-language.js +138 -176
  67. package/src/molecules/gv-identity-picture.js +66 -43
  68. package/src/molecules/gv-list.js +134 -42
  69. package/src/molecules/gv-metrics.js +49 -37
  70. package/src/molecules/gv-modal.js +95 -28
  71. package/src/molecules/gv-nav.js +75 -49
  72. package/src/molecules/gv-option.js +130 -57
  73. package/src/molecules/gv-plans.js +209 -86
  74. package/src/molecules/gv-popover.js +177 -57
  75. package/src/molecules/gv-promote.js +146 -28
  76. package/src/molecules/gv-rating-list.js +195 -69
  77. package/src/molecules/gv-rating.js +105 -52
  78. package/src/molecules/gv-row-expandable.js +11 -5
  79. package/src/molecules/gv-row.js +147 -21
  80. package/src/molecules/gv-stats.js +48 -23
  81. package/src/molecules/gv-stepper.js +187 -43
  82. package/src/molecules/gv-table.js +309 -199
  83. package/src/molecules/gv-tree.js +156 -33
  84. package/src/organisms/gv-documentation.js +127 -44
  85. package/src/organisms/gv-header.js +195 -37
  86. package/src/organisms/gv-http-client.js +168 -32
  87. package/src/organisms/gv-menu.js +158 -37
  88. package/src/organisms/gv-newsletter-subscription.js +189 -48
  89. package/src/organisms/gv-pagination.js +77 -49
  90. package/src/organisms/gv-properties.js +492 -271
  91. package/src/organisms/gv-resizable-views.js +259 -41
  92. package/src/organisms/gv-resources.js +275 -168
  93. package/src/organisms/gv-schema-form-array.js +159 -49
  94. package/src/organisms/gv-schema-form-control-object.js +73 -59
  95. package/src/organisms/gv-schema-form-control.js +134 -107
  96. package/src/organisms/gv-schema-form.js +313 -208
  97. package/src/organisms/gv-tabs.js +98 -66
  98. package/src/organisms/gv-user-menu.js +201 -36
  99. package/src/organisms/gv-vertical-menu.js +61 -20
  100. package/src/policy-studio/gv-flow-step.js +265 -105
  101. package/src/policy-studio/gv-flow.js +304 -125
  102. package/src/policy-studio/gv-policy-studio-menu.js +471 -157
  103. package/src/policy-studio/gv-policy-studio.js +774 -710
  104. package/src/styles/empty.js +20 -3
  105. package/src/styles/input.js +247 -3
  106. package/src/styles/link.js +16 -3
  107. package/src/styles/shapes.js +0 -1
  108. package/src/styles/skeleton.js +37 -3
  109. package/src/styles/zoom.js +24 -3
  110. package/src/theme/definition.json +1762 -0
  111. package/src/theme/gv-theme.js +60 -21
@@ -24,6 +24,7 @@ import { link } from '../styles/link';
24
24
  import { i18n } from '../lib/i18n';
25
25
  import { classMap } from 'lit/directives/class-map';
26
26
  import { dispatchCustomEvent } from '../lib/events';
27
+
27
28
  /**
28
29
  * List of ratings with answer form
29
30
  *
@@ -51,33 +52,119 @@ import { dispatchCustomEvent } from '../lib/events';
51
52
  export class GvRatingList extends LitElement {
52
53
  static get properties() {
53
54
  return {
54
- ratings: {
55
- type: Array
56
- },
57
- user: {
58
- type: Object
59
- },
60
- permissions: {
61
- type: Object
62
- },
63
- required: {
64
- type: Boolean,
65
- attribute: 'required'
66
- },
67
- _permissions: {
68
- type: Object,
69
- attribute: false
70
- },
71
- _ratings: {
72
- type: Array,
73
- attribute: false
74
- }
55
+ ratings: { type: Array },
56
+ user: { type: Object },
57
+ permissions: { type: Object },
58
+ required: { type: Boolean, attribute: 'required' },
59
+ _permissions: { type: Object, attribute: false },
60
+ _ratings: { type: Array, attribute: false },
75
61
  };
76
62
  }
77
63
 
78
64
  static get styles() {
79
- return [skeleton, link, // language=CSS
80
- css`:host{--s:var(--gv-rating-list--s, 18px);--gv-icon--s:var(--s);--gv-rating--s:var(--s);margin:.2rem;box-sizing:border-box}.rating-list{background-color:var(--gv-rating-list--bgc,var(--gv-theme-neutral-color-lightest,#fff))}.rating.parent{border-bottom:1px solid var(--gv-rating-list--bdc,var(--gv-theme-neutral-color,#f5f5f5))}.rating{display:flex;padding:1rem 0}.answer .rating{padding:1rem 0 0 0}.sub-title{color:grey;display:flex;line-height:20px}gv-confirm{align-self:center}.sub-title a.link{text-decoration:underline}gv-identity-picture{margin:0 1rem;height:60px;width:60px}.title{display:flex;line-height:20px}.rating-content,.title b{flex:1}.link-answer{display:inline-block;padding:1rem 0}.link-answer gv-icon{margin-right:.2rem;--gv-icon--s:var(--s)}.delete-answer,.delete-rating,.fake-icon{--gv-icon--s:var(--s);min-width:var(--s);display:inline-flex}.delete-rating{padding-right:1rem}.answer{padding:1rem;margin-top:1rem;background-color:var(--gv-rating-list-answer--bgc,var(--gv-theme-neutral-color-lighter,#fafafa))}.answer-form{display:flex;flex-direction:column}.display-name:after{content:'|';margin:2px}.actions{text-align:right}`];
65
+ return [
66
+ skeleton,
67
+ link,
68
+ // language=CSS
69
+ css`
70
+ :host {
71
+ --s: var(--gv-rating-list--s, 18px);
72
+ --gv-icon--s: var(--s);
73
+ --gv-rating--s: var(--s);
74
+ margin: 0.2rem;
75
+ box-sizing: border-box;
76
+ }
77
+
78
+ .rating-list {
79
+ background-color: var(--gv-rating-list--bgc, var(--gv-theme-neutral-color-lightest, #ffffff));
80
+ }
81
+
82
+ .rating.parent {
83
+ border-bottom: 1px solid var(--gv-rating-list--bdc, var(--gv-theme-neutral-color, #f5f5f5));
84
+ }
85
+
86
+ .rating {
87
+ display: flex;
88
+ padding: 1rem 0;
89
+ }
90
+
91
+ .answer .rating {
92
+ padding: 1rem 0 0 0;
93
+ }
94
+
95
+ .sub-title {
96
+ color: grey;
97
+ display: flex;
98
+ line-height: 20px;
99
+ }
100
+
101
+ gv-confirm {
102
+ align-self: center;
103
+ }
104
+
105
+ .sub-title a.link {
106
+ text-decoration: underline;
107
+ }
108
+
109
+ gv-identity-picture {
110
+ margin: 0 1rem;
111
+ height: 60px;
112
+ width: 60px;
113
+ }
114
+
115
+ .title {
116
+ display: flex;
117
+ line-height: 20px;
118
+ }
119
+
120
+ .title b,
121
+ .rating-content {
122
+ flex: 1;
123
+ }
124
+
125
+ .link-answer {
126
+ display: inline-block;
127
+ padding: 1rem 0;
128
+ }
129
+
130
+ .link-answer gv-icon {
131
+ margin-right: 0.2rem;
132
+ --gv-icon--s: var(--s);
133
+ }
134
+
135
+ .delete-rating,
136
+ .delete-answer,
137
+ .fake-icon {
138
+ --gv-icon--s: var(--s);
139
+ min-width: var(--s);
140
+ display: inline-flex;
141
+ }
142
+
143
+ .delete-rating {
144
+ padding-right: 1rem;
145
+ }
146
+
147
+ .answer {
148
+ padding: 1rem;
149
+ margin-top: 1rem;
150
+ background-color: var(--gv-rating-list-answer--bgc, var(--gv-theme-neutral-color-lighter, #fafafa));
151
+ }
152
+
153
+ .answer-form {
154
+ display: flex;
155
+ flex-direction: column;
156
+ }
157
+
158
+ .display-name:after {
159
+ content: '|';
160
+ margin: 2px;
161
+ }
162
+
163
+ .actions {
164
+ text-align: right;
165
+ }
166
+ `,
167
+ ];
81
168
  }
82
169
 
83
170
  constructor() {
@@ -87,21 +174,23 @@ export class GvRatingList extends LitElement {
87
174
  update: false,
88
175
  delete: false,
89
176
  addAnswer: false,
90
- deleteAnswer: false
177
+ deleteAnswer: false,
91
178
  };
92
179
  }
93
180
 
94
181
  set ratings(value) {
95
- Promise.resolve(value).then(value => {
96
- if (value) {
182
+ Promise.resolve(value)
183
+ .then((value) => {
184
+ if (value) {
185
+ this._skeleton = false;
186
+ this._ratings = value;
187
+ } else {
188
+ this._skeleton = true;
189
+ }
190
+ })
191
+ .catch(() => {
97
192
  this._skeleton = false;
98
- this._ratings = value;
99
- } else {
100
- this._skeleton = true;
101
- }
102
- }).catch(() => {
103
- this._skeleton = false;
104
- });
193
+ });
105
194
  }
106
195
 
107
196
  set permissions(permissions) {
@@ -111,42 +200,33 @@ export class GvRatingList extends LitElement {
111
200
  }
112
201
 
113
202
  render() {
114
- return html` <div class="rating-list">${repeat(this._ratings, rating => this._render(rating))}</div> `;
203
+ return html` <div class="rating-list">${repeat(this._ratings, (rating) => this._render(rating))}</div> `;
115
204
  }
116
205
 
117
206
  _editAnswer(rating, e) {
118
207
  e.stopPropagation();
119
-
120
- this._ratings.forEach(rating => rating._edit = false);
121
-
208
+ this._ratings.forEach((rating) => (rating._edit = false));
122
209
  rating._edit = true;
123
210
  this.performUpdate();
124
211
  }
125
212
 
126
213
  _getAnswerValue() {
127
214
  const element = this.shadowRoot.querySelector('gv-text');
128
-
129
215
  if (element) {
130
216
  return element.value;
131
217
  }
132
-
133
218
  return '';
134
219
  }
135
220
 
136
221
  _onAnswer(rating) {
137
222
  const answer = this._getAnswerValue();
138
-
139
223
  if (answer.trim().length > 0) {
140
- dispatchCustomEvent(this, 'add-answer', {
141
- rating,
142
- answer
143
- });
224
+ dispatchCustomEvent(this, 'add-answer', { rating, answer });
144
225
  }
145
226
  }
146
227
 
147
228
  _hasValidAnswer() {
148
229
  const answer = this._getAnswerValue();
149
-
150
230
  return answer.trim().length > 0;
151
231
  }
152
232
 
@@ -160,46 +240,96 @@ export class GvRatingList extends LitElement {
160
240
  }
161
241
 
162
242
  _renderAnswers(rating) {
163
- return html` ${rating.answers ? html` ${this._canAddAnswer() ? html`<a class="link link-answer" @click="${this._editAnswer.bind(this, rating)}"> <gv-icon class="link" shape="communication:chat#5"></gv-icon> ${i18n('gv-rating-list.reply')}</a>` : ''} ${rating._edit ? html` <div class="answer answer-form"> <gv-text rows="4" label="${i18n('gv-rating-list.answerLabel')}" required @input="${this.performUpdate}"></gv-text> <div class="actions"> <gv-button primary outlined @click="${this._onClose.bind(this, rating)}">${i18n('gv-rating-list.cancel')}</gv-button> <gv-button primary @click="${this._onAnswer.bind(this, rating)}" .disabled="${!this._hasValidAnswer()}">${i18n('gv-rating-list.send')}</gv-button> </div> </div> ` : ''} <div>${repeat(rating.answers, answer => this._renderAnswer(rating, answer))}</div>` : ''}`;
243
+ return html` ${rating.answers
244
+ ? html` ${this._canAddAnswer()
245
+ ? html`<a class="link link-answer" @click="${this._editAnswer.bind(this, rating)}">
246
+ <gv-icon class="link" shape="communication:chat#5"></gv-icon> ${i18n('gv-rating-list.reply')}</a
247
+ >`
248
+ : ''}
249
+ ${rating._edit
250
+ ? html`
251
+ <div class="answer answer-form">
252
+ <gv-text rows="4" label="${i18n('gv-rating-list.answerLabel')}" required @input="${this.performUpdate}"></gv-text>
253
+ <div class="actions">
254
+ <gv-button primary outlined @click="${this._onClose.bind(this, rating)}">${i18n('gv-rating-list.cancel')}</gv-button>
255
+ <gv-button primary @click="${this._onAnswer.bind(this, rating)}" .disabled="${!this._hasValidAnswer()}"
256
+ >${i18n('gv-rating-list.send')}</gv-button
257
+ >
258
+ </div>
259
+ </div>
260
+ `
261
+ : ''}
262
+ <div>${repeat(rating.answers, (answer) => this._renderAnswer(rating, answer))}</div>`
263
+ : ''}`;
164
264
  }
165
265
 
166
266
  _onDelete(rating) {
167
- dispatchCustomEvent(this, 'delete', {
168
- rating
169
- });
267
+ dispatchCustomEvent(this, 'delete', { rating });
170
268
  }
171
269
 
172
270
  _onDeleteAnswer(rating, answer) {
173
- dispatchCustomEvent(this, 'delete-answer', {
174
- rating,
175
- answer
176
- });
271
+ dispatchCustomEvent(this, 'delete-answer', { rating, answer });
177
272
  }
178
273
 
179
274
  _renderActions(data, parent) {
180
275
  if (parent) {
181
- return html` ${this._canDeleteAnswer() ? html`<gv-confirm danger icon="home:trash" @gv-confirm:ok="${this._onDeleteAnswer.bind(this, parent, data)}" message="${i18n('gv-rating-list.confirmAnswerDelete')}"> <gv-icon title="${i18n('gv-rating-list.deleteAnswer')}" class="link delete-answer" shape="home:trash"></gv-icon> </gv-confirm>` : ''} `;
276
+ return html`
277
+ ${this._canDeleteAnswer()
278
+ ? html`<gv-confirm
279
+ danger
280
+ icon="home:trash"
281
+ @gv-confirm:ok="${this._onDeleteAnswer.bind(this, parent, data)}"
282
+ message="${i18n('gv-rating-list.confirmAnswerDelete')}"
283
+ >
284
+ <gv-icon title="${i18n('gv-rating-list.deleteAnswer')}" class="link delete-answer" shape="home:trash"></gv-icon>
285
+ </gv-confirm>`
286
+ : ''}
287
+ `;
182
288
  } else {
183
- return html` ${this._canDelete(data.id) ? html`<gv-confirm danger icon="home:trash" @gv-confirm:ok="${this._onDelete.bind(this, data)}" message="${i18n('gv-rating-list.confirmRatingDelete')}"> <gv-icon title="${i18n('gv-rating-list.deleteRating')}" class="link delete-rating" shape="home:trash"></gv-icon> </gv-confirm>` : html`<div class="fake-icon"></div>`} `;
289
+ return html`
290
+ ${this._canDelete(data.id)
291
+ ? html`<gv-confirm
292
+ danger
293
+ icon="home:trash"
294
+ @gv-confirm:ok="${this._onDelete.bind(this, data)}"
295
+ message="${i18n('gv-rating-list.confirmRatingDelete')}"
296
+ >
297
+ <gv-icon title="${i18n('gv-rating-list.deleteRating')}" class="link delete-rating" shape="home:trash"></gv-icon>
298
+ </gv-confirm>`
299
+ : html`<div class="fake-icon"></div>`}
300
+ `;
184
301
  }
185
302
  }
186
303
 
187
304
  _render(data, parent) {
188
- const classes = {
189
- rating: true,
190
- skeleton: this._skeleton,
191
- parent: parent == null
192
- };
305
+ const classes = { rating: true, skeleton: this._skeleton, parent: parent == null };
193
306
  const displayName = data.author && data.author.display_name ? data.author.display_name : null;
194
307
  const picture = data.author && data.author._links && data.author._links.avatar ? data.author._links.avatar : null;
195
- return html` <div class="${classMap(classes)}"> <gv-identity-picture rounded .display_name="${displayName}" .picture="${picture}"></gv-identity-picture> <div class="rating-content"> <div class="title"> <b>${data.title ? data.title : data.author.display_name}</b>${parent ? '' : html`<gv-rating .readonly="${!this._canUpdate(data.id)}" @input="${this._onUpdateRating.bind(this, data)}" value="${data.value}"></gv-rating>`}${this._renderActions(data, parent)} </div> <div class="sub-title">${this._getDisplayName(data)}<gv-relative-time datetime="${data.date}" noFuture></gv-relative-time></div> <p class="comment">${data.comment}</p> ${parent ? '' : this._renderAnswers(data)} </div> </div> `;
308
+
309
+ return html`
310
+ <div class="${classMap(classes)}">
311
+ <gv-identity-picture rounded .display_name="${displayName}" .picture="${picture}"></gv-identity-picture>
312
+ <div class="rating-content">
313
+ <div class="title">
314
+ <b>${data.title ? data.title : data.author.display_name}</b>${parent
315
+ ? ''
316
+ : html`<gv-rating
317
+ .readonly="${!this._canUpdate(data.id)}"
318
+ @input="${this._onUpdateRating.bind(this, data)}"
319
+ value="${data.value}"
320
+ ></gv-rating>`}${this._renderActions(data, parent)}
321
+ </div>
322
+ <div class="sub-title">${this._getDisplayName(data)}<gv-relative-time datetime="${data.date}" noFuture></gv-relative-time></div>
323
+ <p class="comment">${data.comment}</p>
324
+ ${parent ? '' : this._renderAnswers(data)}
325
+ </div>
326
+ </div>
327
+ `;
196
328
  }
197
329
 
198
330
  _onUpdateRating(rating, e) {
199
331
  rating.value = e.target.value;
200
- dispatchCustomEvent(this, 'update', {
201
- rating
202
- });
332
+ dispatchCustomEvent(this, 'update', { rating });
203
333
  }
204
334
 
205
335
  _canAddAnswer() {
@@ -214,7 +344,6 @@ export class GvRatingList extends LitElement {
214
344
  if (Array.isArray(this._permissions.update)) {
215
345
  return this._permissions.update.includes(ratingId);
216
346
  }
217
-
218
347
  return this._permissions.update === true;
219
348
  }
220
349
 
@@ -222,7 +351,6 @@ export class GvRatingList extends LitElement {
222
351
  if (Array.isArray(this._permissions.delete)) {
223
352
  return this._permissions.delete.includes(ratingId);
224
353
  }
225
-
226
354
  return this._permissions.delete === true;
227
355
  }
228
356
 
@@ -230,10 +358,8 @@ export class GvRatingList extends LitElement {
230
358
  if (data.title) {
231
359
  return html`<span class="display-name">${data.author.display_name}</span>`;
232
360
  }
233
-
234
361
  return '';
235
362
  }
236
-
237
363
  }
364
+
238
365
  window.customElements.define('gv-rating-list', GvRatingList);
239
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL21vbGVjdWxlcy9ndi1yYXRpbmctbGlzdC5qcyJdLCJuYW1lcyI6WyJjc3MiLCJMaXRFbGVtZW50IiwiaHRtbCIsInJlcGVhdCIsInNrZWxldG9uIiwibGluayIsImkxOG4iLCJjbGFzc01hcCIsImRpc3BhdGNoQ3VzdG9tRXZlbnQiLCJHdlJhdGluZ0xpc3QiLCJwcm9wZXJ0aWVzIiwicmF0aW5ncyIsInR5cGUiLCJBcnJheSIsInVzZXIiLCJPYmplY3QiLCJwZXJtaXNzaW9ucyIsInJlcXVpcmVkIiwiQm9vbGVhbiIsImF0dHJpYnV0ZSIsIl9wZXJtaXNzaW9ucyIsIl9yYXRpbmdzIiwic3R5bGVzIiwiY29uc3RydWN0b3IiLCJ1cGRhdGUiLCJkZWxldGUiLCJhZGRBbnN3ZXIiLCJkZWxldGVBbnN3ZXIiLCJ2YWx1ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsIl9za2VsZXRvbiIsImNhdGNoIiwiYXNzaWduIiwicmVuZGVyIiwicmF0aW5nIiwiX3JlbmRlciIsIl9lZGl0QW5zd2VyIiwiZSIsInN0b3BQcm9wYWdhdGlvbiIsImZvckVhY2giLCJfZWRpdCIsInBlcmZvcm1VcGRhdGUiLCJfZ2V0QW5zd2VyVmFsdWUiLCJlbGVtZW50Iiwic2hhZG93Um9vdCIsInF1ZXJ5U2VsZWN0b3IiLCJfb25BbnN3ZXIiLCJhbnN3ZXIiLCJ0cmltIiwibGVuZ3RoIiwiX2hhc1ZhbGlkQW5zd2VyIiwiX29uQ2xvc2UiLCJfcmVuZGVyQW5zd2VyIiwiX3JlbmRlckFuc3dlcnMiLCJhbnN3ZXJzIiwiX2NhbkFkZEFuc3dlciIsImJpbmQiLCJfb25EZWxldGUiLCJfb25EZWxldGVBbnN3ZXIiLCJfcmVuZGVyQWN0aW9ucyIsImRhdGEiLCJwYXJlbnQiLCJfY2FuRGVsZXRlQW5zd2VyIiwiX2NhbkRlbGV0ZSIsImlkIiwiY2xhc3NlcyIsImRpc3BsYXlOYW1lIiwiYXV0aG9yIiwiZGlzcGxheV9uYW1lIiwicGljdHVyZSIsIl9saW5rcyIsImF2YXRhciIsInRpdGxlIiwiX2NhblVwZGF0ZSIsIl9vblVwZGF0ZVJhdGluZyIsIl9nZXREaXNwbGF5TmFtZSIsImRhdGUiLCJjb21tZW50IiwidGFyZ2V0IiwicmF0aW5nSWQiLCJpc0FycmF5IiwiaW5jbHVkZXMiLCJ3aW5kb3ciLCJjdXN0b21FbGVtZW50cyIsImRlZmluZSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsR0FBVCxFQUFjQyxVQUFkLEVBQTBCQyxJQUExQixRQUFzQyxLQUF0QztBQUNBLFNBQVNDLE1BQVQsUUFBdUIsdUJBQXZCO0FBQ0EsT0FBTyw2QkFBUDtBQUNBLE9BQU8sdUJBQVA7QUFDQSxPQUFPLGFBQVA7QUFDQSxPQUFPLGNBQVA7QUFDQSxTQUFTQyxRQUFULFFBQXlCLG9CQUF6QjtBQUNBLFNBQVNDLElBQVQsUUFBcUIsZ0JBQXJCO0FBQ0EsU0FBU0MsSUFBVCxRQUFxQixhQUFyQjtBQUNBLFNBQVNDLFFBQVQsUUFBeUIsMEJBQXpCO0FBQ0EsU0FBU0MsbUJBQVQsUUFBb0MsZUFBcEM7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLE9BQU8sTUFBTUMsWUFBTixTQUEyQlIsVUFBM0IsQ0FBc0M7QUFDdEIsYUFBVlMsVUFBVSxHQUFHO0FBQ3RCLFdBQU87QUFDTEMsTUFBQUEsT0FBTyxFQUFFO0FBQUVDLFFBQUFBLElBQUksRUFBRUM7QUFBUixPQURKO0FBRUxDLE1BQUFBLElBQUksRUFBRTtBQUFFRixRQUFBQSxJQUFJLEVBQUVHO0FBQVIsT0FGRDtBQUdMQyxNQUFBQSxXQUFXLEVBQUU7QUFBRUosUUFBQUEsSUFBSSxFQUFF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RURvRCxFQUFBQSxlQUFlLENBQUNmLElBQUQsRUFBTztBQUNwQixRQUFJQSxJQUFJLENBQUNZLEtBQVQsRUFBZ0I7QUFDZCxhQUFPeEUsSUFBSSw4QkFBOEI0RCxJQUFJLENBQUNPLE1BQUwsQ0FBWUMsWUFBMUMsU0FBWDtBQUNEOztBQUNELFdBQU8sRUFBUDtBQUNEOztBQXRUMEM7QUF5VDdDYyxNQUFNLENBQUNDLGNBQVAsQ0FBc0JDLE1BQXRCLENBQTZCLGdCQUE3QixFQUErQzdFLFlBQS9DIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgR3Jhdml0ZWUgdGVhbSAoaHR0cDovL2dyYXZpdGVlLmlvKVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IGNzcywgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyByZXBlYXQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZXBlYXQnO1xuaW1wb3J0ICcuLy4uL2F0b21zL2d2LXJlbGF0aXZlLXRpbWUnO1xuaW1wb3J0ICcuL2d2LWlkZW50aXR5LXBpY3R1cmUnO1xuaW1wb3J0ICcuL2d2LXJhdGluZyc7XG5pbXBvcnQgJy4vZ3YtY29uZmlybSc7XG5pbXBvcnQgeyBza2VsZXRvbiB9IGZyb20gJy4uL3N0eWxlcy9za2VsZXRvbic7XG5pbXBvcnQgeyBsaW5rIH0gZnJvbSAnLi4vc3R5bGVzL2xpbmsnO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xpYi9pMThuJztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwJztcbmltcG9ydCB7IGRpc3BhdGNoQ3VzdG9tRXZlbnQgfSBmcm9tICcuLi9saWIvZXZlbnRzJztcblxuLyoqXG4gKiBMaXN0IG9mIHJhdGluZ3Mgd2l0aCBhbnN3ZXIgZm9ybVxuICpcbiAqICMjIERldGFpbHNcbiAqICogaGFzIEB0aGVtZSBmYWNldFxuICpcbiAqICMjIEF0dHJpYnV0ZSBgcGVybWlzc2lvbnNgIGRldGFpbHNcbiAqICogYGRlbGV0ZWAgYW5kIGB1cGRhdGVgIHByb3BlcnRpZXMgc3VwcG9ydHMgYm9vbGVhbnMgb3IgYXJyYXlzIG9mIHJhdGluZyBpZGVudGlmaWVyLlxuICogKiBgYWRkQW5zd2VyYCBhbmQgYGRlbGV0ZUFuc3dlcmAgb25seSBhY2NlcHQgYm9vbGVhbnMuXG4gKlxuICogQGZpcmVzIGd2LXJhdGluZy1saXN0OmFkZC1hbnN3ZXIgLSBXaGVuIHVzZXIgc3VibWl0IGFuc3dlclxuICogQGZpcmVzIGd2LXJhdGluZy1saXN0OmRlbGV0ZSAtIFdoZW4gdXNlciBkZWxldGUgcmF0aW5nXG4gKiBAZmlyZXMgZ3YtcmF0aW5nLWxpc3Q6ZGVsZXRlLWFuc3dlciAtIFdoZW4gdXNlciBkZWxldGUgYW5zd2VyXG4gKiBAZmlyZXMgZ3YtcmF0aW5nLWxpc3Q6dXBkYXRlIC0gV2hlbiB1c2VyIHVwZGF0ZSByYXRpbmdcbiAqXG4gKiBAYXR0ciB7UHJvbWlzZTxBcnJheT59IHJhdGluZ3MgLSByYXRpbmdzXG4gKiBAYXR0ciB7aWQsIGF2YXRhciwgZGlzcGxheV9uYW1lfSB1c2VyIC0gYSBjdXJyZW50IHVzZXJcbiAqIEBhdHRyIHtPYmplY3Q8e3VwZGF0ZSwgZGVsZXRlLCBhZGRBbnN3ZXIsIGRlbGV0ZUFuc3dlcn0+fSBwZXJtaXNzaW9ucyAtIFRoZSBwZXJtaXNzaW9uc1xuICogQGNzc3Byb3Age0NvbG9yfSBbLS1ndi1yYXRpbmctbGlzdC0tYmdjPXZhcigtLWd2LXRoZW1lLW5ldXRyYWwtY29sb3ItbGlnaHRlc3QsICNmZmZmZmYpXSAtIEJhY2tncm91bmQgY29sb3JcbiAqIEBjc3Nwcm9wIHtDb2xvcn0gWy0tZ3YtcmF0aW5nLWxpc3QtYW5zd2VyLS1iZ2M9dmFyKC0tZ3YtdGhlbWUtbmV1dHJhbC1jb2xvci1saWdodGVyLCAjZmFmYWZhKV0gLSBBbnN3ZXIgYmFja2dyb3VuZCBjb2xvclxuICogQGNzc3Byb3Age0NvbG9yfSBbLS1ndi1yYXRpbmctbGlzdC0tYmRjPXZhcigtLWd2LXRoZW1lLW5ldXRyYWwtY29sb3IsICNmNWY1ZjUpXSAtIEJvcmRlciBjb2xvclxuICogQGNzc3Byb3Age0xlbmd0aH0gWy0tZ3YtcmF0aW5nLWxpc3QtLXM9MThweF0gLSBIZWlnaHQgYW5kIHN0YXIgd2lkdGhcbiAqL1xuXG5leHBvcnQgY2xhc3MgR3ZSYXRpbmdMaXN0IGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmF0aW5nczogeyB0eXBlOiBBcnJheSB9LFxuICAgICAgdXNlcjogeyB0eXBlOiBPYmplY3QgfSxcbiAgICAgIHBlcm1pc3Npb25zOiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgcmVxdWlyZWQ6IHsgdHlwZTogQm9vbGVhbiwgYXR0cmlidXRlOiAncmVxdWlyZWQnIH0sXG4gICAgICBfcGVybWlzc2lvbnM6IHsgdHlwZTogT2JqZWN0LCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBfcmF0aW5nczogeyB0eXBlOiBBcnJheSwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgc2tlbGV0b24sXG4gICAgICBsaW5rLFxuICAgICAgLy8gbGFuZ3VhZ2U9Q1NTXG4gICAgICBjc3NgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICAtLXM6IHZhcigtLWd2LXJhdGluZy1saXN0LS1zLCAxOHB4KTtcbiAgICAgICAgICAtLWd2LWljb24tLXM6IHZhcigtLXMpO1xuICAgICAgICAgIC0tZ3YtcmF0aW5nLS1zOiB2YXIoLS1zKTtcbiAgICAgICAgICBtYXJnaW46IDAuMnJlbTtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICB9XG5cbiAgICAgICAgLnJhdGluZy1saXN0IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ndi1yYXRpbmctbGlzdC0tYmdjLCB2YXIoLS1ndi10aGVtZS1uZXV0cmFsLWNvbG9yLWxpZ2h0ZXN0LCAjZmZmZmZmKSk7XG4gICAgICAgIH1cblxuICAgICAgICAucmF0aW5nLnBhcmVudCB7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWd2LXJhdGluZy1saXN0LS1iZGMsIHZhcigtLWd2LXRoZW1lLW5ldXRyYWwtY29sb3IsICNmNWY1ZjUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5yYXRpbmcge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgcGFkZGluZzogMXJlbSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLmFuc3dlciAucmF0aW5nIHtcbiAgICAgICAgICBwYWRkaW5nOiAxcmVtIDAgMCAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLnN1Yi10aXRsZSB7XG4gICAgICAgICAgY29sb3I6IGdyZXk7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBsaW5lLWhlaWdodDogMjBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIGd2LWNvbmZpcm0ge1xuICAgICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC5zdWItdGl0bGUgYS5saW5rIHtcbiAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGd2LWlkZW50aXR5LXBpY3R1cmUge1xuICAgICAgICAgIG1hcmdpbjogMCAxcmVtO1xuICAgICAgICAgIGhlaWdodDogNjBweDtcbiAgICAgICAgICB3aWR0aDogNjBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC50aXRsZSB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBsaW5lLWhlaWdodDogMjBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC50aXRsZSBiLFxuICAgICAgICAucmF0aW5nLWNvbnRlbnQge1xuICAgICAgICAgIGZsZXg6IDE7XG4gICAgICAgIH1cblxuICAgICAgICAubGluay1hbnN3ZXIge1xuICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgICBwYWRkaW5nOiAxcmVtIDA7XG4gICAgICAgIH1cblxuICAgICAgICAubGluay1hbnN3ZXIgZ3YtaWNvbiB7XG4gICAgICAgICAgbWFyZ2luLXJpZ2h0OiAwLjJyZW07XG4gICAgICAgICAgLS1ndi1pY29uLS1zOiB2YXIoLS1zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5kZWxldGUtcmF0aW5nLFxuICAgICAgICAuZGVsZXRlLWFuc3dlcixcbiAgICAgICAgLmZha2UtaWNvbiB7XG4gICAgICAgICAgLS1ndi1pY29uLS1zOiB2YXIoLS1zKTtcbiAgICAgICAgICBtaW4td2lkdGg6IHZhcigtLXMpO1xuICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmRlbGV0ZS1yYXRpbmcge1xuICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDFyZW07XG4gICAgICAgIH1cblxuICAgICAgICAuYW5zd2VyIHtcbiAgICAgICAgICBwYWRkaW5nOiAxcmVtO1xuICAgICAgICAgIG1hcmdpbi10b3A6IDFyZW07XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ3YtcmF0aW5nLWxpc3QtYW5zd2VyLS1iZ2MsIHZhcigtLWd2LXRoZW1lLW5ldXRyYWwtY29sb3ItbGlnaHRlciwgI2ZhZmFmYSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLmFuc3dlci1mb3JtIHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIH1cblxuICAgICAgICAuZGlzcGxheS1uYW1lOmFmdGVyIHtcbiAgICAgICAgICBjb250ZW50OiAnfCc7XG4gICAgICAgICAgbWFyZ2luOiAycHg7XG4gICAgICAgIH1cblxuICAgICAgICAuYWN0aW9ucyB7XG4gICAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICAgIH1cbiAgICAgIGAsXG4gICAgXTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fcmF0aW5ncyA9IFtdO1xuICAgIHRoaXMuX3Blcm1pc3Npb25zID0ge1xuICAgICAgdXBkYXRlOiBmYWxzZSxcbiAgICAgIGRlbGV0ZTogZmFsc2UsXG4gICAgICBhZGRBbnN3ZXI6IGZhbHNlLFxuICAgICAgZGVsZXRlQW5zd2VyOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgc2V0IHJhdGluZ3ModmFsdWUpIHtcbiAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpXG4gICAgICAudGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5fc2tlbGV0b24gPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLl9yYXRpbmdzID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fc2tlbGV0b24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhpcy5fc2tlbGV0b24gPSBmYWxzZTtcbiAgICAgIH0pO1xuICB9XG5cbiAgc2V0IHBlcm1pc3Npb25zKHBlcm1pc3Npb25zKSB7XG4gICAgaWYgKHBlcm1pc3Npb25zICYmIHR5cGVvZiBwZXJtaXNzaW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRoaXMuX3Blcm1pc3Npb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fcGVybWlzc2lvbnMsIHBlcm1pc3Npb25zKTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgIDxkaXYgY2xhc3M9XCJyYXRpbmctbGlzdFwiPiR7cmVwZWF0KHRoaXMuX3JhdGluZ3MsIChyYXRpbmcpID0+IHRoaXMuX3JlbmRlcihyYXRpbmcpKX08L2Rpdj4gYDtcbiAgfVxuXG4gIF9lZGl0QW5zd2VyKHJhdGluZywgZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5fcmF0aW5ncy5mb3JFYWNoKChyYXRpbmcpID0+IChyYXRpbmcuX2VkaXQgPSBmYWxzZSkpO1xuICAgIHJhdGluZy5fZWRpdCA9IHRydWU7XG4gICAgdGhpcy5wZXJmb3JtVXBkYXRlKCk7XG4gIH1cblxuICBfZ2V0QW5zd2VyVmFsdWUoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdndi10ZXh0Jyk7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBfb25BbnN3ZXIocmF0aW5nKSB7XG4gICAgY29uc3QgYW5zd2VyID0gdGhpcy5fZ2V0QW5zd2VyVmFsdWUoKTtcbiAgICBpZiAoYW5zd2VyLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdhZGQtYW5zd2VyJywgeyByYXRpbmcsIGFuc3dlciB9KTtcbiAgICB9XG4gIH1cblxuICBfaGFzVmFsaWRBbnN3ZXIoKSB7XG4gICAgY29uc3QgYW5zd2VyID0gdGhpcy5fZ2V0QW5zd2VyVmFsdWUoKTtcbiAgICByZXR1cm4gYW5zd2VyLnRyaW0oKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgX29uQ2xvc2UocmF0aW5nKSB7XG4gICAgZGVsZXRlIHJhdGluZy5fZWRpdDtcbiAgICB0aGlzLnBlcmZvcm1VcGRhdGUoKTtcbiAgfVxuXG4gIF9yZW5kZXJBbnN3ZXIocmF0aW5nLCBhbnN3ZXIpIHtcbiAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwiYW5zd2VyXCI+JHt0aGlzLl9yZW5kZXIoYW5zd2VyLCByYXRpbmcpfTwvZGl2PmA7XG4gIH1cblxuICBfcmVuZGVyQW5zd2VycyhyYXRpbmcpIHtcbiAgICByZXR1cm4gaHRtbGAgJHtyYXRpbmcuYW5zd2Vyc1xuICAgICAgPyBodG1sYCAke3RoaXMuX2NhbkFkZEFuc3dlcigpXG4gICAgICAgICAgICA/IGh0bWxgPGEgY2xhc3M9XCJsaW5rIGxpbmstYW5zd2VyXCIgQGNsaWNrPVwiJHt0aGlzLl9lZGl0QW5zd2VyLmJpbmQodGhpcywgcmF0aW5nKX1cIj5cbiAgICAgICAgICAgICAgICA8Z3YtaWNvbiBjbGFzcz1cImxpbmtcIiBzaGFwZT1cImNvbW11bmljYXRpb246Y2hhdCM1XCI+PC9ndi1pY29uPiAke2kxOG4oJ2d2LXJhdGluZy1saXN0LnJlcGx5Jyl9PC9hXG4gICAgICAgICAgICAgID5gXG4gICAgICAgICAgICA6ICcnfVxuICAgICAgICAgICR7cmF0aW5nLl9lZGl0XG4gICAgICAgICAgICA/IGh0bWxgXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFuc3dlciBhbnN3ZXItZm9ybVwiPlxuICAgICAgICAgICAgICAgICAgPGd2LXRleHQgcm93cz1cIjRcIiBsYWJlbD1cIiR7aTE4bignZ3YtcmF0aW5nLWxpc3QuYW5zd2VyTGFiZWwnKX1cIiByZXF1aXJlZCBAaW5wdXQ9XCIke3RoaXMucGVyZm9ybVVwZGF0ZX1cIj48L2d2LXRleHQ+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8Z3YtYnV0dG9uIHByaW1hcnkgb3V0bGluZWQgQGNsaWNrPVwiJHt0aGlzLl9vbkNsb3NlLmJpbmQodGhpcywgcmF0aW5nKX1cIj4ke2kxOG4oJ2d2LXJhdGluZy1saXN0LmNhbmNlbCcpfTwvZ3YtYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8Z3YtYnV0dG9uIHByaW1hcnkgQGNsaWNrPVwiJHt0aGlzLl9vbkFuc3dlci5iaW5kKHRoaXMsIHJhdGluZyl9XCIgLmRpc2FibGVkPVwiJHshdGhpcy5faGFzVmFsaWRBbnN3ZXIoKX1cIlxuICAgICAgICAgICAgICAgICAgICAgID4ke2kxOG4oJ2d2LXJhdGluZy1saXN0LnNlbmQnKX08L2d2LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgOiAnJ31cbiAgICAgICAgICA8ZGl2PiR7cmVwZWF0KHJhdGluZy5hbnN3ZXJzLCAoYW5zd2VyKSA9PiB0aGlzLl9yZW5kZXJBbnN3ZXIocmF0aW5nLCBhbnN3ZXIpKX08L2Rpdj5gXG4gICAgICA6ICcnfWA7XG4gIH1cblxuICBfb25EZWxldGUocmF0aW5nKSB7XG4gICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnZGVsZXRlJywgeyByYXRpbmcgfSk7XG4gIH1cblxuICBfb25EZWxldGVBbnN3ZXIocmF0aW5nLCBhbnN3ZXIpIHtcbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdkZWxldGUtYW5zd2VyJywgeyByYXRpbmcsIGFuc3dlciB9KTtcbiAgfVxuXG4gIF9yZW5kZXJBY3Rpb25zKGRhdGEsIHBhcmVudCkge1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAke3RoaXMuX2NhbkRlbGV0ZUFuc3dlcigpXG4gICAgICAgICAgPyBodG1sYDxndi1jb25maXJtXG4gICAgICAgICAgICAgIGRhbmdlclxuICAgICAgICAgICAgICBpY29uPVwiaG9tZTp0cmFzaFwiXG4gICAgICAgICAgICAgIEBndi1jb25maXJtOm9rPVwiJHt0aGlzLl9vbkRlbGV0ZUFuc3dlci5iaW5kKHRoaXMsIHBhcmVudCwgZGF0YSl9XCJcbiAgICAgICAgICAgICAgbWVzc2FnZT1cIiR7aTE4bignZ3YtcmF0aW5nLWxpc3QuY29uZmlybUFuc3dlckRlbGV0ZScpfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxndi1pY29uIHRpdGxlPVwiJHtpMThuKCdndi1yYXRpbmctbGlzdC5kZWxldGVBbnN3ZXInKX1cIiBjbGFzcz1cImxpbmsgZGVsZXRlLWFuc3dlclwiIHNoYXBlPVwiaG9tZTp0cmFzaFwiPjwvZ3YtaWNvbj5cbiAgICAgICAgICAgIDwvZ3YtY29uZmlybT5gXG4gICAgICAgICAgOiAnJ31cbiAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBodG1sYFxuICAgICAgICAke3RoaXMuX2NhbkRlbGV0ZShkYXRhLmlkKVxuICAgICAgICAgID8gaHRtbGA8Z3YtY29uZmlybVxuICAgICAgICAgICAgICBkYW5nZXJcbiAgICAgICAgICAgICAgaWNvbj1cImhvbWU6dHJhc2hcIlxuICAgICAgICAgICAgICBAZ3YtY29uZmlybTpvaz1cIiR7dGhpcy5fb25EZWxldGUuYmluZCh0aGlzLCBkYXRhKX1cIlxuICAgICAgICAgICAgICBtZXNzYWdlPVwiJHtpMThuKCdndi1yYXRpbmctbGlzdC5jb25maXJtUmF0aW5nRGVsZXRlJyl9XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGd2LWljb24gdGl0bGU9XCIke2kxOG4oJ2d2LXJhdGluZy1saXN0LmRlbGV0ZVJhdGluZycpfVwiIGNsYXNzPVwibGluayBkZWxldGUtcmF0aW5nXCIgc2hhcGU9XCJob21lOnRyYXNoXCI+PC9ndi1pY29uPlxuICAgICAgICAgICAgPC9ndi1jb25maXJtPmBcbiAgICAgICAgICA6IGh0bWxgPGRpdiBjbGFzcz1cImZha2UtaWNvblwiPjwvZGl2PmB9XG4gICAgICBgO1xuICAgIH1cbiAgfVxuXG4gIF9yZW5kZXIoZGF0YSwgcGFyZW50KSB7XG4gICAgY29uc3QgY2xhc3NlcyA9IHsgcmF0aW5nOiB0cnVlLCBza2VsZXRvbjogdGhpcy5fc2tlbGV0b24sIHBhcmVudDogcGFyZW50ID09IG51bGwgfTtcbiAgICBjb25zdCBkaXNwbGF5TmFtZSA9IGRhdGEuYXV0aG9yICYmIGRhdGEuYXV0aG9yLmRpc3BsYXlfbmFtZSA/IGRhdGEuYXV0aG9yLmRpc3BsYXlfbmFtZSA6IG51bGw7XG4gICAgY29uc3QgcGljdHVyZSA9IGRhdGEuYXV0aG9yICYmIGRhdGEuYXV0aG9yLl9saW5rcyAmJiBkYXRhLmF1dGhvci5fbGlua3MuYXZhdGFyID8gZGF0YS5hdXRob3IuX2xpbmtzLmF2YXRhciA6IG51bGw7XG5cbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxkaXYgY2xhc3M9XCIke2NsYXNzTWFwKGNsYXNzZXMpfVwiPlxuICAgICAgICA8Z3YtaWRlbnRpdHktcGljdHVyZSByb3VuZGVkIC5kaXNwbGF5X25hbWU9XCIke2Rpc3BsYXlOYW1lfVwiIC5waWN0dXJlPVwiJHtwaWN0dXJlfVwiPjwvZ3YtaWRlbnRpdHktcGljdHVyZT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJhdGluZy1jb250ZW50XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+XG4gICAgICAgICAgICA8Yj4ke2RhdGEudGl0bGUgPyBkYXRhLnRpdGxlIDogZGF0YS5hdXRob3IuZGlzcGxheV9uYW1lfTwvYj4ke3BhcmVudFxuICAgICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICAgIDogaHRtbGA8Z3YtcmF0aW5nXG4gICAgICAgICAgICAgICAgICAucmVhZG9ubHk9XCIkeyF0aGlzLl9jYW5VcGRhdGUoZGF0YS5pZCl9XCJcbiAgICAgICAgICAgICAgICAgIEBpbnB1dD1cIiR7dGhpcy5fb25VcGRhdGVSYXRpbmcuYmluZCh0aGlzLCBkYXRhKX1cIlxuICAgICAgICAgICAgICAgICAgdmFsdWU9XCIke2RhdGEudmFsdWV9XCJcbiAgICAgICAgICAgICAgICA+PC9ndi1yYXRpbmc+YH0ke3RoaXMuX3JlbmRlckFjdGlvbnMoZGF0YSwgcGFyZW50KX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLXRpdGxlXCI+JHt0aGlzLl9nZXREaXNwbGF5TmFtZShkYXRhKX08Z3YtcmVsYXRpdmUtdGltZSBkYXRldGltZT1cIiR7ZGF0YS5kYXRlfVwiIG5vRnV0dXJlPjwvZ3YtcmVsYXRpdmUtdGltZT48L2Rpdj5cbiAgICAgICAgICA8cCBjbGFzcz1cImNvbW1lbnRcIj4ke2RhdGEuY29tbWVudH08L3A+XG4gICAgICAgICAgJHtwYXJlbnQgPyAnJyA6IHRoaXMuX3JlbmRlckFuc3dlcnMoZGF0YSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIF9vblVwZGF0ZVJhdGluZyhyYXRpbmcsIGUpIHtcbiAgICByYXRpbmcudmFsdWUgPSBlLnRhcmdldC52YWx1ZTtcbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICd1cGRhdGUnLCB7IHJhdGluZyB9KTtcbiAgfVxuXG4gIF9jYW5BZGRBbnN3ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Blcm1pc3Npb25zLmFkZEFuc3dlciA9PT0gdHJ1ZTtcbiAgfVxuXG4gIF9jYW5EZWxldGVBbnN3ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Blcm1pc3Npb25zLmRlbGV0ZUFuc3dlciA9PT0gdHJ1ZTtcbiAgfVxuXG4gIF9jYW5VcGRhdGUocmF0aW5nSWQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9wZXJtaXNzaW9ucy51cGRhdGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGVybWlzc2lvbnMudXBkYXRlLmluY2x1ZGVzKHJhdGluZ0lkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3Blcm1pc3Npb25zLnVwZGF0ZSA9PT0gdHJ1ZTtcbiAgfVxuXG4gIF9jYW5EZWxldGUocmF0aW5nSWQpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9wZXJtaXNzaW9ucy5kZWxldGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGVybWlzc2lvbnMuZGVsZXRlLmluY2x1ZGVzKHJhdGluZ0lkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3Blcm1pc3Npb25zLmRlbGV0ZSA9PT0gdHJ1ZTtcbiAgfVxuXG4gIF9nZXREaXNwbGF5TmFtZShkYXRhKSB7XG4gICAgaWYgKGRhdGEudGl0bGUpIHtcbiAgICAgIHJldHVybiBodG1sYDxzcGFuIGNsYXNzPVwiZGlzcGxheS1uYW1lXCI+JHtkYXRhLmF1dGhvci5kaXNwbGF5X25hbWV9PC9zcGFuPmA7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG53aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdndi1yYXRpbmctbGlzdCcsIEd2UmF0aW5nTGlzdCk7XG4iXX0=